pygame中比较经典的坦克射击游戏(来自官方)
Posted computerclass
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pygame中比较经典的坦克射击游戏(来自官方)相关的知识,希望对你有一定的参考价值。
#!/usr/bin/env python
"""This is a much simpler version of the aliens.py
example. It makes a good place for beginners to get
used to the way pygame works. Gameplay is pretty similar,
but there are a lot less object types to worry about,
and it makes no attempt at using the optional pygame
modules.
It does provide a good method for using the updaterects
to only update the changed parts of the screen, instead of
the entire screen surface. This has large speed benefits
and should be used whenever the fullscreen isn't being changed."""
#import
import random, os.path, sys
import pygame
from pygame.locals import *
if not pygame.image.get_extended():
raise SystemExit("Requires the extended image loading from SDL_image")
#constants
FRAMES_PER_SEC = 40
PLAYER_SPEED = 12
MAX_SHOTS = 2
SHOT_SPEED = 10
ALIEN_SPEED = 12
ALIEN_ODDS = 45
EXPLODE_TIME = 6
SCREENRECT = Rect(0, 0, 640, 480)
#some globals for friendly access
dirtyrects = [] # list of update_rects
next_tick = 0 # used for timing
class Img: pass # container for images
main_dir = os.path.split(os.path.abspath(__file__))[0] # Program's diretory
#first, we define some utility functions
def load_image(file, transparent):
"loads an image, prepares it for play"
file = os.path.join(main_dir, 'data', file)
try:
surface = pygame.image.load(file)
except pygame.error:
raise SystemExit('Could not load image "%s" %s' %
(file, pygame.get_error()))
if transparent:
corner = surface.get_at((0, 0))
surface.set_colorkey(corner, RLEACCEL)
return surface.convert()
# The logic for all the different sprite types
class Actor:
"An enhanced sort of sprite class"
def __init__(self, image):
self.image = image
self.rect = image.get_rect()
def update(self):
"update the sprite state for this frame"
pass
def draw(self, screen):
"draws the sprite into the screen"
r = screen.blit(self.image, self.rect)
dirtyrects.append(r)
def erase(self, screen, background):
"gets the sprite off of the screen"
r = screen.blit(background, self.rect, self.rect)
dirtyrects.append(r)
class Player(Actor):
"Cheer for our hero"
def __init__(self):
Actor.__init__(self, Img.player)
self.alive = 1
self.reloading = 0
self.rect.centerx = SCREENRECT.centerx
self.rect.bottom = SCREENRECT.bottom - 10
def move(self, direction):
self.rect = self.rect.move(direction*PLAYER_SPEED, 0).clamp(SCREENRECT)
class Alien(Actor):
"Destroy him or suffer"
def __init__(self):
Actor.__init__(self, Img.alien)
self.facing = random.choice((-1,1)) * ALIEN_SPEED
if self.facing < 0:
self.rect.right = SCREENRECT.right
def update(self):
global SCREENRECT
self.rect[0] = self.rect[0] + self.facing
if not SCREENRECT.contains(self.rect):
self.facing = -self.facing;
self.rect.top = self.rect.bottom + 3
self.rect = self.rect.clamp(SCREENRECT)
class Explosion(Actor):
"Beware the fury"
def __init__(self, actor):
Actor.__init__(self, Img.explosion)
self.life = EXPLODE_TIME
self.rect.center = actor.rect.center
def update(self):
self.life = self.life - 1
class Shot(Actor):
"The big payload"
def __init__(self, player):
Actor.__init__(self, Img.shot)
self.rect.centerx = player.rect.centerx
self.rect.top = player.rect.top - 10
def update(self):
self.rect.top = self.rect.top - SHOT_SPEED
def main():
"Run me for adrenaline"
global dirtyrects
# Initialize SDL components
pygame.init()
screen = pygame.display.set_mode(SCREENRECT.size, 0)
clock = pygame.time.Clock()
# Load the Resources
Img.background = load_image('background.gif', 0)
Img.shot = load_image('shot.gif', 1)
Img.bomb = load_image('bomb.gif', 1)
Img.danger = load_image('danger.gif', 1)
Img.alien = load_image('alien1.gif', 1)
Img.player = load_image('oldplayer.gif', 1)
Img.explosion = load_image('explosion1.gif', 1)
# Create the background
background = pygame.Surface(SCREENRECT.size)
for x in range(0, SCREENRECT.width, Img.background.get_width()):
background.blit(Img.background, (x, 0))
screen.blit(background, (0,0))
pygame.display.flip()
# Initialize Game Actors
player = Player()
aliens = [Alien()]
shots = []
explosions = []
# Main loop
while player.alive or explosions:
clock.tick(FRAMES_PER_SEC)
# Gather Events
pygame.event.pump()
keystate = pygame.key.get_pressed()
if keystate[K_ESCAPE] or pygame.event.peek(QUIT):
break
# Clear screen and update actors
for actor in [player] + aliens + shots + explosions:
actor.erase(screen, background)
actor.update()
# Clean Dead Explosions and Bullets
for e in explosions:
if e.life <= 0:
explosions.remove(e)
for s in shots:
if s.rect.top <= 0:
shots.remove(s)
# Move the player
direction = keystate[K_RIGHT] - keystate[K_LEFT]
player.move(direction)
# Create new shots
if not player.reloading and keystate[K_SPACE] and len(shots) < MAX_SHOTS:
shots.append(Shot(player))
player.reloading = keystate[K_SPACE]
# Create new alien
if not int(random.random() * ALIEN_ODDS):
aliens.append(Alien())
# Detect collisions
alienrects = []
for a in aliens:
alienrects.append(a.rect)
hit = player.rect.collidelist(alienrects)
if hit != -1:
alien = aliens[hit]
explosions.append(Explosion(alien))
explosions.append(Explosion(player))
aliens.remove(alien)
player.alive = 0
for shot in shots:
hit = shot.rect.collidelist(alienrects)
if hit != -1:
alien = aliens[hit]
explosions.append(Explosion(alien))
shots.remove(shot)
aliens.remove(alien)
break
# Draw everybody
for actor in [player] + aliens + shots + explosions:
actor.draw(screen)
pygame.display.update(dirtyrects)
dirtyrects = []
pygame.time.wait(50)
#if python says run, let's run!
if __name__ == '__main__':
main()
Python游戏开发,pygame模块,Python实现经典90坦克大战游戏
前言:
本期我们将制作一个仿“经典90坦克大战”的小游戏。
算了废话不多说,让我们愉快地开始吧~
效果图
开发工具
Python版本: 3.6.4
相关模块:
pygame模块;
以及一些Python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
原理介绍
T_T感觉自己的代码整体上逻辑还是很清晰的,也做了很多必要的注释,所以这里我只讲主要的思路,一些实现细节请阅读我的源代码。
游戏规则:
游戏有单人和双人两种模式,己方大本营被破或者己方坦克被歼灭则游戏失败,成功通过所有关卡则游戏胜利。另外,玩家可以通过射击特定的坦克使地图上随机出现一个道具,若己方坦克捡到该道具,则触发一个事件,例如坦克能力的增强。
玩家操作方式如下:
玩家一:
wsad键:上下左右;
空格键:射击。
玩家二:
↑↓←→键:上下左右;
小键盘0键:射击。
逐步实现:
Step1:定义精灵类
因为游戏肯定涉及到碰撞检测,所以我们需要定义一些精灵类。
首先,既然是坦克大战,总得有坦克吧?
己方坦克:
上面的代码定义了坦克的一些属性,例如速度、等级、是否处于受保护状态等等。
当然这里也实例化了一个子弹类,这个我们之后再定义,先假装有这个子弹类,这样主逻辑才是完整的,不然坦克没有子弹类怎么射击呢?
当然,有属性还是不够的,我们还要赋予坦克一些能力,例如上面所说的射击:
当然还有上下左右的移动,因为都是类似的,这里只给出向上移动的源码:
啊,还有坦克的等级提升与下降:
最后当然是坦克死后重置啦:
敌方坦克:
敌方坦克和己方坦克定义的源代码很相似,只不过移动是随机的,死后是不可复生的。
现在,我们可以来定义子弹类了!
子弹类:
子弹类应当具有例如速度、强度等属性,以及选择方向和移动的能力:
最后,我们来定义其他涉及到碰撞检测的物体类。
大本营:
有正常和被摧毁两种状态:
地图障碍物:
包括砖墙、钢墙、森林、河流和冰:
食物道具:
一共有7种道具,不同的道具对应不同的效果:
Step2:设计游戏地图
Emmmm,游戏的大背景是黑色的,然后在上面堆上一些步骤一中定义的障碍物就可以完成地图设计了。其中,钢墙不能被一般的子弹击破,砖墙可被任意子弹击破,除墙外,坦克可以穿过任意障碍物,不过没有任何附加效果(有兴趣的小伙伴可以自己扩展一下~比如冰上的坦克速度加快等等):
在这里我偷懒了只设计了一个地图和两个关卡,有兴趣的小伙伴同样可以在此基础上设计更多的地图和关卡。
Step3:实现游戏主循环
主循环的代码比较长,不过逻辑很清晰。首先展示游戏开始界面,玩家在此界面选择游戏模式后进入游戏;在游戏中,需要进行一系列的碰撞检测以及触发碰撞产生的一系列事件,并绘制当前存在的所有物体;最后,若游戏失败,则显示游戏失败界面,若通关,则显示游戏成功界面,因代码太长无法截图
All Done!
文章到这里就结束了,感谢你的观看,Python24个小游戏系列,下篇文章仿“FlappyBird”的小游戏
为了感谢读者们,我想把我最近收藏的一些编程干货分享给大家,回馈每一个读者,希望能帮到你们。
干货主要有:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
All done~点赞+评论~详见个人简介或者私信获取完整源代码。。
往期回顾
以上是关于pygame中比较经典的坦克射击游戏(来自官方)的主要内容,如果未能解决你的问题,请参考以下文章
Pygame实战:对象突然想玩坦克大战,我用Python三十分钟实现(他开心的笑了。)
Python游戏开发,pygame模块,Python实现经典吃豆豆小游戏
Pygame小游戏神还原欢乐无穷的双人坦克大战小程序游戏,上手开玩~(附完整源码)