AI五子棋_08 五子棋落子规则对应的价值
AI五子棋 第八步
恭喜你到达第八步!
利用前一步得到的棋型分析结果,考察每一个可能落子的位置,给每一个可能的位置打分,将棋子落在分数最高的位置上。根据经验,我们可以总结出下面的落子规则:
1. 致胜棋型
若在某处落子后我方获胜,采取这一落子位置。
我们将空位子记作.,本方棋子记作M(me),对方棋子记作O(opponent),考察点记作C(current),能够致胜的棋型必然包含:
"CMMMM"
"MCMMM"
"MMCMM"
"MMMCM"
"MMMMC"
为了保证其优先级,我们给这条规则分配一个大的分数10000。
2. 必须防守棋型
若我方棋子不落在某处,对方将出现致胜棋型,采取这一落子位置,不过优先级小于前者。
按照上面的记号,此时棋型应包含:
"OOOOC"
"COOOO"
我们给它分配一个较大的分数6000
3. 两步致胜棋型
若在某处落子后,出现致胜棋型,采取这一落子位置,不过优先级小于前者。
按照上面的记号,此时棋型应包含:
".CMMM."
".MCMM."
".MMCM."
".MMMC."
我们给它分配一个较大的分数5000
4. 两步防守棋型
若我方棋子不落在某处,对方将出现两步致胜棋型,采取这一落子位置,不过优先级小于前者。
"COOO."
".OOOC"
".OOCO."
".OCOO."
我们给它分配分数2500
5. 进攻棋型
若在某处落子后,出现一端被挡住的四个连续棋子,此时对方必需挡住另一端,采取这一落子位置,不过优先级小于前者。
按照上面的记号,此时棋型应包含:
"OCMMM."
"OMCMM."
"OMMCM."
"OMMMC."
".CMMMO"
".MCMMO"
".MMCMO"
".MMMCO"
我们给它分配分数2000
6. 两步进攻棋型
若在某处落子后,出现两端都不被挡住的三个连续棋子,此时对方必需挡住其中一端,采取这一落子位置,不过优先级小于前者。
".MMC."
".MCM."
".CMM."
我们给它分配分数400
7. 预防棋型
若我方棋子不落在某处,对方将出现两步进攻棋型或进攻棋型,采取这一落子位置。
".OOC"
"COO."
"MOOOC"
"COOOM"
我们给它分配分数400
8. 无效进攻防守棋型
若在某处落子后,出现一端被挡住的三个连续棋子,或者若我方棋子不落在某处,对方将出现一端被挡住的三个连续棋子,这一步进攻或者防守不会引起对方的立即反应。
".MMCO"
".MCMO"
".CMMO"
"OMMC."
"OMCM."
"OCMM."
"MOOC"
"COOM"
我们给它分配分数200
9. 布局棋型
若在某处落子后,出现两端都不被挡住的两个连续棋子。
".MC."
".CM."
我们给它分配分数50
- 其他棋型
我们给它分配分数20
再次说明,我们的方法并不是最好,但请你先实现这种方法,之后再尝试你的想法。
我们将计算每一个当前还是空着的位置的得分。
按照第六步的方法获得棋盘,此时需要根据当前落子是黑方还是白方,将黑棋和白棋表示为M或O
找到所有还空着的位置
对每一个空位子
a. 将这个位置设为C
b. 按照第七步的方法获得该位置的棋型字符串
c. 在所有的棋型字符串上按顺序寻找上述所有模式,每得到一个匹配,将对应的分数加上,最终所得即为该位置的分数
d. 将这个位置设为.
找出分数最大的位置,若分数最大的位置有多个,随意选择一个
任务 8
实现按照评分规则选择落子位置的算法,通过服务器的检验。
访问http://2**.2**.**.1**:9012/step_08服务器会给你几个棋局的坐标表示,保存到questions字段,以JSON数组表示。请给出分数最大的一个落子位置,写入到ans字段,按顺序给出坐标,坐标之间用逗号隔开。服务器不会告诉你,你是白棋还是黑棋,你需要根据规则自己确定
待处理信息
{"is_success": true, "questions": ["hhifhjigkhjghghiihjhkjjijjij", "hhigjhihjgiiifhgjijfkhkeli", "hhjhiijjkijijkjgjfkhijiflihegdlh", "hhkhlhihkgjimijfnjoklgjhjgigmgnglfli", "hhjhihjiijjjjgjkjliihigjkgigkflehf", "edfefdgdeeefhcdffccfffdddegbgcecicjchb", "gheifhiihhihhiijighg", "hhjhiijgghjjjkjijfkjig", "ggffhggfhffgiefhfeheidehdidhgheg", "hhjhiijgghjjjkjijfkjiggiijih", "hhjhiijgghjjjkjijfkjiggi", "ghhihhhggiggihfhigfjiiifjh", "hhggfhghifgigfgjgkhfhkhiijfgjikh", "hhihgihijgiiigjffjekgghggjghijhjgkiffijekdkfgl", "hhjhihjiijjjjgjkjlii", "hhjhihjiijjjjgjkjliihigjkgigkflehfhgifjf", "ghhihhhggiggihfhigfjiiifjhkhjgjfhfgekfijkg"]}
Python实现
import requests as re
def getIndexNum(coords):
""" 将字符下标转换为数字下标"""
"""coords y x"""
# 0行 [0]='.'--- [14]='.'[15]='\n'
# 1行 [16]='.'--- [30]='.'[31]='\n'
# 2行 [32]='.'--- [46]='.'[47]='\n'
# 15行 [240]='.'--- [254]='.'[255]='\n'
return (ord(coords[0]) - ord('a'))*16 + ord(coords[1]) - ord('a')
def allIndexStr():
""" 快速获取一个 以字符下标为值的列表 """
""" spot[0]='aa' spot[1]='ab' ...."""
spot = []
for i in range(0,15):
for j in range(0,16):
spot.append(chr(i+97) + chr(j+97))
return spot
def getLine(coord,board):
"""
获得中心点的四周点情况 返回一个字符串列表
coord[0] y 纵坐标 coord[1] x 控制横坐标
board 棋局
"""
line = ['', '' , '' , '']
i =0
""" 核心思想就是 将周围点两个坐标x,y的限制 转化为一个位置index的限制 """
while(i != 9):
if ord(coord[1])-ord('a')- 4 + i in range(0, 15) : # line[0]是横线 只需保证 横坐标在棋盘里就好
line[0] +=board[(ord(coord[0])-ord('a'))*16 + ord(coord[1])-ord('a')- 4 + i]
else:
line[0] += ' '
if ord(coord[0])-ord('a') -4 + i in range(0, 15) : # line[2]是竖线 只需保证 纵坐标在棋盘里就好
line[2] +=board[(ord(coord[0])-ord('a')- 4 + i)*16 + ord(coord[1])-ord('a')]
else:
line[2] += ' '
# - 4 + i 是从最小值上升判断 + 4 - i 是从最大值下降判断 两者没有什么不同 根据index的求法而定
if ord(coord[1])-ord('a')- 4 + i in range(0, 15) and ord(coord[0])-ord('a') -4 + i in range(0, 15) : # line[1]是\线 保证 横纵坐标都在棋盘里就好
line[1] +=board[(ord(coord[0])-ord('a')- 4 + i)*16 + ord(coord[1])-ord('a')- 4 + i]
else:
line[1] += ' '
if ord(coord[1])-ord('a') + 4 - i in range(0, 15) and ord(coord[0])-ord('a') -4 + i in range(0, 15) : # line[3]是/线 保证 横纵坐标都在棋盘里就好
line[3] +=board[(ord(coord[0])-ord('a')- 4 + i)*16 + ord(coord[1])-ord('a')+ 4 - i]
else:
line[3] += ' '
i += 1
return line
def judge(testOrder):
""" 服务器并没有给我们我们是 M 还是 O"""
""" 根据棋局的命令序列判断"""
if (len(testOrder)//2) % 2 == 0: # 我是黑方
return 'MO'
else: # 我是白方
return 'OM'
def RuleWithPoints():
""" 返回一个 规则字典 对应规则和分值"""
RWP = {
("CMMMM","MCMMM","MMCMM","MMMCM","MMMMC") : 10000,
("COOOO","OOOOC") : 6000,
(".CMMM.",".MCMM.",".MMCM.",".MMMC.") : 5000,
("COOO.",".OOOC",".OOCO.",".OCOO.") :2500,
("OCMMM.","OMCMM.","OMMCM.","OMMMC.",".CMMMO",".MCMMO",".MMCMO",".MMMCO"):2000,
(".MMC.",".MCM.",".CMM.") : 400,
(".OOC","COO.","MOOOC","COOOM") : 400,
(".MMCO",".MCMO",".CMMO","OMMC.","OMCM.","OCMM.","MOOC","COOM") : 200,
(".MC.",".CM.") : 50,
('.') : 20
}
return RWP
def getMaxCoords(Order,RWP, indexSrc):
"""对于每一个当下的棋局 返回一个最成功的下点"""
board = '' # 棋板
for i in range(0,15):
board += '...............' + '\n'
step = 0 # 步数 用于判断黑白 黑方先走
BW = judge(Order)
for i in range(0, len(Order), 2): # i = 0 2 4 6 8
index = getIndexNum(Order[i:i+2])
# Python不允许直接修改字符串 只能用拼接的方法
if (step % 2) == 0:
board = board[0: index] + BW[0] + board[index + 1:]
else:
board = board[0: index] + BW[1] + board[index + 1:]
step += 1
#print(board)
maxCoord = ''
maxPoints = 0
for i in range(0,len(board)):
if board[i] == '.':
tempBoard = board[0: i] + 'C' + board[i + 1:]
coord = indexSrc[i]
lines4 = ','.join(getLine(coord,tempBoard))
points = 0
for rules,value in RWP.items():
for rul in range(0, len(rules)) :
if rules[rul] in lines4:
points += value * lines4.count(rules[rul])
if points > maxPoints :
maxPoints = points
maxCoord = coord
print(f"{maxCoord} {maxPoints}")
return maxCoord
def getNextStep(url,answer):
"""提交答案 获取下一题链接"""
param = {
'ans' : answer[:-1]
}
getHtml = re.get(url, params=param)
print(getHtml.text)
url = "http://2**.2**.**.1**:9012/step_08/"
getHtml = re.get(url)
stepOrders = getHtml.json()['questions']
RWP = RuleWithPoints()
indexSrc = allIndexStr()
#answer = 'ki,he,ih,le,hg,ia,eh,gi,ci,hi,ke,kh,gl,gm,hi,kh,hj,'
answer = ''
for order in stepOrders:
answer += getMaxCoords(order, RWP, indexSrc) + ','
getNextStep(url, answer)
运行即可获得答案
解题tips
注意规则的匹配次数!
加油吧少年,根据这个博客你也可以写出一个相对智能的五子棋程序,甚至更强的AI算法!
文章会随时改动,注意到博客里去看。一些网站会爬取本文章,但是可能会有出入。
https://www.cnblogs.com/asmurmur/
AI五子棋_08 五子棋落子规则对应的价值的更多相关文章
- [深度学习]实现一个博弈型的AI,从五子棋开始(1)
好久没有写过博客了,多久,大概8年???最近重新把写作这事儿捡起来……最近在折腾AI,写个AI相关的给团队的小伙伴们看吧. 搞了这么多年的机器学习,从分类到聚类,从朴素贝叶斯到SVM,从神经网络到深度 ...
- [深度学习]实现一个博弈型的AI,从五子棋开始(2)
嗯,今天接着来搞五子棋,从五子棋开始给小伙伴们聊AI. 昨天晚上我们已经实现了一个五子棋的逻辑部分,其实讲道理,有个规则在,可以开始搞AI了,但是考虑到不够直观,我们还是顺带先把五子棋的UI也先搞出来 ...
- 五子棋的判断输赢规则 -- java编程(简单优化完整版)
五子棋的判断输赢规则代码 -- 完整优化版 一.前言 之前浏览过很多网上的方法,但总找不到比较完整,也get不到其他大神的思路,就直接画图分析,分析了之后就有了如下的代码,当然还想到更加优化的一种,只 ...
- [深度学习]实现一个博弈型的AI,从五子棋开始
好久没有写过博客了,多久,大概8年???最近重新把写作这事儿捡起来……最近在折腾AI,写个AI相关的给团队的小伙伴们看吧. 搞了这么多年的机器学习,从分类到聚类,从朴素贝叶斯到SVM,从神经网络到深度 ...
- 使用QT creator实现一个五子棋AI包括GUI实现(8K字超详细)
五子棋AI实现 五子棋游戏介绍 五子棋的定义 五子棋是全国智力运动会竞技项目之一,是具有完整信息的.确定性的.轮流行动的.两个游戏者的零和游戏.因此,五子棋是一个博弈问题. 五子棋的玩法 五子棋有两种 ...
- AI实现五子棋机器人(一)
前言: 前几天在 csdn 下载资源的时候才发现自己 csdn 有近 200 的下载积分,看了看共享的资源,哈哈 ... 7年前写的五子棋游戏很受欢迎. 下载地址:新手入门五子棋游戏 刚入行的 ...
- 完全自制的五子棋人机对战游戏(VC++实现)
五子棋工作文档 1说明: 这个程序在创建初期的时候是有一个写的比较乱的文档的,但是很可惜回学校的时候没有带回来……所以现在赶紧整理一下,不然再过一段时间就忘干净了. 最初这个程序是受老同学所托做的,一 ...
- Java GUI 单机版五子棋
前言 刚开始学java时接触到GUI,一时兴起写了个五子棋,五子棋的关键点在于判断输赢,其他的都没什么,现在翻出来整理并记录下来,不足之处还望各位路过的大佬多多指教. 代码实现 代码不多,四百多行,全 ...
- python控制台简单实现五子棋
#棋盘#落子#规则import randomclass chess: def __init__(self): print('#---------------棋盘----------------#') ...
- Java 五子棋小游戏
package Day8_06; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import ...
随机推荐
- [POI2012] PRE-Prefixuffix 题解
前言 题目链接:洛谷. 题意简述 给出长为 \(n\) 的串 \(\texttt{S}\).求最大的 \(l\) 满足: \[2l \leq n \land \texttt{S}[1 \ldots l ...
- C#自定义快捷操作键的实现 - 开源研究系列文章
这次想到应用程序的快捷方式使用的问题. Windows已经提供了API函数能够对窗体的热键进行注册,然后就能够在窗体中使用这些注册的热键进行操作了.于是笔者就对这个操作进行了整理,将注册热键操作写成了 ...
- 神经网络之卷积篇:详解卷积步长(Strided convolutions)
详解卷积步长 卷积中的步幅是另一个构建卷积神经网络的基本操作,让向展示一个例子. 如果想用3×3的过滤器卷积这个7×7的图像,和之前不同的是,把步幅设置成了2.还和之前一样取左上方的3×3区域的元素的 ...
- Unity FpsSample Demo研究
1.前言 Unity FpsSample Demo大约是2018发布,用于官方演示MLAPI(NetCode前身)+DOTS的一个FPS多人对战Demo. Demo下载地址(需要安装Git LFS) ...
- 7E头的那些事儿(帧格式分析实例)
0. 前言 作为一名嵌入式工程师,经常需要通过UART与外设打交道,而对于串行总线来说,往往我们必须要进行帧同步.通常的做法是把信令包含在2个0x7E的中间. 除此之外还有HDLC.PPP等协议也会到 ...
- 配置 GRUB2
配置 GRUB2(GRand Unified Bootloader version 2)通常涉及编辑其配置文件和更新引导程序.以下是一个基础流程,适用于大多数 Linux 发行版: 备份现有配置 在进 ...
- 记录荒废了三年的四年.net开发的第三次面试,苏州斯莱克
现在就业的确崩了 这次面试的时间是8月28号.距离上一次面试已经过去了一个月了,距离开始找工作已经过去了2个月.没多少找工作经验的我也体会到了什么叫就业崩了. 看了一线码农的采访计划后,我也把苏州列为 ...
- Seata 1.3.0 Oracle 回滚测试验证 报错 ORA-02289: 序列不存在
使用Seata 1.3.0版本,测试A服务调用B服务,且A方法中,手动写了一个异常,测试是否正常回滚(Mysql已经测试过) 发现报错:ORA-02289: 序列不存在 一看就是undo_log这张表 ...
- 连续因子一个正整数 N
一个正整数 N 的因子中可能存在若干连续的数字.例如 630 可以分解为 3×5×6×7,其中 5.6.7 就是 3 个连续的数字.给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的 ...
- 合合信息扫描全能王发布“黑科技”,让AI替人“思考”图像处理问题
现阶段,手机扫描正越来越多地进入到人们的生活中.随着扫描应用场景的不断拓宽,诸多细节的问题逐渐显露,比如使用者在拍照扫描文档时,手指不小心"入镜"了,只能重拍:拍电脑屏幕时,画面上 ...