【猜数字游戏】用wxPython实现:基本的游戏框架 + 简单的图形用户界面

简介: 【猜数字游戏】用wxPython实现:基本的游戏框架 + 简单的图形用户界面


写在最前面


猜数字游戏

在这个猜数字游戏中,计算机生成一个由4位不重复的数字组成的随机数。玩家的任务是猜测这个数字。每次猜测后,程序会提供反馈,显示匹配的数字数量和位置正确的数字数量。玩家有十次猜测机会,每次错误猜测会扣分,直到正确猜中或用尽所有机会。

具体要求

1、用户从键盘输入4位不重复的数,来匹配计算机给出的4位随机数,若数字和位置均等同,表示用户赢了

2、每猜一次,计算机均给出提示信息( x , y ), x 表示数字、位置都匹配的个数, y 表示数字匹配但位置不匹配的个数。

3、若输入的是8888,先储存用户之前所猜数字,然后用用户之前所猜数字与计算机所给数字相对照,并提示用户之前所猜数字的第几位数字与计算机所给数字的第几位数字相匹配。

4、若输入的是7777,可以查看计算机所给的4位数,但需要输入密码,密码自定。

5、猜的结果以分数给出,每猜错一次扣40分,若猜对1个数,奖励20分,并且每猜一次,输出所得分。

6、用户只有十次机会猜数,若十次均未正确,算失败。

实现【猜数字游戏 v2.0版本】

关键修改点:

  1. 比较历史猜测:当用户输入8888时,compare_history方法被调用。这个方法遍历用户的猜测历史,对每个猜测进行检查,并指出哪些数字及其位置与计算机的数字相匹配。
  2. 分数计算:每次猜测后,根据猜对的数字数量更新分数。如果没有猜对任何数字,扣除40分;每猜对一个数字,奖励20分。
  3. 剩余尝试次数:用户有十次机会猜数。每次猜测后,尝试次数

全部代码

import wx
import random
class GuessNumberGame(wx.Frame):
    def __init__(self, parent, title):
        super(GuessNumberGame, self).__init__(parent, title=title, size=(400, 300))
        self.initUI()
        self.Centre()
        self.Show()
        self.computer_number = self.generate_number()
        self.attempts = 10
        self.score = 400
        self.guess_history = []
    def initUI(self):
        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)
        self.text_ctrl = wx.TextCtrl(panel)
        vbox.Add(self.text_ctrl, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP, border=10)
        self.guess_button = wx.Button(panel, label='Guess')
        self.guess_button.Bind(wx.EVT_BUTTON, self.on_guess)
        vbox.Add(self.guess_button, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP, border=10)
        self.result_text = wx.StaticText(panel, label="")
        vbox.Add(self.result_text, flag=wx.EXPAND|wx.ALL, border=10)
        panel.SetSizer(vbox)
    def generate_number(self):
        digits = list(range(10))
        random.shuffle(digits)
        return ''.join(map(str, digits[:4]))
    def on_guess(self, event):
        guess = self.text_ctrl.GetValue()
        if guess == '7777':
            self.ask_password()
            return
        if guess == '8888':
            self.compare_history()
            return
        self.guess_history.append(guess)
        x, y = self.check_guess(guess)
        if x == 4:
            self.result_text.SetLabel(f"You won! The number was {self.computer_number}")
            self.disable_input()
        else:
            self.score -= 40
            self.attempts -= 1
            self.result_text.SetLabel(f"Matched: {x}, Misplaced: {y}. Attempts left: {self.attempts}. Score: {self.score}")
            if self.attempts == 0:
                self.result_text.SetLabel(f"You lost! The number was {self.computer_number}")
                self.disable_input()
    def check_guess(self, guess):
        x = y = 0
        for i, num in enumerate(guess):
            if num in self.computer_number:
                if self.computer_number[i] == num:
                    x += 1
                else:
                    y += 1
        return x, y
    def ask_password(self):
        password = wx.GetTextFromUser('Enter password to see the number', 'Password')
        if password == 'your_password':  # Replace 'your_password' with your actual password
            wx.MessageBox(f"The number is {self.computer_number}", "Number")
        else:
            wx.MessageBox("Incorrect password", "Error")
    def compare_history(self):
        message = "Your Guess History:\n\n"
        for guess in self.guess_history:
            message += f"Guess {guess}: "
            matched_positions = []
            for i in range(4):
                if guess[i] == self.computer_number[i]:
                    matched_positions.append(str(i + 1))
                    message += f"Digit {guess[i]} at position {i+1} matches. "
            message += "\n"
            if matched_positions:
                message += "Matched positions: " + ", ".join(matched_positions) + "\n"
            else:
                message += "No matches\n"
        wx.MessageBox(message, "Guess History")
    def disable_input(self):
        self.guess_button.Disable()
        self.text_ctrl.Disable()
if __name__ == '__main__':
    app = wx.App()
    GuessNumberGame(None, title='Guess the Number Game')
    app.MainLoop()

实现【猜数字游戏 v1.0版本】

安装wxPython

关于wxPython:wxPython是一个强大的跨平台GUI(图形用户界面)工具包。这个库允许Python开发者轻松地创建丰富的本地应用程序。wxPython是wxWidgets C++类库的Python封装,它使Python程序员能够轻松地创建具有本地应用程序外观和行为的程序。

首先需要安装wxPython,可以通过pip install wxPython来安装它。

全部代码

实现这个猜数字游戏涉及几个关键点:生成随机数字、处理用户输入、检查匹配情况、处理特殊输入(8888和7777)、计算并显示分数,以及使用wxPython创建GUI。

下面是Python代码示例,展示了如何用wxPython来实现这个游戏的核心逻辑部分:

import wx
import random
class GuessNumberGame(wx.Frame):
    def __init__(self, parent, title):
        super(GuessNumberGame, self).__init__(parent, title=title, size=(400, 300))
        self.initUI()
        self.Centre()
        self.Show()
        self.computer_number = self.generate_number()
        self.attempts = 10
        self.score = 400
        self.guess_history = []
    def initUI(self):
        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)
        self.text_ctrl = wx.TextCtrl(panel)
        vbox.Add(self.text_ctrl, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP, border=10)
        self.guess_button = wx.Button(panel, label='Guess')
        self.guess_button.Bind(wx.EVT_BUTTON, self.on_guess)
        vbox.Add(self.guess_button, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP, border=10)
        self.result_text = wx.StaticText(panel, label="")
        vbox.Add(self.result_text, flag=wx.EXPAND|wx.ALL, border=10)
        panel.SetSizer(vbox)
    def generate_number(self):
        digits = list(range(10))
        random.shuffle(digits)
        return ''.join(map(str, digits[:4]))
    def on_guess(self, event):
        guess = self.text_ctrl.GetValue()
        if guess == '7777':
            self.ask_password()
            return
        if guess == '8888':
            self.show_history()
            return
        self.guess_history.append(guess)
        x, y = self.check_guess(guess)
        if x == 4:
            self.result_text.SetLabel(f"You won! The number was {self.computer_number}")
            self.disable_input()
        else:
            self.score -= 40
            self.attempts -= 1
            self.result_text.SetLabel(f"Matched: {x}, Misplaced: {y}. Attempts left: {self.attempts}. Score: {self.score}")
            if self.attempts == 0:
                self.result_text.SetLabel(f"You lost! The number was {self.computer_number}")
                self.disable_input()
    def check_guess(self, guess):
        x = y = 0
        for i, num in enumerate(guess):
            if num in self.computer_number:
                if self.computer_number[i] == num:
                    x += 1
                else:
                    y += 1
        return x, y
    def ask_password(self):
        password = wx.GetTextFromUser('Enter password to see the number', 'Password')
        if password == 'your_password':  # Replace 'your_password' with your actual password
            wx.MessageBox(f"The number is {self.computer_number}", "Number")
        else:
            wx.MessageBox("Incorrect password", "Error")
    def show_history(self):
        message = "\n".join(f"Guess {i+1}: {g}" for i, g in enumerate(self.guess_history))
        wx.MessageBox(message, "Guess History")
    def disable_input(self):
        self.guess_button.Disable()
        self.text_ctrl.Disable()
if __name__ == '__main__':
    app = wx.App()
    GuessNumberGame(None, title='Guess the Number Game')
    app.MainLoop()

代码解析

游戏代码主要分为几个部分:初始化界面、生成随机数、处理猜测、特殊功能以及分数计算。下面逐一解析:

1. 初始化界面

使用wxPython创建GUI非常直观。我们定义了一个GuessNumberGame类,继承自wx.Frame。在__init__方法中,我们调用了initUI函数来设置界面布局,并初始化了一些基本的游戏变量。

class GuessNumberGame(wx.Frame):
    def __init__(self, parent, title):
        # 窗体初始化
        # ...
    def initUI(self):
        # 创建并布局界面元素
        # ...

2. 生成随机数

在游戏开始时,需要生成一个4位的随机数。这是通过generate_number函数实现的,它使用Python标准库中的random模块来生成一个不重复的数字列表。

def generate_number(self):
    digits = list(range(10))
    random.shuffle(digits)
    return ''.join(map(str, digits[:4]))

3. 处理猜测

玩家每次提交猜测时,都会调用on_guess方法。这个方法会检查特殊的输入(如8888和7777),并调用check_guess函数来确定猜测的准确性。

def on_guess(self, event):
    # 处理猜测逻辑
    # ...

4. 特殊功能

如果玩家输入8888,程序会显示之前所有的猜测。输入7777时,玩家需要输入密码来查看答案。

def ask_password(self):
    # 请求密码查看答案
    # ...
def show_history(self):
    # 显示猜测历史
    # ...

5. 分数计算

每次猜测后,程序都会更新玩家的分数。如果猜错,扣除40分;猜对一个数字,奖励20分。

游戏小程序呈现

这个程序使用wxPython创建了一个简单的图形界面,玩家可以在其中输入猜测的数字并接收反馈。程序逻辑包括生成一个随机的4位数字、检查玩家的猜测、处理特殊的输入(8888和7777),以及更新玩家的分数和剩余尝试次数。

若输入的是7777,可以查看计算机所给的4位数,但需要输入密码,密码自定。

注意:程序中的your_password应替换为你想要的密码,用于查看计算机生成的数字。

结语

通过使用wxPython,我们可以更轻松地为Python程序创建引人入胜的图形用户界面。

这个猜数字游戏只是wxPython众多用途中的一个小例子,但它展示了如何用Python处理逻辑和界面设计,是初学者进入编程世界的完美实例。

此外,这个示例提供了基本的游戏框架,你可以根据需要进一步美化界面或添加更多功能。

希望这个小项目能激发你的兴趣,启发你开发更多有趣的Python应用 ~

编程不仅仅是解决问题的工具,它还是探索创意的平台。

如果有问题,欢迎进一步交流 ~

目录
相关文章
|
5月前
|
人工智能 监控 数据可视化
2025年PMO必备的项目管理工具类软件功能介绍与推荐
在数字化转型背景下,PMO软件已从基础任务管理工具演变为助力企业实现战略目标的核心平台。本文精选15款2025年必备的PMO项目管理工具,涵盖Microsoft Project、Monday.com、板栗看板、Asana等,全面解析其核心功能与适用场景。内容还涵盖PMO工具发展趋势、选型关键因素及未来发展方向,助您在复杂项目环境中做出高效决策,提升组织执行力与战略落地能力。
274 1
|
监控
阿里商旅账单系统架构设计实践问题之对账模型包括内容问题如何解决
阿里商旅账单系统架构设计实践问题之对账模型包括内容问题如何解决
209 2
|
12月前
|
人工智能 小程序 开发者
【一步步开发AI运动小程序】十一、人体关键点跳跃追踪
本文介绍如何利用“云智AI运动识别小程序插件”开发AI运动小程序,涵盖云上运动会、健身打卡等热门应用场景。通过示例代码展示如何调用插件功能,实现动作追踪与分析,助力开发者快速上手。
|
开发工具 git 开发者
|
编解码 索引
RTMP 和 HLS 协议的优缺点
【10月更文挑战第26天】RTMP和HLS协议各有优缺点,在选择使用哪种协议时,需要根据具体的直播场景、观众群体、设备兼容性、服务器性能等因素进行综合考虑,以选择最适合的直播协议。
|
机器学习/深度学习 自然语言处理 负载均衡
揭秘混合专家(MoE)模型的神秘面纱:算法、系统和应用三大视角全面解析,带你领略深度学习领域的前沿技术!
【8月更文挑战第19天】在深度学习领域,混合专家(Mixture of Experts, MoE)模型通过整合多个小型专家网络的输出以实现高性能。从算法视角,MoE利用门控网络分配输入至专家网络,并通过组合机制集成输出。系统视角下,MoE需考虑并行化、通信开销及负载均衡等优化策略。在应用层面,MoE已成功应用于Google的BERT模型、Facebook的推荐系统及Microsoft的语音识别系统等多个场景。这是一种强有力的工具,能够解决复杂问题并提升效率。
1051 2
|
存储 应用服务中间件 API
高效C++项目实战:秋招简历项目解析(提供源码下载)
高效C++项目实战:秋招简历项目解析(提供源码下载)
|
JavaScript 前端开发
vue element-ui分页插件 始终保持在页面底部样式
vue element-ui分页插件 始终保持在页面底部样式
804 0
vue element-ui分页插件 始终保持在页面底部样式
|
域名解析 网络协议 物联网
深度解析:UDP协议及其工作机制与优点
【8月更文挑战第20天】
832 0
|
存储 应用服务中间件 Nacos
Nacos集群搭建
官方给出的Nacos集群图: 其中包含3个nacos节点,然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。
258 3

热门文章

最新文章