游戏截图
代码部分?
import pygame
import random
# 设置标题、背景和图标
pygame.init ()
screen = pygame.display.set_mode ( (800 , 600) )
pygame.display.set_caption ( '飞机大战BETA' )
icon = pygame.image.load ( 'fly.png' )
pygame.display.set_icon ( icon )
# 设置背景、玩家、敌人和子弹的图片
bgImg = pygame.image.load ( 'bg.jpeg' )
playerImg = pygame.image.load ( 'fly.png' )
monsterImg = pygame.image.load ( 'monster.png' )
bulletImg = pygame.image.load ( 'bullet.png' )
# 定义飞机类(玩家)
class fly:
def __init__(self):
self.x = 380
self.y = 500
self.step = 0
# 方法:实现玩家飞机左右移动
def move(self):
# 如果飞机在界内,则可以通过键盘的左右方向键操控
if self.x <= 750 and self.x >= 0:
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
self.step = 1
elif event.key == pygame.K_LEFT:
self.step = -1
if event.type == pygame.KEYUP:
self.step = 0
# 防止出界
elif self.x > 750:
self.step = 0
self.x = 750
else:
self.step = 0
self.x = 1
# 方法:飞机发射子弹
def shoot(self):
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE: # 按空格键可以发射(准确的说是创建)子弹
bullets.append ( bullet ( self.x + 10 , self.y - 30 ) )
# 方法:判断飞机是否与敌人相撞,如果发生则游戏结束
def destroy(self):
for m in monsters:
distance = ((self.x - m.x) ** 2 + (self.y - m.y) ** 2) ** 0.5 # distance代表玩家飞机与敌人的距离
if distance <= 20: # 距离过劲则会坠机,游戏结束
return True
# 创建玩家对象
player1 = fly ()
game_is_over = False
# 方法:判断敌人是否与玩家相撞,如果相撞则游戏结束,显示游戏结束画面
def gameOver(destroy):
global game_is_over
if destroy:
game_is_over = True
if game_is_over:
fail_text = f'Game over!'
fail_render = font2.render ( fail_text , True , (255 , 0 , 0) )
screen.blit ( fail_render , (300 ,250 ) )
monsters.clear ()
return True
# 方法:判断是否击杀了足够数量(波数)的敌人,游戏胜利,显示游戏胜利画面
def gameWin(wave):
if wave >= 5:
win_text = f'You Win!'
win_render = font2.render ( win_text , True , (0 , 255 , 0) )
screen.blit ( win_render , (300 , 250) )
monsters.clear ()
return True
# 创建子弹类
bullets = [] # 创建列表bullets来装载子弹对象
class bullet:
def __init__(self , x , y):
self.x = x
self.y = y
self.speed = 1 # 子弹飞行速度(y轴)
# 方法:显示子弹并使其向前飞行
def show_bullet():
for b in bullets:
screen.blit ( bulletImg , (b.x , b.y) )
b.y -= b.speed
if b.y < 0:
bullets.remove ( b )
# 方法:判断子弹是否接触敌人,如果接触则消灭敌人,同时子弹消失
def eliminate():
for b in bullets:
for m in monsters:
distant = ((b.x - m.x) ** 2 + (b.y - m.y) ** 2) ** 0.5 # distance代表子弹与敌人的距离,如果距离过近则成功消灭敌人
if distant <= 20:
bullets.remove ( b ) # 移除本发子弹
monsters.remove ( m ) # 消灭被击中的敌人
return True
# 创建怪物类(敌人)
monster_numbers = 6 # 初始敌人数量
class monster:
def __init__(self , step):
self.x = random.randint ( 50 , 750 )
self.y = random.randint ( 50 , 150 )
self.step = step # 怪物移动速度(x轴)
self.Left_or_Right = random.randint ( 0 , 1 ) # 怪物移动方向
# 方法:实现怪物左右移动,在移动到左右边界时,向下移动一段距离
def move(self):
if self.Left_or_Right:
self.x += self.step
if self.x > 780: # 判断是否到达左右边界
self.x = 780
self.y += 30 # 向下移动,更加接近玩家
self.Left_or_Right = 0 # 改变左右移动方向
else:
self.x -= self.step
if self.x < 0:
self.x = 0
self.y += 30
self.Left_or_Right = 1
# 方法:显示怪物
def show_monster():
for m in monsters:
screen.blit ( monsterImg , (m.x , m.y) )
m.move ()
# 方法:当场上怪物不足时,补充新的一波敌人
def monster_add():
for i in range ( 6 ):
monsters.append ( monster ( 0.3 ) )
show_monster ()
# 初始化敌人数量,首波敌人
monsters = []
for i in range ( monster_numbers ):
monsters.append ( monster ( 0.3 ) )
# 定义计分类
class record:
def __init__(self):
self.kill = 0 # 击杀敌人数
self.score = 0 # 得分数
self.wave = 0
def show(self):
kill_text = f'kill:{self.kill}'
score_text = f'score:{self.score}'
wave_text = f'wave:{self.wave}'
kill_render = font1.render ( kill_text , True , (255 , 0 , 0) )
score_render = font1.render ( score_text , True , (0 , 255 , 0) )
wave_render = font1.render ( wave_text , True , (0 , 0 , 255) )
screen.blit ( kill_render , (10 , 10) )
screen.blit ( score_render , (10 , 35) )
screen.blit ( wave_render , (10 , 60) )
# 创建计分对象
r = record ()
# 杂项显示
font1 = pygame.font.Font ( None, 24 )
font2 = pygame.font.Font ( None , 60 )
# def pause():
# pygame.time.Clock().tick(30)
if __name__ == '__main__':
# 游戏控制器
running = True
# 开始游戏
while running:
screen.blit ( bgImg , (0 , 0) ) # 加载背景图片
for event in pygame.event.get ():
if event.type == pygame.QUIT:
running = False
player1.move () # 玩家移动
player1.shoot () # 玩家开火
show_bullet () # 显示子弹
if eliminate (): # 判断消灭敌人
monster_numbers -= 1
r.kill += 1
r.score += 10
show_monster () # 显示首波敌人
if len ( monsters ) == 0 and not game_is_over and not gameWin ( r.wave ): # 敌人补充判断
monster_add ()
r.wave += 1
r.show () # 显示计分
gameOver ( player1.destroy () ) # 判断游戏结束或胜利
gameWin ( r.wave )
screen.blit ( playerImg , (player1.x , player1.y) )
player1.x += player1.step
pygame.display.update ()
?游戏说明
游戏名称:飞机大战 V0.1
介绍:经典的横轴清关游戏(简化版),由玩家操控飞机,消灭不断靠近的敌人,直到存活到游戏结束即为胜利!
控制方法:玩家:“←”、“→”左右移动,”空格键“射击
胜利条件:消灭5波敌人并存活
失败条件:敌人接触到玩家飞机
设计
基本玩法:玩家操控敌军,通过发射子弹来消灭不断左右移动(会前进)的敌人,而敌人通过固定的移动,不断进行左右横移以及前进,来试图接近玩家。如果敌人接触了玩家,则gameover,反之,如果玩家消灭了一定数目的敌人,则游戏胜利!
玩家:战斗机造型,一台只能左右横移的飞机,方向朝上,可以向上发射子弹
敌人:外星飞船造型,出场时会随机左右移动,到达左右边界,调转方向,同时向前移动一段距离
子弹:也可以看做炮弹、导弹,由玩家飞机发射,向上飞行,与敌人接触时会消灭该敌人,一发子弹只能消灭一个敌人,暂无溅射贯穿效果
怪物出场:从屏幕上面出现,位置与左右移动方向随机,一波生成6个
玩家生成:从屏幕下面出现,位置固定
游戏胜利:暂时设定为消灭5波(即30个敌人)
计分:左上角有计分牌,分别为kill(击杀数),score(得分,消灭一个敌人得10分),wave(波数)
技术
主要编程语言:python
实现技术包括:
python基础(if...else判断、for循环、列表、运算表达式等等)
random(创建随机数,来实现随机效果)
*pygame(重点,绝大部分事件、行为和元件都是使用pygame模组)
关于图片
背景图片:bg.jpg
(以下均为ps简单制作,有点丑2333)?
玩家飞机:fly.png
敌人飞机:monster.png
?
?子弹:bullet.png
?
ps:博主是python新司机,还请大佬们多多指教(-_-)
|