1.导入依赖&通用配置

import random
import sys
import time
from urllib.request import urlretrieve
import os
import pygameSCREEN_WIDTH, SCREEN_HEIGHT = 1200, 700
MY_BIRTH_LEFT, MY_BIRTH_TOP = SCREEN_WIDTH / 2, SCREEN_HEIGHT - 60
DIRECTION = [U, D, L, R] = [ U ,  D ,  L ,  R ]
Tank_IMAGE_POSITION = r D:/tank_img
URL =  https://gitee.com/tyoui/logo/raw/master/img/

2.通用加载函数

def load_img(name_img):save = Tank_IMAGE_POSITION + os.sep + name_img +  .gifif not os.path.exists(save):urlretrieve(URL + name_img +  .gif , save)return pygame.image.load(save)def load_music(name_music):save = Tank_IMAGE_POSITION + os.sep + name_music +  .wavif not os.path.exists(save):urlretrieve(URL + name_music +  .wav , save)pygame.mixer.music.load(save)pygame.mixer.music.play()

3.通用基础类

class BaseItem(pygame.sprite.Sprite):def __init__(self):super().__init__()

4.定义bullet类

class Bullet(BaseItem):def __init__(self, tank, window):super().__init__()self.direction = tank.directionself.speed = tank.speed * 3self.img = load_img( bullet )self.rect = self.img.get_rect()self.window = windowself.live = Trueif self.direction == U:self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2self.rect.top = tank.rect.top - self.rect.heightelif self.direction == D:self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2self.rect.top = tank.rect.top + tank.rect.heightelif self.direction == L:self.rect.left = tank.rect.left - self.rect.width / 2 - self.rect.width / 2self.rect.top = tank.rect.top + tank.rect.height / 2 - self.rect.height / 2else:self.rect.left = tank.rect.left + tank.rect.widthself.rect.top = tank.rect.top + tank.rect.height / 2 - self.rect.height / 2def display_bullet(self):self.window.blit(self.img, self.rect)def bullet_move(self):if self.direction == U:if self.rect.top > 0:self.rect.top -= self.speedreturnelif self.direction == D:if self.rect.top < SCREEN_HEIGHT:self.rect.top += self.speedreturnelif self.direction == L:if self.rect.left > 0:self.rect.left -= self.speedreturnelse:if self.rect.left < SCREEN_WIDTH:self.rect.left += self.speedreturnself.live = Falsedef hit_enemy_tank(self):for enemy in TankGame.enemy_tank_list:hit = pygame.sprite.collide_rect(self, enemy)if hit:self.live = Falseif enemy.click_count == 1:enemy.live = Falsereturn Noneenemy.click_count -= 1if enemy.click_count == 2:enemy.load_image = enemy.img32if enemy.click_count == 1:enemy.load_image = enemy.img31load_music( hit )def hit_my_tank(self, tank):hit = pygame.sprite.collide_rect(self, tank)if hit:self.live = Falsetank.live = Falsedef bullet_collide_wall(self):for wall in TankGame.wall_list:result = pygame.sprite.collide_rect(self, wall)if result:self.live = Falseif wall.count == 1:wall.live = Falseelse:load_music( hit )def bullet_collide_bullet(self):for bullet in TankGame.enemy_bullet_list:if pygame.sprite.collide_rect(bullet, self):bullet.live = Falseself.live = False

5.定义tank类

class Tank(BaseItem):def __init__(self, left, top, window, image, direction, speed):super().__init__()self.window = windowself.load_image = imageself.direction = directionself.img = self.load_image[self.direction]self.rect = self.img.get_rect()self.rect.left = leftself.rect.top = topself.speed = speedself.tank_width = self.rect.widthself.tank_height = self.rect.heightself.wall_switch = Falseself.move_stop = Trueself.live = Trueself.old_left = 0self.old_top = 0def fire(self):return Bullet(self, self.window)def display(self):self.img = self.load_image[self.direction]self.window.blit(self.img, self.rect)def wall_not(self, direction):if direction == U:return self.rect.top > 0elif direction == D:return self.rect.top <= SCREEN_HEIGHT - self.tank_heightelif direction == L:return self.rect.left > 0else:return self.rect.left <= SCREEN_WIDTH - self.tank_widthdef wall_yes(self, direction):if direction == U:if self.rect.top < 0:self.rect.top = SCREEN_HEIGHTelif direction == D:self.rect.top %= SCREEN_HEIGHTelif direction == L:if self.rect.left < 0:self.rect.left = SCREEN_WIDTHelse:self.rect.left %= SCREEN_WIDTHdef move(self, direction):self.old_left = self.rect.leftself.old_top = self.rect.topif self.wall_switch:self.wall_yes(direction)elif not self.wall_not(direction):return Noneif direction == U:self.rect.top -= self.speedelif direction == D:self.rect.top += self.speedelif direction == L:self.rect.left -= self.speedelse:self.rect.left += self.speeddef stay(self):self.rect.left = self.old_leftself.rect.top = self.old_topdef tank_collide_wall(self):for wall in TankGame.wall_list:if pygame.sprite.collide_rect(self, wall):self.stay()def tank_collide_tank(self):for tank in TankGame.enemy_tank_list:if pygame.sprite.collide_rect(self, tank):self.stay()

6.定义我方&对方tank类

class MyTank(Tank):def __init__(self, left, top, window):self.img = dict(U=load_img( p2tankU ), D=load_img( p2tankD ), L=load_img( p2tankL ), R=load_img( p2tankR ))self.my_tank_speed = 4super().__init__(left, top, window, self.img, U, self.my_tank_speed)class EnemyTank(Tank):def __init__(self, left, top, window):self.img1 = dict(U=load_img( enemy1U ), D=load_img( enemy1D ), L=load_img( enemy1L ), R=load_img( enemy1R ))self.img2 = dict(U=load_img( enemy2U ), D=load_img( enemy2D ), L=load_img( enemy2L ), R=load_img( enemy2R ))self.img3 = dict(U=load_img( enemy3U ), D=load_img( enemy3D ), L=load_img( enemy3L ), R=load_img( enemy3R ))self.img31 = dict(U=load_img( enemy3U_1 ), D=load_img( enemy3D_1 ), L=load_img( enemy3L_1 ),R=load_img( enemy3R_1 ))self.img32 = dict(U=load_img( enemy3U_2 ), D=load_img( enemy3D_2 ), L=load_img( enemy3L_2 ),R=load_img( enemy3R_2 ))image, self.click_count, speed = random.choice([(self.img1, 1, 4), (self.img3, 3, 3), (self.img2, 1, 5)])super().__init__(left, top, window, image, self.random_direction(), speed)self.step = 100@staticmethoddef random_direction():n = random.randint(0, 3)return DIRECTION[n]def random_move(self):if self.step == 0:self.direction = self.random_direction()self.step = random.randint(10, 100)else:self.move(self.direction)self.step -= 1def random_fire(self):if random.randint(0, 50) == 1 and len(TankGame.enemy_bullet_list) < 30:enemy_bullet = self.fire()TankGame.enemy_bullet_list.append(enemy_bullet)

7.爆炸动作类

class Explode(BaseItem):def __init__(self, tank, window):super().__init__()self.img = [load_img( blast0 ), load_img( blast1 ), load_img( blast2 ), load_img( blast3 ), load_img( blast4 ),load_img( blast5 ), load_img( blast6 )]self.rect = tank.rectself.stop = 0self.window = windowself.rect.left = tank.rect.left - tank.rect.width / 2def display_explode(self):load_music( blast )while self.stop < len(self.img):self.window.blit(self.img[self.stop], self.rect)self.stop += 1

8.定义wall类

class Wall(BaseItem):def __init__(self, left, top, window):super().__init__()self.count = random.randint(0, 1)self.img = [load_img( steels ), load_img( walls )][self.count]self.rect = self.img.get_rect()self.rect.left = leftself.rect.top = topself.window = windowself.live = Truedef display_wall(self):self.window.blit(self.img, self.rect)

9.定义坦克大战类

class TankGame:my_bullet_list = list()enemy_bullet_list = list()enemy_tank_list = list()wall_list = list()def __init__(self):if not os.path.exists(Tank_IMAGE_POSITION):os.makedirs(Tank_IMAGE_POSITION)pygame.init()pygame.font.init()self.display = pygame.displayself.window = self.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT], pygame.RESIZABLE, 32)self.display.set_caption( 坦克世界 )self.my_tank = MyTank(MY_BIRTH_LEFT, MY_BIRTH_TOP, self.window)self.creat_enemy_number = 10self.my_tank_lift = 3self.creat_enemy(self.creat_enemy_number)self.creat_walls()self.font = pygame.font.SysFont( kai_ti , 18)self.number = 1def creat_enemy(self, number):for _ in range(number):left = random.randint(0, SCREEN_WIDTH - self.my_tank.tank_width)enemy_tank = EnemyTank(left, 20, self.window)TankGame.enemy_tank_list.append(enemy_tank)def creat_walls(self):for i in range(SCREEN_WIDTH // 60 + 1):wall_h = random.randint(100, 500)w = Wall(60 * i, wall_h, self.window)TankGame.wall_list.append(w)@staticmethoddef show_walls():for w in TankGame.wall_list:if w.live:w.display_wall()else:TankGame.wall_list.remove(w)def start_game(self):load_music( start )while True:self.window.fill([0, 0, 0])self.get_event()len_enemy = len(TankGame.enemy_tank_list)self.window.blit(self.draw_text( 敌方坦克*{0},我方生命值*{1},当前{2}关 .format(len_enemy, self.my_tank_lift, self.number)), (10, 10))if len_enemy == 0:self.creat_enemy_number += 10self.number += 1self.my_tank_lift += 1self.creat_enemy(self.creat_enemy_number)self.wall_list.clear()self.creat_walls()self.show_my_tank()self.show_enemy_tank()self.show_bullet(TankGame.enemy_bullet_list)self.show_bullet(TankGame.my_bullet_list)self.show_walls()self.display.update()time.sleep(0.02)def show_my_tank(self):if self.my_tank.live:self.my_tank.display()self.my_tank.tank_collide_tank()self.my_tank.tank_collide_wall()else:Explode(self.my_tank, self.window).display_explode()del self.my_tankif self.my_tank_lift == 0:self.end_game()self.my_tank_lift -= 1load_music( add )self.my_tank = MyTank(MY_BIRTH_LEFT, MY_BIRTH_TOP, self.window)if not self.my_tank.move_stop:self.my_tank.move(self.my_tank.direction)def show_enemy_tank(self):for e in TankGame.enemy_tank_list:e.random_move()e.tank_collide_wall()if e.live:e.display()else:TankGame.enemy_tank_list.remove(e)Explode(e, self.window).display_explode()e.random_fire()def show_bullet(self, ls):for b in ls:b.bullet_move()b.bullet_collide_wall()if ls is TankGame.my_bullet_list:b.hit_enemy_tank()b.bullet_collide_bullet()else:b.hit_my_tank(self.my_tank)if b.live:b.display_bullet()else:ls.remove(b)def get_event(self):global SCREEN_WIDTH, SCREEN_HEIGHTevent_list = pygame.event.get()for event in event_list:if event.type == pygame.VIDEORESIZE:SCREEN_WIDTH, SCREEN_HEIGHT = event.sizeself.window = self.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT], pygame.RESIZABLE, 32)if event.type == pygame.QUIT:self.end_game()if event.type == pygame.KEYDOWN:if event.key == pygame.K_w:self.my_tank.direction = Uelif event.key == pygame.K_s:self.my_tank.direction = Delif event.key == pygame.K_a:self.my_tank.direction = Lelif event.key == pygame.K_d:self.my_tank.direction = Relse:return Noneself.my_tank.move_stop = Falseelif event.type == pygame.MOUSEBUTTONDOWN:if len(TankGame.my_bullet_list) < 3:bullet = self.my_tank.fire()load_music( fire )TankGame.my_bullet_list.append(bullet)elif event.type == pygame.KEYUP:self.my_tank.move_stop = Truedef end_game(self):self.display.quit()sys.exit()def draw_text(self, content):text_sf = self.font.render(content, True, [255, 0, 0])return text_sf

10.入口

if __name__ ==  __main__ :g = TankGame()g.start_game()

制作一个经典坦克大战相关推荐

  1. Java实现的经典坦克大战小游戏

    Java实现的经典坦克大战小游戏 先看一下游戏结构: 有点多,没有耐心的可以不用看,这里先给出链接吧! 云链接:经典坦克大战 提取码:s9ai 这里就不介绍功能了,贴了一张游戏运行的截图,具体的功能自 ...

  2. HTML5经典坦克大战及源码

    目录 一.简单介绍 二.具体界面 主界面 排行榜界面 组员信息界面 组员信息场景 三.部分代码 3.1 界面绘制的实现 6.2 坦克移动实现 3.3 发射炮弹 3.4声音处理 3.5计分 四.总结 一 ...

  3. C++实现经典坦克大战(一)

    简介 本项目是基于easyX库来实现的一个C++版本的经典坦克大战的游戏界面. easyX库的下载及安装使用 easyX的全称为EasyX Graphics Library,是针对与Visual C+ ...

  4. 实战小例子 | 经典坦克大战的python实现

    ​ 目录 效果展示 开发工具 讲解部分 一:游戏介绍 二:主体构成(地图讲解为主) 三:游戏的进阶 相关资源 代码获取 效果展示 开发工具 编译器:python3.6.4 主要的第三方库:pygame ...

  5. 经典坦克大战的python实现

    欢迎加入我们卧虎藏龙的python讨论qq群:729683466 导语 看到封面 大家一定觉得很熟悉 这不就是小时候经常玩的坦克大战吗 现在有没有想过用python实现一下 了解一下游戏的内部结构是什 ...

  6. 《HTML5经典坦克大战》游戏(代码)

    前几天粗略地学了HTML5,然后就用它写了一个<经典坦克大战>游戏. 现在想分享一下我写的代码,写得不好请大家多多指教. 给大家推荐一个网站,这个网站是为大学生而做,为方便学习编程的同学而 ...

  7. html实现经典坦克大战小游戏

    文章目录 1.设计来源 1.1 游戏主界面 1.2 游戏界面 2.效果和源码 2.1 动态效果 2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/w ...

  8. 【180718】FC经典坦克大战源码

    采用VB.NET开发的经典坦克大战FC游戏源码,模拟任天堂的坦克大战.全开源代码,测试请注意开启键盘大写.控制方式:大写的J K L I 控制坦克方向,F发弹. 注意事项: 开发环境为Visual S ...

  9. 【180622】VC++ 超经典坦克大战双人版

    超经典坦克大战双人版,VC++完整版,含声音.地图.资源文件,编译后请将Map.Sound.graphics拷贝至可执行文件同级目录内,否则出错.大家看看界面就知这游戏有多经典了吧?小时候没玩过的不多 ...

最新文章

  1. R语言ggplot2可视化绘制分组水平条形图并在条形图的各种位置添加数值标签实战
  2. php 表单处理,用PHP提交from表单的处理方法
  3. TFS修改工作区映射区
  4. 关于电商你应该知道的!!!(深度好文)
  5. 大数据最核心的关键技术——32个算法,记得收藏!
  6. java中JOptionPane类_java:JOptionPane类消息框总结
  7. IDEA中如何新建一个带有-P目录的项目
  8. python xlrd安装_详解python中xlrd包的安装与处理Excel表格
  9. 解决QTcpSocket类中readAll()函数调用失败问题
  10. 基于TCP和多线程实现无线鼠标键盘-Socket(2)
  11. ubuntu合并终端_技术|初级:如何在终端及图形界面中更新 Ubuntu
  12. JavaScript内置对象之Array对象总结(附实例)
  13. Caliburn.Micro入门
  14. .NET基础-18-html中各种常用标签
  15. 如何在php中针对距现在时间长短显示不同时间格式
  16. 10.24程序员日,开源社给大家送上大礼!【抢票贴】#疯狂倒计时24小时,10月24-25日I WANT YOU!#...
  17. Android开发笔记之SeekBar 时间的显示 快进快退 Mediaplayer
  18. c语言安徽省考试成绩查询,2021安徽省考报名入口_安徽省考成绩查询
  19. 为什么现在我们很难打造一支跟中供铁军一样的销售队伍?
  20. VMware下载及安装(附带下载地址)

热门文章

  1. stm32hal库应用笔记之 硬件I2C读写ZD24C64
  2. SpringMVC 用对象接收 ajax提交form表单
  3. 室内监控与室外监控有什么区别 如何选择合适的监控摄像机
  4. Vue项目中常见问题(55)提交订单、获取订单号、展示支付信息
  5. 什么是Redis?为什么要用Redis?
  6. ls、ls -a、ls -l、ls -al、ll、ll -a区别
  7. 驱动led --GPIO控制
  8. 3.数据仓库之确定粒度
  9. Android默认设置MTP模式
  10. 在Xml中加注释的方法