本文实例为大家分享了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游戏的精彩文章请点击查看以下专题:

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

python调用pygame_python使用pygame模块实现坦克大战游戏相关推荐

  1. 用pygame做经典坦克大战游戏(附源码)

    首先,我们得分析这个项目的结构,设计出它的框架 坦克大战游戏项目开发 需求分析 1.分析项目需要多少个类 2.分析每个类有哪些方法 1.坦克类(敌方坦克,我方坦克) 移动.射击.展示 2.子弹类 移动 ...

  2. 运用Python+Pygame开发坦克大战游戏_版本V1.01

    这里写目录标题 一.项目整体说明 二.pygame下载方式 三.项目文件 1.坦克大战_框架_1.py 2.坦克大战_开始游戏_窗口设置_2.py 3.坦克大战_事件检测_3.py 4.坦克大战_基本 ...

  3. Python使用pygame模块实现飞机大战

    文章目录 ReadMe 1.开发环境 2.准备环境 2.1 创建工程文件夹和虚拟环境 2.2 安装pygame工具包 3.帮助文档 4.开发步骤 5.项目分析 5.1 对象关系图 5.2 飞机具有的属 ...

  4. 【Python游戏】pygame模块制作飞机大战、贪吃蛇(多模式)含源码

    pygame模块制作飞机大战.贪吃蛇(多版本) 本章意在学习pygame模块以及巩固python语法. 若有需请转去个人github:https://github.com/onlyhyl/pyGame

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

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

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

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

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

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

  8. python坦克大战游戏_Python开发的坦克大战游戏

    python开发的坦克大战游戏importpygamefrom pygame.sprite importSpriteimportsysimporttimeimportrandom SCREEN_WID ...

  9. PYTHON实现坦克大战游戏

    python开发的坦克大战游戏 import pygame from pygame.sprite import Sprite import sys import time import random ...

最新文章

  1. 2019 CES展上最受外媒体关注的中国机器人产品及技术
  2. 域用户绑定计算机批量设置,Windows 2008 AD域账户与计算机名批量绑定
  3. DateTime.Now.Ticks.ToString()说明
  4. python使用pip安装包_12.2.1 使用pip安装Python包
  5. ZoomIn插件制作(VS2010 + arcObject10.2 )全网应该是唯一的
  6. NetScreen下“区域”与“路由”、“策略”基本概念
  7. 大数据之-Hadoop之HDFS_合并FsImage和Edits文件_之CheckPoint时间设置---大数据之hadoop工作笔记0072
  8. win7家庭版更改桌面图标
  9. UVA 540 Team Queue
  10. Javascript 高级程序设计--总结【二】
  11. 全国计算机b类一级考试试题题库,全国计算机等级考试模拟题:一级B试题(一)...
  12. 关于高德百度地图坐标系问题
  13. linux vi 底行命令,Linux下vi命令详解
  14. 《你是三月的小桨》光剑
  15. 机器人SCI期刊及其特点、评价、投稿之我见
  16. 三种嵌入式操作系统的分析与比较
  17. 计算机输入法无法输入小写字母,电脑打不出小写字母了怎么办
  18. vue二维码生成与图片下载
  19. 洛谷:P1042 [NOIP2003 普及组] 乒乓球 C++详解
  20. “DatePicker.RangePicker”不能用作 JSX 组件

热门文章

  1. photoshop flash 视频教材(适合初学者)
  2. ArcGIS网络分析之常见问题分析、诊断篇
  3. Python 小技之实现的鲜花盛宴,你准备好了吗?
  4. 元月元日是哪一天_元日指的是哪一天?
  5. TencentOS-tiny 任务间通信(九)- 邮箱队列
  6. 解析百度谷歌地址栏参数意义
  7. 地址栏中的参数 转码和解码
  8. 电子邮件头跟踪_如何以正确的方式发送电子邮件:跟踪,跟进并获得回复。
  9. Lucene系列七:搜索过程和IndexSearcher
  10. scala 定义空list_四十二、Scala 教程: List(列表)