python之游戏开发-坦克大战

新增功能:
      优化:1.如果子弹碰到墙壁,让子弹消失
            2.最多可以发射3颗子弹,不能一直发射

  1 #导入pygame模块
  2 import pygame,time,random
  3 SCREEN_WIDTH=700
  4 SCREEN_HEIGHT=500
  5 BG_COLOR=pygame.Color(0,0,0)
  6 TEXT_COLOR=pygame.Color(255,0,0)
  7 class MainGame():
  8      window=None
  9      my_tank=None
 10      #存储敌方坦克的列表
 11      enemyTankList=[]
 12      #定义敌方坦克的数量
 13      enemyTankCount=5
 14      #存储我方子弹的列表
 15      myBulletList=[]
 16      def __init__(self):
 17          pass
 18      #开始游戏
 19      def startGame(self):
 20          #加载主窗口
 21          #初始化窗口
 22          pygame.display.init()
 23          #设置窗口的大小及显示
 24          MainGame.window=pygame.display.set_mode([SCREEN_WIDTH,SCREEN_HEIGHT])
 25          #初始化我方坦克
 26          MainGame.my_tank=Tank(350,250)
 27          #初始化敌方坦克,并将敌方坦克添加到列表中
 28          self.createEnemyTank()
 29          #设置窗口的标题
 30          pygame.display.set_caption('坦克大战1.03')
 31          while True:
 32              #使用坦克移动的速度慢一点
 33              time.sleep(0.02)
 34              #给窗口设置填充色
 35              MainGame.window.fill(BG_COLOR)
 36              #获取事件
 37              self.getEvent()
 38              #绘制文字
 39              MainGame.window.blit(self.getTextSuface('敌方坦克剩余数量%d'%len(MainGame.enemyTankList)),(10,10))
 40              #调用坦克显示的方法
 41              MainGame.my_tank.displayTank()
 42              #循环遍历敌方坦克列表,展示敌方坦克
 43              self.blitEnemyTank()
 44              #循环遍历显示我方坦克的子弹
 45              self.blitMyBullet()
 46              #调用移动方法
 47              #如果坦克的开关是开启,才可以移动
 48              if not MainGame.my_tank.stop:
 49                  MainGame.my_tank.move()
 50              pygame.display.update()
 51      # 初始化敌方坦克,并将敌方坦克添加到列表中
 52      def createEnemyTank(self):
 53          top=100
 54          #循环生成敌方坦克
 55          for i in range(MainGame.enemyTankCount):
 56              left=random.randint(0,600)
 57              speed=random.randint(1,4)
 58              enemy=EnemyTank(left,top,speed)
 59              MainGame.enemyTankList.append(enemy)
 60 
 61     # 循环遍历敌方坦克列表,展示敌方坦克
 62      def  blitEnemyTank(self):
 63          for enemyTank in MainGame.enemyTankList:
 64              enemyTank.displayTank()
 65              enemyTank.randMove()
 66      #循环遍历我方子弹存储列表
 67      def blitMyBullet(self):
 68          for myBullet in MainGame.myBulletList:
 69              #判断当前的子弹是否是活着状态,如果是则进行显示及移动,
 70              if myBullet.live:
 71                  myBullet.displayBullet()
 72                  # 调用子弹的移动方法
 73                  myBullet.move()
 74              # 否则在列表中删除
 75              else:
 76                  MainGame.myBulletList.remove(myBullet)
 77 
 78  
 79 
 80 
 81      #结束游戏
 82      def endGame(self):
 83          print('谢谢使用,欢迎再次使用')
 84          exit()
 85      #左上角文字的绘制
 86      def getTextSuface(self,text):
 87          #初始化字体模块
 88          pygame.font.init()
 89          #查看所有的字体名称
 90          # print(pygame.font.get_fonts())
 91          #获取字体Font对象
 92          font=pygame.font.SysFont('kaiti',18)
 93          #绘制文字信息
 94          textSurface=font.render(text,True,TEXT_COLOR)
 95          return textSurface
 96      #获取事件
 97      def getEvent(self):
 98          #获取所有事件
 99          eventList= pygame.event.get()
100          #遍历事件
101          for event in eventList:
102              #判断按下的键是关闭还是键盘按下
103              #如果按的是退出,关闭窗口
104              if event.type == pygame.QUIT:
105                  self.endGame()
106              #如果是键盘的按下
107              if event.type == pygame.KEYDOWN:
108                  #判断按下的是上、下、左、右
109                  if event.key == pygame.K_LEFT:
110                      #切换方向
111                      MainGame.my_tank.direction='L'
112                      #修改坦克的开关状态
113                      MainGame.my_tank.stop=False
114                      # MainGame.my_tank.move()
115                      print('按下左键,坦克向左移动')
116                  elif event.key == pygame.K_RIGHT:
117                      #切换方向
118                      MainGame.my_tank.direction='R'
119                      #修改坦克的开关状态
120                      MainGame.my_tank.stop=False
121                      # MainGame.my_tank.move()
122                      print('按下右键,坦克向右移动')
123                  elif event.key == pygame.K_UP:
124                      #切换方向
125                      MainGame.my_tank.direction='U'
126                      #修改坦克的开关状态
127                      MainGame.my_tank.stop=False
128                      # MainGame.my_tank.move()
129                      print('按下上键,坦克向上移动')
130                  elif event.key == pygame.K_DOWN:
131                      #切换方向
132                      MainGame.my_tank.direction='D'
133                      #修改坦克的开关状态
134                      MainGame.my_tank.stop=False
135                      # MainGame.my_tank.move()
136                      print('按下左键,坦克向下移动')
137                  elif event.key == pygame.K_SPACE:
138                      print('发射子弹')
139                      #如果当前我方子弹列表的大小 小于等于3时候才可以创建
140                      if len(MainGame.myBulletList)<3:
141                          # 创建我方坦克发射的子弹
142                          myBullet = Bullet(MainGame.my_tank)
143                          MainGame.myBulletList.append(myBullet)
144 
145  
146 
147             #松开方向键,坦克停止移动,修改坦克的开关状态
148              if event.type == pygame.KEYUP:
149                  #判断松开的键是上、下、左、右时候才停止坦克移动
150                  if event.key==pygame.K_UP or event.key==pygame.K_DOWN or event.key == pygame.K_LEFT or event.key ==pygame.K_RIGHT:
151                      MainGame.my_tank.stop = True
152 
153 
154 class Tank():
155      #添加距离左边left 距离上边top
156      def __init__(self,left,top):
157          #保存加载的图片
158          self.images={
159              'U':pygame.image.load('img/p1tankU.gif'),
160              'D':pygame.image.load('img/p1tankD.gif'),
161              'L':pygame.image.load('img/p1tankL.gif'),
162              'R':pygame.image.load('img/p1tankR.gif'),
163          }
164          #方向
165          self.direction='L'
166          #根据当前图片的方向获取图片 surface
167          self.image=self.images[self.direction]
168          #根据图片获取区域
169          self.rect=self.image.get_rect()
170          #设置区域的left 和top
171          self.rect.left=left
172          self.rect.top=top
173          #速度  决定移动的快慢
174          self.speed=5
175          #坦克移动的开关
176          self.stop=True
177 
178     #移动
179      def move(self):
180          #判断坦克的方向进行移动
181          if self.direction == 'L':
182              if self.rect.left>0:
183                  self.rect.left -= self.speed
184          elif self.direction == 'U':
185              if self.rect.top>0:
186                  self.rect.top -= self.speed
187          elif self.direction == 'D':
188              if self.rect.top+self.rect.height<SCREEN_HEIGHT:
189                  self.rect.top += self.speed
190          elif self.direction == 'R':
191              if self.rect.left+self.rect.height<SCREEN_WIDTH:
192                  self.rect.left += self.speed
193 
194     #射击
195      def shot(self):
196          pass
197      #展示坦克的方法
198      def displayTank(self):
199          #获取展示的对象
200          self.image=self.images[self.direction]
201          #调用blit方法展示
202          MainGame.window.blit(self.image,self.rect)
203 #我方坦克
204 class MyTank(Tank):
205      def __init__(self):
206          pass
207 
208 #敌方坦克
209 class EnemyTank(Tank):
210      def __init__(self,left,top,speed):
211          #加载图片集
212          self.images={
213              'U':pygame.image.load('img/enemy1U.gif'),
214              'D':pygame.image.load('img/enemy1D.gif'),
215              'L':pygame.image.load('img/enemy1L.gif'),
216              'R':pygame.image.load('img/enemy1R.gif')
217          }
218          #方向,随机生成敌方坦克的方向
219          self.direction=self.randDirection()
220          #根据方向获取图片
221          self.image=self.images[self.direction]
222          #区域
223          self.rect=self.image.get_rect()
224          #对left和top进行赋值
225          self.rect.left=left
226          self.rect.top=top
227          #速度
228          self.speed=speed
229          #移动开关键
230          self.flag=True
231          #薪增加一个步数变量 step
232          self.step=60
233 
234 
235      # 随机生成敌方坦克的方向
236      def randDirection(self):
237          num=random.randint(1,4)
238          if num == 1:
239              return 'U'
240          elif num == 2:
241              return 'D'
242          elif num == 3:
243              return "L"
244          elif num == 4:
245              return 'R'
246 
247     #敌方坦克随机移动的方法
248      def randMove(self):
249          if self.step<=0:
250              #修改方向
251              self.direction=self.randDirection()
252              #让步数复位
253              self.step=60
254          else:
255              self.move()
256              #让步数递减
257              self.step-=1
258 #子弹类
259 class Bullet():
260      def __init__(self,tank):
261          #加载图片
262          self.image=pygame.image.load('img/enemymissile.gif')
263          #坦克的方向决定子弹的方向
264          self.direction=tank.direction
265          #获取区域
266          self.rect=self.image.get_rect()
267          #子弹的left和top与方向有关
268          if self.direction == 'U':
269              self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2
270              self.rect.top = tank.rect.top - self.rect.height
271          elif self.direction == 'D':
272              self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2
273              self.rect.top = tank.rect.top + tank.rect.height
274          elif self.direction == 'L':
275              self.rect.left = tank.rect.left - self.rect.width / 2 - self.rect.width / 2
276              self.rect.top = tank.rect.top + tank.rect.width / 2 - self.rect.width / 2
277          elif self.direction == 'R':
278              self.rect.left = tank.rect.left + tank.rect.width
279              self.rect.top = tank.rect.top + tank.rect.width / 2 - self.rect.width / 2
280          #子弹的速度
281          self.speed=6
282          #子弹的状态,是否碰到墙壁,如果碰到墙壁,修改此状态
283          self.live=True
284      #移动
285      def move(self):
286          if self.direction == 'U':
287              if self.rect.top>0:
288                  self.rect.top-=self.speed
289              else:
290                  #修改子弹的状态
291                  self.live=False
292          elif self.direction == 'R':
293              if self.rect.left+self.rect.width<SCREEN_WIDTH:
294                  self.rect.left+=self.speed
295              else:
296                  #修改子弹的状态
297                  self.live=False
298          elif self.direction =='D':
299              if self.rect.top+self.rect.height<SCREEN_HEIGHT:
300                  self.rect.top+=self.speed
301              else:
302                  #修改子弹的状态
303                  self.live=False
304          elif self.direction == 'L':
305              if self.rect.left>0:
306                  self.rect.left-=self.speed
307              else:
308                  #修改子弹的状态
309                  self.live=False
310      #展示子弹的方法
311      def displayBullet(self):
312          #将图片surface加载到窗口
313          MainGame.window.blit(self.image,self.rect)
314 class Wall():
315      def __init__(self):
316          pass
317      #展示墙壁的方法
318      def displayWall(self):
319          pass
320 class Explode():
321      def __init__(self):
322          pass
323      #展示爆炸效果的方法
324      def displayExplode(self):
325          pass
326 class Music():
327      def __init__(self):
328          pass
329      #播放音乐
330      def play(self):
331          pass
332 if __name__=='__main__':
333      MainGame().startGame()
334      # MainGame().getTextSuface()

猜你喜欢

转载自www.cnblogs.com/Lynn123/p/11824480.html