好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

基于python实现坦克大战游戏

今天带来基于python实现坦克大战游戏教程详解

本文实例为大家分享了python实现坦克大战游戏的具体代码,供大家参考,具体内容如下

游戏界面

pygame游戏引擎的安装

pip安装

windows + R --> cmd --> 命令行输入 pip install 模块名==版本号

pycharm中安装

File --> setting --> Project --> Project Interpreter --> 右侧 + install --> 搜索框输入pygame --> 下方 installPackage

面向对象分析

分析组成类

实现框架的搭建(类的设计) 主逻辑类 坦克类 我方坦克 敌方坦克 子弹类 爆炸类 墙壁类 音效类

框架搭建

import pygame #主逻辑类 class MainGame(): def startGame(self): pass def gameOver(self): pass #基本坦克类 class BaseTank(): pass #我方坦克类 class MyTank(): pass #敌方坦克类 class EnemyTank(): pass #子弹类 class Bullet(): pass #爆炸类 class Explode(): pass #墙壁类 class Wall(): pass #音效类 class Audio(): pass game = MainGame() game.startGame()

展示主窗口

import pygame SCREEN_WIDTH = 900 SCREEN_HEIGHT = 550 #主逻辑类 class MainGame(): #游戏主窗口 window = None def startGame(self): #调用窗口初始化方法 pygame.display.init() MainGame.window = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT)) pygame.display.set_caption('坦克大战v1.02') while True: #填充窗口背景色 MainGame.window.fill((0,0,0)) #刷新 pygame.display.update() def gameOver(self): pass

事件监听

class MainGame(): #游戏主窗口 window = None def startGame(self): #调用窗口初始化方法 pygame.display.init() MainGame.window = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT)) pygame.display.set_caption('坦克大战'+VERSION) while True: #填充窗口背景色 MainGame.window.fill((0,0,0)) #调用事件处理方法 self.getEvents() #刷新 pygame.display.update() #所有事件处理的方法 def getEvents(self): #获取队列中所有事件,遍历事件,对type为QUIT以及KEYDOWN两种事件类型处理 eventList = pygame.event.get() #遍历所有事件 for e in eventList: if e.type == pygame.QUIT: #调用游戏结束的方法 self.gameOver() #如果事件类型为按下键盘按键 elif e.type == pygame.KEYDOWN: #根据具体按键做对应处理 if e.key == pygame.K_UP: print("向上移动") elif e.key == pygame.K_DOWN: print("向下移动") elif e.key == pygame.K_LEFT: print("向左移动") elif e.key == pygame.K_RIGHT: print("向右移动") elif e.key == pygame.K_SPACE: print("biubiu~~~") # elif e.type == pygame.MOUSEMOTION: # print(e.pos) def gameOver(self): #结束程序 exit()

显示我方坦克

#我方坦克类 class MyTank(BaseTank): def __init__(self,x,y): super(MyTank, self).__init__() #设置具体的图片集 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 = 'U' #设置坦克的图片 self.image = self.images[self.direction] #先基于图像获取坦克的位置以及大小 self.rect = self.image.get_rect() #修改坦克坐标,改成自定义位置 self.rect.centerx = x self.rect.centery = y def displayTank(self): self.image = self.images[self.direction] MainGame.window.blit(self.image,self.rect)

实现我方坦克的移动

坦克类中,实现移动方法

def move(self): #移动,基于速度在指定的方向进行移动 if self.direction == 'U': if self.rect.centery > self.rect.height/2: self.rect.centery \= self.speed elif self.direction == 'D': if self.rect.centery self.rect.height/2: self.rect.centerx \= self.speed elif self.direction == 'R': if self.rect.centerx

事件处理方法中新增移动处理

#所有事件处理的方法 def getEvents(self): #获取队列中所有事件,遍历事件,对type为QUIT以及KEYDOWN两种事件类型处理 eventList = pygame.event.get() #遍历所有事件 for e in eventList: if e.type == pygame.QUIT: #调用游戏结束的方法 self.gameOver() #如果事件类型为按下键盘按键 elif e.type == pygame.KEYDOWN: #根据具体按键做对应处理 if e.key == pygame.K_UP: print("向上移动") MainGame.tank1.direction = 'U' MainGame.tank1.move() elif e.key == pygame.K_DOWN: print("向下移动") MainGame.tank1.direction = 'D' MainGame.tank1.move() elif e.key == pygame.K_LEFT: print("向左移动") MainGame.tank1.direction = 'L' MainGame.tank1.move() elif e.key == pygame.K_RIGHT: print("向右移动") MainGame.tank1.direction = 'R' MainGame.tank1.move() elif e.key == pygame.K_SPACE: print("biubiu~~~")

优化移动方式

事件中新增坦克移动开关控制

#所有事件处理的方法 def getEvents(self): #获取队列中所有事件,遍历事件,对type为QUIT以及KEYDOWN两种事件类型处理 eventList = pygame.event.get() #遍历所有事件 for e in eventList: if e.type == pygame.QUIT: #调用游戏结束的方法 self.gameOver() #如果事件类型为按下键盘按键 elif e.type == pygame.KEYDOWN: #根据具体按键做对应处理 if e.key == pygame.K_UP: print("向上移动") MainGame.tank1.direction = 'U' #修改坦克运动状态 MainGame.tank1.stop = False elif e.key == pygame.K_DOWN: print("向下移动") MainGame.tank1.direction = 'D' MainGame.tank1.stop = False elif e.key == pygame.K_LEFT: print("向左移动") MainGame.tank1.direction = 'L' MainGame.tank1.stop = False elif e.key == pygame.K_RIGHT: print("向右移动") MainGame.tank1.direction = 'R' MainGame.tank1.stop = False elif e.key == pygame.K_SPACE: print("biubiu~~~")

主逻辑的循环中优化移动

def startGame(self): #调用窗口初始化方法 pygame.display.init() MainGame.window = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT)) pygame.display.set_caption('坦克大战'+VERSION) #调用创建我方坦克的方法 self.creatMyTank() while True: #填充窗口背景色 MainGame.window.fill((0,0,0)) #调用事件处理方法 self.getEvents() #展示我方坦克 self.showMyTank() if not MainGame.tank1.stop: # 我方坦克移动 MainGame.tank1.move() #刷新 pygame.display.update() #新增,程序休眠,优化坦克移动速度 time.sleep(0.020)

实现敌方坦克的加载

完善敌方坦克类

#敌方坦克类 class EnemyTank(BaseException): #v1.07 def __init__(self,x,y): 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.randomDirection() # 设置坦克的图片 self.image = self.images[self.direction] # 先基于图像获取坦克的位置以及大小 self.rect = self.image.get_rect() # 修改坦克坐标,改成自定义位置 self.rect.centerx = x self.rect.centery = y #v1.07生成坦克的随机方向 def randomDirection(self): num = random.randint(1,4) if num == 1: return 'U' elif num == 2: return 'D' elif num == 3: return 'L' elif num == 4: return 'R' #v1.07将敌方坦克加入到窗口中 def displayTank(self): self.image = self.images[self.direction] MainGame.window.blit(self.image, self.rect)

主逻辑中实现敌方坦克的加载

class MainGame(): #游戏主窗口 window = None tank1 = None #v1.07 新增存储敌方坦克的列表 enemy_tanklist = [] def startGame(self): #调用窗口初始化方法 pygame.display.init() MainGame.window = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT)) pygame.display.set_caption('坦克大战'+VERSION) #调用创建我方坦克的方法 self.creatMyTank() #v1.07调用创建敌方坦克的方法 self.creatEnemyTank() while True: #填充窗口背景色 MainGame.window.fill((0,0,0)) #调用事件处理方法 self.getEvents() #展示我方坦克 self.showMyTank() #v1.07调用展示敌方坦克的方法 self.showEnemyTank() if not MainGame.tank1.stop: # 我方坦克移动 MainGame.tank1.move() #刷新 pygame.display.update() #v1.06新增,程序休眠,优化坦克移动速度 time.sleep(0.020) #创建我方坦克 def creatMyTank(self): MainGame.tank1 = MyTank(SCREEN_WIDTH/2,SCREEN_HEIGHT/3*2) #展示我方坦克 def showMyTank(self): MainGame.tank1.displayTank() #v1.07创建敌方坦克 def creatEnemyTank(self): for i in range(ENEMM_TANK_COUNT): num = random.randint(1,7) etank = EnemyTank(100*num,150) MainGame.enemy_tanklist.append(etank) #v1.07展示敌方坦克 def showEnemyTank(self): for etank in MainGame.enemy_tanklist: etank.displayTank()

运行效果

完整代码

# from pygame import * import pygame,time,random SCREEN_WIDTH = 900 SCRREN_HEIGHT = 600 COLOR_BLACK = pygame.Color(0,0,0) VERSION = 'v2.5' class MainGame(): #游戏窗口 window = None P1 = None #敌方坦克列表 enemyTankList = [] #我方子弹列表 myBulletList = [] #存储敌方子弹 enemyBulletList = [] #存储爆炸效果的列表 bombList = [] #存储墙壁的列表 wallList = [] def __init__(self): self.version = VERSION def startGame(self): print('游戏开始') #初始化展示模块 pygame.display.init() #调用自定义的创建窗口的方法 self.creatWindow() #设置游戏标题 pygame.display.set_caption('坦克大战'+self.version) #调用创建墙壁的方法 self.creatWalls() #调用创建坦克方法 self.creatMyTank() #调用创建敌方坦克 self.creatEnemyTank() while True: #设置游戏背景的填充色 MainGame.window.fill(COLOR_BLACK) #调用展示墙壁的方法 self.showAllWalls() # 调用展示我方坦克的方法 self.showMyTank() #调用展示我方子弹的方法 self.showAllMyBullet() #调用展示所有爆炸效果的方法 self.showAllBombs() #调用展示敌方坦克的方法 self.showEnemyTank() #调用展示敌方子弹的方法 self.showAllEnemyBullet() #调用获取事件,处理事件的方法 self.getAllEvents() #窗口持续刷新以即时显示 pygame.display.update() time.sleep(0.02) def creatWindow(self): MainGame.window = pygame.display.set_mode((SCREEN_WIDTH,SCRREN_HEIGHT)) def getAllEvents(self): #获取所有的事件 event_list = pygame.event.get() for e in event_list: if e.type == pygame.QUIT: #关闭窗口,结束游戏,调用gameOver方法 self.gameOver() elif e.type == pygame.KEYDOWN: print('点击键盘按键') if e.key == pygame.K_SPACE: bullet = MainGame.P1.shot() #控制子弹发射的数量 if len(MainGame.myBulletList) self.rect.height/2: self.rect.centery -= self.speed elif self.direction == 'D': if self.rect.centery self.rect.height/2: self.rect.centerx -= self.speed elif self.direction == 'R': if self.rect.centerx 0: super(EnemyTank, self).move() self.step -= 1 else: #1.生成新的方向 self.direction = self.randDirection() #2.步数还原 self.step = random.randint(25,50) def shot(self): num = random.randint(1,40) if num == 1: b = Bullet(self) MainGame.enemyBulletList.append(b) class Bullet(): def __init__(self,tank): #图片 if isinstance(tank,MyTank): self.image = pygame.image.load('tank-images/tankmissile.gif') else: self.image = pygame.image.load('tank-images/enemymissile.gif') #方向 self.direction = tank.direction #坐标位置 self.rect = self.image.get_rect() #子弹的具体位置 if self.direction == 'U': self.rect.centerx = tank.rect.centerx self.rect.centery = tank.rect.centery - tank.rect.height/2 - self.rect.height/2 elif self.direction == 'D': self.rect.centerx = tank.rect.centerx self.rect.centery = tank.rect.centery + tank.rect.height / 2 + self.rect.height / 2 elif self.direction == 'L': self.rect.centery = tank.rect.centery self.rect.centerx = tank.rect.centerx - tank.rect.height/2 - self.rect.height/2 elif self.direction == 'R': self.rect.centery = tank.rect.centery self.rect.centerx = tank.rect.centerx + tank.rect.height / 2 + self.rect.height / 2 #移动速度 self.speed = 8 #子弹的状态(live) self.live = True def move(self): if self.direction == 'U': #边界控制 if self.rect.centery > 0: self.rect.centery -= self.speed else: self.live = False elif self.direction == 'D': if self.rect.centery 0: self.rect.centerx -= self.speed else: self.live = False elif self.direction == 'R': if self.rect.centerx

更多关于python游戏的精彩文章请点击查看以下专题:

python俄罗斯方块游戏集合

python经典小游戏汇总

python微信跳一跳游戏集合

更多有趣的经典小游戏实现专题,分享给大家:

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

javascript经典小游戏汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学php网。

以上就是关于基于python实现坦克大战游戏全部内容,感谢大家支持自学php网。

查看更多关于基于python实现坦克大战游戏的详细内容...

  阅读:39次