写此片blog的主要目的在于回顾游戏敲写过程,为了能更好的记录编写过程,如能对您稍微有点帮助,倍感荣幸。
此游戏几乎都是按照《python编程:从入门到实践》中的代码敲写,有几个参数(比如游戏窗口大小)的数值更改了一下。游戏代码敲完后,想要打包来着,无奈打包后的程序运行不了,笔者不才,百度后依然未能解决,决定先缓一缓,继续学习,过段时间再试,代码功能实现的具体步骤如下(即压缩包文件中(转下几行链接)alien_invasion_execute_record.py;;;最终的主功能代码为文件alien_invasionV37.py[包括调用的settingsV9;game_statsV5;scoreboardV3;shipV6;game_functionsV32])
ps:各模块功能的逐步实现在该模块中有较为详细的记录,只是文件名不同,模块中定义函数及其功能相同。
(本想上传包含各功能代码的压缩包,无奈审核未通过,那,,,那就曲线救国吧,压缩包百度网盘链接https://pan.baidu.com/s/1plgMkX5ms-IqXgXNd3J4-g)
1.主功能代码
#alien_invasionV37.py
#调整飞船的速度后的更改
#限制飞船的活动范围
#将子弹存储到编组中,故创建列表
#对game_functionsV13的调用,创建外星人群
#更新每个外星人的位置
#向下移动外星人群,并改变移动方向,整群下移,改变方向,左右移V15
#外星人群消灭后,生成新的外星人群
#重构update_bullets(),将处理子弹和外星人的碰撞的代码移动到一个独立的函数中
#检查外星人和飞船之间的碰撞,调用V19
#创建一个GameStats实例
#响应外星人与飞船的碰撞
#有外星人到达屏幕低端,做出类似碰撞的响应V21
#根据标志的属性game_active确定运行游戏的哪些部分
#在屏幕上绘制按钮
#调用V25玩家单击play按钮时重置游戏(三艘飞船)
#仅当玩家点击了play按钮且游戏当前处于非活动状态时,游戏才重新开始并在游戏开始后隐藏光标V26
#在整群外星人都被消灭后调用函数加快游戏节奏,
#在创建一群新的外星人,,并在开始新游戏时重置速度V27 V7
#创建sb实例以显示得分
#修改update_bullets(子弹碰撞,计分)更新得分,将消灭的每个外星人的点数都计入得分V29
#在游戏开始时刷新剩余飞船数并在飞船被撞到时调用prep_ships(),减少飞船图像V32,V3
'''检查是否诞生了新的最高得分(及时更新最高得分)在检测碰撞中提高等级,并更新图像等级
; 为确保在开始游戏时更新计分和等级图像,在按钮play被单击时触发重置V31'''
'''创建一行外星人->创建一个名为aliens的空编组,
用于存储全部的外星人,再调用game_functions.py
中创建外星人群的函数'''
'''修改while循环,以便每次执行循环时都调用
飞船的方法update()'''
import pygame
from pygame.sprite import Group
from settingsV9 import Settings
from game_statsV5 import GameStats
from scoreboardV3 import Scoreboard
from button import Button
from shipV6 import Ship
import game_functionsV32 as gf
def run_game():
#初始化pygame,设置和屏幕对象
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode(
(ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption('Alien Invasion')
#创建Play按钮
play_button = Button(ai_settings, screen, 'Play')
#创建一个用于存储游戏统计信息的实例,并创建记分牌
stats = GameStats(ai_settings)
sb = Scoreboard(ai_settings, screen, stats)
#创建一艘飞船,一个子弹编组和一个外星人编组
ship = Ship(ai_settings, screen)
bullets = Group()
aliens = Group()
#创建外星人群
gf.create_fleet(ai_settings, screen, ship, aliens)
#开始游戏主循环
while True:
#调用事件管理循环
gf.check_events(ai_settings, screen, stats, sb, play_button, ship,
aliens, bullets)
if stats.game_active:
ship.update()
gf.update_bullets(ai_settings, screen, stats, sb, ship, aliens, bullets)
gf.update_aliens(ai_settings, screen, stats, sb, ship, aliens, bullets)
#调用屏幕更新函数
gf.update_screen(ai_settings, screen, stats, sb, ship, aliens,
bullets, play_button)
run_game()
2.游戏功能模块调用与实现
#game_functionsV32.py
#将更新屏幕的代码移到game_functions中
#响应按键(右移)增加左移命令
#将check_events()简化处理->两个函数
#修改check_keydown_events()->按下空格发出子弹
#修改update_screen()确保在调用flip()前在屏幕上重绘子弹
#将发射子弹的代码移到一个独立的函数中
#添加一个结束游戏的快捷键Q:
#让外星人出现在屏幕上
#创建外星人群的函数,修改对update_screen()的调用->能够访问外星人编组
#重构create_fleet() 并添加行
#添加更新外星人的函数
#向下移动外星人群,并改变移动方向,整群下移,改变方向,左右移
#检测子弹与外星人的碰撞,更新子弹位置之后检测
#外星人群消灭后,生成新的外星人群
#重构update_bullets(),将处理子弹和外星人的碰撞的代码移动到一个独立的函数中
#检查外星人和飞船之间的碰撞
#添加ship_hit()函数
#有外星人到达屏幕低端,做出类似碰撞的响应
#在ship_hit()中添加代码,使玩家飞船用完后将game_active设置为False
#修改update_screen在屏幕更新时显示按钮
#玩家单击play按钮时开始游戏,
#玩家单击play按钮时重置游戏(三艘飞船)
#仅当玩家点击了play按钮且游戏当前处于非活动状态时,游戏才重新开始并在游戏开始后隐藏光标
#在整群外星人都被消灭后调用函数加快游戏节奏,在创建一群新的外星人,,并在开始新游戏时重置速度
#修改update_screen使其能够显示得分
#每当有外星人被击落时,更新得分,调用prep_score来创建一幅显示最新得分的新图像
#将消灭的每个外星人点数都计入得分
#检查是否诞生了新的最高得分(及时更新最高得分)
#在检测碰撞中提高等级,并更新图像等级; 为确保在开始游戏时更新计分和等级图像,在按钮play被单击时触发重置
#在游戏开始时刷新剩余飞船数并在飞船被撞到时调用prep_ships(),减少飞船图像
'''对编组调用draw时,Pygame自动绘制编组中的每个元素
,绘制位置由元素的属性rect决定,这里,aliens.draw(screen)
在屏幕上绘制编组中的每个外星人'''
'''修改check_events(),使玩家按下右箭头键
时将moving_right设置为True,松开时设置为False'''
import sys , pygame
from bullet import Bullet
from time import sleep
from alienV2 import Alien
def check_keydown_events(event, ai_settings, screen, ship, bullets):
'''响应按键'''
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
elif event.key == pygame.K_SPACE:
#调用fire_bullets()函数
fire_bullet(ai_settings, screen, ship, bullets)
elif event.key == pygame.K_q:
sys.exit()
def check_keyup_events(event, ship):
'''响应松开'''
if event.key == pygame.K_RIGHT:
ship.moving_right =False
elif event.key == pygame.K_LEFT:
ship.moving_left =False
def check_events(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets):
'''响应按键和鼠标事件'''
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event, ai_settings, screen, ship, bullets)
#每个事件都只与一个键相关联->elif
elif event.type == pygame.KEYUP:
check_keyup_events(event, ship)
#添加响应play按钮的方法
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_x, mouse_y = pygame.mouse.get_pos()
check_play_button(ai_settings, screen, stats, sb, play_button, ship,
aliens, bullets, mouse_x, mouse_y)
def check_play_button(ai_settings, screen, stats, sb, play_button, ship, aliens,
bullets,