使用wxpython的子模块wx.lib.agw.aui实现三局两胜五局三胜游戏模式选择的猜拳小游戏

传奇开心果编程
Python领域优质创作者
2024-09-15 20:39:19

img


import wx
import wx.lib.agw.aui as aui
import random

class RockPaperScissorsFrame(wx.Frame):
    def __init__(self, *args, **kw):
        super(RockPaperScissorsFrame, self).__init__(*args, **kw)
        self.mgr = aui.AuiManager(self)
        self.init_ui()
        self.init_game()

    def init_ui(self):
        self.SetSize((400, 600))  # 调整整个窗口的高度
        self.SetTitle("猜拳游戏")

        self.panel = wx.Panel(self)
        self.panel.SetBackgroundColour('#f0f0f0')  # 设置背景颜色

        self.vbox = wx.BoxSizer(wx.VERTICAL)
        self.vbox.AddSpacer(20)

        # 添加分组框
        self.group_box = wx.StaticBoxSizer(wx.StaticBox(self.panel, label="操作提示"), wx.VERTICAL)
        self.instruction_label = wx.StaticText(self.panel, 
            label="首先选择游戏模式,再点击开始菜单或开始按钮,才能开始游戏。")
        self.group_box.Add(self.instruction_label, flag=wx.ALIGN_CENTER | wx.ALL, border=10)
        self.vbox.Add(self.group_box, flag=wx.ALIGN_CENTER | wx.ALL, border=10)

        # 游戏模式选择标签
        self.mode_label = wx.StaticText(self.panel, label="选择游戏模式:")
        font = wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.BOLD)
        self.mode_label.SetFont(font)
        self.vbox.Add(self.mode_label, flag=wx.ALIGN_CENTER | wx.ALL, border=10)

        # 游戏模式选择框
        self.mode_choice = wx.Choice(self.panel, choices=["自由模式", "三局两胜", "五局三胜"])
        self.vbox.Add(self.mode_choice, flag=wx.ALIGN_CENTER | wx.ALL, border=10)

        # 添加一个列表框用来显示结果,调整高度为500
        self.result_listbox = wx.ListBox(self.panel, size=(350, 500))
        self.vbox.Add(self.result_listbox, flag=wx.EXPAND | wx.ALL, border=20)

        self.panel.SetSizer(self.vbox)
        self.mgr.AddPane(self.panel, aui.AuiPaneInfo().Center())
        self.mgr.Update()

        # 创建菜单栏
        self.menu_bar = wx.MenuBar()

        # 创建一个新的菜单项
        self.action_menu = wx.Menu()
        self.start_item = self.action_menu.Append(wx.ID_ANY, "开始游戏", "开始新游戏")
        self.action_menu.AppendSeparator()        
        self.rock_item = self.action_menu.Append(wx.ID_ANY, "石头", "选择石头")
        self.scissors_item = self.action_menu.Append(wx.ID_ANY, "剪刀", "选择剪刀")
        self.paper_item = self.action_menu.Append(wx.ID_ANY, "布", "选择布")
        self.action_menu.AppendSeparator()
        self.reset_item = self.action_menu.Append(wx.ID_ANY, "重置", "重置游戏")
        self.exit_item = self.action_menu.Append(wx.ID_ANY, "退出", "退出游戏")

        self.menu_bar.Append(self.action_menu, "菜单")
        self.SetMenuBar(self.menu_bar)

        # 创建工具栏
        self.toolbar = self.CreateToolBar()
        self.start_tool = self.toolbar.AddTool(wx.ID_ANY, "开始", wx.ArtProvider.GetBitmap(wx.ART_NEW, wx.ART_TOOLBAR))
        self.reset_tool = self.toolbar.AddTool(wx.ID_ANY, "重置", wx.ArtProvider.GetBitmap(wx.ART_UNDO, wx.ART_TOOLBAR))
        self.exit_tool = self.toolbar.AddTool(wx.ID_ANY, "退出", wx.ArtProvider.GetBitmap(wx.ART_QUIT, wx.ART_TOOLBAR))
        self.toolbar.Realize()

        # 绑定工具栏按钮事件
        self.Bind(wx.EVT_TOOL, self.on_start_game, self.start_tool)
        self.Bind(wx.EVT_TOOL, self.on_reset_game, self.reset_tool)
        self.Bind(wx.EVT_TOOL, self.on_exit_game, self.exit_tool)
        self.Bind(wx.EVT_MENU, self.on_start_game, self.start_item)
        self.Bind(wx.EVT_MENU, self.on_choice_rock, self.rock_item)
        self.Bind(wx.EVT_MENU, self.on_choice_scissors, self.scissors_item)
        self.Bind(wx.EVT_MENU, self.on_choice_paper, self.paper_item)
        self.Bind(wx.EVT_MENU, self.on_reset_game, self.reset_item)
        self.Bind(wx.EVT_MENU, self.on_exit_game, self.exit_item)

        # 初始化时禁用选择
        self.hide_choice_menus()

    def init_game(self):
        self.win_count = 0
        self.lose_count = 0
        self.mode = ""
        self.rounds_played = 0  # 记录已进行的轮次

    def on_start_game(self, event):
        # 检查游戏模式是否选择
        if self.mode_choice.GetSelection() == wx.NOT_FOUND:  # 没有选择任何模式
            wx.MessageBox("操作无效,请先选择游戏模式,再单击开始按钮", "提示", wx.OK | wx.ICON_INFORMATION)
            return

        self.mode = self.mode_choice.GetString(self.mode_choice.GetSelection())
        self.win_count = 0
        self.lose_count = 0
        self.rounds_played = 0
        self.result_listbox.Append("游戏开始!选择你的拳头!")  # 在列表框中添加信息
        self.show_choice_menus()

    def on_reset_game(self, event):
        self.win_count = 0
        self.lose_count = 0
        self.rounds_played = 0
        self.mode_choice.SetSelection(wx.NOT_FOUND)  # 重置选择
        self.result_listbox.Clear()  # 清空结果列表
        self.hide_choice_menus()  # 隐藏选择菜单
        self.result_listbox.Append("游戏已重置,请选择游戏模式并开始新游戏。")  # 提示信息

    def on_exit_game(self, event):
        self.Close()  # 关闭窗口

    def show_choice_menus(self):
        self.rock_item.Enable(True)
        self.scissors_item.Enable(True)
        self.paper_item.Enable(True)

    def hide_choice_menus(self):
        self.rock_item.Enable(False)
        self.scissors_item.Enable(False)
        self.paper_item.Enable(False)

    def on_choice_rock(self, event):
        self.player_choice("石头")

    def on_choice_scissors(self, event):
        self.player_choice("剪刀")

    def on_choice_paper(self, event):
        self.player_choice("布")

    def player_choice(self, user_choice):
        choices = ['石头', '剪刀', '布']
        computer_choice = random.choice(choices)
        self.determine_winner(user_choice, computer_choice)

    def determine_winner(self, user, computer):
        self.rounds_played += 1  # 增加已进行的轮次数量
        if user == computer:
            result = "平局!"
            self.result_listbox.Append(f"第{self.rounds_played}轮: 你选择了: {user},电脑选择了: {computer}. 结果: {result}")
        elif (user == '石头' and computer == '剪刀') or \
             (user == '剪刀' and computer == '布') or \
             (user == '布' and computer == '石头'):
            result = "你赢了!"
            self.win_count += 1
            self.result_listbox.Append(f"第{self.rounds_played}轮: 你选择了: {user},电脑选择了: {computer}. 结果: {result}")
        else:
            result = "你输了!"
            self.lose_count += 1
            self.result_listbox.Append(f"第{self.rounds_played}轮: 你选择了: {user},电脑选择了: {computer}. 结果: {result}")

        if self.mode in ["三局两胜", "五局三胜"]:
            if (self.mode == "三局两胜" and self.win_count < 2 and self.lose_count < 2) or \
               (self.mode == "五局三胜" and self.win_count < 3 and self.lose_count < 3):
                return  # 继续游戏,不需要结束
            else:
                self.end_game()
        else:
            self.hide_choice_menus()  # 隐藏选项,结束游戏

    def end_game(self):
        self.hide_choice_menus()  # 隐藏菜单选项
        if self.win_count > self.lose_count:
            result = "你赢得了游戏!"
            final_message = "恭喜你,胜利者就是你!"
        elif self.win_count < self.lose_count:
            result = "你输掉了游戏!"
            final_message = "很遗憾,你没有赢。再接再厉!"
        else:
            result = "游戏平局!"
            final_message = "比赛打成平局,继续努力!"

        wx.MessageBox(result, "游戏结束", wx.OK | wx.ICON_INFORMATION)
        
        # 在列表框中添加结束信息和总计
        self.result_listbox.Append("游戏结束!")  # 添加结束信息
        self.result_listbox.Append(f"总计: 胜利 {self.win_count}, 失败 {self.lose_count}, 平局 {self.rounds_played - self.win_count - self.lose_count}")  # 结果汇总
        self.result_listbox.Append(final_message)  # 添加输赢判断消息

class MyApp(wx.App):
    def OnInit(self):
        self.frame = RockPaperScissorsFrame(None)
        self.frame.Show()
        return True

if __name__ == '__main__':
    app = MyApp()
    app.MainLoop()

这段代码实现了一个简单的“猜拳”(石头、剪刀、布)游戏的图形界面,使用了 Python 的 wxPython 库。下面是对代码主要部分的详细解释:

类和初始化
RockPaperScissorsFrame 类:
这个类继承自 wx.Frame,用于创建游戏的主窗口。
在构造函数 (init) 中,使用 AuiManager 管理界面元素,并初始化用户界面及游戏状态。
用户界面 (UI)
init_ui() 方法:
设置窗口的大小和标题。
创建一个面板,并使用不同的布局组件(如 BoxSizer 和 StaticBoxSizer)来组织界面元素。
添加选择游戏模式的下拉框(wx.Choice)和结果显示列表框(wx.ListBox)。
创建菜单栏和工具栏,用于提供游戏相关操作(开始游戏、选择石头/剪刀/布、重置、退出等)。
游戏逻辑
init_game() 方法:
初始化游戏状态,包括胜利、失败计数和当前游戏模式。
事件处理
on_start_game() 方法:

检查用户是否选择了游戏模式。如果没有,弹出提示框。
否则,重置游戏计数,并开始游戏。
on_reset_game() 方法:

重置游戏状态和结果显示列表框,并在列表框中提示重置信息。
on_exit_game() 方法:

关闭游戏窗口。
show_choice_menus() 和 hide_choice_menus() 方法:

控制选择石头、剪刀、布的菜单项的可用性。
用户选择处理:

使用 on_choice_rock, on_choice_scissors, on_choice_paper 方法捕捉用户的选择,并调用 player_choice() 方法。
玩家与计算机的选择
player_choice(user_choice) 方法:

随机生成计算机的选择,并调用 determine_winner() 方法来判断胜负。
determine_winner(user, computer) 方法:

根据玩家和计算机的选择判断胜负,更新计分,并在列表框中输出结果。
如果游戏模式是"三局两胜"或"五局三胜",检查是否满足胜利条件,如果达到则调用 end_game()。
结束游戏
end_game() 方法:
根据胜负情况显示游戏结果,更新列表框中的信息,并显示结束消息。
应用程序入口
MyApp 类:

继承自 wx.App,用于启动应用程序并显示主窗口。
主程序入口:

创建应用程序实例并启动事件循环,显示游戏窗口。
总结
这段代码使用 wxPython 创建了一个图形界面的石头剪刀布游戏,包含了用户选择、游戏逻辑、结果判断等功能,提供了良好的用户体验,适合用作初学者学习 GUI 编程和简单的游戏逻辑实现。

...全文
159 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
IDE运行和调试通过
  • 打赏
  • 举报
回复
允许免费复制源代码,允许二次开发,允许免费商用
标题SpringBoot基于Web的图书借阅管理信息系统设计与实现AI更换标题第1章引言介绍图书借阅管理信息系统的研究背景、意义、现状以及论文的研究方法和创新点。1.1研究背景与意义分析当前图书借阅管理的需求和SpringBoot技术的应用背景。1.2国内外研究现状概述国内外在图书借阅管理信息系统方面的研究进展。1.3研究方法与创新点介绍本文采用的研究方法和系统设计的创新之处。第2章相关理论技术阐述SpringBoot框架、Web技术和数据库相关理论。2.1SpringBoot框架概述介绍SpringBoot框架的基本概念、特点和核心组件。2.2Web技术基础概述Web技术的发展历程、基本原理和关键技术。2.3数据库技术应用讨论数据库在图书借阅管理信息系统中的作用和选型依据。第3章系统需求分析对图书借阅管理信息系统的功能需求、非功能需求进行详细分析。3.1功能需求分析列举系统应具备的各项功能,如用户登录、图书查询、借阅管理等。3.2非功能需求分析阐述系统应满足的性能、安全性、易用性等方面的要求。第4章系统设计详细介绍图书借阅管理信息系统的设计方案和实现过程。4.1系统架构设计给出系统的整体架构,包括前后端分离、数据库设计等关键部分。4.2功能模块设计具体阐述各个功能模块的设计思路和实现方法,如用户管理模块、图书管理模块等。4.3数据库设计详细介绍数据库的设计过程,包括表结构、字段类型、索引等关键信息。第5章系统实现与测试对图书借阅管理信息系统进行编码实现,并进行详细的测试验证。5.1系统实现介绍系统的具体实现过程,包括关键代码片段、技术难点解决方法等。5.2系统测试给出系统的测试方案、测试用例和测试结果,验证系统的正确性和稳定性。第6章结论与展望总结本文的研究成果,指出存在的问题和未来的研究方向。6.1研究结论概括性地总结本文的研究内容和取得的成果。6.2展望对图书借阅管理
摘 要 基于SpringBoot的电影院售票系统为用户提供了便捷的在线购票体验,覆盖了从注册登录到观影后的评价反馈等各个环节。用户能够通过系统快速浏览和搜索电影信息,包括正在热映及即将上映的作品,并利用选座功能选择心仪的座位进行预订。系统支持多种支付方式如微信、支付宝以及银行卡支付,同时提供积分兑换和优惠券领取等功能,增强了用户的购票体验。个人中心允许用户管理订单、收藏喜爱的影片以及查看和使用优惠券,极大地提升了使用的便利性和互动性。客服聊天功能则确保用户在遇到问题时可以即时获得帮助。 后台管理人员,系统同样提供了全面而细致的管理工具来维护日常运营。管理员可以通过后台首页直观地查看销售额统计图,了解票房情况并据此调整策略。电影信息管理模块支持新增、删除及修改电影资料,确保信息的准确与及时更新。用户管理功能使得管理员可以方便地处理用户账号,包括导入导出数据以供分析。订单管理模块简化了对不同状态订单的处理流程,提高了工作效率。优惠券管理和弹窗提醒管理功能有助于策划促销活动,吸引更多观众。通过这样的集成化平台,SpringBoot的电影院售票系统不仅优化了用户的购票体验,也加强了影院内部的管理能力,促进了业务的发展和服务质量的提升。 关键词:电影院售票系统;SpringBoot框架;Java技术
内容概要:本文介绍了2025年中国网络安全的十大创新方向,涵盖可信数据空间、AI赋能数据安全、ADR(应用检测与响应)、供应链安全、深度伪造检测、大模型安全评估、合规管理与安全运营深度融合、AI应用防火墙、安全运营智能体、安全威胁检测智能体等。每个创新方向不仅提供了推荐的落地方案和典型厂商,还详细阐述了其核心能力、应用场景、关键挑战及其用户价值。文中特别强调了AI技术在网络安全领域的广泛应用,如AI赋能数据安全、智能体驱动的安全运营等,旨在应对日益复杂的网络威胁,提升企业和政府机构的安全防护能力。 适合人群:从事网络安全、信息技术、数据管理等相关工作的专业人士,尤其是负责企业信息安全、技术架构设计、合规管理的中高层管理人员和技术人员。 使用场景及目标:①帮助企业理解和应对最新的网络安全威胁和技术趋势;②指导企业选择合适的网络安全产品和服务,提升整体安全防护水平;③协助企业构建和完善自身的网络安全管理体系,确保合规运营;④为技术研发人员提供参考,推动技术创新和发展。 其他说明:文章内容详尽,涉及多个技术领域和应用场景,建议读者根据自身需求重点关注相关章节,并结合实际情况进行深入研究和实践。文中提到的多个技术和解决方案已在实际应用中得到了验证,具有较高的参考价值。此外,随着技术的不断发展,文中提及的部分技术和方案可能会有所更新或改进,因此建议读者保持关注最新的行业动态和技术进展。

8

社区成员

发帖
与我相关
我的任务
社区描述
软件开发那些事
软件工程需求分析团队开发 个人社区 甘肃省·酒泉市
社区管理员
  • 传奇开心果编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧