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

本文实例为大家分享了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 开火

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

(0)

相关推荐

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

    本文实例为大家分享了python实现坦克大战的具体代码,供大家参考,具体内容如下 #功能实现游戏主窗口 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 = No

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

    本文实例为大家分享了pygame模块实现坦克大战游戏的具体代码,供大家参考,具体内容如下 首先,第一步,游戏简单素材的准备. 炮弹,炮弹,坦克移动.音乐-开火素材. 其次,思路整理. 我们需要几个类,分别是玩家类,敌人类,炮弹类及地图类,开始游戏界面以及结束界面,血条等等. 开始coding. 主函数,new一个对象(java乱入emmm),声明一个对象. # encoding : utf-8 # anthor : comi from gameloop import * from pygame

  • python之pygame模块实现飞机大战完整代码

    本文实例为大家分享了python之pygame模块实现飞机大战的具体代码,供大家参考,具体内容如下 Python飞机大战步骤: 1.数据区 2.主界面 3.飞船 4.事件监控及边界 5.外星人 6.记分系统 飞机大战效果图: 源码: """ 功能:飞机大战 time:2019/10/3 """ import os import pygame import sys import time from pygame.sprite import Spri

  • 基于python实现坦克大战游戏

    本文实例为大家分享了python实现坦克大战游戏的具体代码,供大家参考,具体内容如下 游戏界面 pygame游戏引擎的安装 pip安装 windows + R --> cmd --> 命令行输入 pip install 模块名==版本号 pycharm中安装 File --> setting --> Project --> Project Interpreter --> 右侧 + install --> 搜索框输入pygame --> 下方 installP

  • python pygame模块编写飞机大战

    本文实例为大家分享了python pygame模块编写飞机大战的具体代码,供大家参考,具体内容如下 该程序没有使用精灵组,而是用列表存储对象来替代精灵组的动画效果.用矩形对象的重叠来判断相撞事件.该程序可以流畅运行,注释较为详细,希望可以帮助大家. import pygame from pygame.locals import * from sys import exit import time import random # 创建子弹类,把子弹的图片转化为图像对象,设定固定的移动速度 clas

  • python实现双人版坦克大战游戏

    游戏介绍: 双人版的<坦克大战>的基本规则是玩家消灭出现的敌方坦克保卫我方基地. 中间还会随机出现很多特殊道具吸收可获得相应的功能,消灭玩即可进入下一关. 方向键:上下左右移动即可.另一个方向键则是:WSAD. 环境配置: Python3. Pycharm .Pygame. 第三方库的安装:pip  install pygame 效果展示: 开始界面一一 开始即可上手玩游戏,还有背景音乐辅助!游戏玩儿起来更带感!  游戏界面-- 代码演示: 1)游戏主程序 import pygame impo

  • Python Pygame实战之红心大战游戏的实现

    目录 导语 一. 红心大战用户手册 二.红心大战游戏规则 三.准备中 四.代码演示 五.效果展示 导语 还记得那些年,我们玩过的Windows小游戏吗? 说起Windows自带的游戏,相信许多80.90后的朋友都不陌生. 在很早的那个游戏贫瘠的年代,<纸牌>.<扫雷>等游戏帮助我们在微机课上带来了许多欢乐的时光.但在这些游戏中,有一款游戏似乎玩懂的人,甚至知道玩法的人并不多.这款游戏就是<红心大战>. 最近小编心血来潮仔细钻研了一下之后,发现这款游戏玩起来却比其他的几款

  • Pygame坦克大战游戏开发实战详解代码

    导语 哈喽!哈喽——我是木木子 今天来升级下之前写的坦克大战游戏嘛,哈哈哈 其实也不算是修改,就是稍微的调试一下!​​ 因为之前写的界面都是英文的 ,有的小伙伴儿英文一点儿都不会的可能看着别扭,今天来一款中 文版的给大家嘛! 俗话说的好:“雨露均沾”.哈哈哈.jpg 小简介: <坦克大战>,1985年由日本开发商南梦宫(Namco)开发,是第一款可以双打的红白机游戏. 当时使用的还是小霸王. 很多小朋友以学习的名义买了以后偷偷打的打游戏还被家长发现了有 没得! <坦克大战>红白机原

  • 教你使用Python的pygame模块实现拼图游戏

    目录 pygame介绍 安装pygame pygame常用模块 pygame入门案例 pygame实现拼图游戏 总结 pygame介绍 Python Pygame 是一款专门为开发和设计 2D 电子游戏而生的软件包,它支 Windows.Linux.Mac OS 等操作系统,具有良好的跨平台性.Pygame 由 Pete Shinners 于 2000 年开发而成,是一款免费.开源的的软件包,因此您可以放心地使用它来开发游戏,不用担心有任何费用产生. Pygame 在 SDL(Simple Di

  • 利用Python写个简易版星空大战游戏

    目录 前言 一.游戏画面 二.游戏结束画面 三.游戏素材 四.游戏代码 五.核心代码 1.导入模块 2.动态星空背景函数 3.不定时产生敌机函数 4.飞碟的移动 5.子弹的移动 6.玩家射击函数 7.播放背景音乐与生成声效对象 8.新建屏幕 9.移动图章实现星星 10.哭脸 11.玩家 12.飞碟移动与子弹移动 13.敌机的碰撞检测 14.闯关成功把子弹删除 六.总结 前言 通过辣条最近观察,大家好像对划水摸鱼是情有独钟啊.于是乎我重操旧业又写上了这么一个简单版的星空大战小游戏. 当然了辣条的初

随机推荐