tank1

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

原文地址:https://www.cnblogs.com/Lynn123/p/11840191.html