找回密码
 会员注册
查看: 16|回复: 0

Python的魅力:利用Pygame实现游戏坦克大战——含完整源码

[复制链接]

8

主题

0

回帖

25

积分

新手上路

积分
25
发表于 2024-9-9 12:58:48 | 显示全部楼层 |阅读模式
文章目录一、游戏运行效果二、代码实现2.1项目搭建2.2加载我方坦克2.3加载敌方坦克2.4添加爆炸效果2.5坦克大战之音效处理三、完整代码一、游戏运行效果二、代码实现坦克大战游戏2.1项目搭建本游戏主要分为两个对象,分别是我方坦克和敌方坦克。用户可以通过控制我方的坦克来摧毁敌方的坦克保护自己的“家”,把所有的敌方坦克消灭完达到胜利。敌方的坦克在初始的时候是默认5个的(这可以自己设置),当然,如果我方坦克被敌方坦克的子弹打中,游戏结束。从面向对象分析该项目有以下类组成:主类:主要包括开始游戏、结束游戏的功能。classMainGame():def__init__(self):pass#开始游戏defstartGame(self):pass#结束游戏defendGame(self):pass123456789'运行运行坦克类:主要包括坦克的创建、显示、移动及射击的功能。classTank():def__init__(self):pass#移动defmove(self):pass#射击defshot(self):pass#展示坦克的方法defdisplayTank(self):pass123456789101112'运行运行我方坦克类继承坦克类,主要包括创建、与敌方坦克的碰撞方法。#我方坦克classMyTank(Tank):def__init__(self):pass1234敌方坦克类继承坦克类,主要包括创建、与我方坦克碰撞方法。#敌方坦克classEnemyTank(Tank):def__init__(self):pass1234子弹类:主要包括子弹的创建、显示及移动的功能。#子弹类classBullet():def__init__(self):pass#移动defmove(self):pass#展示子弹的方法defdisplayBullet(self):pass12345678910'运行运行墙壁类:主要包括墙壁的创建、显示的功能。classWall():def__init__(self):pass#展示墙壁的方法defdisplayWall(self):pass123456'运行运行爆炸效果类:主要展示爆炸效果。classExplode():def__init__(self):pass#展示爆炸效果的方法defdisplayExplode(self):pass123456'运行运行音效类:主要播放音乐。classMusic():def__init__(self):pass#播放音乐defplay(self):pass123456'运行运行显示游戏窗口在游戏设计的前期,要先创建游戏的界面,也就是要为所设计的游戏创建一个窗口。【示例】:显示游戏窗口defstartGame(self):#加载主窗口#初始化窗口pygame.display.init()#设置窗口的大小及显示MainGame.window=pygame.display.set_mode([SCREEN_WIDTH,SCREEN_HEIGHT])#设置窗口的pygame.display.set_caption('坦克大战1.03')whileTrue:#给窗口设置填充色MainGame.window.fill(BG_COLOR)pygame.display.update()MainGame().startGame()12345678910111213运行效果:添加提示文字在运行代码时会发现,创建的窗口没有任何提示。然而在实际中希望窗口提示敌方坦克的数量,因此,需要在现有窗口进行必须的改进,添加敌方坦克数量提示。#文字显示defgetTextSuface(self,text):pygame.font.init()#字体初始化font=pygame.font.SysFont('kaiti',16)#绘制文字信息textSurface=font.render(text,True,TEXT_COLOR)returntextSurface1234567'运行运行2.2加载我方坦克通过加载一张图片来表示游戏中的坦克,此坦克代表我方坦克,完善坦克类。classTank():#添加距离左边left距离上边topdef__init__(self,left,top):#保存加载的图片self.images={'U':pygame.image.load('img/p1tankU.gif'),'D':pygame.image.load('img/p1tankD.gif'),'L':pygame.image.load('img/p1tankL.gif'),'R':pygame.image.load('img/p1tankR.gif'),}#方向self.direction='L'#根据当前图片的方向获取图片surfaceself.image=self.images[self.direction]#根据图片获取区域self.rect=self.image.get_rect()#设置区域的left和topself.rect.left=leftself.rect.top=top12345678910111213141516171819'运行运行添加事件监听上面创建的坦克还不能动,显示不是创建游戏的目的,因此,要给创建的坦克赋予“生命”。添加事件监听,控制上、下、左、右四个方向键,实现针对不同的键改变坦克的方向及移动功能,点击关闭退出游戏。实现退出方法:#结束游戏defendGame(self):print('游戏结束')exit()#退出游戏1234坦克类中添加移动开关属性,按下上、下、左、右四个方向键修改坦克的方向及开关状态,按下关闭键,调用关闭方法退出游戏。#获取程序期间所有事件(鼠标事件,键盘事件)defgetEvent(self):#获取所有事件eventList=pygame.event.get()#遍历事件foreventineventList:#判断按下的键是关闭还是键盘按下#如果按的是退出,关闭窗口ifevent.type==pygame.QUIT:self.endGame()#如果是键盘的按下ifevent.type==pygame.KEYDOWN:#判断按下的是上、下、左、右ifevent.key==pygame.K_LEFT:print('按下左键,坦克向左移动')elifevent.key==pygame.K_RIGHT:print('按下右键,坦克向右移动')elifevent.key==pygame.K_UP:print('按下上键,坦克向上移动')elifevent.key==pygame.K_DOWN:print('按下左键,坦克向下移动')123456789101112131415161718192021按下上、下、左、右之后控制台上会打印对应的信息。随机生成敌方坦克初始化敌方坦克,随机在不同坐标生成敌方坦克。#敌方坦克classEnemyTank(Tank):def__init__(self,left,top,speed):super(EnemyTank,self).__init__(left,top)#加载图片集self.images={'U':pygame.image.load('img/enemy1U.gif'),'D':pygame.image.load('img/enemy1D.gif'),'L':pygame.image.load('img/enemy1L.gif'),'R':pygame.image.load('img/enemy1R.gif'),}#随机生成方向self.direction=self.randDirection()self.image=self.images[self.direction]#根据方向获取图片self.rect=self.image.get_rect()#获取区域self.rect.left,self.rect.top=left,top#对left和top赋值self.speed=speed#速度self.flag=True#坦克移动开关self.step=50#敌方坦克步数123456789101112131415161718192.3加载敌方坦克在MainGame类中创建敌方坦克:defcreateEnemyTank(self):#初始化敌方坦克,将敌方坦克添加到列表中top=100foriinrange(self.enemyTankCount):#生成指定敌方坦克数量left=random.randint(0,600)speed=random.randint(1,4)enemy=EnemyTank(left,top,speed)MainGame.enemyTankList.append(enemy)1234567'运行运行在敌方坦克类中实现敌方坦克的随机移动defrandMove(self):#坦克的随机方向移动ifself.step0:self.rect.left-=self.speedelifself.direction=='U':ifself.rect.top>0:self.rect.top-=self.speedelifself.direction=='D':ifself.rect.top+self.rect.height0:self.rect.top-=self.speedelse:self.live=False#修改子弹的状态elifself.direction=='R':ifself.rect.left+self.rect.width0:self.rect.left-=self.speedelse:self.live=False#修改子弹的状态defhitWall(self):forwallinMainGame.WallList:#循环遍历墙壁列表ifpygame.sprite.collide_rect(self,wall):#检测子弹是否碰撞墙壁self.live=False#修改子弹状态wall.hp-=1#碰撞后墙壁生命值减少ifwall.hp
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 06:05 , Processed in 0.457947 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表