首页 > 编程学习 > 10分钟教你写出 坦克大战【无敌版】

10分钟教你写出 坦克大战【无敌版】

发布时间:2022/1/17 11:56:22

导读

最近读到一位大佬的游戏文章之后,手痒难耐就想自己也写一个小游戏。苦于没有游戏素材在网上搜也都是付费的,我就随便写了一点点来给自己解解馋。😗 好了废话不多说我们现在先试一下游戏效果。不好玩也不要说出来,嘻嘻嘻。后面我们在慢慢的推出好玩的来。

代码和详解

主要部分

image.png
 

对坦克设定进行初始化

pygame.init()#初始化size=(width,heiht)=(800,600)screen=pygame.display.set_mode(size)#设置窗口pygame.display.set_caption("坦克大战")#设置窗口名称fps=30#刷新频率fpsclock=pygame.time.Clock()#定义时钟color_back=(0,0,0)#设置背景颜色my_tank_speed=[4,4]#坦克水平,垂直速度tank_img=pygame.image.load("tanke.bmp")#装载图片bullet_img=pygame.image.load("zidan.bmp")#装载图片new_tank_img=tank_img#new是使用的坦克,后面会旋转tank_rect=tank_img.get_rect()#图片外围矩形框tank_rect.topleft=[400,300]#坦克的初始位置left_count=right_count=top_count=bottom_count=0#子弹发射按键计数my_rotate=0#存当前方向my_bullet=0#子弹数量my_value=0;#得分#写文字font=pygame.font.Font(None,32)text=font.render("value:"+str(my_value),True,(255,0,0))text_rect=text.get_rect()text_rect.left=10#文字位置text_rect.top=10

 

定义坦克类

[图片上传失败...(image-494b7e-1642390233061)]

 class Tank(pygame.sprite.Sprite):#敌方坦克精灵def __init__(self,filename,initial_position):pygame.sprite.Sprite.__init__(self)self.image=pygame.image.load(filename)self.rect=self.image.get_rect()self.rect.topleft=initial_positionself.speed_top=1#敌人坦克速度self.speed_left = 1def update(self, *args):self.rect.top=self.rect.top+self.speed_topself.rect.left = self.rect.left + self.speed_leftif (self.rect.left < 0) or (self.rect.right > width):self.speed_left=-self.speed_leftif (self.rect.top < 0) or (self.rect.bottom > heiht):self.speed_top = -self.speed_top

 

⚽定义子弹类

    class bullet(pygame.sprite.Sprite):#子弹精灵def __init__(self,filename,my_tank_rect,my_rotate):pygame.sprite.Sprite.__init__(self)self.image=pygame.image.load(filename)self.rect=self.image.get_rect()self.speed_top=5#子弹速度self.speed_left = 5self.my_rotate=my_rotate# 子弹的发送初始位置self.rect.left = my_tank_rect.left + (my_tank_rect.right - my_tank_rect.left) / 2self.rect.right = self.rect.left + 12.5self.rect.top = my_tank_rect.top + (my_tank_rect.bottom - my_tank_rect.top) / 2self.rect.bottom = self.rect.top + 12.5self.speed=[0,0]def update(self, *args):pass# 子弹自动移动控制speed_size=self.speed_top# 计算子弹的速度方向if self.my_rotate == 0:self.speed = [0, -speed_size]elif self.my_rotate == 180 :self.speed = [0, speed_size]elif self.my_rotate == 90 :self.speed = [-speed_size, 0]elif self.my_rotate == -90 :self.speed = [speed_size, 0]#子弹移动self.rect.top = self.rect.top + self.speed[1]self.rect.left = self.rect.left + self.speed[0]  # 矩形框移动#子弹边界条件判断if (self.rect.left < 0) or (self.rect.right > width):my_bullet = 0self.kill()if (self.rect.top < 0) or (self.rect.bottom > heiht):my_bullet = 0self.kill()

 

剩下的就是主程序了

    while True:for event in pygame.event.get():#接收事件if event.type==QUIT:#判断退出事件pygame.quit()#退出sys.exit()#放在for循环里面,值进行按键的一次动作判断if event.type == pygame.KEYUP:# 发射子弹if event.key == pygame.K_SPACE:passbullet_sprite1 = bullet("zidan.bmp", tank_rect, my_rotate)bullet_group.add(bullet_sprite1)  # 添加子弹my_bullet = my_bullet + 1#键盘移动控制,放在for循环外边,可以连续检测按键按下的状态tank_speed=my_tank_speed[0]if event.type==pygame.KEYDOWN:if event.key==pygame.K_LEFT:tank_rect = tank_rect.move(-tank_speed,0)left_count=left_count+1#记录left按键次数if left_count==1:#如果是第一次按下,就转动图形my_rotate=90new_tank_img=pygame.transform.rotate(tank_img,90)#转动图形right_count=top_count=bottom_count=0#其余清零elif event.key==pygame.K_RIGHT:tank_rect = tank_rect.move(tank_speed, 0)right_count = right_count + 1if right_count == 1:my_rotate=-90new_tank_img = pygame.transform.rotate(tank_img, -90)left_count = top_count = bottom_count = 0elif event.key == pygame.K_UP:tank_rect = tank_rect.move(0, -tank_speed)top_count = top_count + 1if top_count == 1:my_rotate=0new_tank_img = pygame.transform.rotate(tank_img, 0)left_count = right_count = bottom_count = 0elif event.key == pygame.K_DOWN:tank_rect = tank_rect.move(0, tank_speed)bottom_count = bottom_count + 1if bottom_count == 1:my_rotate=180new_tank_img = pygame.transform.rotate(tank_img, 180)left_count = right_count = top_count = 0#控制边界条件if tank_rect.left<0:tank_rect =tank_rect.move(1,0)elif tank_rect.right>width:tank_rect =tank_rect.move(-1, 0)elif tank_rect.top<0:tank_rect =tank_rect.move(0, 1)elif tank_rect.bottom>heiht:tank_rect =tank_rect.move(0, -1)#子弹碰撞监测if pygame.sprite.groupcollide(bullet_group,tank_group,True,True):#得分值my_value=my_value+1text = font.render("value:" + str(my_value), True, (255, 0, 0))print("value:",my_value)#子弹数统计my_bullet = len(bullet_group)print("bullet:",my_bullet)#添加坦克if len(tank_group)==0:retank1 = Tank('tanke2.bmp', [np.random.random_integers(80,600), np.random.random_integers(80,600)])retank2 = Tank('tanke3.bmp', [np.random.random_integers(80,600), np.random.random_integers(80,600)])retank3 = Tank('tanke4.bmp', [np.random.random_integers(80,600), np.random.random_integers(80,600)])retank4 = Tank('tanke5.bmp', [np.random.random_integers(80,600), np.random.random_integers(80,600)])tank_group.add(retank1)tank_group.add(retank2)tank_group.add(retank3)tank_group.add(retank4)#屏幕的刷新控制screen.fill(color_back)#窗口背景为黑色,图形都放这个后面,否则会被覆盖screen.blit(new_tank_img,tank_rect)#填充矩形框screen.blit(text,text_rect)#添加文字#更新精灵组tank_group.update()#更新敌方坦克精灵组tank_group.draw(screen)#绘图bullet_group.update()#更新子弹精灵组bullet_group.draw(screen)pygame.display.update()#刷新窗口fpsclock.tick(fps)#设置每秒钟的刷新频率

 

播放MP3

[图片上传失败...(image-4ec892-1642390233061)]

这里用的使用非常方便的 playsound模块

def tanke_mp3():playsound('tanke.mp3')

好了今天的文章就介绍到这里了。

最后小编整理了给大家准备一份详细的学习资料、有Python基础语法学习、python高级编程、模块式开发之函数与函数进阶、而且里面的知识点是十分详细的,话术也是很简洁明了,不含任何广告信息,让你学习起来更加的方便,这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。喜欢的小伙伴,可以给我个三连,么么哒!

互联网公司职位招聘.png
ffed5c7d3266a582641a72c3ab9928d8.gif


本文链接:https://www.ngui.cc/51cto/show-113.html
Copyright © 2010-2022 ngui.cc 版权所有 |关于我们| 联系方式| 豫B2-20100000