使用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 编程和简单的游戏逻辑实现。

...全文
103 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
IDE运行和调试通过
  • 打赏
  • 举报
回复
允许免费复制源代码,允许二次开发,允许免费商用

8

社区成员

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

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