**

Python实现坦克大战——源代码

**

一、环境:pygame
Pygame被设计用来写游戏的python模块集合,基于SDL库开发。使用python可以导入pygame来开发具有全部特性的游戏和多媒体软件,Pygame是极度轻便的并且可以运行在几乎所有的平台和操作系统上。

二、编辑器:PyCharm
PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。

源代码:

import pygame
from pygame.locals import *
import math
import randomdef expand_battle_field():for row in small_battle_field:new_row = []for column in row:new_row.extend([column] * 2)battle_field.append(new_row)battle_field.append(new_row[:])def area_conflict(area1, area2):for point1 in area1:if point1 in area2:return Truereturn Falsedef draw_battle_field():global symbol_positionglobal symbol_areafor row_index in range(y_max):for column_index in range(x_max):if battle_field[row_index][column_index] == 1:# is a brick_wallscreen.blit(brick_wall_img, (column_index * 30, row_index * 30))if battle_field[row_index][column_index] == 2:# is a cement_wallscreen.blit(cement_wall_img, (column_index * 30, row_index * 30))if symbol_position != None:continueif battle_field[row_index][column_index] == 3:# is a symbolsymbol_position = (column_index, row_index)symbol_area = ((column_index, row_index),(column_index + 1, row_index),(column_index, row_index + 1),(column_index + 1, row_index + 1))if game_over:screen.blit(symbol_destoryed_img, (symbol_position[0] * 30, symbol_position[1] * 30))else:screen.blit(symbol_img, (symbol_position[0] * 30, symbol_position[1] * 30))def produce_enemy(time):global last_productglobal enemys_cur_numberif last_product != -1 and time - last_product < enemys_product_interval:returnindex_e = random.randint(0, 1)conflict = Falsefor point in tank.area:if point in enemy_init_area[index_e]:conflict = Truebreakif not conflict:for enemy in enemys:for point_e in enemy.area:if point_e in enemy_init_area[index_e]:conflict = Truebreakif conflict:break;if not conflict:enemys.append(Enemy(enemy_init_position[index_e]))last_product = timeenemys_cur_number += 1returnfor point in tank.area:if point in enemy_init_area[1 - index_e]:returnfor enemy in enemys:for point_e in enemy.area:if point_e in enemy_init_area[1 - index_e]:returnenemys.append(Enemy(enemy_init_position[1 - index_e]))last_product = timeenemys_cur_number += 1class ArmoredCar():def __init__(self, p_position, p_direction, p_image, p_fire_interval):self.position = p_positionself.area = ((self.position[0], self.position[1]),(self.position[0] + 1, self.position[1]),(self.position[0], self.position[1] + 1),(self.position[0] + 1, self.position[1] + 1))self.direction = p_directionself.image = p_image self.missiles = []self.destroyed = Falseself.last_fire = -1self.fire_interval = p_fire_interval def draw(self):screen.blit(self.image, (self.position[0] * 30, self.position[1] * 30))def is_legal(self, new_area):for (x, y) in new_area:if x < 0 or y < 0 or x >= x_max or y >= y_max:return Falseif battle_field[y][x] != 0:return Falsefor enemy in enemys:if enemy == self:continueif area_conflict(enemy.area, new_area):return Falseif isinstance(self, Enemy) and area_conflict(self.area, tank.area):return Falsereturn Truedef update(self):self.draw()index = 0for missile in self.missiles:if missile.update() == False:self.missiles.pop(index)index += 1def up(self):self.direction = 'U'if isinstance(self, Tank):self.image = tank_img_Uelse:self.image = enemy_img_U new_position = (self.position[0], self.position[1] - 1)new_area = ((new_position[0], new_position[1]),(new_position[0] + 1, new_position[1]),(new_position[0], new_position[1] + 1),(new_position[0] + 1, new_position[1] + 1))if self.is_legal(new_area):self.position = new_positionself.area = new_areadef down(self):self.direction = 'D'if isinstance(self, Tank):self.image = tank_img_Delse:self.image = enemy_img_Dnew_position = (self.position[0], self.position[1] + 1)new_area = ((new_position[0], new_position[1]),(new_position[0] + 1, new_position[1]),(new_position[0], new_position[1] + 1),(new_position[0] + 1, new_position[1] + 1))if self.is_legal(new_area):self.position = new_positionself.area = new_areadef right(self):self.direction = 'R'if isinstance(self, Tank):self.image = tank_img_Relse:self.image = enemy_img_Rnew_position = (self.position[0] + 1, self.position[1])new_area = ((new_position[0], new_position[1]),(new_position[0] + 1, new_position[1]),(new_position[0], new_position[1] + 1),(new_position[0] + 1, new_position[1] + 1))if self.is_legal(new_area):self.position = new_positionself.area = new_areadef left(self):self.direction = 'L'if isinstance(self, Tank):self.image = tank_img_Lelse:self.image = enemy_img_Lnew_position = (self.position[0] - 1, self.position[1])new_area = ((new_position[0], new_position[1]),(new_position[0] + 1, new_position[1]),(new_position[0], new_position[1] + 1),(new_position[0] + 1, new_position[1] + 1))if self.is_legal(new_area):self.position = new_positionself.area = new_areadef fire(self, time):if self.last_fire == -1 or time - self.last_fire >= self.fire_interval:self.last_fire = timeif isinstance(self, Tank):self.missiles.append(TankMissile(self.direction, self.position))else:self.missiles.append(EnemyMissile(self.direction, self.position))class Tank(ArmoredCar):def __init__(self):ArmoredCar.__init__(self, tank_init_position, 'U', tank_img_U, 300)self.life = 3# for future useself.buf = []def attacked(self):self.direction = 'U'self.image = tank_img_Uself.position = tank_init_positionself.life -= 1if self.life == 0:self.destroyed = Truedef update(self):self.draw()index = 0for missile in self.missiles:if missile.update() == False:self.missiles.pop(index)index += 1class Enemy(ArmoredCar):def __init__(self, p_init_position):ArmoredCar.__init__(self, p_init_position, 'D', enemy_img_D, 800)# for future useself.damaged = 0self.limitation = 1self.move_interval = 1000self.last_move = -1def attacked(self, damage):self.damaged += damageif self.damaged >= self.limitation:self.destroyed = Truedef update(self, time):self.fire(time)index = 0for missile in self.missiles:if missile.update() == False:self.missiles.pop(index)index += 1self.draw()if self.last_move != -1 and time - self.last_move < self.move_interval:returnself.last_move = timeself.direction = ('D', 'D', 'D', 'D', 'D', 'R', 'R', 'L', 'L', 'U')[random.randint(0, 9)]if self.direction == 'U':self.up()elif self.direction == 'D':self.down()elif self.direction == 'R':self.right()elif self.direction == 'L':self.left()class Missile():def __init__(self, direction, p_position, image):self.image = imageself.direction = directionself.speed = 0.3self.damage = 10missile_img_width = self.image.get_width()missile_img_height = self.image.get_height()if self.direction == 'U':self.position = [p_position[0] * 30 + 30 - missile_img_width / 2,p_position[1] * 30 - missile_img_height]elif self.direction == 'D':self.position = [p_position[0] * 30 + 30 - missile_img_width / 2,p_position[1] * 30 + 60]elif self.direction == 'R':self.position = [p_position[0] * 30 + 60,p_position[1] * 30 + 30 - missile_img_height / 2]elif self.direction == 'L':self.position = [p_position[0] * 30 - missile_img_width,p_position[1] * 30 + 30 - missile_img_height / 2]# for future useself.damage = 1def draw(self):screen.blit(self.image, (self.position[0], self.position[1]))class TankMissile(Missile):def __init__(self, direction, p_position):Missile.__init__(self, direction, p_position, tank_missile_img)def update(self):global symbol_attackedif self.direction == 'U':self.position[1] -= self.speedx = int(self.position[0] / 30)y = int(self.position[1] / 30)self.area = ((x, y), (x + 1, y))elif self.direction == 'D':self.position[1] += self.speedx = int(self.position[0] / 30)y = int(self.position[1] / 30)self.area = ((x, y), (x + 1, y))elif self.direction == 'R':self.position[0] += self.speedx = int(self.position[0] / 30)y = int(self.position[1] / 30)self.area = ((x, y), (x, y + 1))elif self.direction == 'L':self.position[0] -= self.speedx = int(self.position[0] / 30)y = int(self.position[1] / 30)self.area = ((x, y), (x, y + 1))x = int(self.position[0] / 30)y = int(self.position[1] / 30)if self.area[0][0] < 0 or self.area[0][1] < 0 or self.area[0][0] >= x_max or self.area[0][1] >= y_max:return Falseif self.area[1][0] < 0 or self.area[1][1] < 0 or self.area[1][0] >= x_max or self.area[1][1] >= y_max:return Falseif battle_field[self.area[0][1]][self.area[0][0]] == 1:battle_field[self.area[0][1]][self.area[0][0]] = 0return Falseif battle_field[self.area[1][1]][self.area[1][0]] == 1:battle_field[self.area[1][1]][self.area[1][0]] = 0return Falseif battle_field[self.area[0][1]][self.area[0][0]] == 2:return Falseif battle_field[self.area[1][1]][self.area[1][0]] == 2:return Falsefor enemy in enemys:if area_conflict(enemy.area, self.area):enemy.attacked(self.damage)hit_msc.play()return Falseif area_conflict(symbol_area, self.area):symbol_attacked += 1return Falseself.draw()class EnemyMissile(Missile):def __init__(self, direction, p_position):Missile.__init__(self, direction, p_position, enemy_missile_img)def update(self):global symbol_attackedif self.direction == 'U':self.position[1] -= self.speedx = int(self.position[0] / 30)y = int(self.position[1] / 30)self.area = ((x, y), (x + 1, y))elif self.direction == 'D':self.position[1] += self.speedx = int(self.position[0] / 30)y = int(self.position[1] / 30)self.area = ((x, y), (x + 1, y))elif self.direction == 'R':self.position[0] += self.speedx = int(self.position[0] / 30)y = int(self.position[1] / 30)self.area = ((x, y), (x, y + 1))elif self.direction == 'L':self.position[0] -= self.speedx = int(self.position[0] / 30)y = int(self.position[1] / 30)self.area = ((x, y), (x, y + 1))x = int(self.position[0] / 30)y = int(self.position[1] / 30)if x < 0 or y < 0 or x >= x_max or y >= y_max:return Falseif self.area[0][0] < 0 or self.area[0][1] < 0 or self.area[0][0] >= x_max or self.area[0][1] >= y_max:return Falseif self.area[1][0] < 0 or self.area[1][1] < 0 or self.area[1][0] >= x_max or self.area[1][1] >= y_max:return Falseif battle_field[self.area[0][1]][self.area[0][0]] == 1:battle_field[self.area[0][1]][self.area[0][0]] = 0return Falseif battle_field[self.area[1][1]][self.area[1][0]] == 1:battle_field[self.area[1][1]][self.area[1][0]] = 0return Falseif battle_field[self.area[0][1]][self.area[0][0]] == 2:return Falseif battle_field[self.area[1][1]][self.area[1][0]] == 2:return Falseif area_conflict(tank.area, self.area):tank.attacked()return Falseif area_conflict(symbol_area, self.area):symbol_attacked += 1return Falseself.draw()# blank         0
# brick_wall    1
# cement_wall   2
# symbol        3
small_battle_field = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0],[0, 1, 2, 1, 0, 0, 0, 1, 2, 1, 0],[0, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0],[0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0],[0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0],[0, 0, 0, 1, 1, 3, 1, 1, 0, 0, 0]]
battle_field = []
pygame.init()
expand_battle_field()
x_max, y_max = len(battle_field[0]), len(battle_field)
screen = pygame.display.set_mode((x_max* 30, y_max * 30), 0, 32)
pygame.display.set_caption('Battle City')symbol_area = None
symbol_position = None
symbol_attacked = 0
symbol_limitation = 4brick_wall_img = pygame.image.load("resources/images/brick_wall.gif")
cement_wall_img = pygame.image.load("resources/images/cement_wall.gif")
symbol_img = pygame.image.load("resources/images/symbol.gif")
symbol_destoryed_img = pygame.image.load("resources/images/symbol_destoryed.gif")
game_over_img = pygame.image.load("resources/images/game_over.gif")tank_img_D = pygame.image.load("resources/images/p1tankD.gif")
tank_img_L = pygame.image.load("resources/images/p1tankL.gif")
tank_img_R = pygame.image.load("resources/images/p1tankR.gif")
tank_img_U = pygame.image.load("resources/images/p1tankU.gif")enemy_img_D = pygame.image.load("resources/images/enemy1D.gif")
enemy_img_L = pygame.image.load("resources/images/enemy1L.gif")
enemy_img_R = pygame.image.load("resources/images/enemy1R.gif")
enemy_img_U = pygame.image.load("resources/images/enemy1U.gif")tank_missile_img = pygame.image.load("resources/images/tankmissile.gif")
enemy_missile_img = pygame.image.load("resources/images/enemymissile.gif")fire_msc = pygame.mixer.Sound("resources/audios/fire.wav")
fire_msc.set_volume(1)hit_msc = pygame.mixer.Sound("resources/audios/hit.wav")
hit_msc.set_volume(50)start_msc = pygame.mixer.Sound("resources/audios/start.wav")
start_msc.set_volume(5)tank_init_position = (4, 16)
enemy_init_position = ((0, 0), (20, 0))
enemy_init_area = (((0, 0), (0, 1), (1, 0), (1, 1)), ((20, 0), (20, 1), (21, 0), (21, 1)))
enemys_cur_number = 0
enemys_max_number = 10tank = Tank()
enemys = []# up, left, down, right, fire
keys = [False, False, False, False, False]
last_move = -1
move_interval = 200
last_product = -1
enemys_product_interval = 5000running = True
game_over = Falsestart_msc.play()
while running:screen.fill(0);if symbol_attacked >= symbol_limitation:game_over = Trueif tank.destroyed:game_over = Truetank.update()draw_battle_field()time = pygame.time.get_ticks()if enemys_cur_number < enemys_max_number:produce_enemy(time)index = 0for enemy in enemys:if enemy.destroyed:enemys.pop(index)else:enemy.update(time)index += 1if game_over:screen.blit(game_over_img, (x_max * 15 - game_over_img.get_width() / 2, y_max * 15 - game_over_img.get_height() / 2))pygame.display.flip()pygame.display.update()for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit(0)if event.type == pygame.KEYDOWN:if event.key == K_w or event.key == K_UP:keys[0] = True elif event.key == K_a or event.key == K_LEFT:keys[1] = True elif event.key == K_s or event.key == K_DOWN:keys[2] = True elif event.key == K_d or event.key == K_RIGHT:keys[3] = True if event.key == K_SPACE:keys[4] = True if event.type == pygame.KEYUP:if event.key == K_w or event.key == K_UP:keys[0] = Falseelif event.key == K_a or event.key == K_LEFT:keys[1] = Falseelif event.key == K_s or event.key == K_DOWN:keys[2] = Falseelif event.key == K_d or event.key == K_RIGHT:keys[3] = Falseif event.key == K_SPACE:keys[4] = Falseif game_over:continueif keys[0]:if last_move == -1 or time - last_move >= move_interval:last_move = timetank.up()elif keys[2]:if last_move == -1 or time - last_move >= move_interval:last_move = timetank.down()if keys[1]:if last_move == -1 or time - last_move >= move_interval:last_move = timetank.left()elif keys[3]:if last_move == -1 or time - last_move >= move_interval:last_move = timetank.right()if keys[4]:tank.fire(time)fire_msc.play()while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit(0)pygame.display.flip()pygame.display.update()

效果图:
一起学习python,小白指导,教学分享记得私信我

Python实现坦克大战——源代码相关推荐

  1. python坦克大战_Life is short,you need Python——Python实现坦克大战(一)

    先展示一下效果 搓搓小手手,坦克大战即将开始--https://www.zhihu.com/video/1140743290784817152 一.游戏引擎的安装 安装方式有两种:1.pip安装 wi ...

  2. c语言编写坦克大战设计报告,c语言编写坦克大战源代码

    <c语言编写坦克大战源代码>由会员分享,可在线阅读,更多相关<c语言编写坦克大战源代码(10页珍藏版)>请在人人文库网上搜索. 1.include tank.h#include ...

  3. Python pygame 坦克大战

    Python pygame 坦克大战 import pygame, time, random from pygame.sprite import SpriteSCREEN_WIDTH = 750 SC ...

  4. Python实现坦克大战源码

    Python实现坦克大战小游戏源码,可实现单人及双人模式. import sysimport pygameimport sceneimport bulletimport foodimport tank ...

  5. python版坦克大战

    Python版坦克大战 Python一千行代码搞定坦克大战游戏. 在开发坦克大战游戏项目中,我们使用的是pygame模块来完成的,所以得先装好pygame模块.本游戏一共封装了11个类和两个模块(py ...

  6. Python实现坦克大战

    Python实现坦克大战 一.前言 前段时间,也就是国庆节.在寝室闲来无事,用pygame写了一个小游戏,就是标题写的<坦克大战>.这个游戏写了两个版本,第一个版本是按照书上的思想来写的, ...

  7. python 游戏开发框架_Python开发 基于python实现坦克大战游戏

    这篇文章主要为大家详细介绍了基于python实现坦克大战游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了python实现坦克大战游戏的具体代码, ...

  8. 用Python实现坦克大战游戏 | 干货贴

    作者 | 李秋键 出品 | AI科技大本营(rgznai100) <坦克大战>是1985年日本南梦宫Namco游戏公司在任天堂FC平台上,推出的一款多方位平面射击游戏.游戏以坦克战斗及保卫 ...

  9. 手把手教你用Python实现“坦克大战”,附详细代码!

    小时候玩的"坦克大战",你还记得吗? 满满的回忆 ! 今天,我们使用Python以及强大的第三方库来实现一个简单的坦克大战游戏. 整体效果 环境依赖 python3.7 pygam ...

  10. Python实现坦克大战(TankWar)游戏

    项目所有的代码与材料:代码下载 Features 双人模式 动画与音效 特殊的场景元素:草丛.河面和可以通行的冰面 各种各样的道具 Rules 玩家一 WASD 控制方向.空格键开火,玩家二上下左右控 ...

最新文章

  1. 我还不懂什么是分布式事务
  2. 在2020年到来之前,你应该知道的十大科技趋势预测
  3. matlab 图像读取长宽_MATLAB图像处理基本操作
  4. Docker 命令自动补全必须有
  5. NYOJ-过河问题(贪心)
  6. 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--数码管电路驱动(八)
  7. pythonmapiter_018.Python迭代器以及map和reduce函数
  8. 148. php in_array()
  9. Matlab 轴承信号仿真+分析
  10. 好评不断的文化纪录片《中国》,背后的“剪刀手”竟是它?
  11. 字体图标库(Font Awesome)的使用--绝佳的图标字体库和CSS框架
  12. 如何在网页中嵌入网易云音乐
  13. ajaxsetup获取ajax的url_jQuery的ajaxSetup-我只想为GET请求添加默认数据
  14. make错误 redis6_redis安装make失败,make[1]: *** [adlist.o] Error 127....
  15. left join的基本用法以及on与where的区别
  16. Mysql数据库连接池之C3p0的使用
  17. WLAN用户接入流程
  18. Wifi万能钥匙已经被淘汰!GitHub上这个开源工具太好用了!
  19. siki学院_Unity初级案例_愤怒的小鸟_学习笔记1/3
  20. 开课吧:C++学习的方向是什么?

热门文章

  1. 第22课: JSP语句 switch判断语句 (JSP教程 JSP入门实战教程 黄菊华Java网站开发系列教程)
  2. 小夜曲dsd使用foobar2000测试dsd输出
  3. 驱动开发入门 - 之二:Win7-x64 + VMWare (Win7-x64) + WinDbg 双机调试环境搭建
  4. 查看计算机显卡驱动版本,电脑怎么更新显卡驱动?如何查看驱动是否正常
  5. 【lizhi125】比Nero更好用的免费小巧的光盘刻录软件——ImgBurn(中文版)
  6. 基于JAVA在线购书商城系统计算机毕业设计源码+系统+数据库+lw文档+部署
  7. 如何使用EditPlus3编写汇编语言
  8. 为什么Audition cc2017扫描不了电音插件,你需要这个软件
  9. Java完全自学手册,一册在手,offer我有(附程序员书单)
  10. hr面试高频问题回答思路总结