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 相关文章推荐
Python写入CSV文件的方法
Jul 08 Python
Python实现将DOC文档转换为PDF的方法
Jul 25 Python
python递归删除指定目录及其所有内容的方法
Jan 13 Python
Python将图片转换为字符画的方法
Jun 16 Python
基于Python在MacOS上安装robotframework-ride
Dec 28 Python
python opencv摄像头的简单应用
Jun 06 Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
Aug 08 Python
python中with用法讲解
Feb 07 Python
Python使用GitPython操作Git版本库的方法
Feb 29 Python
Pandas把dataframe或series转换成list的方法
Jun 14 Python
使用matplotlib的pyplot模块绘图的实现示例
Jul 12 Python
Python数据可视化之用Matplotlib绘制常用图形
Jun 03 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中的正则表达式
2014/08/17 PHP
简单实用的PHP防注入类实例
2014/12/05 PHP
php新建文件的方法实例
2019/09/26 PHP
javascript与css3动画结合使用小结
2015/03/11 Javascript
JavaScript中join()方法的使用简介
2015/06/09 Javascript
JavaScript学习笔记之数组的增、删、改、查
2016/03/23 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
canvas实现手机端用来上传用户头像的代码
2016/10/20 Javascript
vue图片加载与显示默认图片实例代码
2017/03/16 Javascript
原生JavaScript实现的简单放大镜效果示例
2018/02/07 Javascript
vue单页开发父子组件传值思路详解
2018/05/18 Javascript
node.js读取Excel数据(下载图片)的方法示例
2018/08/02 Javascript
Vue.js 中的 v-cloak 指令及使用详解
2018/11/19 Javascript
详解从vue-loader源码分析CSS Scoped的实现
2019/09/23 Javascript
JQuery发送ajax请求时中文乱码问题解决
2019/11/14 jQuery
[47:35]VP vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
Python中使用gzip模块压缩文件的简单教程
2015/04/08 Python
使用Python编写简单的端口扫描器的实例分享
2015/12/18 Python
python 写的一个爬虫程序源码
2016/02/28 Python
python文件的md5加密方法
2016/04/06 Python
不可错过的十本Python好书
2017/07/06 Python
python 请求服务器的实现代码(http请求和https请求)
2018/05/25 Python
python3 读取Excel表格中的数据
2018/10/16 Python
python matplotlib imshow热图坐标替换/映射实例
2020/03/14 Python
python 穷举指定长度的密码例子
2020/04/02 Python
详解使用scrapy进行模拟登陆三种方式
2021/02/21 Python
优衣库澳大利亚官网:UNIQLO澳大利亚
2017/01/18 全球购物
爱游人:Travelliker
2017/09/05 全球购物
Blank NYC官网:夹克、牛仔裤等
2020/12/16 全球购物
电子商务专业个人的自我评价
2013/11/19 职场文书
法律专业推荐信范文
2013/11/29 职场文书
实习报告评语
2014/04/26 职场文书
俞敏洪北大演讲稿
2014/05/22 职场文书
中学生社区服务活动报告
2015/02/05 职场文书
再见,2019我们不负使命;你好,2020我们砥砺前行
2020/01/03 职场文书
Debian11 Xfce终端光标的颜色怎么设置?
2022/08/14 数码科技