@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. 未能加载文件或程序集“Microsoft.SqlServer.Management.Sdk.Sfc, Version=11.0.0.0, Culture=neutral, PublicKeyToken...

    刚开始看老师 用VS新建一个“ADO.NET 实体数据模型” 但是一直报错:未能加载文件或程序集“Microsoft.SqlServer.Management.Sdk.Sfc, Version=11. ...

  2. POJ 2778 DNA Sequence —— (AC自动机+矩阵快速幂)

    距离上次做AC自动机有很久了=.=,以前这题的思路死活看不懂,现在还是觉得很好理解的. 思路参见:http://blog.csdn.net/morgan_xww/article/details/783 ...

  3. 为win10下的linux子系统终端添加powerline

    一切按照上一篇完成,如果成功了,你厉害了我的哥,如果不成功,win10安装powerline字体才可以,才可以,才可以 sudo apt install build-essential cmake g ...

  4. Contest Hunter 3101

    题目 Contest Hunter 3101 阶乘分解 原题传送门 题目分析 这里介绍一个本蒟蒻自己\(yy\)出来的方法. 我们发现,对于某一个单个的整数\(n\),若\(n\)能被某一个数\(x\ ...

  5. Flutter设置Container的最大最小宽高

    Flutter中设置Container宽高可直接通过width和height属性来设置:如下 Container( width: 100, height: 100, color: Colors.red ...

  6. Redis监控之redis-stat安装与详解

    一.安装环境 安装编译环境.ruby运行环境.git代码 yum install gcc-c++ yum -y install ruby-devel yum install ruby yum inst ...

  7. Flume-自定义 Source 读取 MySQL 数据

    开源实现:https://github.com/keedio/flume-ng-sql-source 这里记录的是自己手动实现. 测试中要读取的表 CREATE TABLE `student` ( ` ...

  8. R-CNN/Fast R-CNN/Faster R-CNN

    一.R-CNN 横空出世R-CNN(Region CNN,区域卷积神经网络)可以说是利用深度学习进行目标检测的开山之作,作者Ross Girshick多次在PASCAL VOC的目标检测竞赛中折桂,2 ...

  9. C++ STL transform

    #include<iostream>#include<vector>#include <list>#include <algorithm>#includ ...

  10. 用VLC读取摄像头产生RTSP流,DSS主动取流转发(一)

    用VLC读取摄像头产生RTSP流,DSS主动取流转发(一) 摄像机地址是192.1.101.51,VLC运行在192.1.101.77上,DSS服务器架设在192.1.101.30上. Step1:V ...