坦克大战小游戏 版本号v1.09

xiaoxiao2025-04-13  16

python 初阶知识

''' v1.09 实现子弹类 ''' import pygame,time,random SCREEN_WIDTH = 900 SCREEN_HEIGHT = 550 VERSION = 'V1.09' # v1.07新增 记录敌方坦克的数量 ENEMY_TANK_COUNT = 5 # 主逻辑类 class MainGame(): # 游戏主窗口 window = None # 我方坦克(唯一性)设置成类属性 tank1 = None # v1.07新增存储敌方坦克的列表 enemy_tanklist = [] # v1.09 新增存储我方子弹的列表 mybullet_list = [] def startGame(self): # 调用窗口初始化方法 pygame.display.init() # 在窗口左上角设置游戏标题 pygame.display.set_caption('坦克大战'+VERSION) # 创建一个窗口屏幕显示表面 MainGame.window = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT)) # 调用创建我方坦克的方法 self.createMytank() # 调用创建敌方坦克的方法 self.createEnemytank() while True: # 填充窗口背景色 MainGame.window.fill((100,100,200)) # 将获取的事件类型在填充完窗口背景色后时刻处于循环中 self.getEvents() # 展示我方坦克 self.showMytank() # 调用展示敌方坦克的方法 self.showEnemyTank() # v1.09 新增调用展示我方子弹的方法 self.showMyBullet() # 更新 pygame.display.update() # v1.06 新增程序休眠,优化坦克的移动速度 time.sleep(0.025) # 获取所有事件处理的方法 def getEvents(self): # 获取队列中的所有事件,遍历事件,对type为QUIT和KEYDOWN的两种事件类型进行处理 eventList = pygame.event.get() # 遍历所有事件 for e in eventList: # 当事件类型是QUIT时,退出游戏 if e.type == pygame.QUIT: self.showMytank() # 退出游戏 self.gameOver() # 当事件类型是KEYDOWN时,进行细化处理 elif e.type == pygame.KEYDOWN: # 按下键盘上的向上按键时的处理 if e.key == pygame.K_UP: print('向上移动') MainGame.tank1.direction = 'U' # v1.06修改坦克的移动状态 MainGame.tank1.stop = False # 按下键盘上的向下按键时的处理 elif e.key == pygame.K_DOWN: print('向下移动') MainGame.tank1.direction = 'D' # v1.06修改坦克的移动状态 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~') # v1.09 新增调用发射方法,并将子弹装进列表 b = MainGame.tank1.shoot() MainGame.mybullet_list.append(b) #v1.06新增按键松开的事件处理 elif e.type == pygame.KEYUP: if e.key == pygame.K_UP or e.key == pygame.K_DOWN or\ e.key == pygame.K_LEFT or e.key == pygame.K_RIGHT: # 将坦克的移动状态改为停止 MainGame.tank1.stop = True # 创建我方坦克 def createMytank(self): # 创建我方坦克并赋予其位置属性坐标 MainGame.tank1 = MyTank(SCREEN_WIDTH/2,SCREEN_HEIGHT/3*2) #展示我方坦克 def showMytank(self): MainGame.tank1.displayTank() # v1.08 新增将 我方坦克移动代码 移动位置 if not MainGame.tank1.stop: # 我方坦克移动 MainGame.tank1.move() # v1.07创建敌方坦克 def createEnemytank(self): # 循环创建敌方坦克 for i in range(ENEMY_TANK_COUNT): num = random.randint(1,7) # v1.08新增 随机速度 randomspeed = random.randint(3,10) # 创建第一个敌方坦克,出现位置为y=150,x随机出现在(100-700),坦克移动的随机速度是randomspeed # v1.08新增调用修改后的init方法 etank = EnemyTank(100*num,150,randomspeed) # 创建敌方坦克列表,存入所有的敌方坦克 MainGame.enemy_tanklist.append(etank) # v1.07展示敌方坦克 def showEnemyTank(self): # 遍历展示敌方坦克 for etank in MainGame.enemy_tanklist: etank.displayTank() # v1.08 新增敌方坦克的移动 etank.move() # v1.09 展示我方子弹的方法 def showMyBullet(self): for b in MainGame.mybullet_list: b.displayBullet() def gameOver(self): exit() # 基本坦克类 class BaseTank(): # 基本坦克属性 位置 方向 速度 图片 def __init__(self): self.direction = None self.rect = None self.images = None self.image = None self.speed = 0 #v1.06新增属性,用来控制坦克是否移动 self.stop = True # v1.08 优化移动 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 < SCREEN_HEIGHT - self.rect.height/2: self.rect.centery += self.speed elif self.direction == 'L': if self.rect.centerx > self.rect.height/2: self.rect.centerx -= self.speed elif self.direction == 'R': if self.rect.centerx < SCREEN_WIDTH - self.rect.height/2: self.rect.centerx += self.speed # v1.09 新增射击方法 def shoot(self): bullet = Bullet(self) return bullet # 我方坦克类 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 返回的是一个surface) self.image = self.images[self.direction] # 先基于图像获取坦克的位置和大小 self.rect = self.image.get_rect() # 修改坦克坐标,改成自定义位置 self.rect.centerx = x self.rect.centery = y # 设置坦克速度 self.speed = 5 #将我方坦克加入到窗口中 def displayTank(self): self.image = self.images[self.direction] # 把坦克的图像(即表面)和位置放到另一个图像或表面窗口 MainGame.window.blit(self.image,self.rect) # 敌方坦克类 class EnemyTank(BaseTank): # v1.08新增随机速度参数 def __init__(self,x,y,randSpeed): # v1.08新增调用父类的初始化 super(EnemyTank, self).__init__() # 设置具体的图片集 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') } # v1.07敌方坦克的初始方向为随机方向 self.direction = self.randomDirection() # 设置坦克的图片(self.image 返回的是一个surface) self.image = self.images[self.direction] # 先基于图像获取坦克的位置和大小 self.rect = self.image.get_rect() # 修改坦克坐标,改成自定义位置 self.rect.centerx = x self.rect.centery = y # v1.08新增速度为参数传进来的速度 self.speed = randSpeed # v1.08新增记录敌方坦克移动的步数 self.step = 25 # 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.08新增重写父类中的移动move方法,方法中新增随机方向的处理 def move(self): if self.step == 0: # 变换方向 self.direction = self.randomDirection() # 将步数重新归置成25 self.step = 25 else: super(EnemyTank, self).move() self.step -= 1 # 将敌方坦克加入到窗口中 def displayTank(self): self.image = self.images[self.direction] # 把坦克的图像(即表面)和位置放到另一个图像或表面窗口 MainGame.window.blit(self.image, self.rect) #v1.09 新增实现子弹类 class Bullet(): def __init__(self,tank): self.image = pygame.image.load('img/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.centerx = tank.rect.centerx - tank.rect.height/2 - self.rect.height/2 self.rect.centery = tank.rect.centery elif self.direction == 'R': self.rect.centerx = tank.rect.centerx + tank.rect.height / 2 + self.rect.height / 2 self.rect.centery = tank.rect.centery #将子弹的图像展示到游戏主窗口 def displayBullet(self): MainGame.window.blit(self.image,self.rect) # 爆炸类 class Explode(): pass # 墙壁类 class Wall(): pass # 音效类 class Audio(): pass #创建一个主逻辑类的对象 game = MainGame() # 开始游戏 game.startGame()
转载请注明原文地址: https://www.6miu.com/read-5028187.html

最新回复(0)