象棋和五子棋AI的开发(一)

刚出来工作的时候,用C++做过一个五子棋的AI,那时候已基本达到了自己战胜不了电脑的水平。当然,自己的水平相当有限,不能以此作为标准。最近心血来潮,想做一款象棋的,看了一些资料之后,发现五子棋也可以再写一遍。于是就使用C#做了象棋和五子棋的AI,都达到了自己无法战胜的水平。

一开始,我以为五子棋更简单一些,毕竟象棋的走法更复杂,但做下来发现,其实五子棋是更复杂、计算量更大的一个棋类。

程序的内容很大一部分参考了《PC游戏编程(人机博弈)》这本书,在阅读本博文之前,请先了解书里的内容。我不打算重复书里讲过的内容,只会讲一些自己的特色。

一、基本数据类型的定义

程序没有以效率至上为原则,充分地考虑了易读性,所以代码看起来还是比较容易理解的。

一些基本的数据类型:


 
 
  1. /// <summary>
  2. /// 棋子颜色
  3. /// </summary>
  4. public enum ChessColor
  5. {
  6. 无,
  7. 黑,
  8. 红,
  9. 白,
  10. }
  11. /// <summary>
  12. /// 棋子类型
  13. /// </summary>
  14. public enum ChessType
  15. {
  16. 空,
  17. 卒,
  18. 象,
  19. 士,
  20. 炮,
  21. 马,
  22. 车,
  23. 将,
  24. }
  25. /// <summary>
  26. /// 棋子结构
  27. /// </summary>
  28. public class Chess
  29. {
  30. public Chess()
  31. {
  32. color = ChessColor.无;
  33. type = ChessType.空;
  34. }
  35. public Chess(ChessColor c, ChessType t)
  36. {
  37. color = c;
  38. type = t;
  39. }
  40. public void Set(ChessColor c, ChessType t)
  41. {
  42. color = c;
  43. type = t;
  44. }
  45. public ChessColor color;
  46. public ChessType type;
  47. }
  48. /// <summary>
  49. /// 移动类棋走步结构
  50. /// </summary>
  51. public class Step : IComparable
  52. {
  53. public Step(int fr, int fc, int tr, int tc)
  54. {
  55. FromRow = fr;
  56. FromCol = fc;
  57. ToRow = tr;
  58. ToCol = tc;
  59. }
  60. public int FromRow;
  61. public int FromCol;
  62. public int ToRow;
  63. public int ToCol;
  64. /// <summary>
  65. /// 走步价值
  66. /// </summary>
  67. public int value;
  68. public int CompareTo(object obj)
  69. {
  70. return (obj as Step). value - value;
  71. }
  72. }
  73. /// <summary>
  74. /// 单放类棋走步结构
  75. /// </summary>
  76. public class Put : IComparable
  77. {
  78. public Put(int tr, int tc, ChessColor c)
  79. {
  80. ToRow = tr;
  81. ToCol = tc;
  82. Color = c;
  83. }
  84. public int ToRow;
  85. public int ToCol;
  86. public ChessColor Color;
  87. /// <summary>
  88. /// 走步价值
  89. /// </summary>
  90. public int value;
  91. public int CompareTo(object obj)
  92. {
  93. return (obj as Put). value - value;
  94. }
  95. }

整个棋盘用一个二维数组表示,board[Row,Col],它的每一格都是一个Chess类型,而Chess包括了颜色和棋子类型两个属性。在象棋里面,颜色是红和黑,类型有将、象、马、车等;在五子棋里面,颜色是白和黑,类型只有空和有。

象棋和五子棋的走步结构也并不一样,象棋是由一个位置移动到另一个位置,而五子棋是直接放棋子在某一个空位上。我们还能注意到,结构里有一个走步价值的属性。它是排序用的,在历史启发算法里使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值