首先,我们得分析这个项目的结构,设计出它的框架

坦克大战游戏项目开发

需求分析

1.分析项目需要多少个类

2.分析每个类有哪些方法

1.坦克类(敌方坦克,我方坦克)

移动、射击、展示

2.子弹类

移动、展示

3.墙壁类

属性:是否可以通过

4.爆炸效果类

展示

5.音效类

播放音乐

6.主类

开始游戏

结束游戏

好了,直接上代码,不用担心看不懂,几乎每行都会有注释

import pygame
import time
import random
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
BG_COLOR = pygame.Color(0,0,0)
TEXT_COLOR = pygame.Color(255,0,0)
#定义一个基类
class BaseItem(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)class MainGame():window = Nonemy_tank = None#存储敌方坦克的列表enemyTankList = []#定义敌方坦克的数量enemyTankCount = 5#我方坦克子弹列表myBulletList = []#敌方坦克子弹列表enemyBulletList = []#坦克爆效果列表explodeList = []#墙壁列表wallList = []def __init__(self):pass#开始游戏def startGame(self):#加载主窗口#创建窗口对象pygame.display.init()#设置窗口的大小及显示MainGame.window = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])#创建我方坦克self.creatMyTank()#初始化敌方坦克,并添加到列表中self.creatEnemyTank()# 初始化墙壁self.creatWall()#设置窗口标题pygame.display.set_caption('坦克大战1.0')while True:#让坦克的速度慢一点time.sleep(0.05)#给窗口设置填充色MainGame.window.fill(BG_COLOR)#获取事件self.getevent()#绘制文字MainGame.window.blit(self.getTextSurface('敌方坦克剩余数量:%d'%len(MainGame.enemyTankList)),(10,10))#调用显示坦克的方法#判断我方坦克是否存活if MainGame.my_tank and MainGame.my_tank.live:MainGame.my_tank.displayTank()else:#删除我方坦克del MainGame.my_tankMainGame.my_tank = None#循环坦克列表,进行展示self.blitEnemyTank()#循环我方子弹列表,进行展示self.blitMyBullet()# 循环敌方子弹列表,进行展示self.blitEnemyBullet()# 循环爆炸效果列表,进行展示self.blitExplode()# 循环墙壁列表,进行展示self.blitWall()#调用坦克移动的方法#如果坦克的开关是开 才可以启动if MainGame.my_tank and MainGame.my_tank.live:if not MainGame.my_tank.stop:MainGame.my_tank.move()#检测我方坦克是否与墙体发生碰撞MainGame.my_tank.tank_hit_wall()#检测我方坦克是否与敌方坦克发生碰撞MainGame.my_tank.myTank_hit_enemyTank()pygame.display.update()# 循环墙壁列表,进行展示def blitWall(self):for wall in MainGame.wallList:if wall.live:wall.displayWall()else:MainGame.wallList.remove(wall)# 初始化墙壁def creatWall(self):for i in range(6):wall = Wall(i*150,230)MainGame.wallList.append(wall)def creatMyTank(self):MainGame.my_tank = MyTank(300, 300)#初始化音乐music = Music('img/start.wav')#播放音乐music.play()# 循环爆炸效果列表,进行展示def blitExplode(self):for explode in MainGame.explodeList:#判断是否活着if explode.live:explode.displayExplode()else:MainGame.explodeList.remove(explode)#循环敌方坦克列表,进行展示def blitEnemyBullet(self):for EnenmyBullet in MainGame.enemyBulletList:# 判断当前子弹是否存活,是的话则展示if EnenmyBullet.live:EnenmyBullet.displayBullet()# 调用子弹移动的方法EnenmyBullet.move()#调用敌方子弹击中我方坦克的方法EnenmyBullet.enemyBullet_hit_myTank()#调用子弹碰撞墙壁的方法EnenmyBullet.bullet_hit_wall()else:# 删除子弹MainGame.enemyBulletList.remove(EnenmyBullet)# 循环我方子弹列表,进行展示def blitMyBullet(self):for MyBullet in MainGame.myBulletList:#判断当前子弹是否存活,是的话则展示if MyBullet.live:MyBullet.displayBullet()# 调用子弹移动的方法MyBullet.move()#调用我们子弹与敌方坦克发生碰撞的方法if MainGame.my_tank and MainGame.my_tank.live:MyBullet.myBullet_hit_enemyTank()# 调用子弹碰撞墙壁的方法MyBullet.bullet_hit_wall()else:#删除子弹MainGame.myBulletList.remove(MyBullet)#循环敌方坦克列表进行展示def blitEnemyTank(self):for enemyTank in MainGame.enemyTankList:#判断敌方坦克状态是否存活if enemyTank.live:enemyTank.displayTank()enemyTank.randMove()# 调用检测敌方坦克是否与墙体发生碰撞enemyTank.tank_hit_wall()# 调用检测敌方坦克是否与我方坦克发生碰撞if MainGame.my_tank and MainGame.my_tank.live:enemyTank.enemyTank_hit_MyTank()# 发射子弹enemyBullet = enemyTank.shoot()# 判断子弹的是否为Noneif enemyBullet:# 将敌方坦克子弹存储到子弹列表中MainGame.enemyBulletList.append(enemyBullet)else:MainGame.enemyTankList.remove(enemyTank)# 初始化敌方坦克,并添加到列表中def creatEnemyTank(self):top = 100#循环生成敌方坦克for i in range(MainGame.enemyTankCount):left = random.randint(1,700)speed = random.randint(1,7)enemy = EnemyTank(left,top,speed)MainGame.enemyTankList.append(enemy)#结束游戏def endGame(self):print('谢谢,欢迎下次使用')exit()#左上角的文字绘制def getTextSurface(self,text):#初始化字体模块pygame.font.init()#查看所有字体名称# print(pygame.font.get_fonts())#获取字体对象font = pygame.font.SysFont('kaiti',18)#绘制文本信息textSurface = font.render(text,True,TEXT_COLOR)return textSurfacedef getevent(self):#获取所有事件event_list = pygame.event.get()for event in event_list:#判断按下的是关闭还是键盘按下#如果是退出,关闭窗口if event.type == pygame.QUIT:self.endGame()#如果是键盘的按下if event.type == pygame.KEYDOWN:#当我方坦克不存在死亡时if not MainGame.my_tank:#判断按下的键是否ESC,是则重生if event.key == pygame.K_ESCAPE:self.creatMyTank()if MainGame.my_tank and MainGame.my_tank.live:# 判断按下的是上下左右if event.key == pygame.K_LEFT:# 切换方向MainGame.my_tank.direction = 'L'MainGame.my_tank.stop = False# MainGame.my_tank.move()print('按下的是左键,坦克向左移动')elif event.key == pygame.K_RIGHT:# 切换方向MainGame.my_tank.direction = 'R'MainGame.my_tank.stop = False# MainGame.my_tank.move()print('按下的是右键,坦克向右移动')elif event.key == pygame.K_UP:# 切换方向MainGame.my_tank.direction = 'U'MainGame.my_tank.stop = False# MainGame.my_tank.move()print('按下的是上键,坦克向上移动')elif event.key == pygame.K_DOWN:# 切换方向MainGame.my_tank.direction = 'D'MainGame.my_tank.stop = False# MainGame.my_tank.move()print('按下的是下键,坦克向下移动')elif event.key == pygame.K_SPACE:print('发射子弹')if len(MainGame.myBulletList) < 3:myBullet = Bullet(MainGame.my_tank)MainGame.myBulletList.append(myBullet)#加载音乐music = Music('img/fire.wav')music.play()#松开按键,坦克停止移动,修改坦克开关if event.type == pygame.KEYUP:#判断松开的是上下左右才停止移动if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == pygame.K_UP or event.key == pygame.K_DOWN:if MainGame.my_tank and MainGame.my_tank.live:MainGame.my_tank.stop = Trueclass Tank(BaseItem):#添加距离左边left,距离上边topdef __init__(self,left,top):#保存加载的图片self.images = {'U':pygame.image.load('img/p1tankU.gif'),'R':pygame.image.load('img/p1tankR.gif'),'L':pygame.image.load('img/p1tankL.gif'),'D':pygame.image.load('img/p1tankD.gif')}#方向self.direction = 'U'#根据当前图片方向获取图片的 surfaceself.image = self.images[self.direction]#根据图片获取区域self.rect = self.image.get_rect()#设置区域的 left 和 topself.rect.left = leftself.rect.top = top#速度 决定移动的快慢self.speed = 10#坦克的开关self.stop = True#坦克存活状态self.live = True#坦克原来的坐标self.oldleft = self.rect.leftself.oldtop = self.rect.top#移动def move(self):# 坦克原来的坐标self.oldleft = self.rect.leftself.oldtop = self.rect.top#判断坦克的方向进行移动if self.direction == 'L':if self.rect.left >0:self.rect.left -= self.speedelif self.direction == 'R':if self.rect.left + self.rect.height < 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 < SCREEN_HEIGHT:self.rect.top += self.speed#射击def shoot(self):return  Bullet(self)def stay(self):self.rect.left = self.oldleftself.rect.top = self.oldtop#坦克与墙体发生碰撞def tank_hit_wall(self):for wall in MainGame.wallList:if pygame.sprite.collide_rect(self,wall):#修改坦克的位置self.stay()#展示def displayTank(self):#获取展示的对象self.image = self.images[self.direction]#调用blit方法展示MainGame.window.blit(self.image,self.rect)class MyTank(Tank):def __init__(self,left,top):super(MyTank,self).__init__(left,top)pass#检测我方坦克与敌方坦克发生碰撞def myTank_hit_enemyTank(self):for enemy in MainGame.enemyTankList:if pygame.sprite.collide_rect(self,enemy):self.stay()class EnemyTank(Tank):def __init__(self,left,top,speed):#调用父类的初始化方法super(EnemyTank,self).__init__(left,top)#加载图片集self.images = {'U':pygame.image.load('img/enemy1U.gif'),'R':pygame.image.load('img/enemy1R.gif'),'L':pygame.image.load('img/enemy1L.gif'),'D':pygame.image.load('img/enemy1D.gif')}#方向 随机生成敌方坦克的方向self.direction = self.randDirection()#根据方向获取图片self.image = self.images[self.direction]#区域self.rect = self.image.get_rect()#对left和top赋值self.rect.left = leftself.rect.top = top#速度self.speed = speed#移动开关self.flag = True#步数self.step = 30#敌方坦克与我方坦克发生碰撞def enemyTank_hit_MyTank(self):if pygame.sprite.collide_rect(self,MainGame.my_tank):self.stay()#随机生成敌方坦克的方向def randDirection(self):num = random.randint(1,4)if num == 1:return 'U'elif num == 2:return 'R'elif num == 3:return 'L'elif num == 4:return 'D'def randMove(self):if self.step <=0:#修改方向self.direction = self.randDirection()#恢复步数self.step = 40else:self.move()#步数递减self.step -= 1#重写shootdef shoot(self):num = random.randint(1,100)if num <= 5:return Bullet(self)class Explode():def __init__(self,tank):#爆炸效果位置由坦克被击中的位置决定self.rect = tank.rect#加载图片self.images = [pygame.image.load('img/blast0.gif'),pygame.image.load('img/blast1.gif'),pygame.image.load('img/blast2.gif'),pygame.image.load('img/blast3.gif'),pygame.image.load('img/blast4.gif')]self.step = 0self.image = self.images[self.step]self.live = True#展示爆炸效果def displayExplode(self):if self.step < len(self.images):#根据索引获取爆炸对象self.image = self.images[self.step]self.step += 1#添加到主窗口MainGame.window.blit(self.image,self.rect)else:#修改活着的状态self.live = Falseself.step = 0class Wall():def __init__(self,left,top):#加载图片self.image = pygame.image.load('img/steels.gif')#获取区域self.rect = self.image.get_rect()#设置位置self.rect.left = leftself.rect.top = top#设置存活状态self.live = True#设置生命值self.hp = 5#展示墙的效果def displayWall(self):MainGame.window.blit(self.image,self.rect)class Music():def __init__(self,filename):self.filename = filename#初始化混合器的方法pygame.mixer.init()#加载音乐pygame.mixer.music.load(self.filename)#播放音乐def play(self):pygame.mixer.music.play()class Bullet(BaseItem):def __init__(self,tank):#加载图片self.image = pygame.image.load('img/enemymissile.gif')#坦克的方向决定子弹的方向self.direction = tank.direction#获取区域self.rect = self.image.get_rect()#子弹的left和top和坦克方向有关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 == 'L':self.rect.left = tank.rect.left - self.rect.width / 2 - self.rect.width / 2self.rect.top = tank.rect.top + tank.rect.width / 2 - self.rect.width / 2elif self.direction == 'R':self.rect.left = tank.rect.left + tank.rect.widthself.rect.top = tank.rect.top + tank.rect.width / 2 - self.rect.width / 2# 速度self.speed = 10# 用来记录子弹是否活着self.live = True#移动def move(self):if self.direction == 'U':if self.rect.top >0:self.rect.top -= self.speedelse:#碰到墙壁,修改存活状态self.live = Falseelif self.direction == 'R':if self.rect.left + self.rect.width < SCREEN_WIDTH:self.rect.left += self.speedelse:# 碰到墙壁,修改存活状态self.live = Falseelif self.direction == 'L':if self.rect.left >0:self.rect.left -= self.speedelse:# 碰到墙壁,修改存活状态self.live = Falseelif self.direction == 'D':if self.rect.top + self.rect.height < SCREEN_HEIGHT:self.rect.top += self.speedelse:# 碰到墙壁,修改存活状态self.live = False# 我方子弹与敌方坦克发生碰撞def myBullet_hit_enemyTank(self):# 遍历敌方坦克的列表,判断是否发生碰撞for enemyTank in MainGame.enemyTankList:if pygame.sprite.collide_rect(enemyTank, self):# 修改敌方坦克和我方子弹的状态enemyTank.live = Falseself.live = False#创建爆炸对象explode = Explode(enemyTank)#将爆炸对象添加到列表中MainGame.explodeList.append(explode)#敌方子弹与我方坦克发生碰撞def enemyBullet_hit_myTank(self):if MainGame.my_tank and MainGame.my_tank.live:if pygame.sprite.collide_rect(MainGame.my_tank, self):# 创建爆炸对象explode = Explode(MainGame.my_tank)# 将爆炸对象添加到列表中MainGame.explodeList.append(explode)# 修改我方坦克和敌方方子弹的状态MainGame.my_tank.live = Falseself.live = False#子弹与墙发生碰撞def bullet_hit_wall(self):#循环墙的列表for wall in MainGame.wallList:if pygame.sprite.collide_rect(self,wall):#修改子弹的状态self.live = False#修改墙的生命值wall.hp -= 1if wall.hp <= 0:#修改墙的状态wall.live = False#展示def displayBullet(self):MainGame.window.blit(self.image,self.rect)if __name__ == '__main__':MainGame().startGame()# MainGame().getTextSuface()

最终效果如下

ps:代码中的敌方坦克数量,墙体数量等都是自定义的,我方坦克阵亡后按ESC键重生!

以上代码中的图片素材与py文件必须要对应!

以上代码中的图片素材与py文件必须要对应!

以上代码中的图片素材与py文件必须要对应!

重要的事情说三遍!

游戏里的素材私信我

用pygame做经典坦克大战游戏(附源码)相关推荐

  1. 【Java游戏开发】坦克大战(附源码+课件+资料)

    本课程讲解了一个坦克大战游戏的详细编写流程,即使你是刚入门java的新手,只要你简单掌握了该游戏所需要的javase基础知识,便可以跟随教程视频完成属于你自己的坦克大战游戏!同时还可以加深和巩固你对面 ...

  2. Python实现坦克大战(附源码)

    基于pygame的坦克大战小游戏 目录 基于pygame的坦克大战小游戏 一:开发环境 二.项目介绍 2.1完成功能: 2.2项目截图 : 2.3项目文件 一:开发环境 我们先来看看我的开发环境,用的 ...

  3. 纯Java实现坦克大战游戏,源码公开

    文章目录 前言 一.源码 二.成员类 前言 近日最做项目,很多网友在问题是否有游戏的代码分享,故总结了去年开发的一款小游戏坦克大战,源码公开,大家一起研究改进 * 功能:坦克大战游戏* 1.画出我的坦 ...

  4. Java项目开发—坦克大战(附源码)

    今天给小伙伴们分享一个坦克大战游戏的详细编写流程,即使你是刚入门java的新手,只要你简单掌握了该游戏所需要的javase基础知识,便可以跟随教程视频完成属于你自己的坦克大战游戏!同时还可以加深和巩固 ...

  5. 经典坦克大战1990--Windows下源码编译运行,培养编程兴趣,提高项目经验和能力

    1 介绍 ✨ 该经典坦克大战1990版,由C/C++编写,源码来自于GitHub的大佬krystiankaluzny,本文仅提供Windows下的编译&运行详细步骤,以供爱好者在此基础上进行开 ...

  6. Java项目-坦克大战(附源码+文档)

    今天给小伙伴们分享一个坦克大战游戏的详细编写流程,即使你是刚入门java的新手,只要你简单掌握了该游戏所需要的javase基础知识,便可以跟随教程视频完成属于你自己的坦克大战游戏!同时还可以加深和巩固 ...

  7. JAVA飞机大战游戏附源码

    JAVA飞机大战附源码 java飞机大战 效果图如下 java飞机大战 话不多说 直接上源码 窗体部分 package UI; //自定义窗体 //创建类 继承JFrame //创建构造方法,设置窗体 ...

  8. QT FC坦克大战(附源码)

    QT FC坦克大战 QT设计的类似FC坦克大战的程序.暂时只完成了单人模式,双人模式可以后续自行添加. 源码以及图片音频资源下载地址:QTFC坦克大战(C++)-C++文档类资源-CSDN下载 Tan ...

  9. python调用pygame_python使用pygame模块实现坦克大战游戏

    本文实例为大家分享了pygame模块实现坦克大战游戏的具体代码,供大家参考,具体内容如下 首先,第一步,游戏简单素材的准备. 炮弹, 炮弹,坦克移动.音乐-开火素材. 其次,思路整理. 我们需要几个类 ...

最新文章

  1. 面试干货——年底干货大放送,你准备好了吗?
  2. angular5 httpclient的示例实战
  3. 教你用java统计目录下所有文档的词频
  4. [云炬创业基础笔记]第五章创业机会评估测试7
  5. 红亚科技联手董付国老师开启Python实训教育新篇章
  6. java画笔覆盖在界面_Java画笔的简单实用方法
  7. 文件操作命令(replace)
  8. Servlet生成动态验证码
  9. linux学习笔记-文件属性基本知识
  10. 1.并发问题产生的三大根源与解决sync锁 目录 1. 并发问题产生的三大根源 1 1.1. 原子性 CPU缓存会导致可见问题 指令重排序 1 2. 并发问题根源之一:CPU切换线程执导致的
  11. 菜鸟AJAX 教程和JSON
  12. 华丽的Flutter的demo----新闻阅读+音乐+短视频+小说
  13. pc android 凤凰,应用多开,这才是最适用电脑的安卓—凤凰系统2.0
  14. 电源设计2【DC/DC、PCB设计】
  15. 【数字图像处理】前期准备工作,库的安装(skimage库的安装!)
  16. 如何用火狐浏览器firefox模拟手机浏览器客户端
  17. 压力传感器的种类与工作原理
  18. 华为手机如何用微信与电脑连接服务器,华为手机也能连接苹果电脑,只需这样做...
  19. 企业微信聊天记录如何备份?企业微信如何导出聊天记录?
  20. PCIE Feature ------ INTx

热门文章

  1. OMV搭建系列教程[6] – 安装AriaNG Web前端
  2. 经典搜索算法之B树与B+树
  3. 支持OnVif协议的摄像头直播推流php
  4. 为什么用线程池?解释下线程池参数?
  5. python分析方向的第三方库_Python 机器学习方向的第三方库是
  6. 织梦免费网站模板手机端无法更新的原因及解决
  7. 在线生成安卓签名证书
  8. 中职学校计算机教学探讨,中职学校计算机课程教学方法的探讨.doc
  9. python鼠标监听_用Python监听鼠标和键盘事件
  10. Linux Socket接口使用方法