[技术]编程日记4-就是要玩人机博弈,就是要玩大的

嗯。大概一个半月之前,我写出了自己的人机博弈算法。

我总感觉自己在赎罪。因为那个图书管理系统被老师一轮洗礼,已经让我对自己的能力产生了一定的质疑。

这次我找了两个可靠的队友,和我一起开发这个项目。

 


不知道你小时候有没有玩过另一种中国象棋。32个棋子盖在棋盘的格子里,然后通过翻棋来下,每个棋子只能移动一格,吃与被吃的关系是靠等级大小来决定。而小兵能够吃将帅。

为什么不做正面的象棋?因为在网上有太多中国象棋的人机博弈算法了。有一定难度,但是资料多,这样做起来就有一种抄袭的感觉。

我想自己写一个人机博弈算法,只适用于暗棋也没关系,但我就是想这么做,就算只用if和else去做,也没关系。我只要尝试把它做出来,就行了。


 

我的伙伴太给力了。他们把玩家对战写好了。走棋的规则,吃与被吃的函数做的很棒。于是我只需要在意我人机博弈的这一部分。

我的想法是,判定两步就好。

一、主要思路

  • 主程序构造

将pvp函数中的control_2改为control_c,并且不需要传入坐标,形成新的pvc函数

将control_2函数进行修改,完成走棋部分与翻棋部分

  • 走棋与翻棋
    • 走棋的条件
      •  1.遍历所有节点
      •  2.判定是否为空 或 为背面朝上
      •  3.可以确定为正面朝上,判定是否为己方(电脑)阵营
      •  4.进行该棋子的价值计算
      •  5.若该棋子的价值大于0,则执行吃子函数否则执行翻棋函数
    • 翻棋怎么翻
      • 1.生成一个随机坐标
      • 2.判定该坐标所对应的棋子是否存在或是否背面朝上
      • 3.如是 则翻棋,如否 则重新生成新的坐标继续判定
  • 价值计算与判断
    • 价值表与补充函数与成员
      • 目前的价值为:帅/将:100 ,仕/士:90 ,相/象:80,马:70,车:60,兵/卒:50,炮:80
    • 价值计算方法
      • 以帅为例

QQ截图20160716222338

 

对帅的四个方向分别计算对手的价值,使用eat_com_value()函数。

易知,吃对手的士所获得的价值最大,第一步便会往下走。

然后,我们继续往下看。

QQ截图20160716222427

吃完士之后,会有被对手的小卒吃掉的风险。因此该步数是负的。就不会走往下走这一步。而选择向左走吃掉对手的象。

思路就是这样。

二、函数分析

与原来玩家对战多补充了成员函数:

int eat_con_value_next(int x,int y,int tempx,int tempy,chessboard *p);

struct valueCompare eat_com_value(int x,int y,chessboard *p);

和数据成员

bool canMove

还有一个存初始位置和最终位置的结构体:

除炮外的棋子的价值判断函数基本一致。

故以帅/将进行解释:

(注意!这并非完整的代码。只是供各位学习交流。(虽然我觉得我的叙述差到只有我能看懂。))

最后,依照惯例,发下载地址:

http://pan.baidu.com/s/1c16gDtI