Python代码模拟打字练习软件效果,循环进行单行打字练习,结束时输出平均速度和综合正确率。
(笔记模板由python脚本于2024年01月03日 22:36:34创建,本篇笔记适合熟悉Python字符串和列表基本数据类型的coder翻阅)
Python 官网:https://www.python.org/
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
??自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
????????????—— 华罗庚
本文质量分:
CSDN质量分查询入口:http://www.csdn.net/qc
??一个共同学习python的小朋友,丢过来一段代码,说是练习打字用的,想用time.sleep方法统计打字时间,无法得到预期,让给瞧瞧。
import random
import time
a = input('输入g进入游戏:')
b = 'abcdefghijklmnoprstuvwxyz'
print()
print()
if a == 'g':
c = ''.join(random.sample(b, 13))
print(c)
for i in range(1, 100):
e = input()
if e == c:
break
time.sleep(1)
print('用时{}秒'.format(i))
代码运行效果截屏
??认真读过代码后,感觉可以做一个如同打字练习软件一样的效果,练练手。😁
??做好单行练习,又做了循环练习,输出了平均速度,最后还设法输出了“正确率”。
请先看看效果截屏——
题目描述截屏图片
??我把整个“工程”拆解开来,分块完成代码书写,完了用一个函数统一调度。
??单行练习、循环调用“单行练习”成就“工程”;单行练习又下设输入字符与目标字符比对的判定模块。
??目标字符串的输出,间一个空格,更好辩识一些。
代码运行效果截屏图片
play模块代码
def play(letters):
''' 单行打字练习 '''
chars = ''.join(sample(letters, 13))
line = f"{'':﹉^13}"
print(f"\n{' '.join(chars):^40}\n{f'{line}':^27}\n{'(直接回车结束练习)':^32}") # 随机选取练习字母。
start = time()
inS = input(f"\n{'':>9}~ $ ").strip() # 打印两个空行可以在这里进行。
if not inS: return # 直接回车退出练习。
s = time() - start
speed = s/len(inS)
right = isRight(inS, chars)
s = f"你的速度是:{speed:.2f} s/字"
input(f"\n{'':~^40}\n{right[0]}\n\n{' 你真棒!':~^36}\n\n\n{'':=^40}" if inS == ''.join(chars) else f"\n{'':~^40}\n{right[0]}\n\n{' 加油哦!':~^36}\n\n\n{'':=^40}")
return speed, right[1]
??用zip函数遍历输入字符和目标字符比对,对的?错的×。
代码运行效果截屏图片
isRight代码
(有bug)
def isRight(inS, target):
''' 评判打字正确情况 '''
result = [(i[0], '√' if i[0] == i[1] else 'x')for i in zip(inS, target)]
right = [i[1] for i in result]
return f"\n{' '.join([''] + [i[0] for i in result] + ['']):^40}\n{' '.join([''] + right + ['']):^40}", ''.join(right).count('√')/len(target)
如果不打完,输出的样子是这样
??这是由于zip函数总会“将就”较短的序列造成的,更多zip函数的知识,请点阅我的学习笔记“Python内置函数:zip() “护短””。用空格增长输入字符串与目标字符串长度一致,解决这个小bug。
修正效果截屏图片
修正错误后的isRight
def isRight(inS, target):
''' 评判打字正确情况 '''
inS = inS + ' '*(len(target)-len(inS)) if len(inS) < len(target) else inS # 拉齐字符串长度。
result = [(i[0], '√' if i[0] == i[1] else 'x')for i in zip(inS, target)]
right = [i[1] for i in result]
return f"\n{' '.join([''] + [i[0] for i in result] + ['']):^40}\n{' '.join([''] + right + ['']):^40}", ''.join(right).count('√')/len(target)
??主程序game对各功能模块统筹调度,循环执行单行打字练习,记录单行速度和正确率,退出练习时计算平均速度和综合正确率。
代码运行效果截屏图片
game主程序代码
def game():
''' 主程序 '''
author = f"\n\n{' Author: DreamElf_cq ':~^40}\n{'(作者:梦幻精灵_cq)':^33}"
#letters = list("abcdefghijklmnopqrstuvwxyz") # 小写字母列表。
letters = list(map(chr, range(ord('a'), ord('z')+1))) # 小写字母(迭代器序列生成)。
line = True # sperd初值为真。
result = [] # 单行打字速度记录列表初值。
while line:
clear() # 清屏并打印游戏名称。
line = play(letters) # 调用单行打字练习函数。
if line: result += [line] # 收集单行打字速度。
clear() # 清屏并打印游戏名称。
speed = sum([i[0] for i in result])/len(result) if result else False
right = sum([i[1] for i in result])/len(result) if result else False
print(f"\n\n{f' 您的平均速度是:{60/speed:.0f} 字/分钟':^29}\n{f'(正确率是:{right*100:.2f}%)':^35}\n\n{author}\n{'':=^40}" if speed else f"\n{' 您还没有练习哦(′-ω-`) ':^33}\n{author}\n{'':=^40}")
??只使用模块中的一个方法,用from … import …加载,更省内存。
Python代码
#!/sur/bin/nve python
# coding: utf-8
from random import sample
from time import time # 只加载用到的方法,更小占用机器内存。
??用“\033[2J”控制字符串清屏,让程序界面更“干净”。我用lambda封装成单行匿名函数,让使用更为方便。(清屏控制字符串,windows系统无效,会打印可见字符)
clear单行匿名函数代码
clear = lambda: print(f"\033[2J{' 打 字 练 习 ':=^36}\n\n") # 清屏控制字符串,windows系统无效,会打印可见字符。
??小写字母列表,可以直接26个字母字符串,也可以用迭代器序列生成。
clear单行匿名函数代码
#letters = list("abcdefghijklmnopqrstuvwxyz") # 小写字母列表。
letters = list(map(chr, range(ord('a'), ord('z')+1))) # 小写字母(迭代器序列生成)。
(源码较长,点此跳过源码)
#!/sur/bin/nve python
# coding: utf-8
from random import sample
from time import time # 只加载用到的方法,更小占用机器内存。
def isRight(inS, target):
''' 评判打字正确情况 '''
inS = inS + ' '*(len(target)-len(inS)) if len(inS) < len(target) else inS # 拉齐字符串长度。
result = [(i[0], '√' if i[0] == i[1] else 'x')for i in zip(inS, target)]
right = [i[1] for i in result]
return f"\n{' '.join([''] + [i[0] for i in result] + ['']):^40}\n{' '.join([''] + right + ['']):^40}", ''.join(right).count('√')/len(target)
def play(letters):
''' 单行打字练习 '''
chars = ''.join(sample(letters, 13))
line = f"{'':﹉^13}"
print(f"\n{' '.join(chars):^40}\n{f'{line}':^27}\n{'(直接回车结束练习)':^32}") # 随机选取练习字母。
start = time()
inS = input(f"\n{'':>9}~ $ ").strip() # 打印两个空行可以在这里进行。
if not inS: return # 直接回车退出练习。
s = time() - start
speed = s/len(inS)
right = isRight(inS, chars)
s = f"你的速度是:{speed:.2f} s/字"
input(f"\n{'':~^40}\n{right[0]}\n\n{' 你真棒!':~^36}\n\n\n{'':=^40}" if inS == ''.join(chars) else f"\n{'':~^40}\n{right[0]}\n\n{' 加油哦!':~^36}\n\n\n{'':=^40}")
return speed, right[1]
clear = lambda: print(f"\033[2J{' 打 字 练 习 ':=^36}\n\n") # 清屏控制字符串,windows系统无效,会打印可见字符。
def game():
''' 主程序 '''
author = f"\n\n{' Author: DreamElf_cq ':~^40}\n{'(作者:梦幻精灵_cq)':^33}"
#letters = list("abcdefghijklmnopqrstuvwxyz") # 小写字母列表。
letters = list(map(chr, range(ord('a'), ord('z')+1))) # 小写字母(迭代器序列生成)。
line = True # sperd初值为真。
result = [] # 单行打字速度记录列表初值。
while line:
clear() # 清屏并打印游戏名称。
line = play(letters) # 调用单行打字练习函数。
if line: result += [line] # 收集单行打字速度。
clear() # 清屏并打印游戏名称。
speed = sum([i[0] for i in result])/len(result) if result else False
right = sum([i[1] for i in result])/len(result) if result else False
print(f"\n\n{f' 您的平均速度是:{60/speed:.0f} 字/分钟':^29}\n{f'(正确率是:{right*100:.2f}%)':^35}\n\n{author}\n{'':=^40}" if speed else f"\n{' 您还没有练习哦(′-ω-`) ':^33}\n{author}\n{'':=^40}")
if __name__ == '__main__':
game() # 主程序调用
我的HOT博:
??本次共计收集289篇博文笔记信息,总阅读量44.72w。数据采集于2023年12月11日 23:07:13,用时5分11.8秒。阅读量不小于4.0k的有17篇。
截屏图片
精品文章:
来源:老齐教室
◆ Python 入门指南【Python 3.6.3】
好文力荐:
CSDN实用技巧博文: