python使用pygame模块实现坦克大战游戏


Posted in Python onMarch 25, 2020

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

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

python使用pygame模块实现坦克大战游戏炮弹,python使用pygame模块实现坦克大战游戏python使用pygame模块实现坦克大战游戏python使用pygame模块实现坦克大战游戏python使用pygame模块实现坦克大战游戏炮弹,坦克移动。音乐-开火素材。

其次,思路整理

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

开始coding。

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

# encoding : utf-8
# anthor : comi
from gameloop import *
from pygame import *
import pygame,sys,time
 
if __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.Vector2
 
 
class 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 = False
 
 def 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 + gap
   if key_pressed[pygame.K_d]:
    self.player.pos.x = self.player.pos.x - gap
   if key_pressed[pygame.K_w]:
    self.player.pos.y = self.player.pos.y + gap
   if key_pressed[pygame.K_s]:
    self.player.pos.y = self.player.pos.y - gap
 
  EMC = 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 + gap
   if key_pressed[pygame.K_RIGHT]:
    self.enemy.pos.x = self.enemy.pos.x - gap
   if key_pressed[pygame.K_UP]:
    self.enemy.pos.y = self.enemy.pos.y + gap
   if key_pressed[pygame.K_DOWN]:
    self.enemy.pos.y = self.enemy.pos.y - gap
 
 def 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 = False
    self.playing = False
 
   if self.Pblood <= 0: # Player
    self.screen.fill(black)
    self.game_start('P2 WIN!')
    time.sleep(1.5)
    self.running = False
    self.playing = False
 
 def 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 = 0
  Bar_Lenth = 100
  Bar_Height = 10
  Fill_Lenth = (pct / 100) * Bar_Lenth
  Out_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 = False
    self.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 # 判断方向的flag
 def __init__(self):
  pygame.sprite.Sprite.__init__(self)
  self.image = pygame.image.load(r'C:\Users\Administrator\Desktop\KeepGoing\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'C:\Users\Administrator\Desktop\KeepGoing\img\left.png').convert()
   self.image.set_colorkey(white)
   self.pos.x -= move_space # 位置移动
   self.flag = 2
  if key_pressed[pygame.K_d]:
   self.image = pygame.image.load(r'C:\Users\Administrator\Desktop\KeepGoing\img\right.png').convert()
   self.image.set_colorkey(white)
   self.pos.x += move_space
   self.flag = 1
  if key_pressed[pygame.K_w]:
   self.image = pygame.image.load(r'C:\Users\Administrator\Desktop\KeepGoing\img\up.png').convert()
   self.image.set_colorkey(white)
   self.pos.y -= move_space
   self.flag = 3
  if key_pressed[pygame.K_s]:
   self.image = pygame.image.load(r'C:\Users\Administrator\Desktop\KeepGoing\img\down.png').convert()
   self.image.set_colorkey(white)
   self.pos.y += move_space
   self.flag = 4
  if 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'C:\Users\Administrator\Desktop\KeepGoing\sounds\expl.wav') 
   pygame.mixer.music.play() # 音乐加载
   bullet = Bullet(self.pos.x, self.pos.y)
   self.Bullet_groups.add(bullet) 
   self.last_time = self.now
 
 
class 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 = x
  self.rect.y = y
 
 
class Enemy(pygame.sprite.Sprite): # 与player 相同
 Bullet_groups = pygame.sprite.Group()
 flag = 1
 def __init__(self):
  pygame.sprite.Sprite.__init__(self)
  self.image = pygame.image.load(r'C:\Users\Administrator\Desktop\KeepGoing\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 = 100
  self.last_time = time.time()
  self.flag = 1
 
 def update(self):
  key_pressed = pygame.key.get_pressed()
  if key_pressed[pygame.K_LEFT]:
   self.image = pygame.image.load(r'C:\Users\Administrator\Desktop\KeepGoing\img\left.png').convert()
   self.image.set_colorkey(white)
   self.pos.x -= move_space
   self.flag = 2
  if key_pressed[pygame.K_RIGHT]:
   self.image = pygame.image.load(r'C:\Users\Administrator\Desktop\KeepGoing\img\right.png').convert()
   self.image.set_colorkey(white)
   self.pos.x += move_space
   self.flag = 1
  if key_pressed[pygame.K_UP]:
   self.image = pygame.image.load(r'C:\Users\Administrator\Desktop\KeepGoing\img\up.png').convert()
   self.image.set_colorkey(white)
   self.pos.y -= move_space
   self.flag = 3
  if key_pressed[pygame.K_DOWN]:
   self.image = pygame.image.load(r'C:\Users\Administrator\Desktop\KeepGoing\img\down.png').convert()
   self.image.set_colorkey(white)
   self.pos.y += move_space
   self.flag = 4
  if key_pressed[pygame.K_p]:
   self.shoot()
 
  self.rect.midbottom = self.pos
 
 def shoot(self):
  self.now = time.time()
  if self.now - self.last_time > 0.8:
   pygame.mixer.music.load(r'C:\Users\Administrator\Desktop\KeepGoing\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.now
 
 
class Bullet(pygame.sprite.Sprite): # 炮弹组
 def __init__(self, x, y): # 炮弹该有的位置 玩家周围
  pygame.sprite.Sprite.__init__(self)
  self.image = pygame.image.load(r'C:\Users\Administrator\Desktop\KeepGoing\img\dot.png ').convert()
  self.image.set_colorkey(white)
  self.rect = self.image.get_rect()
  self.rect.centerx = x + 10 # 这里是准确的位置,未进行准确更改
  self.rect.bottom = y - 12
  self.speed = 5
 
 def update(self,flag): 
  if flag == 1: # right
   self.rect.x += self.speed
  if flag == 2: # left
   self.rect.x -= self.speed
  if flag == 3: #up
   self.rect.y -= self.speed
  if flag == 4: # down
   self.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
# color
 
black = (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 开火

python使用pygame模块实现坦克大战游戏python使用pygame模块实现坦克大战游戏

更多关于python游戏的精彩文章请点击查看以下专题:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
分析python服务器拒绝服务攻击代码
Jan 16 Python
python数据结构之图的实现方法
Jul 08 Python
利用Python操作消息队列RabbitMQ的方法教程
Jul 19 Python
Python(Django)项目与Apache的管理交互的方法
May 16 Python
Python实现简单的用户交互方法详解
Sep 25 Python
在python下使用tensorflow判断是否存在文件夹的实例
Jun 10 Python
python安装requests库的实例代码
Jun 25 Python
Python 获取项目根路径的代码
Sep 27 Python
Win10 安装PyCharm2019.1.1(图文教程)
Sep 29 Python
python3下pygame如何实现显示中文
Jan 11 Python
如何用python爬取微博热搜数据并保存
Feb 20 Python
python开发制作好看的时钟效果
May 02 Python
Django如何开发简单的查询接口详解
May 17 #Python
详解python函数的闭包问题(内部函数与外部函数详述)
May 17 #Python
学习python分支结构
May 17 #Python
python pygame实现方向键控制小球
May 17 #Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
May 16 #Python
Python实现Linux监控的方法
May 16 #Python
计算机二级python学习教程(3) python语言基本数据类型
May 16 #Python
You might like
PHP 解决utf-8和gb2312编码转换问题
2010/03/18 PHP
2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
2014/04/08 PHP
PHP合并数组+号和array_merge的区别
2015/06/25 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
2016/07/09 PHP
简单谈谈PHP面向对象之标识对象
2017/06/27 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
基于豆瓣API+Angular开发的web App
2015/01/02 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
2015/03/18 Javascript
深入理解javascript中concat方法
2016/12/12 Javascript
NodeJs中express框架的send()方法简介
2017/06/20 NodeJs
JS引用传递与值传递的区别与用法分析
2018/06/01 Javascript
jQuery利用FormData上传文件实现批量上传
2018/12/04 jQuery
vue踩坑记录之数组定义和赋值问题
2019/03/20 Javascript
vue使用keep-alive保持滚动条位置的实现方法
2019/04/09 Javascript
JavaScript实现模态对话框实例
2020/01/13 Javascript
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
简单总结Python中序列与字典的相同和不同之处
2016/01/19 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
2016/02/19 Python
python 把数据 json格式输出的实例代码
2016/10/31 Python
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
Python入门_浅谈数据结构的4种基本类型
2017/05/16 Python
PyQt5打开文件对话框QFileDialog实例代码
2018/02/07 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
在pycharm下设置自己的个性模版方法
2019/07/15 Python
Python使用Pandas对csv文件进行数据处理的方法
2019/08/01 Python
python 生成器和迭代器的原理解析
2019/10/12 Python
python如何将两张图片生成为全景图片
2020/03/05 Python
matplotlib基础绘图命令之imshow的使用
2020/08/13 Python
纯CSS3实现手风琴风格菜单具体步骤
2013/05/06 HTML / CSS
MIS软件工程师的面试题
2016/04/22 面试题
财务信息服务专业自荐书范文
2014/02/08 职场文书
演讲稿的格式及范文
2014/08/22 职场文书
余世维讲座观后感
2015/06/11 职场文书
Python 全局空间和局部空间
2022/04/06 Python