五子棋day-6

网址可以访问了,继续

第八步
恭喜你到达第八步!

利用前一步得到的棋型分析结果,考察每一个可能落子的位置,给每一个可能的位置打分,将棋子落在分数最高的位置上。根据经验,我们可以总结出下面的落子规则:

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

10. 其他棋型
我们给它分配分数20

我们将计算每一个当前还是空着的位置的得分。
1.按照第六步的方法获得棋盘,此时需要根据当前落子是黑方还是白方,将黑棋和白棋表示为M或O
2.找到所有还空着的位置
3.对每一个空位子
a. 将这个位置设为C
b. 按照第七步的方法获得该位置的棋型字符串
c. 在所有的棋型字符串上按顺序寻找上述所有模式,每得到一个匹配,将对应的分数加上,最终所得即为该位置的分数
d. 将这个位置设为.

找出分数最大的位置,若分数最大的位置有多个,随意选择一个

任务 8
实现按照评分规则选择落子位置的算法,通过服务器的检验。

访问http://xxx/step_08服务器会给你几个棋局的坐标表示,保存到questions字段,以JSON数组表示。请给出分数最大的一个落子位置,写入到ans字段,按顺序给出坐标,坐标之间用逗号隔开。服务器不会告诉你,你是白棋还是黑棋,你需要根据规则自己确定。

正则表达式:https://www.runoob.com/python/python-reg-expressions.html
字符串匹配:https://www.cnblogs.com/huiAlex/p/7994606.html
list转字符串:https://www.cnblogs.com/who-care/p/9306800.html

权重计算:

import json

win_type = ["CMMMM", "MCMMM", "MMCMM", "MMMCM", "MMMMC"] #终-致胜
defense_type = ["OOOOC", "COOOO"] #御-必守
latent_win_type = [".CMMM.", ".MCMM.", ".MMCM.", ".MMMC."] #创-两步致胜
latent_defense_type = ["COOO.", ".OOOC", ".OOCO.", ".OCOO."] #忍-两步防守
kill_type = ["OCMMM.", "OMCMM.", "OMMCM.", "OMMMC.", ".CMMMO", ".MCMMO", ".MMCMO", ".MMMCO"] #攻-进攻
latent_kill_type = [".MMC.", ".MCM.", ".CMM."] #蓄-两步进攻
foresee_type = [".OOC", "COO.", "MOOOC", "COOOM"] #预-预防
invalid_type = [".MMCO", ".MCMO", ".CMMO", "OMMC.", "OMCM.", "OCMM.", "MOOC", "COOM"] #缓-无效进攻
layout_type 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值