@Python编程从入门到实践 Python项目练习

九、添加Play按钮

一、创建Button类

先让游戏一开始为非活动状态

# game_stats.py
# --snip-- self.game_active = False # def reset_stats(self):
# --snip--

button类为带标签的实心矩形,将“play”字符串渲染为图像,放在矩形上方居中

# button.py
import pygame.font class Button(): def __init__(self, ai_settings, screen, msg):
"""初始化按钮的属性"""
self.screen = screen
self.screen_rect = screen.get_rect() # 设置按钮的尺寸和其他属性
self.width, self.height = 200, 50
self.button_color = (0, 0, 0)
self.text_color = (255, 255, 255)
self.font = pygame.font.SysFont(None, 48) # 指定字体 # 创建按钮的rect对象,并使其居中
self.rect = pygame.Rect(0, 0, self.width, self.height)
self.rect.center = self.screen_rect.center # 按钮的标签只需创建一次,即将字符串msg渲染为图像
self.prep_msg(msg) def prep_msg(self, msg):
"""将msg渲染为图像,并使其在居中"""
self.msg_image = self.font.render(msg, True, self.text_color,
self.button_color) # 渲染为图像
self.msg_image_rect = self.msg_image.get_rect()
self.msg_image_rect.center = self.rect.center # 使文字形成的图像居中 def draw_button(self):
# 绘制一个用颜色填充的按钮,再绘制文本图像,使其在上方
self.screen.fill(self.button_color, self.rect)
self.screen.blit(self.msg_image, self.msg_image_rect)

二、绘制按钮

在alien_invasion.py中创建实例,修改up_screen(),让游戏处于非活动状态显示按钮

# alien_invasion.py
# --snip--
# 创建play按钮
play_button = Button(ai_settings, screen, "Play") # 开始游戏主循环
while True:
# --snip--
# 每次循环重绘窗口并更新屏幕
gf.update_screen(ai_settings, screen, stats, ship, passenger_group, bullet_group,play_button)
# game_functions.py
# --snip-- # 如果游戏处于非活动状态,就绘制Play按钮
if not stats.game_active:
play_button.draw_button() # --snip--

三、点击按钮

玩家点击按钮时,应重置游戏统计信息,保证下次游戏不重复。而且,只有在游戏激活状态为False时,点击才有效。

# game_functions.py
# for event in pygame.event.get():
# if event.type == pygame.QUIT:
# sys.exit() # --snip--
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_x, mouse_y = pygame.mouse.get_pos()
check_play_button(ai_settings, screen, stats, play_button, ship,
passenger_group, bullet_group, mouse_x, mouse_y) def check_play_button(ai_settings, screen, stats, play_button, ship,
passenger_group, bullet_group, mouse_x, mouse_y):
"""在玩家单击Play按钮时开始游戏"""
button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)
if button_clicked and not stats.game_active: # 检查鼠标点击位置是否在play范围内
# 隐藏光标
pygame.mouse.set_visible(False)
# 重置游戏统计信息
stats.reset_stats()
stats.game_active = True # 清空外星人列表和子弹列表
passenger_group.empty()
bullet_group.empty() # 创建一群新的外星人,并在飞船居中
create_fleet(ai_settings, screen, ship, passenger_group)
ship.center_ship()

注意,修改alien_invasion.py中,check_events的形参,与game_functions.py中的同步。

十、提高游戏难度

通过修改乘客、飞机移动速度不断增加游戏难度。

重构setting 类设置选项分为动态设置和静态设置,每一次消灭全部乘客后,将速度乘以speedup_scale。

# settings.py
class Settings(object):
"""设置所有设置的类"""
def __init__(self):
"""初始化游戏的静态设置"""
# 屏幕设置
self.screen_width = 600
self.screen_height = 400
self.bg_color = (255, 255, 255) # 飞船设置
self.ship_limit = 3 # 子弹设置
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = 60, 60, 60
self.bullet_group_allowed = 3 # 乘客设置
self.fleet_drop_speed = 7 # 以什么样的速度加快游戏的节奏
self.speedup_scale = 1.1 self.initialize_dynamic_settings() def initialize_dynamic_settings(self):
"""初始化随游戏进行而变化的动态设置"""
self.ship_speed_factor = 1.5
self.bullet_speed_factor = 3
self.passenger_speed_factor = 1
# fleet_direction为1表示向右移动,为-1表示向左移动
self.fleet_direction = 1 def increase_speed(self):
"""提高速度的设置"""
self.ship_speed_factor *= self.speedup_scale
self.bullet_speed_factor *= self.speedup_scale
self.passenger_speed_factor *= self.speedup_scale
# game_functions.py
# def check_bullet_passenger_collisions(ai_settings, screen, ship, passenger_group,
# bullet_group):
# if len(passenger_group) == 0:
# --snip--
# 删除现有子弹并新建一波新的乘客, 并加快游戏速度
# bullet_group.empty()
ai_settings.increase_speed()
# game_functions.py
# def check_play_button(ai_settings, screen, stats, play_button, ship,
# passenger_group, bullet_group, mouse_x, mouse_y):
# """在玩家单击Play按钮时开始游戏"""
# button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)
# if button_clicked and not stats.game_active: # 检查鼠标点击位置是否在play范围内
# 重置游戏速度设置
ai_settings.initialize_dynamic_settings() # --snip--

Pygame小游戏练习四的更多相关文章

  1. pygame小游戏之坦克大战

    以前在学校的时候无聊的学了会pygame.看了大概一周的教学视频,做出来个坦克大战的小游戏 Python3.5  pycharm import pygame,sys,time from random ...

  2. Pygame小游戏练习二

    @Python编程从入门到实践 Python项目练习 四.创建Ship类 建立ship.py,创建Ship类,管理飞船行为. # ship.py import pygame class Ship(): ...

  3. web版扫雷小游戏(四)

    ~~~接上篇,游戏的主体框架完成了,接下来我们对游戏中存在的两个主要实体进行分析,一个是雷点类BombObject(节点对象),一个是节点对象对应的图片对象BombImgObject,根据第一篇的介绍 ...

  4. Pygame小游戏练习五

    @Python编程从入门到实践 Python项目练习 十一.显示游戏得分及最高分 创建新类Scoreboard,用以显示得分和最高分. # scoreboard.py import pygame.fo ...

  5. Pygame小游戏练习三

    @Python编程从入门到实践 Python项目练习 七.创建Passenger类 创建passenger.py文件,创建Passenger类,控制乘客属性和行为 # passenger.py imp ...

  6. Pygame小游戏练习一

    @Python编程从入门到实践 Python项目练习 一.安装Python包Pygame 通过pip安装包工具安装 python3 -m pip --version #查看是否安装pip 确定安装pi ...

  7. python小游戏-pygame模块

    一.tkinter模块的GUI 基本上使用tkinter来开发GUI应用需要以下5个步骤: 导入tkinter模块中我们需要的东西. 创建一个顶层窗口对象并用它来承载整个GUI应用. 在顶层窗口对象上 ...

  8. Python小游戏——外星人入侵(保姆级教程)第一章 01创建Pygame窗口 02创建设置类Setting()

    系列文章目录 第一章:武装飞船 01:创建Pygame窗口以及响应用户输入 02:创建设置类Setting() 一.前期准备 1.语言版本 Python3.9.0 2.编译器 Pycharm2022 ...

  9. 第四次作业——WORDSEARCH小游戏

    “谁想出来的这么缺德的题目啊!!!!”一个声音在我心中回荡 这个题目很早就在课堂上公布了,我和我的小伙伴都惊呆了! 这是个毛?根本无从下手的感觉 总是觉得这个小游戏不是程序能给出答案的,因为我的第一印 ...

随机推荐

  1. shell 统计行数,单词个数,字符个数

    如果我们想知道1.txt中有多少行,多少个单词,多少个字符.我们可以使用wc命令.选项与参数-l:今列出行-w:今列出多少字(英文单词)-m:多少字符[zhang@localhost ~]$ cat ...

  2. Java并发概念-2

    一,死锁: 所谓死锁: 是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在 ...

  3. C#程序调用CMD执行命令,将参数传递给cmd.exe

    proc.StartInfo.Arguments = "/c ping 10.2.2.125"; C#程序调用CMD执行命令 将参数传递给cmd.exe的(Passing an a ...

  4. pwn学习日记Day11 《程序员的自我修养》读书笔记

    阅读基础 计算机系统软件体系结构采用一种层的结构--计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决. 多线程的优势: 1.某个操作可能会陷入长时间等待,等待的线程会进入睡眠状态,无法继续 ...

  5. 去除IntelliJ IDEA对重复代码的检测

    方法1:  方法2:(比较简便) 

  6. EEPROM与FLASH

    最初的ROM rom最初不能编程,出厂什么内容就永远什么内容,不灵活.后来出现了prom,可以自己写入一次,要是写错了,只能换一片,自认倒霉. 人类文明不断进步,终于出现了可多次擦除写入的EPROM, ...

  7. MySQL索引选择及添加原则

    索引选择性就是结果个数与总个数的比值. 用sql语句表示为: SELECT COUNT(*) FROM table_name WHERE column_name/SELECT COUNT(*) FRO ...

  8. vue单页面项目架构方案

    这里的架构方案是基于vue-cli2生成的项目应用程序产生的,是对项目应用程序或者项目模板的一些方便开发和维护的封装.针对单页面的解决方案. 主要有四个方面: 一,不同环境下的分别打包 主要是测试环境 ...

  9. Kotlin入门-文件读写操作

    转 https://blog.csdn.net/aqi00/article/details/83241762 Java的文件处理用到了io库java.io,该库虽然功能强大,但是与文件内容的交互还得通 ...

  10. kotlin 类的委托

    fun main(arg: Array<String>) { val baseImpl = baseImpl() demo(baseImpl).printL() } interface b ...