《python编程:从入门到实践》外星人入侵小游戏

本文介绍了遵循《Python编程:从入门到实践》书中的指导,开发外星人入侵小游戏的过程。游戏包括主功能代码、外星人设置、子弹系统、play按钮、游戏统计信息跟踪、得分与等级显示等模块。虽然尝试打包游戏遇到问题,但所有功能代码已实现并详细记录在各模块中。游戏最终成功运行,展示了丰富的游戏功能。
摘要由CSDN通过智能技术生成
写此片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,
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值