【pygame游戏编程】第四篇-----打字测速游戏
下面我们一起用pygame编写一个打字测速游戏
这是一个很实用的有趣的小游戏:
开始之前先来学习几个小函数:
1、 ord(ch)
python内置函数,传入一个字符,返回字符的ascii码
2、chr(num)
python内置函数,传入一个十进制或十六进制,返回ascii码对应的字符
3、os.path.getsize(filename)
传入文件路径,返回文件大小,返回0为空文件
4、pygame.key.get_pressed()
返回一个记录按键事件的字典,字典中的键为按键类型,字典中的值为bool中的True或者False、
例如:
keys = pygame.key.get_pressed() if keys[K_RETURN]:
print("按了回车键")
下面是我们的代码
我们将全部代码写在多个.py文件中,最后通过主程序引入各个子程序,这样做可以让我们编写程序逻辑更清晰,有助于修改调整程序。
游戏主程序
import pygame
import sys
import time
from random import randint from settings import Setting
from displayboard import Displayboard
import functions as fun pygame.init() my_settings = Setting() screen = pygame.display.set_mode((my_settings.screen_width,
my_settings.screen_high))
pygame.display.set_caption("Test Your Typing") dis_board = Displayboard(my_settings, screen) #标志变量
letter_ascii = randint(97, 122)
letter = chr(letter_ascii - 32)
game_active = False
scores = 0
speed = 0
timing = False
remaining_time = my_settings.limited_time
fastest_speed = int (fun.read_fastest_speed(my_settings.filename)) while True:
'''游戏的主循环'''
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit() keys = pygame.key.get_pressed()
if keys[pygame.K_RETURN] and not game_active:
scores = 0
remaining_time = my_settings.limited_time
game_active = True
timing = True #开始计时
if timing:
start_time = time.perf_counter()
timing = False #填充界面
screen.fill(my_settings.BLUE) #显示文本图像
dis_board.display_speed_text(speed) dis_board.display_fastest_text(fastest_speed) #游戏还未开始时执行的操作
if not game_active: pygame.mouse.set_visible(True) dis_board.display_top_text() dis_board.display_start_text() #游戏进行时执行的操作
if game_active: pygame.mouse.set_visible(False) dis_board.display_letter_text(letter) dis_board.display_remaining_time_text(remaining_time) if event.type == pygame.KEYDOWN:
dis_board.display_typing_text() if event.key == letter_ascii:
scores += 1
letter_ascii = randint(97, 122)
letter = chr(letter_ascii - 32) speed = scores * 3 current_time = time.perf_counter()
remaining_time = int (my_settings.limited_time - (current_time - start_time))
if remaining_time < 0:
game_active = False if speed >= fastest_speed:
fastest_speed = speed
fun.write_fastest_speed(speed, my_settings.filename) pygame.display.flip()
存放游戏设置的程序
class Setting():
'''存放游戏中的设置''' def __init__(self): #屏幕尺寸
self.screen_width = 700
self.screen_high = 550
#字体大小
self.s_font_size = 24
self.m_font_size = 35
self.l_font_size = 200
#按钮尺寸
self.button_width = 100
self.button_high = 35
#测试时间
self.limited_time = 20 #颜色
self.YELLOW = (255, 255, 0)
self.WHITE = (255, 255, 255)
self.BLACK = ( 0, 0, 0)
self.RED = (255, 0, 0)
self.GREEN = ( 0, 255, 0)
self.DARKGREEN = ( 0, 155, 0)
self.DARKGRAY = ( 40, 40, 40)
self.OLIVE = (128, 128, 0)
self.BLUE = ( 0, 0, 255)
self.NAVYBLUE = ( 0, 0, 128) #位置
self.top_text_position = (20, 20)
self.speed_text_position = (20, 100) #文本内容
self.top_text = "Try to keep up " + str(self.limited_time) + " seconds!"
self.start_text = "Please Enter To Start!" #文件名
self.filename = r'flies\speed.txt'
存放主程序函数的程序
import os def read_fastest_speed(speed_file):
file_size = os.path.getsize(speed_file)
if file_size == 0:
return 0
else:
with open(speed_file) as speed_file:
lines = speed_file.readlines()
return lines[0] def write_fastest_speed(speed, speed_file):
with open(speed_file) as file:
file.write(str(speed))
显示文本的程序
import pygame class Displayboard():
'''展示程序中的文本''' def __init__(self, my_settings, screen): self.screen = screen
self.my_settings = my_settings
self.screen_rect = screen.get_rect() #获取字体对象
self.s_font = pygame.font.Font(r'fonts\freesansbold.ttf',
my_settings.s_font_size)
self.m_font = pygame.font.Font(r'fonts\freesansbold.ttf',
my_settings.m_font_size)
self.l_font = pygame.font.Font(r'fonts\freesansbold.ttf',
my_settings.l_font_size) #获取文本图片
self.top_text_image = self.s_font.render(my_settings.top_text, True,
my_settings.YELLOW) self.typing_flag_image = self.s_font.render("typing!", True,
my_settings.DARKGRAY) self.start_text_image = self.m_font.render(my_settings.start_text, True,
my_settings.GREEN, my_settings.OLIVE) #获取surface的rect
self.start_image_rect = self.start_text_image.get_rect()
self.start_image_rect.center = self.screen_rect.center self.typing_image_rect = self.typing_flag_image.get_rect()
self.typing_image_rect.right = self.screen_rect.right - 20
self.typing_image_rect.top = 20 #显示各个文本的函数
def display_top_text(self):
self.screen.blit(self.top_text_image,
self.my_settings.top_text_position) def display_typing_text(self):
self.screen.blit(self.typing_flag_image, self.typing_image_rect) def display_start_text(self):
self.screen.blit(self.start_text_image, self.start_image_rect) def display_speed_text(self, speed):
speed_text_image = self.s_font.render("Current Speed: " + str(speed) + " letters/min",
True, self.my_settings.YELLOW)
speed_text_rect = speed_text_image.get_rect()
speed_text_rect.centery = self.screen_rect.centery / 2
speed_text_rect.right = self.screen_rect.right - 20
self.screen.blit(speed_text_image, speed_text_rect) def display_letter_text(self, letter):
letter_text_image = self.l_font.render(letter, True,
self.my_settings.RED)
letter_rect = letter_text_image.get_rect()
letter_rect.centerx = self.screen_rect.centerx
letter_rect.centery = self.screen_rect.bottom * 2 / 3
self.screen.blit(letter_text_image, letter_rect) def display_remaining_time_text(self, remaining_time):
remaining_time_image = self.s_font.render("Remaining Time: " + str(remaining_time),
True, self.my_settings.OLIVE)
remaining_time_rect = remaining_time_image.get_rect()
remaining_time_rect.top = self.screen_rect.top + 20
remaining_time_rect.centerx = self.screen_rect.centerx
self.screen.blit(remaining_time_image, remaining_time_rect) def display_fastest_text(self, fastest_speed):
fastest_speed_image = self.s_font.render("Fastest Speed: " + str(fastest_speed),
True, self.my_settings.YELLOW)
fastest_speed_rect = fastest_speed_image.get_rect()
fastest_speed_rect.centery = self.screen_rect.centery / 2
fastest_speed_rect.left = 20
self.screen.blit(fastest_speed_image, fastest_speed_rect)
【pygame游戏编程】第四篇-----打字测速游戏的更多相关文章
- 【pygame游戏编程】第一篇-----创建一个窗口
下面我们一起来创建一个背景为蓝色的窗口作为游戏编程的开始: import sys import pygame def creat_screen(): #初始化pygame pygame.init() ...
- 如何制作一款HTML5 RPG游戏引擎——第四篇,情景对话
今天我们来实现情景对话.这是一个重要的功能,没有它,游戏将变得索然无味.所以我们不得不来完成它. 但是要知道,使用对话可不是一件简单的事,因为它内部的东西很多,比如说人物头像,人物名称,对话内容... ...
- 【pygame游戏编程】第二篇-----移动图像
Learning From Here import pygame import sys pygame.init() screen_width = 640 screen_high = 480 scree ...
- [C入门 - 游戏编程系列] 序言篇
记得学习C语言的时候,看着别人能写各种各样的小游戏和小软件,甚是羡慕.而自己,虽然说语法都会,但是真正上手写个几百行的代码,就显得力不从心.曾经一度很是郁闷,看过一些书,大都处于教语法的层面,有些涉及 ...
- [C入门 - 游戏编程系列] 环境篇
这一系列笔记的代码都是在Ubuntu 14.04下编码并测试的,原因无他,因为我笔记本电脑只装了一个Ubuntu系统,其中唯一使用的第三方库SDL也是开源并且跨平台的.所以即使你用的是Windows或 ...
- Windows界面编程第四篇 异形窗体 高富帅版 ---博客
http://blog.csdn.net/morewindows/article/details/8451638
- PLC状态机编程第四篇-历史状态处理
今天我们接着上次的控制任务,加入历史状态,这个任务会比较复杂,象这样的任务我们倾向于自动生成PLC程序,自己写容易出错.但为了演示,我们可以尝试一下.言归正传,下面是我们的控制任务. 控制任务 这次的 ...
- 【读书笔记《Android游戏编程之从零开始》】6.Android 游戏开发常用的系统控件(TabHost、ListView)
3.9 TabSpec与TabHost TabHost类官方文档地址:http://developer.android.com/reference/android/widget/TabHost.htm ...
- 【读书笔记《Android游戏编程之从零开始》】8.Android 游戏开发常用的系统控件(系统控件常见问题)
Android 中常用的计量单位Android有时候需要一些计量单位,比如在布局Layout文件中可能需要指定具体单位等.常用的计量单位有:px.dip(dp).sp,以及一些不常用的pt.in.mm ...
随机推荐
- Golang 调用 Python 代码
go 中的 cgo 模块可以让 go 无缝调用 c 或者 c++ 的代码,而 python 本身就是个 c 库,自然也可以由 cgo 直接调用,前提是指定正确的编译条件,如 Python.h 头文件( ...
- Android 页面跳转之生命周期调用顺序问题
Android Activity 常用技巧 Android Activity 启动模式和任务栈 Android 页面跳转之生命周期调用顺序问题 一.页面跳转逻辑分析 1.1 跳转逻辑分析 Androi ...
- 处理返回键劫持(结合vue)
在这里记录一下近期解决的一个问题 需求,在某个页面,浏览器返回按钮点击的时候,不能走浏览器的默认返回操作,而是要走自己的逻辑, 比如跳转页面等等. 那么问题来了,如何去不走默认返回呢.经过网上搜罗和同 ...
- Java学习笔记32(集合框架六:Map接口)
Map接口与Collection不同: Collection中的集合元素是孤立的,可理解为单身,是一个一个存进去的,称为单列集合 Map中的集合元素是成对存在的,可理解为夫妻,是一对一对存进去的,称为 ...
- XStream进行xml和bean互转
加入pom <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>x ...
- linux中环境变量PATH设置错误,导致ls cd 等命令不能使用,提示:没有那个文件或目录
在CentOS7中执行了 PATH=/opt/:$PATH 然后执行ls时,出现 ls-bash: ls: 没有那个文件或目录 试了试其他命令也一样无法使用 后来执行 : export PATH=/u ...
- Liferay7 BPM门户开发之25: Liferay7应用程序配置(APPLICATION CONFIGURATION)
首先有几个概念需要明确.1.第一个概念是这里的应用程序配置不是写XML之类的配置文件,是类似字典的类型化配置这意味着应用程序配置不只是一个字符串键值对的列表.值还可以有类型,如整数列表,字符串列表,一 ...
- windows中的常用Dos命令
# __切换盘符目录__ E/D: # 从C盘切换到E盘或者D盘# __切换到指定文件夹下__cd folder_name(指定文件夹名--相对/绝对路径)cd .. # 返回上一级目录cd / # ...
- Eclipse创建web项目目录结构
效果图如下: 0 新建Web项目 1.右击项目MyProject进入Java Build Path 2. 点击Add Folder按钮,进入如下界面 3.选择src,点击Add New Folder按 ...
- [译]ABP vNext微服务演示,项目状态和路线图
译注: ABP的主要负责人hikalkan最近又发布了一篇博客, 说明了ABP vNext的微服务演示,项目状态和路线图.其中特意对ABP的中文社区进行了感谢! 本文翻译自该博客文章(https:// ...