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

十一、显示游戏得分及最高分

创建新类Scoreboard,用以显示得分和最高分。

# scoreboard.py
import pygame.font class Scoreboard():
"""显示得分信息的类"""
def __init__(self, ai_settings, screen, stats):
"""初始化显示得分涉及的属性"""
self.screen = screen
self.screen_rect = screen.get_rect()
self.ai_settings = ai_settings
self.stats = stats # 显示得分信息时使用的字体设置
self.text_color = (30, 30, 30)
self.font = pygame.font.SysFont(None, 48) # 准备初始得分图像
self.prep_score()
# 准备最高得分
self.prep_high_score() def prep_score(self):
"""将得分转换为一幅渲染的图像"""
rounded_score = int(round(self.stats.score, -1))
score_str = "{:,}".format(rounded_score)
self.score_image = self.font.render(score_str, True, self.text_color,
self.ai_settings.bg_color)
# 将得分放在屏幕右上角
self.score_rect = self.score_image.get_rect()
self.score_rect.right = self.screen_rect.right - 20
self.score_rect.top = 10 def prep_high_score(self):
"""将最高得分转为一幅渲染都图像"""
# 将得分圆整
high_score = int(round(self.stats.high_score, -1))
high_score_str = "{:,}".format(high_score)
self.high_score_image = self.font.render(high_score_str, True, self.text_color,
self.ai_settings.bg_color) # 将得分放在屏幕顶部中央
self.high_score_rect = self.score_image.get_rect()
self.high_score_rect.centerx = self.screen_rect.centerx
self.high_score_rect.top = 10 def show_score(self):
"""在屏幕上显示得分"""
self.screen.blit(self.score_image, self.score_rect)
self.screen.blit(self.high_score_image, self.high_score_rect)

在game_stats中添加score属性,为每次重新开始都可以重置分数。

# game_stats.py
# def __init__(self, ai_settings):
# """初始化统计信息"""
# self.ai_settings = ai_settings
# self.reset_stats()
# self.game_active = False
# 在任何情况下都不应该重置最高分
self.high_score = 0 # def reset_stats(self):
# """初始化在游戏运行期间可能变化的统计信息"""
# self.ships_left = self.ai_settings.ship_limit
self.score = 0

在alien_invasion.py 中创建一个Scoreboard实例,并通过update_screen()函数在每次消灭乘客后更新分数。

# alien_inavsion.py
from scoreboard import Scoreboard # --snip--
# 创建记分牌
sb = Scoreboard(ai_settings, screen, stats) #while True:
# --snip--
gf.update_bullet_group(ai_settings, screen, stats, sb, ship, passenger_group, bullet_group)
# 每次循环重绘窗口并更新屏幕
gf.update_screen(ai_settings, screen, stats, sb, ship, passenger_group, bullet_group, play_button) # --snip--

在settings.py中设定外星人的分数,并根据游戏难度的提高,提高外星人的分值

# settings.py

        # 乘客点数的提高速度
self.score_scale = 1.5 # def initialize_dynamic_settings(self):
# """初始化随游戏进行而变化的动态设置""" # 记分
self.passenger_points = 50 # def increase_speed(self):
# """提高速度的设置,同时提高乘客的分数"""
self.passenger_points = int(self.passenger_points * self.score_scale)

发生碰撞即遍历字典collisions中的一个键,确保每个子弹击中的乘客都有分数

# game_functions.py

def check_bullet_passenger_collisions(ai_settings, screen, stats, sb, ship, passenger_group, bullet_group):
# # 检查是否有子弹击中了乘客
# # 如果是这样,就删除相应的子弹和乘客
# # groupcollide()返回字典,实参为True即删除发生碰撞的子弹或外星人
# collisions = pygame.sprite.groupcollide(bullet_group, passenger_group, False, True)
# if collisions:
for passenger_group in collisions.values():
stats.score += ai_settings.passenger_points * len(passenger_group)
sb.prep_score()
check_high_score(stats, sb) def check_high_score(stats, sb):
"""检查是否诞生了新的最高分"""
if stats.score > stats.high_score:
stats.high_score = stats.score
sb.prep_high_score()

十二、显示飞机数量

首先,让Ship类继承Sprite,以便创建飞船编组。

# ship.py
from pygame.sprite import Sprite
#class Ship(Sprite): # def __init__(self, ai_settings, screen):
# """初始化飞船并设置其初始位置"""
super(Ship, self).__init__() def blitme_s(self):
"""在绘制剩余飞机数量"""
self.image = pygame.transform.scale(self.image, (37, 34))
self.screen.blit(self.image, self.rect)

修改scoreboard.py,创建一个可供显示的飞船编组,并绘制。

from pygame.sprite import Group
from ship import Ship # 准备船的图像
self.prep_ships() def prep_ships(self):
"""显示还余下多少艘飞船"""
self.ships = Group()
for ship_number in range(self.stats.ships_left):
ship = Ship(self.ai_settings, self.screen)
ship.rect.x = 10 + ship_number * ship.rect.width / 2
ship.rect.y = 10
self.ships.add(ship) # def show_score(self):
# """在屏幕上显示得分"""
# self.screen.blit(self.score_image, self.score_rect)
# self.screen.blit(self.high_score_image, self.high_score_rect)
for ship in self.ships:
ship.blitme_s()

修改game_functions.py,确保游戏开始时显示飞船图像,在撞击之后损失一艘飞船图像。

# game_functions.py
def check_play_button(ai_settings, screen, stats, sb, play_button, ship,
passenger_group, bullet_group, mouse_x, mouse_y):
# """在玩家单击Play按钮时开始游戏""" # 重置记分牌图像
sb.prep_score()
sb.prep_high_score()
sb.prep_ships() def ship_hit(ai_settings, stats, sb, screen, ship, passenger_group, bullet_group):
# """响应被乘客撞到的飞船"""
# if stats.ships_left > 0:
# # 讲ship_left减一
# stats.ships_left -= 1
# 更新记分牌
sb.prep_ships()

注意修改alien_invasion.py中函数参数与game_functions.py中保持一下。

效果图

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. Pygame小游戏练习四

    @Python编程从入门到实践 Python项目练习 九.添加Play按钮 一.创建Button类 先让游戏一开始为非活动状态 # game_stats.py # --snip-- self.game ...

  4. Pygame小游戏练习三

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

  5. Pygame小游戏练习一

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

  6. python小游戏-pygame模块

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

  7. 【python游戏编程之旅】第五篇---嗷大喵爱吃鱼小游戏开发实例

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 我们一同在前几期的博客中已经学到了很多pygame的基本知识了,现在该做个小游戏实战一下了. 前几期博客链接 ...

  8. Pygame:编写一个小游戏 标签: pythonpygame游戏 2017-06-20 15:06 103人阅读 评论(0)

    大学最后的考试终于结束了,迎来了暑假和大四的漫长的"自由"假期.当然要自己好好"玩玩"了. 我最近在学习Python,本意是在机器学习深度学习上使用Python ...

  9. 用python+pygame写贪吃蛇小游戏

    因为python语法简单好上手,前两天在想能不能用python写个小游戏出来,就上网搜了一下发现了pygame这个写2D游戏的库.了解了两天再参考了一些资料就开始写贪吃蛇这个小游戏. 毕竟最开始的练手 ...

随机推荐

  1. POJ 3186 Treats for the Cows ——(DP)

    第一眼感觉是贪心,,果断WA.然后又设计了一个两个方向的dp方法,虽然觉得有点不对,但是过了样例,交了一发,还是WA,不知道为什么不对= =,感觉是dp的挺有道理的,,代码如下(WA的): #incl ...

  2. mysql 优化知识点

    附录: https://www.nowcoder.com/discuss/150059?type=0&order=0&pos=13&page=0 本文概要 概述 为什么要优化 ...

  3. MongoDB(mongodb-win32-x86_64-enterprise-windows-64-4.2.1-signed.msi)下载,启动和插入数据,查询

    下载链接:https://pan.baidu.com/s/19lM5Q-_BaDbjaO1Pj0SbYg&shfl=sharepset 安装一路Next就行,安装完毕后,进入目录C:\Prog ...

  4. shell编程(2)

    一.变量简介 变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据.脚本语言在定义变量时通常不需要指明类型,直接赋值即可,shell变量也遵循这个规则. 在Bash shell 中,每一个 ...

  5. MSMQ菜鸟教程

    一  .MSMQ概述 MSMQ全称MicroSoft Message Queue,微软消息队列,是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于 ...

  6. Saltstack之使用salt安装es6.0以上的head插件

    本实验使用salt安装es6.0以上的head插件 ES6.0以上手动安装head插件参考:https://www.cnblogs.com/minseo/p/9117470.html 文件夹目录为 / ...

  7. opengl球形网格生成

    效果如图 准备第三方库 glew.freeglut.glm 代码包括主程序源文件mainApp.cpp.顶点着色器shader.vs.片元着色器shader.fs   mainApp.cpp如下 #i ...

  8. Jquery Easyui与Jquery Bootstrap的比较

    1.easyui是js框架 :bootstrap 是css框架 ,bootstrap = 样式库 + 一堆jQuery插件,顺便解释一句,如果你只需要bootstrap的样式,你完全不用引入jQuer ...

  9. 第一章 python+selenium自动化测试实战

    @序章 自动化测试是软件测试的主流方向之一: 教程从测试的根本需求出发,讲解如何开展自动化测试. 首先,我们要明白,自动化仅仅是满足我们某种需求的一种工具:没有必要花费时间把它全部弄懂:我们只需要学会 ...

  10. form表单Get方式提交时,action中带参数传递不了

    <form action="getPostServlet/getPost.do?param4=param4" method="get"> <i ...