五子棋算法
五子棋几种算法详解

五子棋几种算法详解算法一:这里讲述棋盘大小为10×10的人机对战五子棋实现方法,要看完整代码请看Java做的五子棋1.概述玩家每走一步,对于玩家和计算机,都根据获胜表对棋盘各个空棋位进行评分,每个位置的分数与下面这句话有关:该位置所在的每一种获胜组合中已经拥有的棋子数,然后对玩家和计算机产生的分数均衡,以判断计算机是进攻还是防守。
2.数据结构10×10的数据,用来记录棋盘状态;两个获胜表([10][10][192]),也就是获胜组合,因为五个子一线则胜,不在一线上的五个子就不在一个组合中,对于10×10的棋盘获胜的组合有192种,下面将会详细说明,获胜表用来表示棋盘上的每个位置是否在玩家或计算机的获胜组合中;一个二维数组([2][192]),记录玩家与计算机在各种获胜组合中填入了多少棋子;两个10×10的数组,用来记录玩家与计算机在各个棋盘位置上的分数,分数高的将是计算机下一步的着法。
3.计算获胜组合上图是一个10×10的五子棋棋盘,我们可以得出垂直方向上的获胜组合是10×6=60,同理,水平方向的获胜组合也是60,而两个倾斜方向上的获胜组合是(1+2+3+4+5)×2+6=36,即:60*2+36*2=192。
4.评分用两个数组存储每个棋位的分数,一个是计算机的,另一个是玩家的,表示该位置对于各方是最佳着法的肯定程度,对一个位置的评分就是:遍历该位置所在的每一种获胜组合,根据这个组合中已经拥有的己方棋子数1到4分别加不同分数,最后将这些所有的获胜组合所得出的分数相加就是该位置的分数,下图是对于黑方各棋位的评分(其中的1,2,3,4这几个值要根据实际需要来确定)。
5.思路算法二:1.关键词棋位:棋盘的任意一个能放置棋子的位置。
空棋位:没有放置棋子的棋位。
成五:同一色的五子连成一线,胜利。
活四:同一色的四子连成一线,且四子的两端是空棋位。
基于深度强化学习的智能五子棋算法研究

基于深度强化学习的智能五子棋算法研究智能算法作为人工智能研究领域的重要分支,在近年来得到了越来越广泛的关注和重视。
其中,深度强化学习作为一种能够自动学习和探索的技术,在图像识别、游戏对弈等方面的应用表现突出。
作为深度强化学习在应用中的代表,智能五子棋算法研究引发了大量研究者的兴趣。
本文将深入探讨基于深度强化学习的智能五子棋算法的研究。
一、五子棋算法的发展历程五子棋,起源于中国,是一种双人对弈的棋类游戏。
在五子棋的发展历程中,各种算法得到了不同程度的应用。
传统的五子棋算法包括贪心算法、极大极小算法、Alpha-Beta剪枝算法等。
然而,这些算法在处理棋面复杂、难以判断胜负等问题上存在很大的局限性。
二、深度强化学习在五子棋领域的应用深度强化学习采用了神经网络和强化学习的结合方式,可以自动地进行学习和探索,从而使得算法在处理复杂问题时的表现得到了很大的提升。
基于深度强化学习的智能五子棋算法在应用中展现出了非常好的性能,它不仅可以快速地辨别胜负,还可以通过学习来提高棋力。
当前主要的深度强化学习算法包括Deep Q Network (DQN)、Asynchronous Advantage Actor-Critic (A3C)、Policy Gradient等。
三、DQN算法在五子棋领域的应用DQN算法是深度强化学习领域的代表性算法之一。
在五子棋领域,DQN算法的表现非常优秀。
DQN算法通过神经网络的方式实现价值函数的学习,在棋面复杂的情况下依然能够保持很好的表现。
同时,DQN算法还可以自我学习和完善,能够不断提高算法的棋力。
四、A3C算法在五子棋领域的应用A3C算法是一种基于策略梯度的深度强化学习算法。
在五子棋领域,A3C算法可以通过多个并行的神经网络进行训练,能够更加高效地实现算法的自我学习和完善。
同时,A3C算法还可以实现不同程度的特化,使得其在处理不同难度的任务时表现得更加出色。
五、Policy Gradient算法在五子棋领域的应用Policy Gradient算法是一种基于策略梯度的深度强化学习算法。
五子棋谱 Microsoft Word 文档

1,该进攻时,不要防守。
法则:越是积极的进攻,越容易获得取胜的机会。
当你的对手走棋不积极时,你不必跟着他走棋,而是要考虑自己的棋是否可以进攻。
如图1,白10形成眠三,看起来为下一步进攻做好了准备;但如果你仔细计算,会发现白棋的进攻并没有连续性。
因此,我们认为白棋并不积极,黑棋可以落子11形成攻击。
有很多棋手会跟着挡在11-C,虽然这不是坏着,但在当前情况下,完全没有必要,这个时候,你应该去进攻而不是防守。
白10应该走A或B点,这样的行棋会更加积极,如此,黑棋就不能走11位攻击了,而是要跟着白棋去防守。
2,进攻始于活二,要尽可能的利用好棋盘上的每一个子,多形成活二。
(图2-1)中,黑棋有不同的选择。
黑若走在A点,虽然产生了两个二,但都不是活二,在进攻中几乎毫无威力。
而走在B点会产生两个活二,为后续攻击打下了基础。
显然B点比A点更有威力。
总之,一个原则:一子落下,形成的活二越多越好。
(图2-2)中,黑棋有四种选择(A、B、C、D)来构筑进攻,但D是最佳攻击点,因为它同时产生了3个活二。
这跟做棋原则中,“一子三通点往往是好点”相通。
3,在必须防守时,可以选择一个最助于自己进攻的防守点。
(图3-1)中白活三,黑有A、B两个防点来挡住白的活三。
由此需要判断哪个防点,更有利于自己的攻击。
很显然,走在A点,自己会形成连接,而白棋并无后续手段,由此在黑防A后,需要回头来防守黑棋,这样白就失掉先手。
这里,防在A点比B点更有利。
(图3-2)的情况则有不同,黑棋防在A点虽然对自己将来的进攻有利,但黑棋仍然必须防在B点,因为白棋在上面可以连续攻击而获胜。
这里提示我们,要判断哪个防点更有利,就必须考虑在防守以后,对手和自己的后续攻击,而后才能选择出正确的防点。
1.防守不总是要挡,有时采取牵制的手段更好。
(图4)现在轮到黑棋走,黑必须要小心,因为白棋可以在B点连续进攻取胜。
因此,黑棋需要提前防守白棋可能的攻击,哪种防守更有利呢?黑棋如果直接阻挡A或B,虽然可以挡住白棋的活二,但之后白会走C,这样局面趋于平衡,黑棋大好形势丧失殆尽。
五子棋总则

五子棋比赛规则行棋顺序1、开局先猜子,(一方拿子一方进行猜单双),猜对的一方执黑子,黑先、白后,从天元开始相互顺序落子;第二局换先。
判断胜负1.最先在棋盘横向、竖向、斜向形成连续的相同色五个棋子的一方为胜。
2.黑棋禁手判负,白棋无禁手。
黑棋禁手包括“三、三” (包括“四、三、三”)、“四、四”(包括“四、四、三”)、“长连”。
黑棋只能以“四、三”取胜。
3.如分不出胜负,则定为平局(Draw)。
4.五连与禁手同时形成,先五为胜。
5.黑方禁手形成时,白方应立即指出。
若白方未发现或发现后未指明而继续应子,则不能判黑方负。
补充规则1.“三手可交换”:是指黑棋下第 2 手棋 ( 盘面第 3 着棋之后,白方在应白 2 之前,如感觉黑方棋形不利于己方,可出交换,即执白棋一方变为执黑棋一方。
2. “五手两打法”:是指黑棋在下盘面上关键的第 5 手时,必须下两步棋,让白方在这两步棋中任选一步,然后再续下。
3.禁下妖刀(即非二十六开局)五子棋术语对局相关术语〖黑方〗执黑棋一方的简称。
〖白方〗执白棋一方的简称。
〖胜局〗有一方获胜的对局。
〖和局〗分不出胜负的对局。
〖终局〗对局结束。
〖复盘〗对局双方将本盘对局全过程的再现。
行棋相关术语〖阳线〗棋盘上可见的纵线和直线。
〖阴线〗棋盘对角线及与对角线平行的隐形斜线。
〖线〗阳线和阴线统称为线。
〖交叉点〗纵、横阳线的交点,简称“点”。
〖落子〗棋子直接落于棋盘的空白交叉点上。
也称“下子”和“着子”〖轮走方〗即“行棋方”,交替落子的过程中轮到落子的一方。
〖着〗在对局过程中,行棋方每一次落子均被视为一着。
〖回合〗双方各走一着,称为一个回合。
〖开局〗在对局开始阶段形成的布局。
一般指前3手棋形成的局面。
〖连〗2枚以上的同色棋子在一条线上邻接成串。
〖五连〗五枚同色棋子在一条线上邻接连串。
〖长连〗五枚以上同色棋子在一条线上邻接成串。
〖成五〗五连和长连的统称。
〖威胁〗下一手可以成五或者活四的点。
〖四〗五连去掉1子的棋型。
五子棋比赛规则及流程

五子棋比赛规则及流程比赛规则:1.开局执黑先行,无禁手,无指定开局2.比赛采用快棋每场5分钟,步时30秒越时判负。
若比赛时满仍不能决出胜负,且至少有一方不愿求和,则黑白双方各分八枚棋子,并进行每步30秒读秒阶段,越时判负。
八枚棋子下完仍不能决出胜负的则判和棋。
3.每人有两次求和机会,对手需在30秒内做出回应(同意或不同意),求和期间不算作步时。
初赛比赛选手抽签随机分为5组,每组4人,进行小组赛,剩余2人分作一组进行3局2胜制。
首轮:场上一共6副棋盘,由前一半选手首先入场对弈。
对弈结束后选手下场休息,由后一半选手入场对弈。
每组abcd四位棋手,比赛时按如下阵容对弈(前者执黑):a对b,c对d决出结果;a对c,b对d决出结果;a对d,b对c决出结果。
每组棋手,进行两场比赛,第一场比赛结束后双方棋手交换先后手进行第二场。
比赛结果,胜积2分,和积1分,负积0分至此小组内比赛结束,统计棋手积分,小组前两名出线进入复赛。
积分相同且影响到晋级者,须加赛至分出胜负。
复赛进入复赛的11名选手抽签进行两两对局(3局2胜制),剩余三人进行循环赛决出一人,胜出的5人进入决赛,三人循环排序a对b,b对c,a对c(每组棋手进行两场比赛,第一场比赛结束后双方棋手交换先后手进行第二场。
)循环赛记分同初赛,名次按积分排序,积分相同的选手,须加赛至分出胜负。
决赛决赛视时间情况,继续举行或择期举行。
决赛实行循环赛a对b,e对d,每组棋手,进行两场比赛,第一场比赛a对c,b对d结束后双方棋手交换先后手进行第二场。
a对d,c对e选手按积分进行排名,积分相同者,加a对e,c对b赛至分出胜负b对e,d对c加赛规则规则同初赛,赛前由一方选手抓子,另一方猜单双,猜对则执黑先行否则执白。
擂台赛规则前一半选手进行比赛的同时,另一半选手或是观众可以参加擂台赛。
五子棋AI算法分析

五子棋AI规则五子棋AI算法分析:制作五子棋的AI ,我们首先从五子棋的规则谈起,五子棋分为“有禁手”和"无禁手" 两种规则。
相对而言,“有禁手”的规则更为专业些,而“无禁手”的规则更为大众些,所以,这里我们以“无禁手”的规则制作五子棋游戏。
对于五子棋的AI 而言,主要的思路就是对棋盘上的棋子进行分析,记录自己与对手的棋型,进而对其进行判断,根据对自己更有利的原则,进行优先级分析,然后选定要下棋子的点,并对其进行赋值。
下面是五子棋的棋型的分类:1.五子:某一方形成五个相同颜色的棋子相连2.活四:形成四子相连,并且两端是都没有子的3.冲四:形成四子相连,并且有一端是有对方棋子或者是墙壁,而另一端是没有子的4.活三:形成三子相连,并且两端是都没有子的5.死三:形成三子相连,并且有一端是有对方棋子或者是墙壁,而另一端是没有子的6.活二:形成两子相连,并且两端是都没有子的7.死二:形成两子相连,并且有一端是有对方棋子或者是墙壁,而另一端是没有子的8.单子:一个棋子最后是对形成各种棋型进行一个评估,以方便于去对下子的位置做出最优的选择。
所以给落子的“点”相应的评分,去判断该点会形成什么样的棋型:1.五子:1002.活四:803.活三: 704.冲四: 605.死三:506.活二: 407.死二:308. 单子:0接下来就是对<自己的棋型>进行分析,然后对<对方的棋型>分析,进而对自己和对家进行总体的打分,得出自己应该是应该进行进攻还是防守。
(这是一个基本思路,具体在实现过程中在进行添加)高级AI 思索:将每个位置进行分析,假设AI落子在该位置,用以上打分规则为AI打分,并将得到的分数加一。
然后,假设玩家落子在该点,为玩家打分,然后将所有的分值汇总。
取最高分作为这个位置的估分,接下来就是取分数最高的位置下棋了。
“位置估分”,下棋的时候,既可以考虑到自己攻击对手,又能考虑到对对手的防御,可以说,很多时候可以顶上考虑两步的AI。
五子棋的基本知识

五子棋的基本知识●1 、五子棋的基本下法:五子棋是由两个人在一盘棋上进行对抗的竞技运动。
在对局开始时,先由执黑棋一方将一枚棋子落在天元点上,然后由执白棋的一方在黑棋周围的交叉点上落子。
如此轮流落子,直到某一方首先在棋盘的直线、横线或斜线上形成连续的五子或五子以上,则该方就算获胜。
但是,五子棋的特点是先行的一方优势很大。
因此,在职业比赛中对黑方做了种种限制,以利公平竞争。
黑白双方的胜负的结果必须按照职业五子棋的规则要求来决定。
2 、五子棋的开局:五子棋的开局阶段是十分短暂的,大约在7 着与10 几着之间.在这一阶段的争夺中,双方的布局应答将对以后的胜负起着极为关键的作用。
一般来说,黑棋以攻为主,而白棋则似防守为主。
开局可分为二类:自由开局与职亚开局。
(l )自由开局:亦称任意开局。
它是中国古代及现代的非职业游戏性五子棋开局的常用方法。
即先由黑方下一子于中央天元点,再由白方下子阻拦,接着黑方白方轮流下子,直至局终。
在开局阶段,我国民间流传着许多有趣而实用的五子棋阵法布局,例如“八卦阵”.、“四角阵”“燕阵”、“长勾阵”、“剑阵”、“梅花阵”等等,如何发掘这些传统阵法并使之发扬光大,是我们五子棋爱好者的光荣任务。
( 2 )职业开局:亦称指定开局。
它是按国际连珠(五子棋)联盟的正规比赛要求而设置的开局方法,即建立在两套基本打法(斜指打法与直指打法)上的开局。
原有二十六种开局,但是其中两种(彗星局与游星局)已被废弃不用,故共有二十四种职业开局。
采用此种开局一般都用“指定打法”,即比赛双方按照约定好的开局进行对弈,由白棋先行。
3 、职业五子棋(连珠)的比赛规则(1)黑先、白后,从天元开始相互顺序落子。
(2 )最先在棋盘横向、竖向、斜向形成连续的相同色五个棋子的一方为胜。
(3 )黑棋禁手判负,白棋无禁手。
黑棋禁手包括“三、三”; “四、四”; “长连”。
黑方只能“四、三”胜。
( 4 )如分不出胜负,则定为平局。
五子棋规则解析

五子棋规则解析
1. 游戏目标
五子棋是一种双人对弈的棋类游戏,目标是在棋盘上先连成一行、一列或一对角线上放满五颗自己的棋子。
2. 游戏规则
- 棋盘:
- 五子棋使用一个大小为15*15的棋盘。
- 棋盘的交叉点称为格子,共有225个格子。
- 玩家角色:
- 五子棋有两个玩家,分别执黑子和白子。
- 黑子先手,白子后手。
- 落子:
- 玩家依次在棋盘上落子。
- 每一颗棋子只能放在棋盘的一个格子上。
- 胜负判定:
- 当一方在横、竖、斜向上出现连续的五个自己的棋子时,该玩家获胜。
- 若棋盘被填满且没有任何一方连成五子,游戏平局。
- 禁手规则:
- 某些比赛中可能采用禁手规则,限制某些策略,如三三禁手和四四禁手等。
- 三三禁手:禁止在一个位置同时形成两个活三。
- 四四禁手:禁止在一个位置同时形成两个活四。
3. 游戏策略和技巧
- 防守和进攻:玩家需要懂得防守自己的棋子,并尝试进攻对手的棋子,以获得胜利。
- 利用高级棋法:高级棋法如三连活二、跳冲等可以增加胜利机会。
- 观察对手:观察对手的走子方式以及形成棋型的倾向,可以帮助制定更好的下棋策略。
- 保持灵活性:避免固定思维,随机应变,并灵活地选择最佳下子位置。
4. 总结
五子棋是一款简单而有趣的棋类游戏,通过理解游戏规则和运用合适的策略,玩家可以不断提升自己的下棋水平。
希望这份规则解析对您有所帮助。
祝您游戏愉快!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前一段时间某个公司给我出了一道作业题,当然,只有做完了这个题目才能够有基本的实习机会,这个题目就是五子棋了。
五子棋说起来简单,也比较简单,毕竟现在网上已经有非常成熟的算法了,而如果说五子棋考人面试的话,应该还算是有一定的难度的(虽然思路不是特别难),当然,我在做这个题目的时候,还是发现了很多问题。
在博客园上找了一个五子棋的实现,我写的算法基本和他差不多,不过我的AI总没有他那么高,我这就是简单的实现了一下,如下图所示。
在做五子棋这个程序的时候,首先确定一些基本功能,这些功能包括如下。
玩家能够快速开始游戏。
玩家能够更换身份(更换黑棋和白棋)。
玩家能够退出游戏。
其中,玩家能够快速开始游戏,需要考虑玩家当前的身份。
例如当玩家为黑棋的时候(玩家先走棋),单击【快速游戏】时玩家能够开始下棋,另外,当玩家为白棋的时候(电脑先走棋),单击【快速游戏】时计算机首先下棋。
不仅如此,玩家能够快速更换身份。
更换身份后玩家能够进行不同的棋子的选择,从而和电脑进行博弈。
如果玩家希望退出时,可以单击【退出】进行系统退出。
OK,了解了基本的功能后,主要就是算法问题了,这里主要有几个类,这几个类分别为Stones(控制棋子),Boards(控制棋盘以及逻辑),PC(电脑AI的实现),Rules(五子棋规则的实现)。
首先也是最重要的,就是Boards类,该类一开始首先需要绘制一个棋盘在窗体中。
棋盘是绘制上去的,在Paint方法中实现,示例代码如下所示。
1.private void Form1_Paint(object sender, PaintEventArgs e)2.{3. bd.DrawBoard();4.}复制代码上述代码使用了Boards的bd类进行棋盘的创建,这里可以看看该类的实现。
1.public void DrawBoard()2.{3. Assembly myAssembly = Assembly.GetExecutingAssembly();4. Stream myStream =myAssembly.GetManifestResourceStream("FiveStone.board.png");5. Bitmap bt = new Bitmap(myStream);6. myStream.Close();7. mg.DrawImage(bt, 20, 20, bt.Width, bt.Height);8.9. for (int i = 0; i < 15; i++)10. {11. for (int j = 0; j < 15; j++)12. {13. if (board[i, j] == 0)14. {15. stone.DrawStone(i, j, true);16. }17. if (board[i, j] == 1)18. {19. stone.DrawStone(i, j, false);20. }21. }22. }23.}复制代码由于我们的棋盘是15*15的,那么该函数会在每次重绘的时候进行棋盘中的棋子的绘画。
那么棋子怎么表示呢,这里就用-1,0,1进行表示,其中0是白子,而1是黑子,那么-1当然就是没子了,该函数会在每次重绘时进行绘制,从而呈现棋盘上的内容。
在上述代码中,使用了Stones的stone对象,该类的实现如下所示。
1.public class Stones2.{3. private Graphics mg;4. private Bitmap bs;5. private Bitmap ws;6.7. public Stones(Graphics g)8. {9. Assembly myAssembly = Assembly.GetExecutingAssembly();10. Stream bStream =myAssembly.GetManifestResourceStream("FiveStone.black.png");11. Stream wStream =myAssembly.GetManifestResourceStream("FiveStone.white.png");12. bs = new Bitmap(bStream);13. ws = new Bitmap(wStream);14. bStream.Close();15. wStream.Close();16. mg = g;17. }18.19. public void DrawStone(int x, int y, bool flag)20. {21. if (flag)22. {23. mg.DrawImage(bs, x * 40 + 20, y * 40 + 23, bs.Width, bs.Height);24. }25. else26. {27. mg.DrawImage(ws, x * 40 + 20, y * 40 + 23, bs.Width, bs.Height);28. }29. }30.}复制代码代码不做过多的解释,这里的高手一定都知道了,这些内容可以在源代码中下载。
OK,在了解了基本的绘制棋盘以及绘制棋子(还有棋子状态的描述),那么就应该描述AI了。
AI 部分的实现,我从网上看到的资料,大多都是用权值进行描述,当然,这个方法虽然最笨也是最容易实现的。
当人下子的时候(通过ON_MONTHDOWN方法),可以在相应的数组空间中进行赋值,例如如果人下的是白子,那么相应的数组位置的值应该等于0,反之等于1。
那么当人下子了之后,计算机如何知道该怎么下子呢,计算机当然不知道什么是”双三,”冲四,这里必须通过数学的方法进行实现,(可能网上说的不太清除,我详细的讲一下,也会自己进行记录)如下图所示。
如上图所示,当我们首先在中间下了一个黑子(这里是计算机先下,方便说明,因为如果我先下的话,那么计算机很快就下子了。
),那么计算机就应该计算哪里才是最好的地方,当然,这里只有一个子,计算机的计算就可以随便计算,当然,也有一定的规律性。
计算机可能在上图中的1、2、3或者周边的其他地方下子,但是为什么要选这个地方下子?计算机就要找到最好的地方,怎么找最好的地方,就是要找到胜利的”可能性,既然知道计算机要找到可能性,那么怎么找可能性?如下图所示。
如上图所示,在最上面一行,其中是一个连子的可能性。
其中占用五个子,那么在最上面一行的可能性有11种(自己数,上图中是一种可能性,依次右移,有11种),这里有15行,那么就是11*15种可能性。
同理,从上到下的可能性也是11*15种可能性,而侧边(即左上右下,右上左下的方向),也具有可能性,上图中也描述了,这个可能性希望大家能够自己数一数。
OK,知道了可能性以后,就需要了解计算机怎么判断落子点,上图中在中间下了一个白子,既然下了一个白子,那么周边也是有可能性的。
注意,计算机会通过可能性计算你下子周边的可能性,例如上面下了一个白子,周边的连子(即能够形成5个子连子的可能性),都是有的,并且应该相等。
当然,在初期,这个相等的值比较多。
然后里该位置越远,可能性就越少,计算机就越不会在那个位置下子,例如左下角,大家都知道中间这个点和左下角这个点练成五子的可能性为0,这里计算机也认为为0,那么就不会在这个地方下子,同样,下了多步后,可能性也会被重新计算,如下图所示。
当下了多步之后,例如上面,计算机马上要赢了,那么计算的话,第5个子的位置的权值应该是最高的,即10000,这里可以随意定,越高越好。
而其他周边的地方,赢的可能性可能会少一些,可能就是500,同理,在右下边两个黑子那里,由于还是两个黑子,没有构成猥亵,计算机也会认定具备较少的权值,则计算机会下权值最高的点(如果人不堵这个位置),如果人堵了这个点,那么计算就就会继续找权值最高的点(当然,这个时候权值就可能不是上图中所描述的了)。
既然了解了基本原理之后,那么如何计算权值?权值的计算方法比较容易,即从上、下、左上右下、右上左下四个方向寻找连子,如果连子有1个,即可赋值权值100,依次增高,如果连子有4个,那么就应该有最高的权值,即10000。
值得注意的是,权值不仅仅包括一个方向,例如”双三或”冲四,在一个点中的不同方向都有多个子的时候,应该加上所有方向的权值。
在计算中,首先需要计算整个棋盘的权值,示例代码如下所示。
1.public void Down(int[,] board)2.{3. int[,] q = new int[15, 15];4. for (int i = 0; i < 15; i++)5. {6. for (int j = 0; j < 15; j++)8. if (board[i, j] != -1)//如果这个位置没有子的话9. {10. q[i, j] = -1;//权值为-1即可咯11. }12. else13. {14. q[i, j] = FindQz(i, j, board);//找权值15. }16. }17. }18. ForMax(q);19.}复制代码上述代码使用了FindQz方法寻找权值,示例代码如下所示。
1.public int FindQz(int x,int y,int[,] board)2.{3. int qz = 0;4. int w1 = 10000000;5. int w2 = 50000;6. int w3 = 10000;7. int w4 = 5000;8. int w5 = 1000;9. int w6 = 500;10. int w7 = 100;11. int w8 = 50;12. int w9 = -100000000;13. int[] move = new int[4];14. if (mifis)15. {16. board[x, y] = 0;17. }19. {20. board[x, y] = 1;21. }22. move[0] = Rules.X1(x, y, board);23. move[1] = Rules.X2(x, y, board);24. move[2] = Rules.X3(x, y, board);25. move[3] = Rules.X4(x, y, board);26. if (x == 7 && y == 7)27. {28. qz += 1;29. }30.31. for (int i = 0; i < 4; i++)32. {33. if (Abs(move) == 5)34. {35. qz += w1;36. }37. else if (move == 4)38. {39. qz += w3;40. }41. else if (move == 3)42. {43. qz += w5;44. }45. else if (move == 2)46. {47. qz += w7;48. }49.50. if (mifis)51. {52. if (Rules.Fails(move, board[x, y]))53. {54. qz += w9;55. }56. }57. }58.59. if (mifis)60. {61. board[x, y] = 1;62. }63. else64. {65. board[x, y] = 0;66. }67.68. move[0] = Rules.X1(x, y, board);69. move[1] = Rules.X2(x, y, board);70. move[2] = Rules.X3(x, y, board);71. move[3] = Rules.X4(x, y, board);72.73. for (int i = 0; i < 4; i++)74. {75. if (Abs(move) == 5)76. {77. qz += w2;78. }79. else if (move == 4)80. {81. qz += w4;82. }83. else if (move == 3)84. {85. qz += w6;86. }87. else if (move == 2)88. {89. qz += w8;90. }91. }92. board[x, y] = -1;93. return qz;94.}复制代码上述代码就不详细解释了,如果有不会的朋友可以逐步运行并查看局部变量的值。