您的位置:首页 > 脚本大全 > > 正文

python弹球游戏编写过程(python实现坦克大战游戏 附详细注释)

更多 时间:2021-10-01 01:03:20 类别:脚本大全 浏览量:117

python弹球游戏编写过程

python实现坦克大战游戏 附详细注释

本文实例为大家分享了python实现坦克大战的具体代码,供大家参考,具体内容如下

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • 358
  • 359
  • 360
  • 361
  • 362
  • 363
  • 364
  • 365
  • 366
  • 367
  • 368
  • 369
  • 370
  • 371
  • 372
  • 373
  • 374
  • 375
  • #功能实现游戏主窗口
  • import pygame,time,random#导入模块
  • _display = pygame.display#赋值给一个变量 调用时方便
  • color_red = pygame.color(255,0,0)#同上  v
  • class maingame(object):
  •  screen_width = 900#游戏界面宽度
  •  screen_height = 550#界面的高度
  •  tank_p1 = none#坦克对象
  •  window = none #窗口对象
  •  enemytank_list = []# 存储所有敌方坦克
  •  enemtank_count = 10# 要创建的敌方坦克的数量
  •  bullet_list = [] #创建我方子弹列表
  •  enemytank_bullet_list = []
  •  explode_list= []
  •  wall_list = []
  •  def startgame(self):
  •   pygame.display.init()#初始化游戏模块的显示
  •   maingame.window = _display.set_mode([maingame.screen_width,maingame.screen_height])#生成并加载游戏窗口、\
  •   #pygame.display模块及set_mode方法和pygame相关方法调用设置
  •   # 见<<https://www.pygame.org/docs/ref/display.html#pygame.display.set_mode>> uc浏览器实现自动翻译
  •   pygame.display.set_caption("坦克大战v1.0")#s设置游戏标题
  •   self.createnemytank()#类中调用初始敌方坦克方法
  •   self.creatmytank()#创建我方坦克
  •   self.creatwalls()#创建障碍物
  •  
  •   while true:#无限循环 所有行为方法都要无限制的显示
  •    maingame.window.fill(pygame.color(0,0,0))#窗口颜色设置 window在开始方法已设置为游戏窗口
  •    self.getevent()#死循环中 获取事件的值 对其进行相应处理
  •    maingame.window.blit(self.drawtext("剩余敌方数量%d" %len(maingame.enemytank_list)),(7, 7))#循环游戏窗口加载文本 bilt方法在页面写入另一个
  •  
  •    self.blitwalls()
  •    if maingame.tank_p1 and maingame.tank_p1.alive:
  •     maingame.tank_p1.displaytank()#循环调用生成的坦克对象(显示)方法
  •  
  •  
  •    self.blitenemytank()# 此类中用self 循环展示敌方坦克
  •  
  •    if maingame.tank_p1 and not maingame.tank_p1.stop:
  •     maingame.tank_p1.move()# 移动
  •     maingame.tank_p1.hitwall()#撞击墙壁
  •     maingame.tank_p1.hitenemytank()#撞击敌方坦克方法
  •    self.blitenemybullet()#显示敌方坦克子弹
  •    self.blitbullet()#显示炮弹
  •    self.blitexplode()#显示爆炸效果
  •    time.sleep(0.02)
  •    _display.update()#获取更新
  •    #将带有文字的surface 绘制到窗口中 循环
  •   # 创建敌方坦克
  •  
  •  def createnemytank(self):#创建敌方坦克
  •  
  •   top = 100
  •  
  •   for i in range(maingame.enemtank_count):#maingame.enemtank_count=5 五次循环创建敌方坦克
  •    speed = random.randint(3, 6) # 随机模块 random.randint
  •    # 每次都随机生成一个left值
  •    left = random.randint(1, 7)
  •    etank = enemytank(left * 100, top, speed)#生成敌方坦克类对象 传入参数 left为随机
  •    maingame.enemytank_list.append(etank)#将创建的每一个敌方坦克添加到列表
  •   # 将坦克加入到窗口中
  •  def creatmytank(self):
  •   maingame.tank_p1 = mytank(400, 480) # 生成一个坦克类的实例对象
  •   music = music("img/start.wav")
  •   music.play()
  •  def creatwalls(self):
  •   for i in range(1,10):
  •    wall = wall(60*i,250)
  •    maingame.wall_list.append(wall)
  •  def blitwalls(self):
  •   for wall in maingame.wall_list:
  •    if wall.live == true:
  •     wall.displaywall()
  •    else:
  •     maingame.wall_list.remove(wall)
  •  def blitenemytank(self):#显示敌方坦克 若出现坦克图片重叠也是符合逻辑
  •   for etank in maingame.enemytank_list:
  •    if etank.live :
  •     etank.displaytank()#将列表中每一个进行显示 etank为敌方坦克类对象 调用父类tank类中显示方法
  •     etank.randmove()
  •     etank.hitwall()
  •     etank.hitmytank()
  •     ebullet = etank.shot()
  •  
  •     if ebullet:#如果不为空
  •      maingame.enemytank_bullet_list.append(ebullet)
  •    else:
  •     maingame.enemytank_list.remove(etank)
  •  def blitenemybullet(self):#将敌方坦克加入到窗口中
  •   for ebullet in maingame.enemytank_bullet_list:
  •    if ebullet.alive:
  •     ebullet.display_bullet()
  •     ebullet.bulletmove()
  •     ebullet.hitwalls()
  •     if maingame.tank_p1.alive:
  •      ebullet.hitmytank()
  •    else:
  •     maingame.enemytank_bullet_list.remove(ebullet)
  •  def blitbullet(self):#显示子弹
  •   for bullet in maingame.bullet_list:#事件中获的子弹的列表进行遍历 类似显示坦克方法 逐个展示
  •    if bullet.alive:#bullet类中设置的标签 来判断子弹的存活 true为生 根据炮弹移动方法bulletmove()中所加限制条件
  •     bullet.display_bullet()#调用列表中子弹对象的显示方法
  •     bullet.bulletmove()#子弹的移动
  •     bullet.hitenemytank()#调用与敌方坦克的碰撞检测方法
  •     bullet.hitwalls()#d调用子弹碰撞墙壁
  •    else:
  •  
  •     maingame.bullet_list.remove(bullet)#如果为false bulletmove()中触碰墙壁就是false 就从列表删除 循环执行
  •  def blitexplode(self):
  •   for explode in maingame.explode_list:
  •    if explode.live:
  •     explode.display_explode()
  •     music = music("img/blast.wav")
  •     music.play()
  •    else:
  •     maingame.explode_list.remove(explode)
  •  def drawtext(self,content):#文本 写入游戏窗口
  •   pygame.font.init()#初始化字体
  •   font = pygame.font.sysfont("kaiti",18)#创建字体对象
  •   text_sf = font.render(content,true,color_red)#字体样式对象
  •   return text_sf #返回内容的surface
  •  def getevent(self):#获取所有事件
  •   eventlist = pygame.event.get()#所有事件列表
  •   for event in eventlist:#遍历每一个事件进行判断 键盘输入的字符
  •    #type属性
  •    if event.type == pygame.quit:#如果是quit(就是点击窗口的退出按钮 叉号)
  •     print("退出游戏")
  •     self.gameover()#退出方法
  •    if event.type == pygame.keyup:#如果键盘按钮抬起 并且是上下左右键
  •     if event.key == pygame.k_left or event.key == pygame.k_right or event.key == pygame.k_up\
  •     or event.key == pygame.k_down:
  •      if maingame.tank_p1 and maingame.tank_p1.alive:
  •       maingame.tank_p1.stop = true#stop为true 按钮抬起就停止 start方法中的开关 实现坦克按住按钮持续移动
  •  
  •    if event.type == pygame.keydown:#如果事件的类型为按下按键进行如下判断
  •     if event.key == pygame.k_escape :
  •      self.creatmytank()
  •     if maingame.tank_p1 and maingame.tank_p1.alive:
  •      if event.key == pygame.k_left:#如果为左方向键 如下为同一类型
  •       print("向左移动")
  •       maingame.tank_p1.direction = "l"#设置坦克方向进行判断向左就是l,
  •       # 并设置游戏窗口的界限 还可以利用方向作为字典的键获取坦克图片 坦克的移动方向
  •       #就是加载不同方向的坦克图片 呈现出移动的效果
  •       maingame.tank_p1.stop = false#坦克移动的开关 循环使用 false为移动
  •      if event.key == pygame.k_right:
  •       print("向右移动")
  •       maingame.tank_p1.direction = "r"
  •       maingame.tank_p1.stop = fa

  • 上一篇:html5的canvas代码(H5最强接口之canvas实现动态图形功能)
  • 下一篇:mysql常见的存储引擎(如何选择MySQL的存储引擎?)
  • 您可能感兴趣