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 相关文章推荐
pycharm 使用心得(二)设置字体大小
Jun 05 Python
python基础教程之面向对象的一些概念
Aug 29 Python
Python中functools模块函数解析
Mar 12 Python
Python实现的朴素贝叶斯分类器示例
Jan 06 Python
python使用json序列化datetime类型实例解析
Feb 11 Python
Django命名URL和反向解析URL实现解析
Aug 09 Python
Python多线程及其基本使用方法实例分析
Oct 29 Python
django使用JWT保存用户登录信息
Apr 22 Python
django日志默认打印request请求信息的方法示例
May 17 Python
python unittest单元测试的步骤分析
Aug 02 Python
Python音乐爬虫完美绕过反爬
Aug 30 Python
Python内置的数据类型及使用方法
Apr 13 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
如何开发一个虚拟域名系统
2006/10/09 PHP
PHP封装分页函数实现文本分页和数字分页
2014/10/23 PHP
php中instanceof 与 is_a()区别分析
2015/03/03 PHP
PHP里的单例类写法实例
2015/06/25 PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
2019/04/10 PHP
PHP7.0连接DB操作实例分析【基于mysqli】
2019/09/26 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
javascript ie6兼容position:fixed实现思路
2013/04/01 Javascript
使用javascript实现判断当前浏览器
2015/04/14 Javascript
javascript实现俄罗斯方块游戏的思路和方法
2015/04/27 Javascript
谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法
2015/12/03 Javascript
分享JavaScript与Java中MD5使用两个例子
2015/12/23 Javascript
原生js获取元素样式的简单方法
2016/08/06 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
使用BootStrap实现表格隔行变色及hover变色并在需要时出现滚动条
2017/01/04 Javascript
JS 实现计算器详解及实例代码(一)
2017/01/08 Javascript
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
2017/08/26 Javascript
angular.js4使用 RxJS 处理多个 Http 请求
2017/09/23 Javascript
优化Vue中date format的性能详解
2020/01/13 Javascript
用Python生成器实现微线程编程的教程
2015/04/13 Python
Python正则表达式使用范例分享
2016/12/04 Python
Django实现快速分页的方法实例
2017/10/22 Python
python脚本监控Tomcat服务器的方法
2018/07/06 Python
一篇文章了解Python中常见的序列化操作
2019/06/20 Python
python中文分词库jieba使用方法详解
2020/02/11 Python
深入了解Python 变量作用域
2020/07/24 Python
next在python中返回迭代器的实例方法
2020/12/15 Python
CSS3关于z-index不生效问题的解决
2020/02/19 HTML / CSS
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
毕业实习个人鉴定范文
2013/12/10 职场文书
铁路个人事迹材料
2014/01/30 职场文书
人民教师的自我评价分享
2014/02/21 职场文书
关于青春的演讲稿800字
2014/08/22 职场文书
致我们终将逝去的青春观后感
2015/06/10 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL
nginx配置限速限流基于内置模块
2022/05/02 Servers