900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Python开发摸鱼小游戏——兔獾大战 越玩越上瘾

Python开发摸鱼小游戏——兔獾大战 越玩越上瘾

时间:2023-05-16 15:37:01

相关推荐

Python开发摸鱼小游戏——兔獾大战 越玩越上瘾

前阵子看到国外一个12岁的孩子写的兔獾大战游戏,心生敬佩,想当年我还是12岁的时候还不知电脑为何物,连小霸王都未曾玩过。自己也未曾想去搞游戏开发,纯属自娱自乐。在此心态下,依葫芦画瓢重新架构了一下该游戏。

一、准备环境:更改设置pip 国内镜像

在使用pycharm来制作小游戏写代码的时候需要编译环境,使用pip镜像源,由于pip管理工具安装库文件时,默认使用国外的源文件,因此在国内的下载速度会比较慢,可能只有50KB/s。幸好,国内的一些顶级科研机构已经给我们准备好了各种镜像,下载速度可达2MB/s。所以需要更改设置成pip国内镜像。

国内源:

新版ubuntu要求使用https源,要注意。

清华:https://pypi.tuna./simple

阿里云:/pypi/simple/

中国科技大学 https://pypi.mirrors./simple/

华中理工大学:/

山东理工大学:/

豆瓣:/simple/

临时使用

pip install -i https://pypi.tuna./simple some-package

可以在使用pip的时候加参数-i https://pypi.tuna./simple

例如:

pip install -i https://pypi.tuna./simple pyspider,这样就会从清华这边的镜像去安装pyspider库。

2.默认使用

windows系统使用cmd(命令指示符)快速设置

1.pip install pip -U # 升级pip到最新版本

2.pip config set global.index-url https://pypi.tuna./simple

注:在命令指示符里依次敲以上代码,以上例子都是用的清华大学的镜像

二、进行代码的编写

# -*-conding: utf-8 -*-#如果要在python2的py文件里面写中文,则必须要添加一行声明文件编码的注释,否则python2会默认使用ASCII编码。#如果是python3及其以上的版本就可以不写第一行注释。# 1 - Import libraryimport pygame #import语句:在模块模块定义好后,我们可以使用 import 语句来引入模块from pygame.locals import *# from 语句从模块中导入一个指定的部分到当前命名空间中import mathimport random# 2 - Initialize the game#initialize (隐藏摘要) 预置(初始状态bai), 初始化这个游戏keys = [False, False, False, False]playerpos = [100, 100]acc = [0, 0]arrows = []badtimer = 100badtimer1 = 0badguys = [[640, 100]]healthvalue = 194pygame.init()width, height = 640, 480 #设置页面宽高screen = pygame.display.set_mode((width, height))pygame.display.set_caption("兔鼠大战")pygame.mixer.init()# 3 - Load images下载图片player = pygame.image.load("resources/images/dude.png")grass = pygame.image.load("resources/images/grass.png")castle = pygame.image.load("resources/images/castle.png")arrow = pygame.image.load("resources/images/bullet.png")badguyimg1 = pygame.image.load("resources/images/badguy.png")gameover = pygame.image.load("resources/images/gameover.png")youwin = pygame.image.load("resources/images/youwin.png")healthbar = pygame.image.load("resources/images/healthbar.png")health = pygame.image.load("resources/images/health.png")badguyimg = badguyimg1# 3.1 - Load audio 下载音乐hit = pygame.mixer.Sound("resources/audio/explode.wav")enemy = pygame.mixer.Sound("resources/audio/enemy.wav")shoot = pygame.mixer.Sound("resources/audio/shoot.wav")hit.set_volume(0.05)enemy.set_volume(0.05)shoot.set_volume(0.05)pygame.mixer.music.load('resources/audio/moonlight.wav')pygame.mixer.music.play(-1, 0.0)pygame.mixer.music.set_volume(0.25)# 4 - keep looping through 保持一个圈通过running = 1exitcode = 0while running:badtimer -= 1# 5 - clear the screen before drawing it again 再次绘制之前清除屏幕screen.fill(0)# 6 - draw the screen elements 绘制屏幕元素for x in range(width // grass.get_width() + 1):for y in range(height // grass.get_height() + 1):screen.blit(grass, (x * 100, y * 100))screen.blit(castle, (0, 30))screen.blit(castle, (0, 135))screen.blit(castle, (0, 240))screen.blit(castle, (0, 345))# screen.blit(player, (100,100))# screen.blit(player, playerpos)position = pygame.mouse.get_pos()angle = math.atan2(position[1] - (playerpos[1] + 32), position[0] - (playerpos[0] + 26))playerrot = pygame.transform.rotate(player, 360 - angle * 57.29)playerpos1 = (playerpos[0] - playerrot.get_rect().width / 2, playerpos[1] - playerrot.get_rect().height / 2)screen.blit(playerrot, playerpos1)# 6.2 - Draw arrowsfor bullet in arrows:index = 0velx = math.cos(bullet[0]) * 10vely = math.sin(bullet[0]) * 10bullet[1] += velxbullet[2] += velyif bullet[1] < -64 or bullet[1] > 640 or bullet[2] < -64 or bullet[2] > 480:arrows.pop(index)index += 1for projectile in arrows:arrow1 = pygame.transform.rotate(arrow, 360 - projectile[0] * 57.29)screen.blit(arrow1, (projectile[1], projectile[2]))# 6.3 - Draw badgers绘制老鼠if badtimer == 0:badguys.append([640, random.randint(50, 430)])badtimer = 100 - (badtimer1 * 2)if badtimer1 >= 35:badtimer1 = 35else:badtimer1 += 5index = 0for badguy in badguys:# 6.3.1 - Attack castle 攻击伤害badrect = pygame.Rect(badguyimg.get_rect())badrect.top = badguy[1]badrect.left = badguy[0]if badrect.left < 64:hit.play()healthvalue -= random.randint(5, 20)badguys.pop(index)# 6.3.2 - Check for collisions 检查是否有碰撞index1 = 0for bullet in arrows:bullrect = pygame.Rect(arrow.get_rect())bullrect.left = bullet[1]bullrect.top = bullet[2]if badrect.colliderect(bullrect):enemy.play()acc[0] += 1badguys.pop(index)arrows.pop(index1)index1 += 1# 6.3.3 - Next bad guy 下一个老鼠if badguy[0] < -64:badguys.pop(index)badguy[0] -= 7index += 1for badguy in badguys:screen.blit(badguyimg, badguy)# 6.4 - Draw clock 绘制计时器font = pygame.font.Font(None, 24)survivedtext = font.render(str((90000 - pygame.time.get_ticks()) / 60000) + ":" + str((90000 - pygame.time.get_ticks()) / 1000 % 60).zfill(2), True, (0, 0, 0))textRect = survivedtext.get_rect()textRect.topright = [635, 5]screen.blit(survivedtext, textRect)# 6.5 - Draw health bar 绘制生命条screen.blit(healthbar, (5, 5))for health1 in range(healthvalue):screen.blit(health, (health1 + 8, 8))# 7 - update the screen 更新屏幕pygame.display.flip()# 8 - loop through the events 循环处理事件for event in pygame.event.get():# check if the event is the X button 检查游戏是否失败`在这里插入代码片`if event.type == pygame.QUIT:# if it is quit the game 如果是,请退出游戏pygame.quit()exit(0)if event.type == pygame.KEYDOWN: #设置移动的按键,个人认为设置成上下左右键方便操作,鼠标左键单击发动攻击。if event.key == K_UP:# k_wkeys[0] = Trueelif event.key == K_LEFT:# k_akeys[1] = Trueelif event.key == K_DOWN:# k_skeys[2] = Trueelif event.key == K_RIGHT:# k_dkeys[ 3 ] = True #以上设置按键也可以设置成w,a,s,d #后是对应的代码,如用这个下面也需要更换成相同的if event.type == pygame.KEYUP:if event.key == pygame.K_UP: #这里跟上面的设置键需要设置成相同的keys[0] = Falseelif event.key == pygame.K_LEFT:keys[1] = Falseelif event.key == pygame.K_DOWN:keys[2] = Falseelif event.key == pygame.K_RIGHT:keys[3] = Falseif event.type == pygame.MOUSEBUTTONDOWN:shoot.play()position = pygame.mouse.get_pos()acc[1] += 1arrows.append([math.atan2(position[1] - (playerpos1[1] + 32), position[0] - (playerpos1[0] + 26)), playerpos1[0] + 32,playerpos1[1] + 32])# 9 - Move player 移动时播放的音频if keys[0]:playerpos[1] -= 5elif keys[2]:playerpos[1] += 5if keys[1]:playerpos[0] -= 5elif keys[3]:playerpos[0] += 5# 10 - Win/Lose check 检查是否赢得/输掉游戏if pygame.time.get_ticks() >= 90000:running = 0exitcode = 1if healthvalue <= 0:running = 0exitcode = 0if acc[1] != 0:accuracy = acc[0] * 1.0 / acc[1] * 100else:accuracy = 0# 11 - Win/lose display 赢得/输掉游戏 不再继续游戏if exitcode == 0:pygame.font.init()font = pygame.font.Font(None, 24)text = font.render("Accuracy: " + str(accuracy) + "%", True, (255, 0, 0))textRect = text.get_rect()textRect.centerx = screen.get_rect().centerxtextRect.centery = screen.get_rect().centery + 24screen.blit(gameover, (0, 0))screen.blit(text, textRect)else:pygame.font.init()font = pygame.font.Font(None, 24)text = font.render("Accuracy: " + str(accuracy) + "%", True, (0, 255, 0))textRect = text.get_rect()textRect.centerx = screen.get_rect().centerxtextRect.centery = screen.get_rect().centery + 24screen.blit(youwin, (0, 0))screen.blit(text, textRect)while 1:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit(0)pygame.display.flip()

成果显示如下

这次的分享就到这里了,如果觉得文章还不错的话,记得点赞支持一下哦

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。