pygame实现打字游戏


Posted in Python onFebruary 19, 2021

本文实例为大家分享了pygame实现打字游戏的具体代码,供大家参考,具体内容如下

1.基本代码

下面的代码完成了每一秒在界面的顶部随机生成一个新的字母

# -*- coding=utf-8 -*-
import pygame
from pygame.locals import KEYDOWN
import random

w,h = 800,600
pygame.init()
screen = pygame.display.set_mode((w, h))

white=255,255,255
black=0,0,0
myfont = pygame.font.Font(None,80)

word_diff_ticks = 1000
word_ticks = pygame.time.get_ticks() + word_diff_ticks

def get_random_word():
 color = (random.randint(0, 255),random.randint(0, 255),random.randint(0, 255)) # 颜色随机
 x = random.randint(100, w-100) # x坐标从左右边距各100之间随机
 y = 0
 word = random.randint(65, 90)
 return x,y,word,color

arr=[]
arr.append(get_random_word())

while True:
 for event in pygame.event.get():
 if event.type == pygame.QUIT:
 pygame.quit()
 exit()

 screen.fill((255, 255, 255))

 for i in range(len(arr)): # 绘制这些字母
 x, y, word, c = arr[i]
 textImage = myfont.render(chr(word), True, c)
 screen.blit(textImage, (x, y))

 if pygame.time.get_ticks()>=word_ticks: # 计时增加新字母
 word_ticks +=word_diff_ticks
 arr.append(get_random_word())

 pygame.display.update()

2.移动字母

先增加一个定时器,设定字母20毫秒移动一格

diff_ticks = 20
ticks = pygame.time.get_ticks() + diff_ticks

在主循环中加入移动的代码

if pygame.time.get_ticks() >= ticks:
 ticks += diff_ticks
 for i in range(len(arr)):
 x, y, word, c = arr[i]
 arr[i] = (x, y+1, word, c)

3.消除字母

在事件的处理代码中加入对键盘字母的判断

for event in pygame.event.get():
 ……
 
 if len(arr)>0 and event.type == KEYDOWN:
 if event.key == arr[0][2]+32: # 大小写字母差32
 arr.pop(0)

规定每次消除都必须是第一个,所以如果正确按下了第一个字母,就将第一个字母移除

4.增加游戏难度级别

增加一个变量clear_word用于记录消除的字母数量,增加一个变量level用于记录目前的级别,把界面的标题设置显示当前level

clear_word=0
level = 1
pygame.display.set_caption('typing level:%d'%level)

在正确按下字母后增加技术和判断是否增加难度,因为diff_ticks和word_diff_ticks分别是字母移动的时间间隔和增加一个新字母的时间间隔,所以对这两个变量进行*0.9的处理,就缩短了时间间隔,增加了难度

for event in pygame.event.get():
 if event.type == pygame.QUIT:
 pygame.quit()
 exit()

 if len(arr)>0 and event.type == KEYDOWN:
 if event.key == arr[0][2]+32: # 大小写字母差32
 arr.pop(0)
 clear_word += 1
 if clear_word >= level*10: #每10个字母增加一次难度
  level+=1
  pygame.display.set_caption('typing level:%d' % level)
  diff_ticks=diff_ticks*0.9
  word_diff_ticks=word_diff_ticks*0.9

5.游戏状态

增加一个变量game_state用于记录游戏状态

game_state=1 # 1.进行中 2.游戏失败

游戏失败时的显示

if game_state == 2:
 textImage = myfont.render("Level%d fail"%level, True, (255,0,0))
 sw,sh = textImage.get_size()
 screen.blit(textImage, ((w-sw)/2, (h-sh)/2)) # 居中显示

移动字母的代码中做下修改,将代码放入game_state为1的判断中,并且用arr[0][1] > h检测最下面一个字母是否已经超过屏幕下线

if game_state == 1:
 if pygame.time.get_ticks()>=word_ticks: # 计时增加新字母
 word_ticks +=word_diff_ticks
 arr.append(get_random_word())

 if pygame.time.get_ticks() >= ticks:
 ticks += diff_ticks
 for i in range(len(arr)):
 x, y, word, c = arr[i]
 arr[i] = (x, y+1, word, c)
 if len(arr) > 0 and arr[0][1] > h: game_state=2

对字母的按键判断处理处也增加下游戏状态的判断,避免游戏结束后还能消除字母

for event in pygame.event.get():
 if event.type == pygame.QUIT:
 pygame.quit()
 exit()

 if game_state==1 and len(arr)>0 and event.type == KEYDOWN:
 ……

6.给第一个字母增加闪烁效果

为增加显示效果,给第一个字母增加下闪烁效果,便于提醒要敲下对应字母。
实现思路是每移动一格让这个字母随机变个颜色,以实现闪烁。
定义一个sign变量,用于切换颜色

sign=1

在移动字母的地方增加下sign变量的切换1-sign实现0、1两个值的切换

if game_state == 1:
 ……

 if pygame.time.get_ticks() >= ticks:
 ticks += diff_ticks
 sign=1-sign
 ……

在绘制字母的地方增加下sign的判断,如果是第一个字母,并且sign不为0,则对字母做随机颜色

for i in range(len(arr)):
 x, y, word, c = arr[i]
 if i==0 and sign:
 c = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))

 textImage = myfont.render(chr(word), True, c)
 screen.blit(textImage, (x, y))

7.最终效果图

pygame实现打字游戏

8.完整的代码

# -*- coding=utf-8 -*-
import pygame
from pygame.locals import KEYDOWN
import random

w,h = 800,600
pygame.init()
screen = pygame.display.set_mode((w, h))

white=255,255,255
black=0,0,0
myfont = pygame.font.Font(None,80)

diff_ticks = 20
ticks = pygame.time.get_ticks() + diff_ticks
word_diff_ticks = 1000
word_ticks = pygame.time.get_ticks() + word_diff_ticks

def get_random_word():
 color = (random.randint(0, 255),random.randint(0, 255),random.randint(0, 255)) # 颜色随机
 x = random.randint(100, w-100) # x坐标从左右边距各100之间随机
 y = 0
 word = random.randint(65, 90)
 return x,y,word,color

arr=[]
arr.append(get_random_word())

clear_word=0
level = 1
pygame.display.set_caption('typing level:%d'%level)
game_state=1 # 1.进行中 2.游戏失败
sign=1
while True:
 for event in pygame.event.get():
 if event.type == pygame.QUIT:
 pygame.quit()
 exit()

 if game_state==1 and len(arr)>0 and event.type == KEYDOWN:
 if event.key == arr[0][2]+32: # 大小写字母差32
 arr.pop(0)
 clear_word += 1
 if clear_word >= level*10:
  level+=1
  pygame.display.set_caption('typing level:%d' % level)
  diff_ticks=diff_ticks*0.9
  word_diff_ticks=word_diff_ticks*0.95

 screen.fill((255, 255, 255))

 for i in range(len(arr)): # 绘制这些字母
 x, y, word, c = arr[i]
 if i==0 and sign:
 c = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
 textImage = myfont.render(chr(word), True, c)
 screen.blit(textImage, (x, y))

 if game_state == 2:
 textImage = myfont.render("Level%d fail"%level, True, (255,0,0))
 sw,sh = textImage.get_size()
 screen.blit(textImage, ((w-sw)/2, (h-sh)/2)) # 居中显示

 if game_state == 1:
 if pygame.time.get_ticks()>=word_ticks: # 计时增加新字母
 word_ticks +=word_diff_ticks
 arr.append(get_random_word())

 if pygame.time.get_ticks() >= ticks:
 ticks += diff_ticks
 sign=1-sign
 for i in range(len(arr)):
 x, y, word, c = arr[i]
 arr[i] = (x, y+1, word, c)
 if len(arr) > 0 and arr[0][1] > h: game_state=2

 pygame.display.update()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
mac下给python3安装requests库和scrapy库的实例
Jun 13 Python
python散点图实例之随机漫步
Aug 27 Python
对python中的iter()函数与next()函数详解
Oct 18 Python
python3转换code128条形码的方法
Apr 17 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
Jun 18 Python
Python实现微信翻译机器人的方法
Aug 13 Python
Python双链表原理与实现方法详解
Feb 22 Python
Python实现我的世界小游戏源代码
Mar 02 Python
解决Pyinstaller打包软件失败的一个坑
Mar 04 Python
解决Python字典查找报Keyerror的问题
May 26 Python
openstack中的rpc远程调用的方法
Jul 09 Python
python实现双向链表原理
May 25 Python
Python 实现自动导入缺失的库
Oct 29 #Python
python实现的读取网页并分词功能示例
Oct 29 #Python
python实现LRU热点缓存及原理
Oct 29 #Python
Python 中的 import 机制之实现远程导入模块
Oct 29 #Python
Centos7 下安装最新的python3.8
Oct 28 #Python
Python any()函数的使用方法
Oct 28 #Python
PYTHON发送邮件YAGMAIL的简单实现解析
Oct 28 #Python
You might like
?算你??的 PHP 程式大小
2006/12/06 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
ThinkPHP模板IF标签用法详解
2014/07/01 PHP
php实现简单的MVC框架实例
2015/09/23 PHP
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
解决jQuery插件tipswindown与hintbox冲突
2010/11/05 Javascript
jquery each()源代码
2011/02/14 Javascript
jqPlot 基于jquery的画图插件
2011/04/26 Javascript
js 走马灯简单实例
2013/11/21 Javascript
javascript匿名函数实例分析
2014/11/18 Javascript
ECMAScript5中的对象存取器属性:getter和setter介绍
2014/12/08 Javascript
Javascript基础教程之数据类型转换
2015/01/18 Javascript
Javascript实现Web颜色值转换
2015/02/05 Javascript
JavaScript获取并更改input标签name属性的方法
2015/07/02 Javascript
jQuery实现两款有动画功能的导航菜单代码
2015/09/16 Javascript
vue-resource + json-server模拟数据的方法
2017/11/02 Javascript
深入剖析Express cookie-parser中间件实现示例
2018/02/01 Javascript
如何更好的编写js async函数
2018/05/13 Javascript
vue-cli3环境变量与分环境打包的方法示例
2019/02/18 Javascript
JS Math对象与Math方法实例小结
2019/07/05 Javascript
Python的自动化部署模块Fabric的安装及使用指南
2016/01/19 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
2018/11/06 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
Lookfantastic希腊官网:英国知名美妆购物网站
2018/09/15 全球购物
介绍一下MYSQL常用的优化技巧
2012/10/25 面试题
信用社实习人员自我鉴定
2013/09/20 职场文书
护士求职自荐信范文
2014/03/19 职场文书
档案保密承诺书
2014/06/03 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
销售经理工作失职检讨书
2014/10/24 职场文书
大学生助学金感谢信
2015/01/21 职场文书
老人院义工活动感想
2015/08/07 职场文书
2015年国庆节广播稿
2015/08/19 职场文书
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书
Go 实现英尺和米的简单单位换算方式
2021/04/29 Golang
MySQL 使用事件(Events)完成计划任务
2021/05/24 MySQL