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

写在最前面

看到了一个比较有意思的问题
https://ask.csdn.net/questions/8038039

猜数字游戏

在这个猜数字游戏中,计算机生成一个由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应用 ~

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

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

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是Yu欸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值