引言

最近在学习python,跟着视频完整的码了《坦克大战》这个小游戏,切身体会了面向对象分析编程的过程,逻辑清晰,不像我学之前面对整个问题无从下手,总之是很有逻辑和条理一步步写代码,这种码代码方式是比较快乐的。我也整理了思维导图相关代码、图片、音频资源附在最后,供有需要的朋友取用。第一次成功完成游戏制作,挺有意义,记录一下。

代码部分:

"""
v2.0 小游戏初步完成
"""import pygame, time,randomCOLOR_RED = pygame.Color(255, 0, 0)
COLOR_BLACK = pygame.Color(0, 0, 0)
version = 'v2.0'class MainGame():# 游戏主窗口window = NoneSCREEN_WIDTH = 800SCREEN_HEIGHT = 500Tank_My = NoneEnemyTank_list = []EnemyTank_num = 5Enemy_bullet_list=[]Explode_list=[]Bullet_list=[]Wall_list=[]def __init__(self):passdef startgame(self):pygame.display.init()MainGame.window = pygame.display.set_mode([MainGame.SCREEN_WIDTH, MainGame.SCREEN_HEIGHT])pygame.display.set_caption("坦克大战" + version)self.creatMyTank()self.creatEnemyTank()self.creatWalls()# 让窗口持续刷新while True:MainGame.window.fill(COLOR_BLACK)# self.getTextSurface()# 在循环中持续获取事件self.getevent()# 将绘制得到的小画布,黏贴到窗口中MainGame.window.blit(self.getTextSurface("剩余敌方坦克%d辆" % len(MainGame.EnemyTank_list)), (5, 10))self.blitWalls()self.blitEnemyTank()if MainGame.Tank_My and not MainGame.Tank_My.stop:MainGame.Tank_My.move()MainGame.Tank_My.hitWalls()MainGame.Tank_My.hitEnemyTank()self.blitBullet()self.blitEnemyBullet()self.displayExplodes()if MainGame.Tank_My and MainGame.Tank_My.live:MainGame.Tank_My.display()else:del MainGame.Tank_MyMainGame.Tank_My=Nonetime.sleep(0.02)pygame.display.update()def getevent(self):# 1.获取所有事件eventlist = pygame.event.get()for event in eventlist:# 判断事件类型event.type是否为退出QUIT,如果是退出的话,直接调用程序结束方法if event.type == pygame.QUIT:self.endgame()if MainGame.Tank_My and MainGame.Tank_My.live:if event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:print("坦克向左移动")MainGame.Tank_My.direction = 'L'MainGame.Tank_My.stop = Falseelif event.key == pygame.K_RIGHT:print("坦克向右移动")MainGame.Tank_My.direction = 'R'MainGame.Tank_My.stop = Falseelif event.key == pygame.K_DOWN:print("坦克向下移动")MainGame.Tank_My.direction = 'D'MainGame.Tank_My.stop = Falseelif event.key == pygame.K_UP:print("坦克向上移动")MainGame.Tank_My.direction = 'U'MainGame.Tank_My.stop = Falseelif event.key == pygame.K_SPACE:print("坦克发射子弹")MainGame.Tank_My.stop = Trueif len(self.Bullet_list)<3:# 产生一颗子弹m = Bullet(MainGame.Tank_My)# 将子弹加入列表self.Bullet_list.append(m)music=Music('musics/fire.wav')music.play()elif event.type == pygame.KEYUP:# 松开如果是方向键才处理if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == pygame.K_DOWN or event.key == pygame.K_UP:MainGame.Tank_My.stop = Trueif event.key == pygame.K_SPACE:MainGame.Tank_My.stop = Trueelif event.type==pygame.KEYDOWN and event.key==pygame.K_ESCAPE:self.creatMyTank()#创建敌方坦克def creatWalls(self):for i in range(1,4):wall=Wall(180*i,250)MainGame.Wall_list.append(wall)def creatEnemyTank(self):top=100speed=2for i in range(MainGame.EnemyTank_num):left = random.randint(1, 5)eTank=enemyTank(100*left,top,speed*left)MainGame.EnemyTank_list.append(eTank)def creatMyTank(self):MainGame.Tank_My = myTank(400, 400)music=Music('musics/start.wav')music.play()def blitWalls(self):for wall in MainGame.Wall_list:if wall.live:wall.displayWall()else:MainGame.Wall_list.remove(wall)#将坦克加入到窗口中def blitEnemyTank(self):for eTank in MainGame.EnemyTank_list:if eTank.live:eTank.display()eTank.randMove()eTank.hitWalls()if MainGame.Tank_My and MainGame.Tank_My.live:eTank.hitMyTank()eBullet=eTank.shot()if eBullet:MainGame.Enemy_bullet_list.append(eBullet)else:MainGame.EnemyTank_list.remove(eTank)def blitMyTank(self):if self.Tank_My and self.Tank_My.live:myTank.display(self)def blitBullet(self):#将子弹加入到窗口中for bullet in MainGame.Bullet_list:if bullet.live:Bullet.displayBullet(bullet)Bullet.move(bullet)bullet.hitEnemyTank()bullet.hitWalls()else:MainGame.Bullet_list.remove(bullet)def blitEnemyBullet(self):for eBullet in MainGame.Enemy_bullet_list:if eBullet.live:Bullet.displayBullet(eBullet)Bullet.move(eBullet)if MainGame.Tank_My and MainGame.Tank_My.live:eBullet.hitMyTank()eBullet.hitWalls()else:MainGame.Enemy_bullet_list.remove(eBullet)def displayExplodes(self):for explode in MainGame.Explode_list:if explode.live:explode.displayExplode()music=Music('musics/bang.wav')music.play()else:MainGame.Explode_list.remove(explode)def getTextSurface(self, text):pygame.font.init()font = pygame.font.SysFont('kaiti', 18)surface = font.render(text, True, COLOR_RED)return surfacedef endgame(self):print("谢谢使用")exit()
class BaseItem(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)
class Tank(BaseItem):def __init__(self, left, top):self.images = {'U': pygame.image.load("images/WU.gif"),'D': pygame.image.load("images/WD.gif"),'L': pygame.image.load("images/WL.gif"),'R': pygame.image.load("images/WR.gif"),}self.direction = 'U'self.image = self.images[self.direction]# 获取坦克的大小self.rect = self.image.get_rect()self.rect.left = leftself.rect.top = top# 速度属性self.speed = 5# 新增属性:坦克的移动开关self.stop = Trueself.live=True#新增属性:用来记录移动之前的坐标self.oldLeft=self.rect.leftself.oldTop=self.rect.topdef move(self):self.oldLeft = self.rect.leftself.oldTop = self.rect.topif self.direction == 'L':if self.rect.left > 0:self.rect.left -= self.speedelif self.direction == 'R':if self.rect.left + self.rect.width < MainGame.SCREEN_WIDTH:self.rect.left += self.speedelif self.direction == 'U':if self.rect.top > 0:self.rect.top -= self.speedelif self.direction == 'D':if self.rect.top + self.rect.height < MainGame.SCREEN_HEIGHT:self.rect.top += self.speeddef shot(self):return Bullet(self)def stay(self):self.rect.left=self.oldLeftself.rect.top=self.oldTopdef hitWalls(self):for wall in MainGame.Wall_list:if pygame.sprite.collide_rect(self,wall):self.stay()def display(self):# 1.重新设置坦克的图片self.image = self.images[self.direction]# 2.将坦克加入到窗口中MainGame.window.blit(self.image, self.rect)
class myTank(Tank):def __init__(self,left,top):super(myTank,self).__init__(left,top)def hitEnemyTank(self):for eTank in MainGame.EnemyTank_list:if pygame.sprite.collide_rect(self,eTank):self.stay()
class enemyTank(Tank):def __init__(self, left, top,speed):# 图片集self.images = {'U': pygame.image.load("images/EU.gif"),'D': pygame.image.load("images/ED.gif"),'L': pygame.image.load("images/EL.gif"),'R': pygame.image.load("images/ER.gif"),}self.direction = self.randDirection()self.image = self.images[self.direction]# 获取坦克的大小self.rect = self.image.get_rect()self.rect.left = leftself.rect.top = top# 速度属性self.speed = speed#新增步数属性,控制敌方坦克移动self.step=20self.live=Truedef randDirection(self):num=random.randint(1,4)if num==1 :return 'U'elif num==2:return 'D'elif num==3:return 'R'elif num==4:return 'L'def randMove(self):if self.step<=0:self.direction=self.randDirection()self.step=30else:self.move()self.step -=1def shot(self):if random.randint(1,50)==1:return Bullet(self)def hitMyTank(self):if pygame.sprite.collide_rect(self,MainGame.Tank_My):self.stay()
class Bullet(BaseItem):def __init__(self,tank):# 方向(坦克方向)self.direction=tank.direction#图片self.images={'U':pygame.image.load("images/MU.gif"),'D': pygame.image.load("images/MD.gif"),'R': pygame.image.load("images/MR.gif"),'L': pygame.image.load("images/ML.gif"),}self.image=self.images[tank.direction]#位置self.rect=self.image.get_rect()if self.direction=='U':self.rect.left=tank.rect.left+tank.rect.width/2-self.rect.width/2self.rect.top+=tank.rect.top-self.rect.heightelif self.direction=='D':self.rect.left=tank.rect.left+tank.rect.width/2-self.rect.width/2self.rect.top+=tank.rect.top+tank.rect.heightelif self.direction == 'R':self.rect.left = tank.rect.left + tank.rect.widthself.rect.top += tank.rect.top + tank.rect.height/2-self.rect.height/2elif self.direction == 'L':self.rect.left = tank.rect.left - self.rect.widthself.rect.top += tank.rect.top + tank.rect.height/2-self.rect.height/2#速度self.speed=7self.live=Truedef move(self):if self.direction=='U':if self.rect.top>0:self.rect.top-=self.speedelse:self.live=Falseelif self.direction=='D':if self.rect.top+self.rect.height<MainGame.SCREEN_HEIGHT:self.rect.top+=self.speedelse:self.live=Falseelif self.direction=='R':if self.rect.left+self.rect.width<MainGame.SCREEN_WIDTH:self.rect.left+=self.speedelse:self.live=Falseelif self.direction=='L':if self.rect.left-self.rect.width>0:self.rect.left-=self.speedelse:self.live=Falsedef displayBullet(self):MainGame.window.blit(self.image,self.rect)def hitEnemyTank(self):for eTank in MainGame.EnemyTank_list:if pygame.sprite.collide_rect(eTank,self):explode=Explode(eTank)MainGame.Explode_list.append(explode)self.live=FalseeTank.live=FalseExplode.displayExplode(eTank)def hitMyTank(self):if pygame.sprite.collide_rect(MainGame.Tank_My,self):explode=Explode(MainGame.Tank_My)MainGame.Explode_list.append(explode)MainGame.Tank_My.live=Falseself.live=Falsedef hitWalls(self):for wall in MainGame.Wall_list:if pygame.sprite.collide_rect(wall,self):self.live=Falseif wall.hp>0:wall.hp-=1else:wall.live=False
class Explode():def __init__(self,tank):self.rect=tank.rectself.step=0self.images=[pygame.image.load('images/0.gif'),pygame.image.load('images/1.gif'),pygame.image.load('images/2.gif'),pygame.image.load('images/3.gif'),pygame.image.load('images/4.gif'),pygame.image.load('images/5.gif'),pygame.image.load('images/6.gif'),pygame.image.load('images/7.gif')]self.live=Trueself.image=self.images[self.step ]def displayExplode(self):if self.step<len(self.images):self.image=self.images[self.step]MainGame.window.blit(self.image, self.rect)self.step+=1else:self.step=0self.live=False
class Wall():def __init__(self,left,top):self.image=pygame.image.load('images/wall.gif')self.rect=self.image.get_rect()self.rect.left=leftself.rect.top=topself.live=Trueself.hp=3def displayWall(self):MainGame.window.blit(self.image,self.rect)
class Music():def __init__(self,filename):self.filename=filenamepygame.mixer.init()pygame.mixer.music.load(self.filename)def play(self):pygame.mixer.music.play()MainGame().startgame()

附录

思维导图(自己制作,存在漏写和不规范问题):

需要更多格式图片(.svg/.jpg/.xmind)以及代码、游戏所需图片和音频的朋友,可以通过百度网盘自行下载:链接:https://pan.baidu.com/s/1W9yAfdmIDubvv2wO60HXeg
提取码:0226

#如有侵权立马删除

坦克大战(Python)附思维导图、代码、图片音频资源相关推荐

  1. 2312、卖木头块 | 面试官与狂徒张三的那些事(leetcode,附思维导图 + 全部解法)

    零 标题:算法(leetcode,附思维导图 + 全部解法)300题之(2312)卖木头块 一 题目描述 二 解法总览(思维导图) 三 全部解法 面试官:看你准备得差不多了,我们开始面试吧. 狂徒张三 ...

  2. 一份小白前端可视化学习指南——附思维导图

    一份小白前端可视化学习指南--附思维导图 前言 因为群里粉丝一直要求我写一篇「可视化入门指南」,今天他来了.其实说起前端可视化,大家所能想到的就是各种图表,大屏.这种看着贼炫酷,而笔者呢工作也一直从事 ...

  3. 36、有效的数独 | 算法(leetode,附思维导图 + 全部解法)300题

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(36)有效的数独 前言 1)码农三少 ,一个致力于 编写极简.但齐全题解(算法) 的博主. 2)文末附赠 价值上百美刀 资料. 一 ...

  4. 软件工程导论第五章复习总结附思维导图及部分习题答案

    软件工程导论第五章复习总结附思维导图及部分习题答案 总体设计 一.设计过程 1.设想提供选择的方案 2.选取合理的方案 3.推荐最佳方案 4.功能分解 5.设计软件结构 6.设计数据库 7.制定测试计 ...

  5. 计网复习笔记【附思维导图】——【2】应用层

    计网复习笔记[附思维导图]--[2]应用层 计网 应用层 2.1 应用层协议原理 位置 应用层协议含义 应用层协议类型 网络应用程序架构 进程通信 网络应用需要的运输层服务 Internet提供的运输 ...

  6. 众包数据库管理、时空众包、移动群智感知方向的综述整理——附思维导图

    众包数据库管理.时空众包.移动群智感知方向的综述整理--附思维导图 论文介绍 众包数据库管理 时空众包 移动群智感知 总结 论文介绍 该方向的发展主要分为三个模块:时空众包.群智感知.众包数据库管理: ...

  7. python课程思维导图_零基础Python学习思维导图,记得收藏

    原标题:零基础Python学习思维导图,记得收藏 本文主要涵盖了 Python 编程的核心知识(暂不包括标准库及第三方库). 1.按顺序依次展示了以下内容的一系列思维导图:基础知识,数据类型(数字,字 ...

  8. python基础思维导图

    python基础思维导图

  9. 软件工程导论第三章复习总结附思维导图

    软件工程导论第三章复习总结附思维导图 概述 准确回答"系统必须做什么" 必须理解并描述问题的信息域,根据这条准则应该建立数据模型 必须定义软件应该完成的功能,这条准则要求建立功能模 ...

  10. 投基取巧:如何选择基金及构建投资组合?基金投资进阶经验分享,附思维导图!

    之前发了一个 Chat"投基取巧:如何通过基金投资获得 20%+ 的收益?基金理财干货分享,附思维导图!",不少网友看后跟我联系反馈,有没有更高阶的基金投资的经验分享,比如:具体到 ...

最新文章

  1. 小米9拍照黑科技:基于NAS的图像超分辨率算法
  2. 牛客网--整数与IP地址间的转换
  3. Leetcode-整数反转 C++
  4. append导致TypeError: 'NoneType' object is not iterable
  5. 汽车系统实现--搜索功能
  6. java基本变量的堆栈_JAVA经验谈:尽可能使用堆栈变量
  7. MySQL:BlackHole
  8. 排队论的计算机模拟,8.2 排队论模型(二)-----计算机模拟.pdf
  9. 微软商店常见的几个问题
  10. java课程设计通讯录_java课程设计(通讯录管理软件源代码)
  11. 哈工大计算机系统2022春 大作业 程序人生
  12. Tomcat 服务器搭建
  13. MySql 如何查询某一天内的数据
  14. 求最小公倍数(扩展版)
  15. 12 Go 并发调度器模型
  16. lstm和GRU结构图
  17. 【shaderforge学习笔记】 UVTile节点
  18. 为什么要对数据进行归一化处理
  19. 2-3 CAD基础 删除(erase)
  20. PW2051降压型DC/DC调整器芯片

热门文章

  1. eclipse 如何查看Java源码
  2. 太极助手发公开信解释越狱捆绑原因
  3. DirectX Repair
  4. 场景文字检测——CTPN模型介绍及代码实现
  5. 控制Dell服务器的风扇转速
  6. 萌萌机器人布娃娃图片_萌萌机器人教程
  7. JAVA程序员--壁纸
  8. 含泪推荐几款超级好用的软件
  9. 运输问题的表上作业法
  10. wps日期加减算天数_日期相减之后的天数怎么用公式计算 - 卡饭网