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恢复默认设置或者是替换pycharm的解释器实例
Oct 29 Python
在pycharm 中添加运行参数的操作方法
Jan 19 Python
selenium+python环境配置教程详解
May 28 Python
解决python tkinter界面卡死的问题
Jul 17 Python
python生成器推导式用法简单示例
Oct 08 Python
python处理excel绘制雷达图
Oct 18 Python
Python实现自动访问网页的例子
Feb 21 Python
python实现批量转换图片为黑白
Jun 16 Python
为什么python比较流行
Jun 19 Python
pycharm如何使用anaconda中的各种包(操作步骤)
Jul 31 Python
python 用struct模块解决黏包问题
Nov 07 Python
在 Golang 中实现 Cache::remember 方法详解
Mar 30 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合并两个数组的两种方式的异同
2012/09/14 PHP
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
php自定文件保存session的方法
2014/12/10 PHP
Yii中特殊行为ActionFilter的使用方法示例
2020/10/18 PHP
jquery 的 $("#id").html() 无内容的解决方法
2010/06/07 Javascript
基于JQuery 的消息提示框效果代码
2011/07/31 Javascript
jQuery动态背景图片效果实现方法
2015/07/03 Javascript
jQuery的position()方法详解
2015/07/19 Javascript
搭建Bootstrap离线文档的方法
2016/12/02 Javascript
angular 组件通信的几种实现方式
2018/07/13 Javascript
微信小程序之swiper滑动面板用法示例
2018/12/04 Javascript
JS造成内存泄漏的几种情况实例分析
2020/03/02 Javascript
Javascript实现鼠标移入方向感知
2020/06/24 Javascript
JavaScript indexOf()原理及使用方法详解
2020/07/09 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
python多线程http下载实现示例
2013/12/30 Python
python中getattr函数使用方法 getattr实现工厂模式
2014/01/20 Python
Python字符编码判断方法分析
2016/07/01 Python
Python中字符串的常见操作技巧总结
2016/07/28 Python
django基于cors解决跨域请求问题详解
2019/08/06 Python
pandas DataFrame运算的实现
2020/06/14 Python
python中复数的共轭复数知识点总结
2020/12/06 Python
css 元素选择器的简单实例
2016/05/23 HTML / CSS
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
Brasty波兰:香水、化妆品、手表网上商店
2019/04/15 全球购物
回馈慈善的设计师太阳镜:DIFF eyewear
2019/10/17 全球购物
酒店管理毕业生自荐信
2013/10/24 职场文书
汽车技术服务英文求职信范文
2014/01/02 职场文书
金融学专业大学生职业生涯规划
2014/03/07 职场文书
法律进社区实施方案
2014/03/21 职场文书
篮球比赛口号
2014/06/10 职场文书
小学教师自我评价
2015/03/04 职场文书
丧事答谢词大全
2015/09/30 职场文书
高三语文教学反思
2016/02/16 职场文书
工作计划范文之财务管理
2019/08/09 职场文书
AJAX实现指定部分页面刷新效果
2021/10/16 Javascript