@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. 学院管理系统(mysql版)

    需求 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下 讲师视图 管理班级,可创建班级,根据学员qq号把学员加入班级 可创建指定班级的上课纪录,注意一节上课纪录对应多条学员的上 ...

  2. Shell基础之四 变量与运算

    shell变量与运算 变量存在于内存中.假设变量str,设置或修改变量属性时,不带$号,只有引用变量的值时才使用$号.也就是说在内存中,标记变量的变量名称是str,而不是$str. 变量数据的存储方式 ...

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

    重定位就是把程序的逻辑地址空间变换成内存中的实际物理地址空间的过程.它是实现多道程序在内存中同时运行的基础.重定位有两种,分别是动态重定位与静态重定位. 静态重定位:即在程序装入内存的过程中完成,是指 ...

  4. 重读APUE(3)-dup与文件表项

    下图为调用dup之后的文件指针状态,包含如下信息: 1. dup选择了一个最小的未使用的描述符3: 2. dup(1)之后,描述符1和描述符3指向同一个文件表项: 3. dup(1)的返回值即为复制得 ...

  5. StringUtils的isNotEmpty,isNotBlank方法的区别

    这两个用着用着老是混淆或者忘记,今天写一下做个笔记,对比下两个判断方法的区别 isNotEmpty: 判断某字符串是否非空,等于!isEmpty(String str),这里不能排除空格字符 Stri ...

  6. Ubuntu18.04 桌面系统的个人吐槽(主要是终端)

    装了Ubuntu18.04,桌面换风格了,使用中最大的感觉是终端切换非常反人类,可能是我还没有摸清门路.原先习惯用Alt+Tab快捷键切不同终端以及不同窗口的,现在Alt+Tab时多个终端会归成一个图 ...

  7. 关于hexo-abbrlink链接undefined

    关于hexo-abbrlink hexo-abbrlink是一个hexo博客链接永久化的解决方案 支持使用不同的算法和进制对文章链接进行转换 算法 进制 生成链接 crc16 hex https:// ...

  8. SpringBoot 部署到Linux开机自启动和运行

    前文 SpringBoot是一个强大的微服务框架,通常都是打包项目成Jar包,并部署到服务器上,本文以Linux服务器部署为主 开机自启动 博文:<https://www.cnblogs.com ...

  9. leetcode刷题-559. Maximum Depth of N-ary Tree

    题目: https://leetcode.com/problems/maximum-depth-of-n-ary-tree/description/ n-ary-tree的数据结果表示 // Defi ...

  10. JAVA 基础编程练习题35 【程序 35 最大最小交换】

    35 [程序 35 最大最小交换] 题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组. package cskaoyan; public class cskaoyan35 { ...