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

news2024/11/27 13:15:41

【猜数字游戏】

  • 写在最前面
    • 猜数字游戏
  • 实现【猜数字游戏】
    • 安装wxPython
    • 全部代码
    • 代码解析
      • 1. 初始化界面
      • 2. 生成随机数
      • 3. 处理猜测
      • 4. 特殊功能
      • 5. 分数计算
  • 游戏小程序呈现
    • 结语

写在最前面

看到了一个比较有意思的问题
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、用户只有十次机会猜数,若十次均未正确,算失败。

实现【猜数字游戏】

安装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应用 ~

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

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

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

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

相关文章

人工智能_机器学习056_拉格朗日乘子法原理推导_公式由来详解_原理详解---人工智能工作笔记0096

https://blog.csdn.net/Soft_Po/article/details/118332454 这里有老师的一篇文章介绍拉格朗日乘子法的原理推导 结合老师的这篇文章我们来看一下详细的推导过程 可以看到上一节我们说,一个有条件的,函数,可以转换为一个,无条件的函数, 根据拉格朗日乘子法,可以创建出一个等…

3.C转python

1.int()默认是按照十进制来转换的 2.在python中没有字符 3.可以这样写 4.特例 这样写才对(要空语句即pass空语句来占位) 5.python中没有swicth语句 6.while循环例子 7.死循环有时不是Bug 8.for循环例子 其中的range()函数中的第三个常数是步长 例子 再一个例子 9.使用shif…

【Node.js】笔记整理4 - 版本管理工具nvm

写在最前:跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识,需要格外注重实战和官方技术文档,文档建议作为手册使用 系列文章 【Node.js】笔记整理 1 - 基础知识【Node.js】笔记整理 2 - 常用模块【Node.js】笔记整理 3 - n…

无限移动的风景 css3 动画

<style>*{margin:0;padding:0;/* box-sizing: border-box; */}ul{list-style: none;}#nav{width:900px;height:100px;border:2px solid rgb(70, 69, 69);margin:100px auto; overflow: hidden;}#nav ul{animation:moving 5s linear infinite;width:200%; /*怎么模拟动画…

python爬虫基础知识

使用python进行网络爬虫开发之前&#xff0c;我们要对什么是浏览器、什么HTML&#xff0c;HTML构成。请求URL的方法都有一个大概了解才能更清晰的了解如何进行数据爬取。 什么是浏览器&#xff1f; 网页浏览器&#xff0c;简称为浏览器,是一种用于检索并展示万维网信息资源的…

二进制求和

这篇文章会收录到 : 算法通关村第十三关-白银挑战数字与数学高频问题-CSDN博客 二进制求和 描述 : 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 题目 : LeetCode 67.二进制求和 : 67. 二进制求和 分析 : 这个题也是用字符串来表示数据的…

qt 5.15.2压缩和解压缩功能

qt 5.15.2压缩和解压缩功能 主要是添加qt项目文件.pro内容&#xff1a; 这里要先下载quazip的c项目先编译后引入到本项目中/zip目录下 INCLUDEPATH ./zip CONFIG(debug, debug|release) {win32:win32-g: PRE_TARGETDEPS $$PWD/zip/libquazipd.awin32:win32-g: LIBS -L$$PWD…

nginx部署多个vue或react项目

下载nginx(tar.gz) nginx: download(官方地址) 部署nginx # 进入nginx压缩包所在目录 cd /usr/nginx# 解压 tar -zxvf nginx-1.25.3.tar.gz# 安装nginx的相关依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel# 生成Makefile可编译文件 cd /usr/ng…

SSM校园组团平台系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 校园组团平台系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模…

11-30 JavaWeb

修改与删除操作 防止空指针异常 localhost:8080 -> 分页查询 修改流程&#xff1a;(先查后改(两个servlet)) 修改&#xff1a; 传用户id(用户id怎么得到 -> 循环一次得到一个user 对象 user对象里用user.getId()得到用户id) UpdateUserQueryServlet.java &#xff08;…

Linux系统的常见命令十一,文本编辑器(vi和vim)

目录 vi命令vim命令vi命令与vim命令的区别 本文主要介绍Linux系统的文本编辑器命令vi和vim&#xff0c;还有它们之间的区别。 vi命令 vi是Linux和其他类Unix操作系统中最常用的文本编辑器之一&#xff0c;它的功能强大且灵活&#xff0c;可以通过键盘快捷键来完成大量的编辑操…

TZOJ 1387 人见人爱A+B

答案&#xff1a; #include <stdio.h> void time(int ah, int am, int as, int bh, int bm, int bs, int* sum_h, int* sum_m, int* sum_s) //不需要返回值所以定义void函数&#xff0c;前面6个为输入&#xff0c;然后用指针存给后面三个 {*sum_s (as bs) % 60; …

【办公软件】Outlook启动一直显示“正在启动”的解决方法

早上打开电脑Outlook2016以后&#xff0c;半个多小时了&#xff0c;一直显示这个界面&#xff1a; 解决办法 按WIN R键打开“运行”&#xff0c;输入如下命令&#xff1a; outlook.exe /safe 然后点击“确定” 这样就进入了Outlook的安全模式。 点击“文件”->“选项”-…

ubuntu18.04安装miniconda和mysql

MySQL 1.更新软件包 apt-get update 2.mysql安装 apt-get install mysql-server 3.初始化配置mysql mysql_secure_installation 第一个选项是问你要不要安装密码插件&#xff0c;就是说安装了之后你必须用安全度很高的密码&#xff0c;不安装的话&#xff0c;可以随意设…

6.16二叉搜索树中的搜索(LC700-E)

算法&#xff1a; 二叉搜索树自带顺序&#xff0c;所以不用强调前、中、后序。 调试过程&#xff1a; 原因&#xff1a;初始化变量result时&#xff0c;没有给result赋值 正确代码&#xff1a; /*** Definition for a binary tree node.* public class TreeNode {* int…

在Spring Boot中使用JavaMailSender发送邮件

用了这么久的Spring Boot&#xff0c;我们对Spring Boot的了解应该也逐步进入正轨了&#xff0c;这篇文章讲的案例也在我们的实际开发中算是比较实用的了&#xff0c;毕竟我们完成注册功能和对用户群发消息&#xff0c;都可以采用到邮箱发送功能&#xff0c;往下看&#xff0c;…

传统算法:使用 Pygame 实现归并排序

使用 Pygame 模块实现了归并排序的动画演示。首先,它生成一个包含随机整数的数组,并通过 Pygame 在屏幕上绘制这个数组的条形图。接着,通过归并排序算法对数组进行排序,动画效果可视化每一步的排序过程。在排序的过程中,程序将数组递归地分成两半,分别进行排序,然后再将…

OpenCV中八种不同的目标追踪算法

引言 目标跟踪作为机器学习的一个重要分支&#xff0c;加之其在日常生活、军事行动中的广泛应用&#xff0c;受到极大的关注。在AI潮流中&#xff0c;大家对于深度学习&#xff0c;目标跟踪肯定都会有过接触了解&#xff1a;在GPU上通过大量的数据集训练出自己想使用的垂直场景…

使用gparted进行ubuntu虚拟机的磁盘扩容(解决gparted无法拖动分区的问题)

在学习内核编译下载linux内核源码的时候&#xff0c;由于源码非常大&#xff0c;下载的时候提示磁盘空间不足&#xff0c;我才意识到刚开始创建虚拟机的时候分配了20GB的空间现在已经快用光了。在VM的设置里可以进行扩容&#xff0c;我扩展到了30GB重启却发现空间并没有加到我使…

JVM类加载与运行时数据区

目录 一、类加载器 jvm类的加载过程 第一阶段&#xff1a;加载 第二阶段&#xff1a;链接阶段 第三阶段&#xff1a;初始化阶段&#xff1a; 双亲委派机制 沙箱安全机制 运行时数据区 栈-Xss1m 堆 TLAB 逃逸分析 方法区 常量池中有什么 StringTable为什么要调整位…