8
社区成员
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 编程和简单的游戏逻辑实现。