使用 Python 和 Tkinter 构建打字游戏:从入门到实践

news2025/1/8 18:18:26

在这篇博客中,我们将一起创建一个简单但有趣的打字游戏,使用 Python 的 Tkinter 库来构建图形界面,并利用多线程来处理游戏的倒计时功能。这不仅能帮助你练习 Python 编程,还能加深对 Tkinter 和线程操作的理解。

项目概述

这个打字游戏的基本玩法是:展示一段英文文本,玩家需要尽可能快地键入这段文本,完成后游戏会显示玩家用时。如果玩家在规定的时间内成功完成任务,游戏会显示恭喜信息;如果超时,则会显示时间到的消息。

代码结构

在本项目中,代码主要由以下几个部分组成:

  1. 游戏文本:我们准备了一些英文句子供玩家打字。
  2. 图形界面:使用 tkinter 创建一个简单的 GUI 窗口,包括文本显示、输入框、按钮等。
  3. 倒计时:游戏开始后会启动一个倒计时,倒计时为 30 秒。
  4. 用户输入检测:实时检测玩家的输入,判断是否完成文本。
  5. 游戏逻辑:根据玩家的输入情况,判断游戏是否结束,并显示最终结果。

代码实现

以下是完整的代码实现:

import tkinter as tk
import random
import time
from threading import Thread

# 游戏文本列表
texts = [
    "The quick brown fox jumps over the lazy dog.",
    "Python is an amazing programming language.",
    "Typing games are a fun way to practice your typing speed.",
    "Stay focused and keep typing, you can do it!",
    "Good luck, typing fast requires practice!"
]

# 创建游戏窗口
root = tk.Tk()
root.title("打字游戏")
root.geometry("600x400")

# 初始化一些变量
current_text = random.choice(texts)  # 随机选择一段文本
start_time = None  # 记录开始时间
is_game_over = False  # 游戏是否结束

# 标签显示目标文本
text_label = tk.Label(root, text=current_text, font=("Helvetica", 14), wraplength=500)
text_label.pack(pady=20)

# 输入框,玩家输入文本
entry = tk.Entry(root, font=("Helvetica", 14), width=50)
entry.pack(pady=10)

# 计时标签
timer_label = tk.Label(root, text="剩余时间: 30s", font=("Helvetica", 12))
timer_label.pack(pady=5)

# 提示标签
status_label = tk.Label(root, text="开始游戏,打字吧!", font=("Helvetica", 12))
status_label.pack(pady=10)

# 游戏倒计时线程
def countdown():
    global start_time
    for remaining in range(30, 0, -1):
        if is_game_over:
            break
        timer_label.config(text=f"剩余时间: {remaining}s")
        time.sleep(1)
    if not is_game_over:
        game_over(False)

# 游戏开始函数
def start_game():
    global start_time, is_game_over
    if not is_game_over:
        entry.focus_set()  # 聚焦到输入框
        start_time = time.time()  # 记录开始时间
        is_game_over = False
        status_label.config(text="开始打字!")
        countdown_thread = Thread(target=countdown)
        countdown_thread.start()

# 游戏结束函数
def game_over(success):
    global is_game_over
    is_game_over = True
    elapsed_time = round(time.time() - start_time, 2)
    if success:
        status_label.config(text=f"恭喜,你成功完成了任务!用时 {elapsed_time} 秒!")
    else:
        status_label.config(text=f"时间到,游戏结束!用时 {elapsed_time} 秒!")

# 检查用户输入
def check_input(event):
    global current_text, is_game_over
    if is_game_over:
        return

    typed_text = entry.get()  # 获取用户输入
    if typed_text == current_text:
        game_over(True)  # 完成文本,游戏胜利

# 按键监听
entry.bind("<KeyRelease>", check_input)

# 开始按钮
start_button = tk.Button(root, text="开始游戏", font=("Helvetica", 14), command=start_game)
start_button.pack(pady=20)

# 启动GUI事件循环
root.mainloop()

 

详细讲解

1. 初始化游戏文本
texts = [
    "The quick brown fox jumps over the lazy dog.",
    "Python is an amazing programming language.",
    "Typing games are a fun way to practice your typing speed.",
    "Stay focused and keep typing, you can do it!",
    "Good luck, typing fast requires practice!"
]

我们首先定义了一些英文句子,这些句子会在游戏中随机选择,作为玩家需要打字的内容。

2. 设置 GUI 界面
root = tk.Tk()
root.title("打字游戏")
root.geometry("600x400")

使用 Tkinter 创建一个窗口,窗口的大小设置为 600x400,并且设置了标题为“打字游戏”。

3. 显示文本和输入框
text_label = tk.Label(root, text=current_text, font=("Helvetica", 14), wraplength=500)
entry = tk.Entry(root, font=("Helvetica", 14), width=50)
  • text_label 显示目标文本,即玩家需要打字的内容。
  • entry 是一个输入框,玩家将在其中输入文本。
4. 倒计时功能
def countdown():
    global start_time
    for remaining in range(30, 0, -1):
        if is_game_over:
            break
        timer_label.config(text=f"剩余时间: {remaining}s")
        time.sleep(1)
    if not is_game_over:
        game_over(False)

游戏开始后,我们启动了一个倒计时功能,倒计时为 30 秒。每一秒更新一次界面,显示剩余的时间。当时间用完后,游戏自动结束并显示失败信息。

5. 开始游戏
def start_game():
    global start_time, is_game_over
    if not is_game_over:
        entry.focus_set()
        start_time = time.time()
        is_game_over = False
        status_label.config(text="开始打字!")
        countdown_thread = Thread(target=countdown)
        countdown_thread.start()

点击“开始游戏”按钮后,start_game 函数会被调用。它将启动游戏倒计时,并设置游戏状态为“进行中”。

6. 游戏结束
def game_over(success):
    global is_game_over
    is_game_over = True
    elapsed_time = round(time.time() - start_time, 2)
    if success:
        status_label.config(text=f"恭喜,你成功完成了任务!用时 {elapsed_time} 秒!")
    else:
        status_label.config(text=f"时间到,游戏结束!用时 {elapsed_time} 秒!")

如果玩家在时间内完成打字,游戏会显示胜利消息;如果超时,则显示失败消息。

7. 输入检测
def check_input(event):
    global current_text, is_game_over
    if is_game_over:
        return
    typed_text = entry.get()
    if typed_text == current_text:
        game_over(True)

每次玩家输入字符时,都会检查输入是否与目标文本一致。如果一致,游戏结束并显示成功消息。

8. 启动 GUI 循环
root.mainloop()

启动 Tkinter 的事件循环,确保界面持续响应用户的操作。

总结

通过这篇博客,我们成功创建了一个简单的打字游戏。通过 Tkinter 库,我们构建了一个基础的图形用户界面;利用多线程,我们实现了倒计时功能;并通过事件监听,实时检测玩家的输入。通过这个项目,你可以学习如何使用 Tkinter 创建应用程序、如何处理多线程以及如何实现简单的游戏逻辑。

希望你喜欢这个项目并能从中学到一些新的知识!你可以根据自己的需求进一步扩展这个游戏,比如添加难度等级、显示打字速度、保存成绩等等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2272760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据高级ACP学习笔记(2)

钻取&#xff1a;变换维度的层次&#xff0c;改变粒度的大小 星型模型 雪花模型 MaxCompute DataHub

尚硅谷· vue3+ts 知识点学习整理 |14h的课程(持续更ing)

vue3 主要内容 核心&#xff1a;ref、reactive、computed、watch、生命周期 常用&#xff1a;hooks、自定义ref、路由、pinia、miit 面试&#xff1a;组件通信、响应式相关api ----> 笔记&#xff1a;ts快速梳理&#xff1b;vue3快速上手.pdf 笔记及大纲 如下&#xff…

阻抗(Impedance)、容抗(Capacitive Reactance)、感抗(Inductive Reactance)

阻抗&#xff08;Impedance&#xff09;、容抗&#xff08;Capacitive Reactance&#xff09;、感抗&#xff08;Inductive Reactance&#xff09; 都是交流电路中描述电流和电压之间关系的参数&#xff0c;但它们的含义、单位和作用不同。下面是它们的定义和区别&#xff1a; …

在 SQL 中,区分 聚合列 和 非聚合列(nonaggregated column)

文章目录 1. 什么是聚合列&#xff1f;2. 什么是非聚合列&#xff1f;3. 在 GROUP BY 查询中的非聚合列问题示例解决方案 4. 为什么 only_full_group_by 要求非聚合列出现在 GROUP BY 中&#xff1f;5. 如何判断一个列是聚合列还是非聚合列&#xff1f;6. 总结 在 SQL 中&#…

B树与B+树:数据库索引的秘密武器

想象一下&#xff0c;你正在构建一个超级大的图书馆&#xff0c;里面摆满了各种各样的书籍。B树和B树就像是两种不同的图书分类和摆放方式&#xff0c;它们都能帮助你快速找到想要的书籍&#xff0c;但各有特点。 B树就像是一个传统的图书馆摆放方式&#xff1a; 1. 书籍摆放&…

回归预测 | MATLAB实现CNN-SVM多输入单输出回归预测

回归预测 | MATLAB实现CNN-SVM多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-SVM多输入单输出回归预测预测效果基本介绍模型架构程序设计参考资料 预测效果 基本介绍 CNN-SVM多输入单输出回归预测是一种结合卷积神经网络&#xff08;CNN&#xff09;和支持向量机&#…

Linux-Ubuntu之裸机驱动最后一弹PWM控制显示亮度

Linux-Ubuntu之裸机驱动最后一弹PWM控制显示亮度 一&#xff0c; PWM实现原理二&#xff0c;软件实现三&#xff0c;正点原子裸机开发总结 一&#xff0c; PWM实现原理 PWM和学习51时候基本上一致&#xff0c;控制频率&#xff08;周期&#xff09;和占空比&#xff0c;51实验…

自定义校验注解

已有的注解不能满足所有的校验需求,特殊的情况需要自定义校验(自定义校验注解) 1.自定义注解,并在注解上指定校验逻辑 Constraint(validatedBy StateValidation.class) // 指定校验逻辑 package com.example.demo.validation;import jakarta.validation.Constraint; import j…

分数阶傅里叶变换代码 MATLAB实现

function Faf myfrft(f, a) %分数阶傅里叶变换函数 %输入参数&#xff1a; %f&#xff1a;原始信号 %a&#xff1a;阶数 %输出结果&#xff1a; %原始信号的a阶傅里叶变换N length(f);%总采样点数 shft rem((0:N-1)fix(N/2),N)1;%此项等同于fftshift(1:N)&#xff0c;起到翻…

Ubuntu 20.04安装gcc

一、安装GCC 1.更新包列表 user596785154:~$ sudo apt update2.安装gcc user596785154:~$ sudo apt install gcc3.验证安装 user596785154:~$ gcc --version二 编译C文件 1.新建workspace文件夹 user596785154:~$ mkdir workspace2.进入workspace文件夹 user596785154:~…

小兔鲜儿:头部区域的logo,导航,搜索,购物车

头部&#xff1a;logo ,导航&#xff0c;搜索&#xff0c;购物车 头部总体布局: 设置好上下外边距以及总体高度&#xff0c; flex布局让总体一行排列 logo&#xff1a; logo考虑搜索引擎优化&#xff0c;所以要使用 h1中包裹 a 标签&#xff0c;a 里边写内容&#xff08;到时候…

Linux C编程——文件IO基础

文件IO基础 一、简单的文件 IO 示例二、文件描述符三、open 打开文件1. 函数原型2. 文件权限3. 宏定义文件权限4. 函数使用实例 四、write 写文件五、read 读文件六、close 关闭文件七、Iseek 绍 Linux 应用编程中最基础的知识&#xff0c;即文件 I/O&#xff08;Input、Outout…

论文解读 | NeurIPS'24 IRCAN:通过识别和重新加权上下文感知神经元来减轻大语言模型生成中的知识冲突...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 作者简介 史丹&#xff0c;天津大学博士生 内容简介 大语言模型&#xff08;LLM&#xff09;经过海量数据训练后编码了丰富的世界知识。最近的研究表明&#xff0c…

【51单片机零基础-chapter5:模块化编程】

模块化编程 将以往main中泛型的代码,放在与main平级的c文件中,在h中引用. 简化main函数 将原来main中的delay抽出 然后将delay放入单独c文件,并单独开一个delay头文件,里面放置函数的声明,相当于收纳delay的c文件里面写的函数的接口. 注意,单个c文件所有用到的变量需要在该文…

扩散模型论文概述(三):Stability AI系列工作【学习笔记】

视频链接&#xff1a;扩散模型论文概述&#xff08;三&#xff09;&#xff1a;Stability AI系列工作_哔哩哔哩_bilibili 本期视频讲的是Stability AI在图像生成的工作。 同样&#xff0c;第一张图片是神作&#xff0c;总结的太好了&#xff01; 介绍Stable Diffusion之前&…

数据库软考历年上午真题与答案解析(2018-2024)

本题考查计算机总线相关知识。 总线&#xff08;Bus&#xff09;是计算机各种功能部件之间传送信息的公共通信干线&#xff0c;它是由导线组成的传输线束。 根据总线连接设备范围的不同&#xff0c; 分为&#xff1a;1.片内总线&#xff1a;芯片内部的总线&#xff1b; 2.系统…

【three.js】模型-几何体Geometry,材质Material

模型 在现实开发中&#xff0c;有时除了需要用代码创建模型之外&#xff0c;多数场景需要加载设计师提供的使用设计软件导出的模型。此时就需要使用模型加载器去加载模型&#xff0c;不同格式的模型需要引入对应的模型加载器&#xff0c;虽然加载器不同&#xff0c;但是使用方式…

彻底学会Gradle插件版本和Gradle版本及对应关系

看完这篇&#xff0c;保你彻底学会Gradle插件版本和Gradle版本及对应关系&#xff0c;超详细超全的对应关系表 需要知道Gradle插件版本和Gradle版本的对应关系&#xff0c;其实就是需要知道Gradle插件版本对应所需的gradle最低版本&#xff0c;详细对应关系如下表格&#xff0…

预测facebook签到位置

1.11 案例2&#xff1a;预测facebook签到位置 学习目标 目标 通过Facebook位置预测案例熟练掌握第一章学习内容 1 项目描述 本次比赛的目的是预测一个人将要签到的地方。 为了本次比赛&#xff0c;Facebook创建了一个虚拟世界&#xff0c;其中包括10公里*10公里共100平方公里的…

【万字详细教程】Linux to go——装在移动硬盘里的Linux系统(Ubuntu22.04)制作流程;一口气解决系统安装引导文件迁移显卡驱动安装等问题

Linux to go制作流程 0.写在前面 关于教程Why Linux to go&#xff1f;实际效果 1.准备工具2.制作步骤 下载系统镜像硬盘分区准备启动U盘安装系统重启完成驱动安装将系统启动引导程序迁移到移动硬盘上 3.可能出现的问题 3.1.U盘引导系统安装时出现崩溃3.2.不影响硬盘里本身已有…