跳至主要內容

Python 实现古诗词猜词游戏

AI悦创原创Python一对一辅导NOIP一对一辅导NOI一对一辅导Python一对一辅导NOIP一对一辅导NOI一对一辅导大约 12 分钟...约 3528 字

1. 项目需求

2. 技术查询表

2.1 编程语言 & 库

序号名称功能
01Python项目所使用的编程语言
02tkinterPython 小型实现 GUI 的库(官方自带的 Python 库)|GUI:你现在看见的应用程序界面,这些都是 GUI
03randomPython 中实现随机数的库
04timePython 自带的时间库

2.2 语法知识

  1. 面向对象编程
  2. 函数
  3. 列表

2.3 单词

序号单词中文序号单词中文序号单词中文
01self自己、自身02text文本03time时间
04shuffled洗牌、打乱05random随机06start开始、启动
07Label标签08font文字、字体09count数量
10None没有11custom自定义12correct正确

3. 游戏设计原则

下面是这个游戏的设计思路概述:

3.1 游戏目标:

玩家的目标是将乱序的字符按照原始古诗的顺序点击,从而恢复古诗的原文。

3.2 初始化与数据准备:

  1. 古诗文本处理:首先,我们将古诗的每个字单独分割出来,使其成为一个字符列表。这使得我们可以对其进行随机乱序,并在稍后为每个字符创建按钮。

  2. 随机乱序:我们复制了原始字符列表,并使用 random.shuffle 函数对其进行随机乱序。这将为玩家提供一个挑战,让他们按照原始顺序恢复古诗。

  3. 跟踪与状态:为了跟踪玩家的进度和时间,我们设置了几个变量:correct_count 跟踪已经正确点击的字符数量,start_time 跟踪游戏开始的时间。

3.3 用户界面构建:

  1. 显示原始古诗:我们在窗口的顶部使用标签显示原始古诗,这样玩家可以参考。

  2. 创建按钮:对于乱序列表中的每个字符,我们都创建了一个按钮。每个按钮都有一个点击事件,当被点击时,会调用 check_word 函数来判断是否按照正确的顺序点击。

3.4 游戏逻辑:

  1. 开始计时:当玩家点击第一个按钮时,游戏开始计时。

  2. 字符校验:每当玩家点击一个按钮时,check_word 函数都会被调用。它首先检查点击的字符是否与原始文本中当前位置的字符匹配。

  3. 进度跟踪:如果字符匹配,我们更新 correct_count 变量并禁用已点击的按钮。如果玩家点击了所有的按钮并且都是正确的顺序,那么游戏结束。

  4. 错误处理:如果玩家点击的字符与期望的字符不匹配,将会显示一个错误消息框。

3.5 结束与反馈:

  1. 计时器更新:在游戏进行中,窗口的标题会显示已经过去的时间。

  2. 结束反馈:当玩家成功点击所有的字符并按照正确的顺序恢复了古诗,一个消息框会显示,告诉玩家他们完成了游戏,并告诉他们总共用了多少时间。

这就是这款古诗恢复游戏的设计思路。它是一个简单但有趣的方式,可以让玩家练习和认识古诗。

4. Code

0.5 版本
import tkinter as tk
from tkinter import messagebox
import random
import time

class Game(tk.Tk):
    def __init__(self, text):
        super().__init__()

        # 将输入的文本转换为单个字符的列表
        self.text = list(text)
        # 创建一个乱序的字符列表
        self.shuffled = self.text.copy()
        random.shuffle(self.shuffled)
        # 用来跟踪已经匹配正确的字符数
        self.correct_count = 0
        # 跟踪游戏开始的时间
        self.start_time = None

        # 在窗口顶部显示原始文本
        tk.Label(self, text="原文:").pack()
        tk.Label(self, text=text, wraplength=400).pack(pady=10)

        # 在原文下方显示乱序的字符,用户需要按照原文的顺序点击它们
        tk.Label(self, text="点击以下文字,按照正确顺序恢复文本:").pack(pady=20)
        # 为乱序列表中的每个字符创建一个按钮
        # 当按钮被点击时,会调用 self.check_word 函数
        self.buttons = [tk.Button(self, text=char, command=lambda c=char: self.check_word(c)) for char in self.shuffled]
        for button in self.buttons:
            button.pack(side=tk.LEFT, padx=2, pady=10)

    def check_word(self, char):
        # 当第一个按钮被点击时,记录开始时间,并开始更新计时器
        if self.start_time is None:
            self.start_time = time.time()
            self.update_timer()
            
        # 检查点击的字符是否与原文中的当前位置的字符匹配
        if char == self.text[self.correct_count]:
            # 如果匹配,增加正确计数
            self.correct_count += 1
            # 如果所有字符都匹配成功,结束游戏
            if self.correct_count == len(self.text):
                self.end_game()
            # 禁用已经点击的按钮
            for button in self.buttons:
                if button['text'] == char:
                    button.config(state=tk.DISABLED)
                    break
        else:
            # 如果字符不匹配,显示错误消息
            messagebox.showerror("错误", "字符选择不正确!")

    def update_timer(self):
        # 更新窗口标题,显示已经过去的时间
        if self.start_time:
            elapsed_time = int(time.time() - self.start_time)
            self.title(f"已经过去 {elapsed_time} 秒")
            self.after(1000, self.update_timer)  # 每秒更新一次

    def end_game(self):
        # 当游戏结束时,计算总时间并显示完成消息
        elapsed_time = int(time.time() - self.start_time)
        messagebox.showinfo("完成", f"恭喜你完成了游戏! 耗时 {elapsed_time} 秒")

if __name__ == "__main__":
    sample_text = "但愿人长久,千里共婵娟"
    # 创建游戏窗口并启动游戏
    app = Game(sample_text)
    app.title("古诗恢复游戏")
    app.mainloop()

5. 知识点梳理

5.1 导入 tkinter 库

import tkinter as tk  # 导入我们的 tkinter 并缩写设置为 tk,在后续的代码中,tk 代表 tkinter 

5.2 messagebox, ttk

这两个导入都是从 tkinter 模块中获取的,它们都是用于 GUI 编程的工具。具体来说:

  1. messagebox: 这是一个用于显示消息框的模块。在我们的代码中,它用于显示错误消息和完成消息。例如:

    messagebox.showerror("错误", "请选择一个难度级别!")
    

    上述代码将弹出一个错误消息框,标题为“错误”,内容为“请选择一个难度级别!”。

  2. ttk: ttktkinter 模块的一个子模块,它提供了一套改进的、更现代化的小部件(控件)。在代码中,我们使用了 ttk 中的 LabelFrameRadiobutton 。这些部件与 tkinter 中的原始部件有相同的功能,但具有不同的外观和某些额外的特性。

    使用 ttk 中的部件而不是基础的 tkinter 部件,可以使应用程序的界面看起来更加现代化和平滑。例如:

    self.level_frame = ttk.LabelFrame(self, text="选择级别")
    

这些导入使得我们可以在游戏中创建和管理窗口小部件,以及显示消息给玩家。

使用 ttk 是为了使用更好的子模块

5.3 random

在上述代码中,random 模块用于执行随机化操作,为了增加游戏的趣味性和复杂性。

具体来说,random 模块在以下几个地方被使用:

  1. 选择题目

    self.text = random.choice(self.LEVELS[level_selected])
    

    使用 random.choice 从指定难度级别的古诗列表中随机选择一首古诗作为游戏题目。

  2. 乱序字符

    self.shuffled = self.text.copy()
    random.shuffle(self.shuffled)
    

    random.shuffle 用于将指定的古诗的字符列表打乱顺序,从而生成一个乱序的字符列表。玩家的任务是根据这个乱序的列表点击字符以恢复原始古诗的顺序。

这些随机化操作为游戏增添了变化和挑战性,使得每次游戏的体验都可能有所不同。

公众号:AI悦创【二维码】

AI悦创·编程一对一

AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh

C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh

方法一:QQopen in new window

方法二:微信:Jiabcdefh

上次编辑于:
贡献者: AndersonHJB
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度