前言
此次实验,主要是在上一次添加图形化界面的基础之上进行了进一步的更新完善,主要是在游戏模式和图形界面两方面进行完善。
游戏规则
黄金点游戏规则:
N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。
收获与感悟
这次实验进一步学习wxPython,丰富了UI图形界面,主要是增加了界面背景和按钮,同时这次也进一步完善了游戏,将做出了单人模式和多人模式,多人模式是是在前面的基础之上进行了细微的改进,单机模式则是和电脑对抗玩游戏,整个实验仍然采用小组配合式完成了这次的项目,同时这次两人除了完成上述操作,也在继续学习强化学习算法为后来优化扎实基础,学到了很多。同时软件工程课上关于项目开发的规范,也在这次联机项目撰写上得到了很明显的体显。
二、使用步骤
这次实验新增添三个新文件,使项目整体更加模块化,以下将对新添部分和原wxpython.py文件的修改部分进行介绍
1.play_online.py
1.1引用包
import wx
import client
import server
1.2 online类
代码如下:
class online(wx.Frame):
"""We simple derive a new class of Frame"""
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, title=title, size=(400, 760))
# self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE,)
self.Show(True)
self.CreateStatusBar() # 创建窗口底部的状态栏
panel = wx.Panel(self)
panel.PicShow = wx.StaticBitmap(parent=panel, pos=(0,0), size=(390, 650))
img = wx.Image('./40)CGAI{$IA))N2W%}TGBQ7.png', wx.BITMAP_TYPE_ANY )
panel.PicShow.SetBitmap(wx.BitmapFromImage(img))
panel.button_client = wx.Button(panel.PicShow, -1, "if Client", pos=(40, 20))
panel.Bind(wx.EVT_BUTTON, self.on_client, panel.button_client)
panel.button_client.SetDefault()
panel.button_server = wx.Button(panel.PicShow, -1, "if Server", pos=(100, 100))
panel.Bind(wx.EVT_BUTTON, self.on_server, panel.button_server)
panel.button_server.SetDefault()
。。。
1.3 on_client函数
代码如下:
def on_client(self, e):
HOST = wx.GetTextFromUser("puts server ip", caption="IP", default_value="",
parent=None) # 还没有判定ip合法
if_first_round = 1
while True:
if_continue = client.open_client(HOST,self,if_first_round)
if_first_round = 0
if if_continue == 0:
break
。。。
1.3 on_client函数
代码如下:
def on_client(self, e):
HOST = wx.GetTextFromUser("puts server ip", caption="IP", default_value="",
parent=None) # 还没有判定ip合法
if_first_round = 1
while True:
if_continue = client.open_client(HOST,self,if_first_round)
if_first_round = 0
if if_continue == 0:
break
。。。
2.inital改进
代码如下:
def initial(people_num):
global people
people = []
# 初始化
for i in range(people_num):
name = wx.GetTextFromUser("Name", caption="Player" + str(i + 1) + " puts your name", default_value="",
parent=None)
people.append(person(name))
return people
inital函数此次多添加了一个名为people的数组,更改了参数列表,作为参数将参与新GoldPoint函数的运算
4.Person
代码如下:
class person:
def __init__(self, name):
self.name = name
self.score_list = []
self.score = 10 # 初始分数为10
def change_score(self, num):
self.score += num
self.score_list.append(self.score)
def show(self):
return (str(self.name) + ":" + str(self.score))
def get_name(self):
return self.name
def show_scorelist(self):
sc = ""
for i in self.score_list:
sc += str(i) + " "
return (str(self.name) + ":" + sc)
新添加的person类包含了一个玩家的基本信息,如名字,分数等
4.GoldPoint改进
代码如下:
def Gold_Point(people, self):
num = []
fscore = []
for i in range(len(people)):
if people[i].get_name() == machine:
person_num = random.randint(1,99)
else:
while (1):
person_num = wx.GetPasswordFromUser("Player " + people[i].get_name() + " puts your number",
caption="Number", default_value="",
parent=None)
try:
person_num = int(person_num)
if (person_num > 0 and person_num < 100):
break
else:
dlg = wx.MessageDialog(self, "Number range error!", "error!", wx.OK) # 创建一个对话框,有一个ok的按钮
dlg.ShowModal() # 显示对话框
dlg.Destroy() # 完成后,销毁它
except Exception as e:
dlg = wx.MessageDialog(self, str(e), "error!", wx.OK) # 创建一个对话框,有一个ok的按钮
dlg.ShowModal() # 显示对话框
dlg.Destroy() # 完成后,销毁它
num.append(person_num)
Gpoint = np.mean(num) * 0.618
num = [abs(x - Gpoint) for x in num] # 减去Gpoint
num = [x - min(num) for x in num] # 减去最小值
farther_num = max(num)
for i in range(len(num)):
if num[i] == 0:
people[i].change_score(len(people))
elif num[i] == farther_num:
people[i].change_score(-2)
else:
pass
for person in people:
fscore.append(person.show())
return fscore
该处主要改进的是把输入的数字全部以密码圆点形式展现,防止信息泄露,同时更改参数列表,新增了people参数传入,配合一个新建的person类在多人模式和单机模式下的计算。单机模式下AI的数字计算目前是采用随机数的方法,这是未来将在后面进行优化的重点之处
结果展示
在支持原菜单选择的情况下,继续添加了背景和按钮
在支持原菜单选择的情况下,添加了背景和按钮支持
有单机模式和多人模式提供选择
首先先看单机模式
数字密码式显示
若输入的是字母等不合法字段,则会报上图的错误
若输入的数字超出范围将返回range error
输入成功后,AI通过radom随机生成1~100的一个数,直接得到最后结果
点继续可以继续单机模式 ,得到结果
同样可以查看分数
多人模式
首先输入参与人数
依次输入参与人名字
依次输入数字,依旧防止信息泄露,采用加密展示
得到最后结果
continue可以在最近一局模式下继续
score查看分数
强化学习简介
强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题
此次我们学习了一个最为基本的即马尔科夫决策过程(马尔科夫决策过程是对完全可观测的环境进行描述的,也就是说观测到的状态内容完整地决定了决策的需要的特征。)我们整个黄金点游戏过程中除了第一次没有结果,完全随机不可测,后面我们的结果都是明确的。若某一状态信息包含了所有相关的历史,只要当前状态可知,所有的历史信息都不再需要,当前状态就可以决定未来,则认为该状态具有马尔科夫性。我们认为人总有想更接近黄金点的心理,那么玩家说出的分数则存在了一定的可预测性。简单地说,假设玩家只会计算一次距黄金点最近的数,那么AI代入人的计算结果则可得到一个绝对能赢的结果。但是人同样具有智能,也会意识到这个问题,那么玩家的计算次数是AI获胜的关键,而玩家计算次数是完全随机不可知的,这真是现在如果想使用马尔科夫强化的问题所在,我们将在后面的学习过程中继续完善
总结
这次整个实验主要是在进行进一步的完善优化提升,将原来的功能进一步完善升级,对整个代码进行了一下重构,提升了性能和运行速度。我们并没选择完全的分工,而是对相互的工作都有一定的参与。因此在双方工作交融,代码协同时提升了效率,同时我们也开始了对神经网络的探索,希望能通过神经网络做出一个高效,合理的AI判断。此次试验收获学习颇丰,配合也越来越默契,下次将对算法进行更好的提升完善