''' 坦克大战 新增功能: 完善子弹发射功能 坦克发射子弹 --> 产生一颗子弹 ''' # 导入pygame模块 import pygame import time import random SCREEN_WIDTH=700 SCREEN_HEIGHT=500 BG_COLOR=pygame.Color(0,0,0) TEXT_COLOR=pygame.Color(255,0,0) class MainGame(): window=None my_tank=None # 存储敌方坦克列表 enemyTanklist=[] # 定义敌方坦克生成的数量 enemyTankCount=5 # 存储我立子弹列表 Bullet_list=[] # 初始化方法 def __init__(self): pass # 开始游戏 def startGame(self): # 加载主窗口 # 初始化窗口 pygame.display.init() # 设置窗口大小及显示 MainGame.window = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT]) # 初始化我方坦克 MainGame.my_tank=Tank(350,250) # 初始化敌方坦克,并将敌方坦克添加到列表中 self.createEnemyTank() # 设置窗口标题 pygame.display.set_caption("坦克大战") while True: # 使坦克移动速度降慢 # time单位为秒 time.sleep(0.02) # 设置窗口填充色 MainGame.window.fill(BG_COLOR) # 获取事件 self.getEvent() # 绘制文字 MainGame.window.blit(self.getTextSurface("敌方坦克剩余数量%d"%len(MainGame.enemyTanklist)),(10,10)) # 调用坦克显示方法 MainGame.my_tank.displayTank() # 循环遍历敌方坦克列表,展示敌方坦克 self.blitEnemyTank() # 调用移动方法 # 如果坦克移动开关开启才能移动 if not MainGame.my_tank.stop: MainGame.my_tank.move() # 调用子弹列表的方法 self.blitBullet() pygame.display.update() # 初始化敌方坦克,并将敌方坦克添加到列表中 def createEnemyTank(self): top=100 # 循环生成敌方坦克 for i in range(MainGame.enemyTankCount): left = random.randint(0,600) speed = random.randint(1,4) enemy=EnemyTank(left,top,speed) MainGame.enemyTanklist.append(enemy) # 循环遍历敌方坦克列表,展示敌方坦克 def blitEnemyTank(self): for enemyTank in MainGame.enemyTanklist: enemyTank.displayTank() enemyTank.move() enemyTank.randMove() # 将子弹加载到窗口中 def blitBullet(self): for bullet in MainGame.Bullet_list: bullet.displyBullet() # 结束游戏 def endGame(self): print("谢谢") exit() # 左上角文字绘制 def getTextSurface(self,text): # 查看所有字体名称 #print(pygame.font.get_fonts()) # 初始化字体模块 pygame.font.init() # 获取字体Font对象 font = pygame.font.SysFont("kaiti",18) # 绘制文字信息 textSurface = font.render(text,True,TEXT_COLOR) return textSurface # 获取事件 def getEvent(self): eventList = pygame.event.get() # 遍历事件 for event in eventList: # 判断按下的键是关闭还是键盘按下 # 判断是否关闭窗口 if event.type == pygame.QUIT: self.endGame() # 判断键盘输入 if event.type == pygame.KEYDOWN: # 判断键盘上下左右键 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("发射子弹") # 产生一颗子弹 m = Bullet(MainGame.my_tank) # 将子弹加入子弹列表 MainGame.Bullet_list.append(m) # 松开方向键停止移动,修改坦克移动开关状态 if event.type==pygame.KEYUP: # 判断松开的键是方向键才停止移动 if event.key ==pygame.K_UP or event.key==pygame.K_LEFT or event.key==pygame.K_DOWN or event.key==pygame.K_RIGHT: MainGame.my_tank.stop=True class Tank(): # 初始化方法 # 距离左边left, 距离上边left def __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 = "U" # 根据当前图片的方向获取图片 返回surface self.image=self.images[self.direction] # 根据图片获取区域 self.rect=self.image.get_rect() # 设置区域left和top self.rect.left=left self.rect.top=top # 速度 决定移动快慢 self.speed=2 # 坦克移动开关 self.stop=True # 移动 def move(self): # 判断坦克方向进行移动 if self.direction =="L": if self.rect.left > 0: self.rect.left-=self.speed elif self.direction =="U": if self.rect.top>0: self.rect.top-=self.speed elif self.direction =="D": if self.rect.top+self.rect.height<SCREEN_HEIGHT: self.rect.top+=self.speed elif self.direction =="R": if self.rect.left+self.rect.height < SCREEN_WIDTH: self.rect.left+=self.speed # 射击 def shot(self): return Bullet(self) # 展示坦克 def displayTank(self): # 获取展示的对象 self.image=self.images[self.direction] # 调用blit方法展示 MainGame.window.blit(self.image,self.rect) # 我方坦克(继承自坦克类) class MyTank(Tank): # 初始化方法 def __init__(self): pass # 敌方坦克(继承自坦克类) class EnemyTank(Tank): # 初始化方法 def __init__(self,left,top,speed): # 加载敌方坦克图片 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() # 对left和top赋值 self.rect.left=left self.rect.top=top # 速度 self.speed=speed # 移动开关 self.flag=True # 新增一个步数变量 step self.step = 30 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" # 敌方坦克随机移动方法 def randMove(self): if self.step <=0: # 修改方向 self.direction=self.randomDirection() self.step=random.randint(20,80) else: self.move() # 让步数递减 self.step-=1 # 子弹类 class Bullet(): def __init__(self): # 加载图片 self.image = pygame.image.load("img/enemymissile.gif") # 坦克的方向决定子弹的方向 self.direction = tank.direction # 获取区域 self.rect = self.image.get_rect() # 子弹的left和top与方向有关 if self.direction == "U": # 子弹left=tank.left+tank.rect.width/2-子弹.width/2 self.rect.left = tank.left + tank.rect.width / 2 - self.rect.width / 2 # 子弹top=tank.top-子弹.height self.rect.top = tank.top - self.rect.height elif self.direction == "L": self.rect.left = tank.rect.left - self.rect.width / 2 - self.rect.width / 2 self.rect.top = tank.rect.top + tank.rect.width / 2 - self.rect.width / 2 elif self.direction == "D": self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2 self.rect.top = tank.rect.top + tank.rect.height elif self.direction == "R": self.rect.left = tank.rect.left + tank.rect.width self.rect.top = tank.rect.top + tank.rect.width / 2 - self.rect.width / 2 # 子弹的速度 self.speed = random.randint((1, 3)) # 移动 def move(self): pass # 展示子弹 def displayBullet(self): # 将图片surface加载到窗口 MainGame.window.blit(self.image.self.rect) class Wall(): def __init__(self): pass # 展示墙壁 def displayWall(self): pass class Explode(): def __init__(self): pass # 爆炸效果 def displayExplode(self): pass class Music(): def __init__(self): pass # 播放音乐 def play(self): pass if __name__== "__main__": MainGame().startGame() #MainGame().getTextSurface()
F:\Python\pythonProject\Tank\venv\Scripts\python.exe F:/Python/pythonProject/Tank/13.py
pygame 2.0.1 (SDL 2.0.14, Python 3.9.1)
Hello from the pygame community. https://www.pygame.org/contribute.html
发射子弹
Traceback (most recent call last):
File "F:\Python\pythonProject\Tank\13.py", line 329, in <module>
MainGame().startGame()
File "F:\Python\pythonProject\Tank\13.py", line 52, in startGame
self.getEvent()
File "F:\Python\pythonProject\Tank\13.py", line 143, in getEvent
m = Bullet(MainGame.my_tank)
TypeError: __init__() takes 1 positional argument but 2 were given
Process finished with exit code 1