首先,第一步,游戏简单素材的准备。

炮弹,坦克移动。音乐-开火素材。

其次,思路整理。

我们需要几个类,分别是玩家类,敌人类,炮弹类及地图类,开始游戏界面以及结束界面,血条等等。

开始coding。

主函数,new一个对象(java乱入emmm),声明一个对象。

# encoding : utf-8
# anthor : comi
from gameloop import *
from pygame import *
import pygame,sys,timeif __name__ == '__main__':player = game()    # 声明一个类对象player.game_start('KEEP-GOING')    # 调用开始函数while player.playing:    # 进入游戏运行player.new()    # 开始游戏player.screen.fill(black)player.game_start('GAME-OVER')    # 游戏结束time.sleep(1.5)    # 可以不要

这里可以根据自己的需要进行更改相关代码

接下来 游戏的主循环

# encoding : utf-8
# author : comi
from setting import *
from pygame import *
from Sprite import *
import pygame,sys
vec = pygame.math.Vector2class game:    # 游戏类 包含循环等def __init__(self):    # 初始化pygame.init()    # pygame 初始化pygame.display.set_caption("Keep-Going")    # 游戏窗口 左上角名称self.screen = pygame.display.set_mode((width, height))    # 游戏窗口的大小self.FpsClock = pygame.time.Clock()    # 设置游戏的刷新率self.playing = True    # 进入游戏的状态self.running = True    # 游戏运行的状态self.Waiting = True    # 游戏等待的状态self.Pblood = 100    # 玩家血量self.Eblood = 100    # 敌人血量self.player = Player()    # 声明一个游戏玩家对象self.enemy = Enemy()    # 声明一个敌人对象self.all_groups = pygame.sprite.Group()    #    通过pygame自带的 group 来判断碰撞检测self.player_groups = pygame.sprite.Group()self.Map_groups = pygame.sprite.Group()self.Enemy_groups = pygame.sprite.Group()def new(self):    # 开始一个游戏self.player_groups.add(self.player)    # 将玩家添加到玩家组self.all_groups.add(self.player)    # 将玩家添加到 所有组self.Enemy_groups.add(self.enemy)self.all_groups.add(self.enemy)for platfroms in Map1:    # 地图p = Platform(*platfroms)     # 取出所有值self.Map_groups.add(p)self.all_groups.add(p)self.run()    # 调用函数运行游戏def game_start(self,text):     # 游戏的开始界面self.text_draw(width / 2, height / 4, 64, text)  # 文本self.text_draw(width / 2, height * 3 / 4, 25,'Press any key to continue',)  # 文本pygame.display.update()    # 更行展示while self.Waiting:    # 实现 按键等待开始效果for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.KEYDOWN:    self.Waiting = Falsedef update(self):    # 画面更新self.Map_groups.update()    self.player_groups.update()self.enemy.Bullet_groups.update(self.enemy.flag)    # 通过按键判断子弹方向self.player.Bullet_groups.update(self.player.flag)self.Enemy_groups.update()hit = pygame.sprite.groupcollide(self.player.Bullet_groups, self.Map_groups, True,False)   # 子弹碰墙消失hit = pygame.sprite.groupcollide(self.enemy.Bullet_groups, self.Map_groups, True, False)PMC = pygame.sprite.spritecollide(self.player,self.Map_groups,False,False)      # 撞墙if PMC:key_pressed = pygame.key.get_pressed()if key_pressed[pygame.K_a]:self.player.pos.x = self.player.pos.x + gapif key_pressed[pygame.K_d]:self.player.pos.x = self.player.pos.x - gapif key_pressed[pygame.K_w]:self.player.pos.y = self.player.pos.y + gapif key_pressed[pygame.K_s]:self.player.pos.y = self.player.pos.y - gapEMC = pygame.sprite.spritecollide(self.enemy,self.Map_groups,False,False)       # 撞墙if EMC:key_pressed = pygame.key.get_pressed()if key_pressed[pygame.K_LEFT]:self.enemy.pos.x = self.enemy.pos.x + gapif key_pressed[pygame.K_RIGHT]:self.enemy.pos.x = self.enemy.pos.x - gapif key_pressed[pygame.K_UP]:self.enemy.pos.y = self.enemy.pos.y + gapif key_pressed[pygame.K_DOWN]:self.enemy.pos.y = self.enemy.pos.y - gapdef run(self):    while self.running:self.FpsClock.tick(Fps)    # 设置帧率self.events()    # 获取事件self.draw_pic()    # 画出图片self.update()    f self.Eblood <= 0: # enemy    self.screen.fill(black)self.game_start('P1 WIN!')time.sleep(1.5)self.running = Falseself.playing = Falseif self.Pblood <= 0: # Playerself.screen.fill(black)self.game_start('P2 WIN!')time.sleep(1.5)self.running = Falseself.playing = Falsedef text_draw(self, x, y, size, text):    # 文本展示函数self.font = pygame.font.Font('freesansbold.ttf', size)    # 字体,大小self.text_surf = self.font.render(text, True, red)    # 颜色self.text_rect = self.text_surf.get_rect()    # 矩形self.text_rect.center = (x, y)    # 位置self.screen.blit(self.text_surf, self.text_rect)    # 覆盖展示def draw_pic(self):    self.screen.fill(white)    # 背景self.text_draw(900,50,30,"KEEP")    # 文本self.text_draw(900, 100, 30, "GOING")self.text_draw(820, 150, 20, "P1:")self.text_draw(820, 200, 20, "P2:")self.text_draw(900, 250, 20, "Attention!")self.text_draw(900,300,20,"The Bullet Can")self.text_draw(900, 350, 20, "Be Control!")self.bar_draw(850, 145, self.Pblood)    # 血条hit = pygame.sprite.groupcollide(self.enemy.Bullet_groups, self.player_groups, True, False)    # 血条减少if hit:self.Pblood = self.Pblood - randint(10, 15)self.bar_draw(850, 145, self.Pblood)self.bar_draw(850, 195, self.Eblood)hit = pygame.sprite.groupcollide(self.player.Bullet_groups, self.Enemy_groups, True, False)if hit:self.Eblood = self.Eblood - randint(10, 15)self.bar_draw(850, 195, self.Eblood)self.Map_groups.draw(self.screen)    # 画出图片self.player_groups.draw(self.screen)self.Enemy_groups.draw(self.screen)self.player.Bullet_groups.draw(self.screen)self.enemy.Bullet_groups.draw(self.screen)pygame.display.update()    def bar_draw(self, x, y, pct):    # 血条函数#  draw a bar    if pct <= 0:pct = 0Bar_Lenth = 100Bar_Height = 10Fill_Lenth = (pct / 100) * Bar_LenthOut_rect = pygame.Rect(x, y, Bar_Lenth, Bar_Height)Fill_rect = pygame.Rect(x, y, Fill_Lenth, Bar_Height)pygame.draw.rect(self.screen, green, Fill_rect)pygame.draw.rect(self.screen, red, Out_rect, 2)def events(self):    # 事件for events in pygame.event.get():if events.type == pygame.QUIT:self.running = Falseself.playing = False

在主循环内实现了很多功能,文本窗口展示,血条展示,以及整个游戏循环的定义都是可以拿来借鉴的,我也是从油管主上学来的。

接下来,精灵类,包含玩家,敌人。子弹,地图四部分。

# encoding : utf-8
# antuor : comi
from setting import *
from pygame import *
import pygame,sys,time
from random import *
from math import *vec = pygame.math.Vector2    # 运用向量class Player(pygame.sprite.Sprite):    # 玩家类Bullet_groups = pygame.sprite.Group()flag = 1    # 判断方向的flagdef __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load(r'..\img\down.png').convert()    # 图片的加载self.image.set_colorkey(white)    # 设置忽略白色self.rect = self.image.get_rect()self.rect.midbottom = (115, 130)    self.pos = vec(115, 130)self.last_time = time.time()    #记录上一次时间 用来设置子弹频率等def update(self):    key_pressed = pygame.key.get_pressed()    # 按键获取if key_pressed[pygame.K_a]:self.image = pygame.image.load(r'..\img\left.png').convert()self.image.set_colorkey(white)self.pos.x -= move_space    # 位置移动self.flag = 2if key_pressed[pygame.K_d]:self.image = pygame.image.load(r'..\img\right.png').convert()self.image.set_colorkey(white)self.pos.x += move_spaceself.flag = 1if key_pressed[pygame.K_w]:self.image = pygame.image.load(r'..\img\up.png').convert()self.image.set_colorkey(white)self.pos.y -= move_spaceself.flag = 3if key_pressed[pygame.K_s]:self.image = pygame.image.load(r'..\img\down.png').convert()self.image.set_colorkey(white)self.pos.y += move_spaceself.flag = 4if key_pressed[pygame.K_SPACE]:self.shoot()self.rect.midbottom = self.pos    def shoot(self):    # 开火self.now = time.time()    # 获取现在时间if self.now - self.last_time > 0.8:    # 子弹时间间隔# 这里显示错误了,应该在if 语句内 包含以下部分pygame.mixer.music.load(r'..\sounds\expl.wav') pygame.mixer.music.play()    # 音乐加载bullet = Bullet(self.pos.x, self.pos.y)self.Bullet_groups.add(bullet)    self.last_time = self.nowclass Platform(pygame.sprite.Sprite):    # 地图创建def __init__(self, x, y, w, h):    # x,y,宽,高pygame.sprite.Sprite.__init__(self)self.image = pygame.Surface((w, h)) # 砖块大小self.image.fill(yellow)    # 砖颜色self.rect = self.image.get_rect()self.rect.x = xself.rect.y = yclass Enemy(pygame.sprite.Sprite):    # 与player 相同Bullet_groups = pygame.sprite.Group()flag = 1def __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load(r'..\img\down.png').convert()self.image.set_colorkey(white)self.rect = self.image.get_rect()self.rect.midbottom = (315, 130)self.pos = vec(315, 130)self.bar = 100self.last_time = time.time()self.flag = 1def update(self):key_pressed = pygame.key.get_pressed()if key_pressed[pygame.K_LEFT]:self.image = pygame.image.load(r'..\img\left.png').convert()self.image.set_colorkey(white)self.pos.x -= move_spaceself.flag = 2if key_pressed[pygame.K_RIGHT]:self.image = pygame.image.load(r'..\img\right.png').convert()self.image.set_colorkey(white)self.pos.x += move_spaceself.flag = 1if key_pressed[pygame.K_UP]:self.image = pygame.image.load(r'..\img\up.png').convert()self.image.set_colorkey(white)self.pos.y -= move_spaceself.flag = 3if key_pressed[pygame.K_DOWN]:self.image = pygame.image.load(r'..\img\down.png').convert()self.image.set_colorkey(white)self.pos.y += move_spaceself.flag = 4if key_pressed[pygame.K_p]:self.shoot()self.rect.midbottom = self.posdef shoot(self):self.now = time.time()if self.now - self.last_time > 0.8:pygame.mixer.music.load(r'..\sounds\expl.wav')pygame.mixer.music.play()bullet = Bullet(self.pos.x, self.pos.y)self.Bullet_groups.add(bullet)self.Bullet_groups.update(self.flag)self.last_time = self.nowclass Bullet(pygame.sprite.Sprite):    # 炮弹组def __init__(self, x, y):    # 炮弹该有的位置 玩家周围pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load(r'..\img\dot.png ').convert()self.image.set_colorkey(white)self.rect = self.image.get_rect()self.rect.centerx = x + 10    # 这里是准确的位置,未进行准确更改self.rect.bottom = y - 12self.speed = 5def update(self,flag):    if flag == 1:   # rightself.rect.x += self.speedif flag == 2:   # leftself.rect.x -= self.speedif flag == 3:   #upself.rect.y -= self.speedif flag == 4:   # downself.rect.y += self.speed

最后,便是相关的设置文件了


# encoding : utf-8
# author :comi
width = 1000
height = 600
Fps = 60
food = 20
gap = 3
move_space = 1.5
back_space = 5
Map1 = [(0, 0, width*2, 10), (0, 10, 10, height * 2),(0, height-10, width * 2, 10), (width - 210, 0, 10, height * 2),(50,50,100,20),(250,50,100,20),(150,230,100,20),(100,340,200,20),(50, 70, 20, 90), (130, 70, 20, 90),(250,70,20,90),(330,70,20,90),(130,280,20,70),(250,300,20,50),(80,320,20,20),(300,320,20,20),(185,200,30,30),(185,250,30,30),(60,300,20,20),(320,300,20,20),(40,280,20,20),(340,280,20,20),(490,100,160,40),(650,100,40,200),(425,250,150,40),(425,290,40,80),(510,365,160,40),(695,460,95,40),(595,454,40,100),(190,460,30,30),(300,450,200,40),(100,425,30,130),(200,520,230,25),(725,70,30,30),(725,140,30,30),(725,210,30,30),(725,280,30,30),(725,365,30,30)]    # map
# colorblack = (0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)
green = (0, 255,0)
blue = (0, 0, 255)
yellow = ( 255,200,0)
purple = (128,138,135)

这个坦克大战还有一些小的bug,比如说,当你按下SPACE 开火是,第一发炮弹已经出去了,当你按下相反方向,子弹会按你第二次按下的方向移动。(不打算解决,开始学习游戏ai,和横板游戏的制作)

有想法的同学可以和我交流,欢迎大家留言。

最后,运行效果如下 ,双人操作 p1:w a s d space 开火 p2: 上 下左 右  p 开火

应网友要求,添加github 开源库https://github.com/BITEWKRER/KeepGoing

如有相关想法,欢迎大家修改提交(需要安装一些常用的pygame开源库环境,上传的为源码,不包含其他资源文件,主要是由于内容过于久远,途中换了电脑导致!)

简单 坦克大战 pygame -制作相关推荐

  1. Unity3D项目十:简单坦克大战

    简单坦克大战 作业要求 坦克对战游戏 AI 设计 从商店下载游戏:"Kawaii" Tank 或 其他坦克模型,构建 AI 对战坦克.具体要求 使用"感知-思考-行为&q ...

  2. java简单坦克大战制作代码

    转载自:http://www.jb51.net/article/88317.htm 利用Java语言中的集合.Swing.线程等知识点编写一个坦克大战游戏. (1) 画出敌我坦克的原理: 在坦克类里面 ...

  3. python坦克大战游戏_python实现简单坦克大战

    基于对面向对象编程的思想完成简单的坦克大战游戏.主要目的锻炼面相对象编程思想 同样的在使用python进行游戏编写时需要安装pygame模块 安装方法: pycharm安装方式:File --> ...

  4. C#面向对象简单坦克大战(创意)

    GIthub地址 TankDemo 介绍 一个c#简单桌面应用(游戏). 基本上实现了坦克大战的相应功能. 参考最下方的截图 特点 支持用户登录注册,保存成绩,成绩排名.(然并-.) 关卡无限!因为一 ...

  5. 重磅来袭(90街机坦克大战unity制作)

    以下为源码,如有错误欢迎指教. using UnityEngine; /// /// 坦克生成复活脚本 /// public class Born : MonoBehaviour { [Header( ...

  6. 基于C++如何使用EGE做一个简单的坦克大战游戏

    作为一个C语言刚入门的小萌新,学完C语言基础语法后就迫不及待想要自己做一个游戏出来了,然后想到了小时候插卡玩的坦克大战,于是做了一个黑框框版的简单坦克大战,后面学了一点EGE图形库就在黑框框版的坦克大 ...

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

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

  8. 坦克大战Java版(文末附下载地址)

    坦克大战Java版(文末附下载地址) 未用框架纯手打Java制作坦克大战游戏,实现基本的玩家对战NPC,积分记录保存,排行榜展示等功能 以下是当初我们组制作的简单坦克大战游戏项目展示(文章最后附上项目 ...

  9. python 中的坦克大战0.1版本

    这个只是初步的坦克大战,只有一个坦克,进行刷新的动作.线程类的操作不是太懂.唯一知道的就是不能再主线程里面使用sleep ,这样子的话,主线程就进入休眠的状态,不能进行时间的监听. import py ...

最新文章

  1. 可扩展且侵入性最小的脑机接口平台
  2. Java 类的热替换---转载
  3. 用 libpcap抓取http报文
  4. BZOJ3298[USACO 2011Open]cow checkers——威佐夫博弈
  5. assign与weak区别(面试)
  6. CSDN写博客(字体颜色、大小)
  7. Haproxy实现负载均衡及相关配置(添加日志、设定自动刷新时间、控制访问、动静分离、读写分离)
  8. arduino uno电压_Arduino UNO中文数据手册
  9. 转载 2012年游戏行业人才需求预测
  10. tornado-ioloop-async-io
  11. HTML5学习笔记(二):HTML基础学习之二
  12. php实例-微信第三方登录
  13. 12月18日23点,2022年卡塔尔世界杯决赛,阿根廷对阵法国,上演巅峰对决,谁能捧走大力神杯?
  14. 1 STM32F407ZG的简单介绍
  15. 【资源】什么是原生广告 What Is Native Advertising?
  16. Debian在vi编辑器里方向键变ABCD,退格键失效
  17. 自己做h5页面点击元素块的时候会出现黑色阴影
  18. 深圳大数据学习:方法的嵌套--【千锋】
  19. matlab电路建模,单相桥式整流电路在MATLAB中的建模与仿真
  20. Outlook Express错误代码表

热门文章

  1. docker下php的ci模式报yac扩展找不到
  2. 十六、行为型模式--观察者模式
  3. TME、Netflix、Spotify的共同「疫」题
  4. php basename读取中文,php basename处理中文的问题
  5. 【Fast RTPS】入门--------Ubuntu系统下
  6. 计算机flash逐渐淡入,用flash制作文字的逐个淡入
  7. ThingsPanel物联网平台添加萤石云摄像头视频播放地址
  8. html第三天之音乐盒
  9. 短视频供需之变,好看视频打响突围战
  10. CNN每一层都做了什么