求一个中国象棋的算法最好是VB的,C的也行!写了!我的QQ 489646530@QQ.COM

供稿:hz-xin.com     日期:2025-01-14
c++程序设计 中国象棋源代码

我提供两个功能完善,而且最重要的,我认为算法设计比较好的中国象棋源代码,因为是源码网的,所以可以学习参考下:
http://www.codefans.net/soft/1466.shtml
http://www.codefans.net/soft/1289.shtml

  先弄明白数据的结构:
  MantisChessDef.h里的东西一定要先看一下, 否则会摸不到头脑的。
  还有棋盘坐标:
  象棋棋盘大小9x10,为了便于编程,规定棋盘每条边留有一个元素的边界。
  这样棋盘大小(包括边界)变成11x12。棋盘x坐标轴向右,y轴向下。
  黑棋永远在上方,在标准开局时左上角的黑车坐标是(1,1)。

  局面用这三个变量表示:

  static POINT g_pointChessman[32]; //棋子坐标
  static int g_iChessmanMap[11][12]; //棋位状态
  static int g_iSide; //轮到哪方走

  智能部分有几个函数的前三个参数就是这个东西, 应该不难理解吧?

  ---------------------------------------------------------------------------------------
  search函数:

  先说明一下, 经常有朋友问我要原理, 但我公开源代码是给大家一个参考, 而不是什么教程,所以我不想说那些理论的东西。
  基本原理是α-β搜索, 很多人工智能的教科书上都有讲到, 没看过的的赶快去找一本来啃一啃;
  虽然这些书上的文字大多晦涩难懂,但毕竟讲得明明白白。
  没有书的朋友请发挥一下主观能动性, 去找一找,不要来问我要, 因为我也没有。

  我在这里只分析一下search函数:

  弄懂α-β搜索后来看看这个博弈树, 看怎么编程实现它。

  先规定一下, 我们用一个整数表示局面的好坏.
  这个数越大说明局面对 "走棋方" 越有利,0表示双方实力相等。

  1a( 1) ┬ 2a(-1) ┬ 3a(-1)
  │ └ 3b( 1)
  └ 2b(-5) ┬ 3c( 2)
  ├ 3d(-4)
  └ 3e( 5)

  分析一下这棵树,有这么个特点: 父结点的值 = -MAX(子结点的值)

  我们还知道1、每个结点对应一个局面。2、底层的结点的值是"估"出来的。

  于是我们可以写出伪代码了:

  伪代码: 搜索一个结点下的分支, 得到这个结点的值。

  参数: 局面,搜索深度

  返回值:结点的值

  int search(局面,int depth)
  {
  if(depth!=0)//不是底层结点
  {

  枚举出所有子结点(列出所有走法);

  int count=子结点数;
  int maxvalue= -∞;
  for(int i=0;i<count;i++)//遍历所有结点
  {
  算出子结点局面;

  maxvalue=max(maxvalue,search(子结点局面,depth-1));
  }
  return -maxvalue;
  }
  else //是底层结点
  {
  return 估计值;
  }
  }

  这就是搜索算法的框架, 用到了递归。
  MantisChess的智能部分函数都在MantisChessThink.cpp里, 其中search是搜索, 跟上面的这个search差不多,我把它copy出来注释一下:

  int Search(int tmap[11][12],POINT tmanposition[32],int &tside,int man, POINT point,int upmax,int depth)
  {

  //前面的三个参数就是局面。
  //man 和point 是走法,用来计算本结点的局面。 这里是把计算局面放在函数的开头,跟上面的伪代码不太一样。
  //upmax: up - 上一层, max - 最大值, 这是α-β的剪枝用到的东西, 后面再讲。
  //depth: 搜索深度

  int ate,cur,maxvalue,curvalue,xs,ys;
  int count;

  //#####################这一段是计算本结点的局面#########################################
  ate=32;
  //移动棋子:
  xs=tmanposition[man].x;ys=tmanposition[man].y; //原坐标
  if (SideOfMan[tmap[point.x][point.y]]==!tside) //目标点有对方的棋子
  {
  ate=tmap[point.x][point.y]; //记录下被吃掉的棋子
  if(ate==0 || ate==16)
  {
  return 9999;
  }
  tmanposition[ate].x=0; //目标点的棋子被吃掉
  }

  tmap[point.x][point.y]=man; //这两行是:
  tmap[xs][ys]=32; //在map上的移动
  tmanposition[man]=point;
  tside=!tside;
  //####################################################################################

  depth--;

  if(depth>0) //不是底层结点
  {
  int chessman[125];
  POINT targetpoint[125];
  if(EnumList(tmap,tmanposition,tside,chessman,targetpoint,count)) //枚举出所有子结点(列出所有走法)
  {
  //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  //这里是剪枝(不是α-β剪枝), 原理是在正式搜索之前先用较浅的搜索来得到误差较大的值
  //然后根据这些值来对子结点排序, 只保留最好的S_WIDTH个结点进行正式搜索。
  //显然,这个剪枝有一定的风险

  if(depth>=2 && count>S_WIDTH+2)
  {
  int value[125];
  cur=0;
  maxvalue=-10000;
  while(cur< count)
  {
  curvalue=Search(tmap,tmanposition,tside,chessman[cur],targetpoint[cur],-10000,depth-2);
  value[cur]=curvalue;
  if(curvalue>maxvalue)maxvalue=curvalue;
  cur ++;
  }
  ::Mantis_QuickSort(value,chessman,targetpoint,0,count-1); //排序
  count=S_WIDTH;//剪枝
  }
  //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  maxvalue=-10000;
  cur=0;
  while(cur< count)
  {
  curvalue=Search(tmap,tmanposition,tside,chessman[cur],targetpoint[cur],maxvalue,depth);
  if(curvalue>maxvalue)maxvalue=curvalue;
  if(curvalue>=-upmax)goto _ENDSUB; //α-β剪枝, 符合剪枝条件的就Cut掉。 这里用了goto语句了, 千万别学我。
  cur ++;
  }
  }
  else maxvalue=9800;
  }
  else //是底层结点
  {
  maxvalue=Value(tmap,tmanposition,tside); //估值
  }

  _ENDSUB:

  //返回之前要恢复父结点的局面
  //####################################################################################
  tmanposition[man].x=xs; //这两行是:
  tmanposition[man].y=ys; //在face上的恢复
  tmap[xs][ys]=man; //在map上的恢复
  if(ate!=32)
  {
  tmanposition[ate]=point;
  tmap[point.x][point.y]=ate;
  }
  else tmap[point.x][point.y]=32;

  tside=!tside;
  //####################################################################################

  return -maxvalue;
  }

  上面的代码用到了α-β剪枝, 举个例子就明白了:

  还是这个博弈树,从上往下遍历。

  1a( 1) ┳ 2a(-1) ┳ 3a(-1)
  ┃ ┗ 3b( 1)
  ┗ 2b(-5) ┯ 3c( 2)
  ├ 3d(-4)
  └ 3e( 5)

  2a遍历完后 upmax=-1, 继续遍历完3c后返回2b, 发现3c=2>-upmax, 这时就不用管3d和3e了, 因为无论他们的值是多少 2b=-max(3c,3d,3e)<2a 一定成立,
  也就是说2b可以安全地剪掉。这就是α-β剪枝。

  从上面的代码来看我的MantisChess算法与标准的α-β剪枝搜索并没有什么不同, 只不过加了排序和剪枝而已。

那个工程量很大的,你提供思想的话我可以给你翻译成代码

vb程序设计,一次象棋比赛,要求每位参赛选手与所有对手对弈一局,一共...
Private Sub Command2_Click()Dim x As Integer Dim sum As Integer x = 2 While sum <> 300 x = x + 1 sum = f(x)Wend MsgBox x End Sub Private Function f(ByVal x As Integer) As Integer f = 0 While x > 1 x = x - 1 f = f + x Wend End Function 答案是25个人...

用VB语言编写代码 在象棋的的棋盘第一格放一颗麦粒,第二格放两颗麦粒...
Private Sub Command1_Click()s = 1 t = 1 For i = 2 To 64 t = t + t s = s + t Next i Print "64个格子全部放完麦子,"Print "总共为"; s; "粒"End Sub

中国象棋 VB 源代码
给你几个下源码的网站吧!!!代码中国:洪越源代码!:源代之家:源码天下:源码网 - 源码发布与下载:中国源码中心:中国站长下载源码下载,:

VB编程的一个问题,VB好学还是Office好学呢。
就我所知,算法在以学习语言为目的的课程中是非常轻视的,讲了排序和查找就不错了,搜索,还真没见到过(DFS涉及递归,BFS涉及队列),全国计算机等级考试二级VB方面的算法要求也就只有排序和查找,基本不好写棋类游戏。不过,棋类中有一个想写出来的话,算法部分还算很简单的——黑白棋,而且最笨的...

我想制作一个小游戏,不是FLASH的,想中国象棋那样的,新手好做吗?
你可以用gamemaker来做,会基本英语和C++语言会好做,不会也只是麻烦点。双人对战好做些,可以先做人与人玩的。要做人机对战需要一些算法(思路是对各种情况设立权值,然后是带启发函数的广度优先搜索,当然这只是初步的AI)。

一枚中国象棋棋子的底面半径是二厘米这样的一副中国象棋32枚棋子的底...
4×3.14×32=401.92

VB编游戏功能怎样??
使用 vc++和DirectX的SDK vb也可以使用DirectX,当然也可以编游戏。事实上DirectX算是一种微软专门为游戏和多媒体提供的组件技术,是和语言无关的 在具体一点,好的游戏是vc环境下的win32 SDK+DirectX开发的,如果使用MFC或VB都需要运行环境的支持,换句话说,有一个中间层(比如说win98就不能直接运行...

VB实用的可具体做哪些小软件?最好有实例
可做小游戏类:五子棋、华容道、中国象棋、推箱子……可做课件:演示物体运动、进行某种谋算,实用小工具:练习打字的软件、比赛用的计时器、抽号器……我开发过通用数据库管理程序。可以用vb操作EXcel,进行统计,从而做成统计工具,适合工厂车间用 对实验数据进行统计 可直观演示动态数据,做成演示板,如...

求象棋里的将帅走法规则
将帅只能在"九宫"之内活动,可上可下,可左可右,每次走动只能按竖线或横线走动一格。将帅只能在"九宫"之内活动,可上可下,可左可右,每次走动只能按竖线或横线走动一格。帅与将不能在同一直线上直接对面,否则走方判负;是全局的中心,胜负的标志。除在残局阶段,一般没有实战能力,在全局中应以“...

谁有中国象棋入门快易精4VCD百度云资源链接请发我一下地址谢谢_百度知 ...
链接: https:\/\/pan.baidu.com\/s\/13m01DuQAd5kAjcu6ksR9gQ 提取码: vbcx 中国象棋入门快易精4VcD百度网盘打包资源课程。