cnCalc计算器论坛

 找回密码
 注册
搜索
查看: 2861|回复: 2

[Nspire] 在nspire上编了一个五子棋 带AI

[复制链接]
发表于 2012-12-17 14:32:07 | 显示全部楼层 |阅读模式
本帖最后由 big-fat-bass 于 2012-12-18 22:24 编辑

按理说五子棋程序应该是全逻辑判断才行 但程序会很长
所以我就想出了个偷懒的办法
思路大概就是比较在棋盘上各个空格落子的必要性。最后就在必要性最大的那个格子上落子。

首先定义一些基本概念:
1.棋盘上每个可以落子的最小元叫格子,
2.由线性相连的5个格子构成的一个整体叫分子(也就是可能形成五子的地方)。需要指出, 一个格子可以同时属于多个分子,分子之间是相互交叉的 而不是分立的,以免引起误解。
3.离散函数p(n)的变量n为格子的序号,函数值p代表格子上是白子还是黑子,p=-1代表白子,p=1代表黑子,p=0代表空,
4.离散函数d(n)的变量n为格子的序号,函数值d代表在该格子落子的必要性,在游戏开始前,d(n)=0对于任意n成立。在游戏开始后,若p(n)≠0,则d(n)=0 (因为不能在已经落子的格子上落子)
5.离散函数u(a,b,c)的变量a代表分子序号,b为该分子内黑子数,c为该分子内白子数。函数值u代表在这个分子内落子的必要性。
若b*c>0,则u=0 (这个很显然的, b*c>0 说明这个分子内已经不可能形成五子了,这个分子就废掉了)
若b*c=0,则u=(b+c)^4(一个分子内相同颜色的子个数越多就越有必要下在里面,分2种情况,如果分子里面对手的子很多,那就有必要下里面不让对手形成5子,如果自己的子很多,当然也要下里面。而且b+c=4的时候的必要性u应该远高于b+c=3的时候,所以取高次幂来拉开差距)

当程序运行的时候,先让计算器算出一个分子的必要性u(a),然后由分子序号反解出分子内格子的序号{n(a,1)…n(a,5)}
然后执行 u(a)+d(n(a,i))→d(n(a,i))
对每个分子进行这样的操作,d(n)就是格子上累积的必要性。
再进行筛选 对于所有n ,若p(n)≠0,则0→d(n),于是d(n)就是最终必要性。
最后落子序号N=arcd(max{d})

课上用“ti basic”编了出来,修了些bug,对函数u的参数进行了些调整,如果计算器先手,不是很容易下赢它。

附件说明:默认是计算器后手,要计算器先手只要把第一个子下在棋盘外面就行了,
g(是开始,重新开局是0→n,修正系数d/a一般取0左右


calc.png

fi.tns

8.46 KB, 下载次数: 118

评分

参与人数 1金钱 +10 收起 理由
imath + 10 好像很厉害,,,

查看全部评分

发表于 2012-12-17 14:48:46 | 显示全部楼层
建议LZ尝试Lua编程
imath大大已经发布过类似程序,不过没有AI
http://www.cncalc.org/forum.php?mod=viewthread&tid=6993
 楼主| 发表于 2012-12-17 15:09:57 | 显示全部楼层
本帖最后由 big-fat-bass 于 2012-12-17 15:11 编辑
wtof1996 发表于 2012-12-17 14:48
建议LZ尝试Lua编程
imath大大已经发布过类似程序,不过没有AI
http://www.cncalc.org/forum.php?mod=view ...


嗯 13*13的盘算一步棋要20秒 。。 ti basic有点无奈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cnCalc计算器论坛

GMT+8, 2024-11-1 09:34 , Processed in 0.074031 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表