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

【猜数字游戏】

  • 写在最前面
    • 猜数字游戏
  • 实现【猜数字游戏】
    • 安装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.mfbz.cn/a/206015.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【模电】放大电路的性能指标

放大电路的性能指标 放大倍数输入电阻输出电阻通频带非线性失真系数最大不失真输出电压最大输出功率与效率 下图所示为放大电路的示意图。 对于信号而言,任何一个放大电路均可看成一个两端口网络。左边为输入端口,当内阻为 R s R\tiny s Rs的正弦波信号…

【Java 并发编程】进程线程、lock、设计模式、线程池...

博主:_LJaXi Or 東方幻想郷 专栏: Java | 从入门到入坟 Java 并发编程 并发编程多线程的入门类和接口线程组和线程优先级线程的状态及主要转化方法线程间的通信重排序和 happens-beforevolatilesynchronized 与锁CAS 与原子操作AQS计划任务Stream 并行计…

uc_09_创建新进程 exec() system()

1 什么是创建新进程(夺舍) 在前面文章中,我们学习了fork()函数用来创建子进程。 子进程是父进程的副本,复制父进程除代码段以外的其他数据,代码段数据和父进程共享。 子进程的PID与父进程不同: 而创建新进程则不同。 与fork()不同…

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; …

达梦数据库安装(DM8)新版 windows11下安装及超详细使用教程

达梦数据库安装&#xff08;DM8&#xff09;新版 windows11下安装及超详细使用教程 新电脑安装重新写了一下 注意看一下踩坑部分 文章目录 1.DM 数据库安装1.1 windows11安装前准备1.1.0 安装环境要求1.1.1 检查系统信息1.1.2 检查系统内存1.1.3 检查存储空间 1.2 官网下载免…

11 款顶级的免费 iPhone 数据恢复软件

iPhone 拥有巨大的存储容量。您可以在 iPhone 设备上存储图像、文档和视频等数据。有时&#xff0c;您的 iPhone 会发生许多意外事件&#xff0c;例如意外删除&#xff0c;从而导致数据丢失。这里有 11 个最好的免费 iPhone 数据恢复软件&#xff0c;您可以免费下载&#xff0c…

Android Bitmap裁剪/压缩/缩放到限定的最大宽高值,Kotlin

Android Bitmap裁剪/压缩/缩放到限定的最大宽高值&#xff0c;Kotlin private fun cropImage(image: Bitmap): Bitmap {val maxWidth 1024 //假设宽度最大值1024val maxHeight 1024 //假设高度最大值1024val width image.widthval height image.heightif (width < maxWi…

架构的模式

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容&#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作…

一起学docker系列之十五深入了解 Docker Network:构建容器间通信的桥梁

目录 1 前言2 什么是 Docker Network3 Docker Network 的不同模式3.1 桥接模式&#xff08;Bridge&#xff09;3.2 Host 模式3.3 无网络模式&#xff08;None&#xff09;3.4 容器模式&#xff08;Container&#xff09; 4 Docker Network 命令及用法4.1 docker network ls4.2 …

开关电源基础而又硬核的知识

1.什么是Power Supply? Power Supply是一种提供电力能源的设备&#xff0c;它可以将一种电力能源形式转换成另外一种电力能源形式&#xff0c;并能对其进行控制和调节。 根据转换的形式分类&#xff1a;AC/DC、DC/DC、DC/AC、AC/AC 根据转换的方法分类&#xff1a;线性电源、…

Git分支批量清理利器:自定义命令行插件实战

说在前面 不知道大家平时工作的时候会不会需要经常新建git分支来开发新需求呢&#xff1f;在我这边工作的时候&#xff0c;需求都是以issue的形式来进行开发&#xff0c;每个issue新建一个关联的分支来进行开发&#xff0c;这样可以通过issue看到一个需求完整的开发记录&#x…

STM32F407-14.3.7-01PWM输入模式

PWM 输入模式 此模式是输入捕获模式的一个特例。其实现步骤与输入捕获模式基本相同&#xff0c;仅存在以下不同之处&#xff1a; 例如&#xff0c;可通过以下步骤对应用于 TI1① 的 PWM 的周期&#xff08;位于 TIMx_CCR1⑨ 寄存器中&#xff09;和占空 比&#xff08;位于 …

【投稿优惠|检索稳定】2023年信息系统和工程与数字化经济国际会议(ICISEDE 2023)

2024年信息系统和工程与数字化经济国际会议(ICISEDE 2024) 2024 International Conference on Information Systems and Engineering and the Digital Economy(ICISEDE 2024) [会议简介] 2024 年信息系统和工程与数字化经济国际会议(ICISEDE 2024)将于 2024 年 1 月 20 日在厦门…

⭐ Unity + ARKIT ARFace脸部追踪

相比之前的图像物体检测&#xff0c;这脸部检测实现起来会更加的简单。 &#xff08;1&#xff09;首先我们先在场景中的物体上添加一个AR Face Mananger组件&#xff1a; &#xff08;2&#xff09;以上組件的 Face Prefab所代表的就是脸部的模型也就是覆盖在脸部上面的投影模…

vue3+element-plus+vue-cropper实现裁剪图片上传

1.vue3element-plusvue-cropper实现裁剪图片 element-UI官网element-plus官网vue-croppervue3使用vue-cropper安装&#xff1a;npm install vue-croppernext 2.vue-cropper插件&#xff1a; <vue-cropper :img"option.img" /><script setup>import {reac…

numpy知识库:深入理解numpy.resize函数和数组的resize方法

前言 numpy中的resize函数顾名思义&#xff0c;可以用于调整数组的大小。但具体如何调整&#xff1f;数组形状变了&#xff0c;意味着数组中的元素个数发生了变化(增加或减少)&#xff0c;如何确定resize后的新数组中每个元素的数值呢&#xff1f;本次博文就来探讨并试图回答这…

二进制求和

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

Docker 使用心得

创建一个docker 镜像&#xff0c;相关运行代码&#xff0c;放在docker镜像文件同级&#xff0c; pm2 不能与 docker一起使用&#xff08;&#xff09; # node 服务docker FROM node:10.16.3LABEL author"sj"RUN mkdir -p /var/nodeCOPY ./node /var/nodeWORKDIR /va…

动手学深度学习(六)---权重衰退

文章目录 一、理论知识二、代码实现【相关总结】 主要解决过拟合 一、理论知识 1、使用均方范数作为硬性限制&#xff08;不常用&#xff09; 通过限制参数值的选择范围来控制模型容量 通常不限制偏移b 小的意味着更强的正则项 使用均方范数作为柔性限制 对于每个都可以找到使…

陈嘉庚慈善践行与卓顺发的大爱传承

陈嘉庚慈善践行&#xff0c;了解陈嘉庚后人与卓顺发的大爱传承。 2023年11月25日,卓顺发太平绅士以及陈家后人在分享他们对慈善领域见解的过程中,特别强调了慈善在促进社会和谐以及推动社会进步方面的关键作用。同时,他们深入探讨了如何在当今社会中继续传扬和实践家国情怀以及…