五子棋算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 Stones

2.{

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. else

26. {

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或者周边的其他地方下子,但是为什么要选这个地方下子?计算机就要找到最好的地方,怎么找最好的地方,就是要找到胜利的”可能性,既然知道计算机

相关文档
最新文档