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()

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

时间: 2024-10-07 11:46:25

python之游戏开发-坦克大战的相关文章

Python之游戏开发-飞机大战

#!/usr/bin/env python # coding: utf-8 import pygame import time import random from pygame.locals import * class Base(object): def __init__(self, x, y, imageName): self.x = x self.y = y self.imageName = imageName self.image = pygame.image.load(self.im

Coco2d-x android win7 Python 搭建游戏开发环境

1:我用电脑配置 win7 3 核 内存8G 台式机,一直想研究Coco2d 游戏开发,所以经过一周的需找,终于把环境搭建好了 2:我用的版本是该版本,至于搭建android开发环境省略了, 3: 2.2>安装ndk,为了使用c++/c进行android开发 下载android-ndk-r8e,然后在eclipse或adt bundle中配置ndk路径. 4: 5:采用VS 编译环境 我之前用的VS2010 感觉用着不爽,所以改成现在的VS 2012 , 6:一般用python建立项目: 用py

python之游戏开发

http://pygame.org/hifi.html https://pyweek.org/ https://wiki.python.org/moin/PythonGames

python之游戏开发-贪吃蛇

#!/usr/bin/env python# coding=utf-8import pygameimport sysimport random # 全局定义,screen的长和宽SCREEN_X = 600SCREEN_Y = 600 # 蛇类# 点以25为单位class Snake(object): # 定义一个类--Snake,默认使用object类,如果你有更好的话,可以替换它 # 初始化各种需要的属性 [开始时默认向右/身体块x5] def __init__(self): # 定义ini

HTML5移动开发之路(8)——坦克大战游戏2

本文为 兄弟连IT教育 机构官方 HTML5培训 教程,主要介绍:HTML5移动开发之路(8)--坦克大战游戏2 在上一篇文章中我们已经画出了自己的坦克,并且可以控制自己的坦克移动,我们继续接着上一篇来实现我们的坦克大战游戏吧. 一.将JS文件分离出来 使用OO的思想,我们已经对坦克进行了封装,对画坦克也进行了封装,下面我们将这两个对象提取到外部的js文件中,文件内容如下: [javascript] view plain copy print? //定义一个Hero类(后面还要改进) //x表示

HTML5移动开发之路(7)——坦克大战游戏1

本文为 兄弟连IT教育 机构官方 HTML5培训 教程,主要介绍:HTML5移动开发之路(7)--坦克大战游戏1 上一篇中我们介绍了关于Canvas的基础知识,用Canvas绘制各种图形和图片,在上一篇的基础上我们来做一个基于HTML5的坦克大战游戏,下面我们开始吧 一.用Canvas画出我们的坦克 我们设计的坦克结构如下图所示,如果有的朋友有更好的设计,希望分享和交流一下. 如上图所示,我们的坦克基本上是由三个矩形和一个圆形一个线段组成,每个部件的尺寸进行了标记,单位为px,下面我们用上一篇中

HTML5移动开发之路(9)——坦克大战游戏3

本文为 兄弟连IT教育 机构官方 HTML5培训 教程,主要介绍:HTML5移动开发之路(9)--坦克大战游戏3 上一篇我们创建了敌人的坦克和自己的坦克,接下来就应该让坦克发子弹了,我们下面来看一下如何让我们的坦克发出子弹. 前面我们用面向对象的思想对Tank进行了封装,又利用对象冒充实现了我们的坦克和敌人的坦克,仿照这种方式我们是不是也应该封装一个Bullet,答案是肯定的.好吧,那么我们再想想这个Bullet"类"都应该封装什么东西呢?位置应该有吧.子弹飞行的方向应该有吧.飞行的速

自己动手写游戏:坦克撕逼大战

START:最近在公交车上无聊,于是用平板看了看下载的坦克大战的开发教程,于是在晚上回家后花了两天模仿了一个,现在来总结一下. 一.关于坦克大战 <坦克大战>(Battle City)是1985年日本南梦宫Namco游戏公司开发并且在任天堂FC平台上,推出的一款多方位平面射击游戏.游戏以坦克战斗及保卫基地为主题,属于策略型联机类.同时也是FC平台上少有的内建关卡编辑器的几个游戏之一,玩家可自己创建独特的关卡,并通过获取一些道具使坦克和基地得到强化. 1985年推出的坦克大战(Battle Ci

《Java小游戏实现》:坦克大战

<Java小游戏实现>:坦克大战 前面写了一个简单的聊天小程序,今天开始就写一个坦克大战的游戏,算是对Java相关小知识点的一个应用. 这个游戏的完成,我们也是分步完成,逐步累加,一个一个小功能的添加,最后直至完成整个游戏的开发. 第一步:写一个界面 public class TankClient extends JFrame{ public static void main(String[] args) { new TankClient().launchFrame(); } public v