|
本帖最后由 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左右
|
评分
-
查看全部评分
|