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 相关文章推荐
深入理解Javascript中的this关键字
Mar 27 Python
以windows service方式运行Python程序的方法
Jun 03 Python
Python 专题一 函数的基础知识
Mar 16 Python
python3.4下django集成使用xadmin后台的方法
Aug 15 Python
python实现飞机大战微信小游戏
Mar 21 Python
解决pycharm运行出错,代码正确结果不显示的问题
Nov 30 Python
wxPython之wx.DC绘制形状
Nov 19 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
Apr 08 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
Apr 21 Python
Selenium webdriver添加cookie实现过程详解
Aug 12 Python
Python如何爬取51cto数据并存入MySQL
Aug 25 Python
Python如何把不同类型数据的json序列化
Apr 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
JoshChen_php新手进阶高手不可或缺的规范介绍
2013/08/16 PHP
php生成静态页面的简单示例
2014/04/17 PHP
php中异常处理方法小结
2015/01/09 PHP
PHP获取数组最大值下标的方法
2015/05/12 PHP
PHP实现数组array转换成xml的方法
2016/07/19 PHP
PHP实现唤起微信支付功能
2019/02/18 PHP
浅谈PHP封装CURL
2019/03/06 PHP
很可爱的输入框
2008/08/03 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
2014/08/22 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
在HTML中插入JavaScript代码的示例
2015/06/03 Javascript
jQuery自定义数值抽奖活动代码
2016/06/11 Javascript
jQuery制作网页版选项卡
2016/07/28 Javascript
vue resource post请求时遇到的坑
2017/10/19 Javascript
Angular实现表单验证功能
2017/11/13 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
vue 设置proxyTable参数进行代理跨域
2018/04/09 Javascript
JS实现520 表白简单代码
2018/05/21 Javascript
jquery ajaxfileuplod 上传文件 essyui laoding 效果【防止重复上传文件】
2018/05/26 jQuery
扫微信小程序码实现网站登陆实现解析
2019/08/20 Javascript
iview form清除校验状态的实现
2019/09/19 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
2020/10/29 Javascript
Python只用40行代码编写的计算器实例
2017/05/10 Python
python中强大的format函数实例详解
2018/12/05 Python
Python实现爬取马云的微博功能示例
2019/02/16 Python
HTML5+CSS3网页加载进度条的实现,下载进度条的代码实例
2016/12/30 HTML / CSS
美国亚洲时尚和美容产品的一站式网上商店:Stylevana
2019/09/05 全球购物
保加利亚手表、香水、化妆品和珠宝购物网站:Brasty.bg
2020/04/22 全球购物
厂长助理岗位职责
2013/12/27 职场文书
护士思想汇报
2014/01/12 职场文书
大学生考试作弊检讨书1000字
2014/10/14 职场文书
普希金的诗歌赏析(3首)
2019/08/20 职场文书
MySQL中存储时间的最佳实践指南
2021/07/01 MySQL
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
2022/01/18 Java/Android
oracle数据库去除重复数据
2022/05/20 Oracle