Python和tkinter单词游戏

news2024/12/23 5:08:34

Python和tkinter单词游戏

数据字典文本文件,文件名为Dictionary.txt,保存编码格式为:utf-8。文本内容:每行一个 单词 ,单词和解释用空格分隔,如

a art.一(个);每一(个)

ability n.能力;能耐,本领

able a.有能力的;出色的

baby n.婴儿;孩子气的人

back ad.在后;回原处;回

background n.背景,后景,经历

cable n.缆,索;电缆;电报

cafe n.咖啡馆;小餐厅

good a.好的;有本事的

游戏规则:

每次随机从文本中选取一个英语单词,在界面上从左到右移动,随机选出三个单词的解释,和英语单词正确解释,随机放到四个按钮中,这四个按钮放到界面下方。

用户单击带有解释的按钮,界面上英语单词消失,再随机从文本中选取一个新英语单词,进入下一个猜单词过程;若英语单词移动出界面,用户未能单击有正确解释的按钮,表示失败,也将随机从文本中选取一个新英语单词,进入下一个猜单词过程。

有失败和成功计数。

使用Python和tkinter来实现这个单词游戏, 运行界面:

使用面向过程方式实现,游戏源码如下:

import tkinter as tk
import random

# 全局变量
root = None
word_label = None
option_buttons = []
score_label = None
dictionary = {}
current_word = ""
current_definition = ""
options = []
success_count = 0
fail_count = 0
word_x = -100

def load_dictionary(filename):
    global dictionary
    with open(filename, 'r', encoding='utf-8') as file:
        for line in file:
            parts = line.strip().split(' ', 1)
            if len(parts) == 2:
                dictionary[parts[0]] = parts[1]

def choose_new_word():
    global current_word, current_definition, options, word_x
    current_word = random.choice(list(dictionary.keys()))
    current_definition = dictionary[current_word]
    options = [current_definition]
    while len(options) < 4:
        random_def = random.choice(list(dictionary.values()))
        if random_def not in options:
            options.append(random_def)
    random.shuffle(options)

    word_label.config(text=current_word)
    for i, button in enumerate(option_buttons):
        button.config(text=options[i])
    
    word_x = -100  # 重置单词位置

def move_word():
    global word_x, fail_count
    if word_x > 400:
        fail_count += 1
        update_score()
        choose_new_word()
    else:
        word_x += 5
        word_label.place(x=word_x, y=50)
    root.after(50, move_word)

def check_answer(index):
    global success_count, fail_count
    if options[index] == current_definition:
        success_count += 1
    else:
        fail_count += 1
    update_score()
    choose_new_word()

def update_score():
    score_label.config(text=f"成功: {success_count} 失败: {fail_count}")

def setup_gui():
    global root, word_label, option_buttons, score_label
    root = tk.Tk()
    root.title("单词游戏")
    root.geometry("400x300")

    score_label = tk.Label(root, text="成功: 0 失败: 0", font=("Arial", 12))
    score_label.pack(anchor='ne', padx=10, pady=10)

    word_label = tk.Label(root, text="", font=("Arial", 24))
    word_label.place(x=-100, y=50)

    button_frame = tk.Frame(root)
    button_frame.pack(side='bottom', pady=20)

    for i in range(4):
        button = tk.Button(button_frame, text="", font=("Arial", 10), width=20, height=1, command=lambda i=i: check_answer(i))
        button.grid(row=i//2, column=i%2, padx=5, pady=5)
        option_buttons.append(button)

def main():
    load_dictionary("Dictionary.txt")
    setup_gui()
    choose_new_word()
    move_word()
    root.mainloop()

if __name__ == "__main__":
    main()

使用这个程序之前,请确保你有一个名为"Dictionary.txt"的文件,格式如你所描述的那样。将这个文件放在与Python脚本相同的目录下。

使用面向对象方式实现,游戏源码如下:

import tkinter as tk
import random

class WordGame:
    def __init__(self, dictionary_file):
        # 初始化游戏窗口
        self.root = tk.Tk()
        self.root.title("单词游戏")
        self.root.geometry("400x300")

        # 加载词典
        self.dictionary = self.load_dictionary(dictionary_file)
        self.current_word = ""
        self.current_definition = ""
        self.options = []
        self.success_count = 0
        self.fail_count = 0
        self.word_x = -100
        
        # 设置游戏界面
        self.setup_gui()

        # 选择新单词并开始移动单词
        self.choose_new_word()
        self.move_word()
    
    def load_dictionary(self, filename):
        # 从文件加载词典并返回一个字典对象
        dictionary = {}
        with open(filename, 'r', encoding='utf-8') as file:
            for line in file:
                parts = line.strip().split(' ', 1)
                if len(parts) == 2:
                    dictionary[parts[0]] = parts[1]
        return dictionary
    
    def choose_new_word(self):
        # 选择一个新的单词和定义,并更新选项按钮的文本
        self.current_word = random.choice(list(self.dictionary.keys()))
        self.current_definition = self.dictionary[self.current_word]
        self.options = [self.current_definition]
        while len(self.options) < 4:
            random_def = random.choice(list(self.dictionary.values()))
            if random_def not in self.options:
                self.options.append(random_def)
        random.shuffle(self.options)
        
        self.word_label.config(text=self.current_word)
        for i, button in enumerate(self.option_buttons):
            button.config(text=self.options[i])
        
        self.word_x = -100  # 重置单词位置到初始值
    
    def move_word(self):
        # 控制单词的移动,如果超出窗口范围则增加失败计数并选择新单词,否则更新单词位置
        if self.word_x > 400:
            self.fail_count += 1
            self.update_score()
            self.choose_new_word()
        else:
            self.word_x += 5
            self.word_label.place(x=self.word_x, y=50)
        self.root.after(50, self.move_word)
    
    def check_answer(self, index):
        # 检查用户选择的答案是否正确,并更新成功或失败计数
        if self.options[index] == self.current_definition:
            self.success_count += 1
        else:
            self.fail_count += 1
        self.update_score()
        self.choose_new_word()
    
    def update_score(self):
        # 更新显示的成功和失败计数
        self.score_label.config(text=f"成功: {self.success_count} 失败: {self.fail_count}")
    
    def setup_gui(self):
        # 设置游戏界面的标签和按钮
        self.score_label = tk.Label(self.root, text="成功: 0 失败: 0", font=("Arial", 12))
        self.score_label.pack(anchor='ne', padx=10, pady=10)

        self.word_label = tk.Label(self.root, text="", font=("Arial", 24))
        self.word_label.place(x=-100, y=50)

        button_frame = tk.Frame(self.root)
        button_frame.pack(side='bottom', pady=20)

        self.option_buttons = []
        for i in range(4):
            # 创建答案选项按钮,并绑定对应的回调函数
            button = tk.Button(button_frame, text="", font=("Arial", 10), width=20, height=1, command=lambda i=i: self.check_answer(i))
            button.grid(row=i//2, column=i%2, padx=5, pady=5)
            self.option_buttons.append(button)
    
    def run(self):
        # 启动游戏的主循环
        self.root.mainloop()

if __name__ == "__main__":
    # 创建WordGame对象并运行游戏
    game = WordGame("Dictionary.txt")
    game.run()

在这个面向对象的实现方式,创建一个WordGame类,该类封装了游戏UI(User Interface,用户界面)元素和主要逻辑功能,包括加载词典、选择新单词、移动单词、检查答案和更新分数。

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

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

相关文章

EKF+UKF+CKF+PF的效果对比|三维非线性滤波|MATLAB例程

前言 标题里的EKF、UKF、CKF、PF分别为&#xff1a;扩展卡尔曼滤波、无迹卡尔曼滤波、容积卡尔曼滤波、粒子滤波。 EKF是扩展卡尔曼滤波&#xff0c;计算快&#xff0c;最常用于非线性状态方程或观测方程下的卡尔曼滤波。 但是EKF应对强非线性的系统时&#xff0c;估计效果不如…

MySQL5.7安装初始化错误解决方案

问题背景 今天在给公司配数据库环境时,第一次报initializing database 数据库初始化错误? 起初没管以为是安装软件原因,然后就出现以下错误:如下图 点开log,我们观察日志会发现 无法识别的参数 ‘mysqlx_port=0.0’,???,官方的安装程序还能出这问题?

排序(堆排序、快速排序、归并排序)-->深度剖析(二)

前言 前面介绍了冒泡排序、选择排序、插入排序、希尔排序&#xff0c;作为排序中经常用到了算法&#xff0c;还有堆排序、快速排序、归并排序 堆排序&#xff08;HeaSort&#xff09; 堆排序的概念 堆排序是一种有效的排序算法&#xff0c;它利用了完全二叉树的特性。在C语言…

【Linux】:环境变量

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux环境变量的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门…

万字总结随机森林原理、核心参数以及调优思路

万字总结随机森林原理、核心参数以及调优思路 在机器学习的世界里&#xff0c;随机森林&#xff08;Random Forest, RF&#xff09;以其强大的预测能力和对数据集的鲁棒性而备受青睐。作为一种集成学习方法&#xff0c;随机森林通过构建多个决策树并将它们的预测结果进行汇总&…

SpringCloud_Eureka注册中心

概述 Eureka是SpringCloud的注册中心。 是一款基于REST的服务治理框架&#xff0c;用于实现微服务架构中的服务发现和负载均衡。 在Eureka体系中&#xff0c;有两种角色: 服务提供者和服务消费者。 服务提供者将自己注册到Eureka服务器&#xff0c;服务消费者从Eureka服务器中…

禹神electron学习~

最近时间比较富裕 咱们浅浅来学习下electron 视频在这禹神&#xff1a;一小时快速上手Electron&#xff0c;前端Electron开发教程_哔哩哔哩_bilibili 先看下流程模型 先决条件 首先第一步 查看你的node和npm版本 创建你的应用 创建一个文件夹 我创建的名称为my-electron-…

在Zotero中使用Deepl翻译

文章目录 Zotero简介Zotero下载插件下载在Zotero中安装插件获取Deepl密钥在Zotero中使用deepl 参考链接 Zotero简介 Zotero是一款非常实用的文献管理软件&#xff0c;可以快速帮助我们下载、分类和标注文献。由于专业需要&#xff0c;很多使用者需要阅读外文文献&#xff0c;Z…

无锁编程——从CPU缓存一致性讲到内存模型(1)

一.前言 1.什么是有锁编程&#xff0c;什么是无锁编程&#xff1f; 在编程中&#xff0c;特别是在并发编程的上下文中&#xff0c;“无锁”和“有锁”是描述线程同步和资源访问控制的两种不同策略。有锁&#xff08;Locked&#xff09;: 有锁编程是指使用锁&#xff08;例如互…

Redis-分布式锁(基本原理和不同实现方式对比)

文章目录 1、基本原理2、不同实现方式 1、基本原理 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁&#xff0c;只要大家使用的是同一把锁&#xff0c;那么我们就能锁住线程&#xff0c;不让线程进行&am…

Mysql 的账户管理,索引,存储引擎

目录 一.MySQL的账户管理 1.存放用户信息的表 2.查看当前使用的用户 3.新建用户 4.修改用户名称 5.删除用户 6.修改用户密码 7.破解密码 8. 远程登录 9.用户权限管理 9.1 权限类别 9.2 查看权限 9.3 授予权限 9.4 撤销权限 二.索引 1. 索引管理 1.1 查看索…

Generating Diverse Structure for Image Inpainting With Hierarchical VQ-VAE

Jialun Peng1 Dong Liu1* Songcen Xu2 Houqiang Li1 1 University of Science and Technology of China 2 Noahs Ark Lab, Huawei Technologies Co., Ltd.pjlmail.ustc.edu.cn, {dongeliu, lihq}ustc.edu.cn, xusongcenhuawei.com 原文提供代码链接&#xff1a; GitHub - UST…

MySQL:数据类型

数据类型 1. 字符串类型2. 整数类型3. 定点数类型和浮点数类型4. 布尔类型5. 枚举和集合类型6. 日期和时间类型7. Blob类型8. JSON类型 字符串类型、数字类型、日期和时间类型、存放二进制的数据类型、存放地理数据的类型。 1. 字符串类型 字符串类型也可以用来存储邮编&…

【论文阅读】-- 研究时间序列可视化,提升用户体验

Investigating Time Series Visualisations to Improve the User Experience 摘要1 引言2 相关工作互动技巧视觉编码坐标系 3 用户研究时间序列可视化互动技巧任务实验设计 4 结果交互技术的效果视觉编码的影响坐标系的影响 5 讨论交互技术的效果视觉编码的影响坐标系的影响 6 …

(必看图文)Hadoop集群安装及MapReduce应用(手把手详解版)

前言 随着大数据时代的到来&#xff0c;处理和分析海量数据已成为企业和科研机构不可或缺的能力。Hadoop&#xff0c;作为开源的分布式计算平台&#xff0c;因其强大的数据处理能力和良好的可扩展性&#xff0c;成为大数据处理领域的佼佼者。本图文教程旨在帮助读者理解Hadoop集…

《昇思25天学习打卡营第5天|数据变换 Transforms》

文章目录 前言&#xff1a;今日所学&#xff1a;1. Common Transforms2. Vision Transforms3. Text Transforms 前言&#xff1a; 我们知道在进行神经网络训练的时候&#xff0c;通常要将原始数据进行一系列的数据预处理操作才会进行训练&#xff0c;所以MindSpore提供了不同类…

C语言部分复习笔记

1. 指针和数组 数组指针 和 指针数组 int* p1[10]; // 指针数组int (*p2)[10]; // 数组指针 因为 [] 的优先级比 * 高&#xff0c;p先和 [] 结合说明p是一个数组&#xff0c;p先和*结合说明p是一个指针 括号保证p先和*结合&#xff0c;说明p是一个指针变量&#xff0c;然后指…

蒂升电梯职业性格和Verify认知能力SHL测评答题攻略及薪资待遇解密!

​一、蒂升电梯职业性格和认知能力测评考什么 您好&#xff01;蒂升电梯公司邀请您参加的OPQ职业性格测评和Verify认知能力测评是两种常见的评估工具&#xff0c;用于帮助了解个人的职场性格特点和认知能力。 OPQ职业性格测评 这是一种性格测试&#xff0c;通常用于评估个人在…

一文讲解Docker入门到精通

一、引入 1、什么是虚拟化 在计算机中&#xff0c;虚拟化&#xff08;英语&#xff1a;Virtualization&#xff09;是一种资源管理技术&#xff0c;它允许在一台物理机上创建多个独立的虚拟环境&#xff0c;这些环境被称为虚拟机&#xff08;VM&#xff09;。每个虚拟机都可以…

盘古5.0,靠什么去解最难的题?

文&#xff5c;周效敬 编&#xff5c;王一粟 当大模型的竞争开始拼落地&#xff0c;商业化在B端和C端都展开了自由生长。 在B端&#xff0c;借助云计算向千行万业扎根&#xff1b;在C端&#xff0c;通过软件App和智能终端快速迭代。 在华为&#xff0c;这家曾经以通信行业起…