对于棋盘的表示当前比较先进的思想是“位棋盘”。“位棋盘”用于国际象棋非常便捷,因为国际象棋的棋盘正好有64个格子,可以将一个棋盘的信息用一个64位的变量来表示。其基本思想就是用位上的值是1或0来表示棋子在棋盘相应位置上的存在与否,这样做的好处是可以通过位操作运算来加快局面评估和着法生成的速度。当用于中国象棋时需要进行拼凑以表示中国象棋棋盘的90个格子……

由于考虑到本人目前水平精力均着实有限。当前应以实现本程序为首要目标,而不是致力于高质量算法研究,所以就偷懒采用了传统的较为简单的“棋盘数组”——即用一个9*10的数组来存储棋盘上的信息,数组的每个元素存储棋盘上相应位置是何种棋子。这种表示方法简单易行。按此方法棋盘的初始情形如下所示:

BYTE CChessBoard[9][10] = {R,  0,  0,  P,  0,  0,  p,  0,  0,  r,H,  0,  C,  0,  0,  0,  0,  c,  0,  h,E,  0,  0,  P,  0,  0,  p,  0,  0,  e,A,  0,  0,  0,  0,  0,  0,  0,  0,  a,K,  0,  0,  P,  0,  0,  p,  0,  0,  k,A,  0,  0,  0,  0,  0,  0,  0,  0,  a,E,  0,  0,  P,  0,  0,  p,  0,  0,  e,H,  0,  C,  0,  0,  0,  0,  c,  0,  h,R,  0,  0,  P,  0,  0,  p,  0,  0,  r
};

其中”0”表示无棋子,”R”表示红车,”r”表示黑车等等(详见后面的代码),也就是我们给棋盘进行了如下图所示的编号,并约定红方棋子总在棋盘的下方。

下面是CChessDef.h的代码。该头文件定义了象棋相关的基本数据结构,包括棋子棋盘的表示,行棋的基本结构类型等。我同时使用了两种方式来为一个棋子命名,这是为了在有些情况下见名知意而在其它情况下能简单快捷地表示。

// CChessDef.h       // 基本类型定义 //
typedef char BYTE;       typedef struct _point{BYTE x;BYTE y;
} POINT ;            // 棋盘上的点的结构       typedef struct _cchessmove{POINT ptFrom;     // 起点POINT ptTo;         // 目标点int nScore;         // 该走法的历史得分
} CCHESSMOVE ;        // 走法结构       // 下棋方定义
const int HUMAN        = 1;    // 人
const int COMPUTER    = 0;    // 电脑       const int RED    = 1;    // 红方
const int BLACK    = 0;    // 黑方       // 棋子定义 //
//红方棋子定义        红
const BYTE K =    1;    // 帅
const BYTE A =    2;    // 仕
const BYTE E =    3;    // 相
const BYTE H =    4;    // 马
const BYTE R =    5;    // 车
const BYTE C =    6;    // 炮
const BYTE P =    7;    // 兵       //黑方棋子定义        黑
const BYTE k =    8;    // 将
const BYTE a =    9;    // 士
const BYTE e =    10;    // 象
const BYTE h =    11;    // 马
const BYTE r =    12;    // 车
const BYTE c =    13;    // 炮
const BYTE p =    14;    // 卒       //红方棋子定义
#define RED_K    K
#define RED_S    A
#define RED_X    E
#define RED_M    H
#define RED_J    R
#define RED_P    C
#define RED_B    P       //黑方棋子定义
#define BLACK_K    k
#define BLACK_S    a
#define BLACK_X    e
#define BLACK_M    h
#define BLACK_J    r
#define BLACK_P    c
#define BLACK_B    p       //判断该棋子为哪一方
const int SideOfMan[15] ={0, RED, RED, RED, RED, RED, RED, RED,BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, };
//此数组将作为一个“函数”来使用。类似 int SideOfMan( BYTE );       /// 棋局定义//
// 棋盘上棋子分布
BYTE CChessBoard[9][10] = {R,  0,  0,  P,  0,  0,  p,  0,  0,  r,H,  0,  C,  0,  0,  0,  0,  c,  0,  h,E,  0,  0,  P,  0,  0,  p,  0,  0,  e,A,  0,  0,  0,  0,  0,  0,  0,  0,  a,K,  0,  0,  P,  0,  0,  p,  0,  0,  k,A,  0,  0,  0,  0,  0,  0,  0,  0,  a,E,  0,  0,  P,  0,  0,  p,  0,  0,  e,H,  0,  C,  0,  0,  0,  0,  c,  0,  h,R,  0,  0,  P,  0,  0,  p,  0,  0,  r
};       // end of CChessDef.h

转载于:https://www.cnblogs.com/mane/p/6257879.html

[转载] 中国象棋软件-引擎实现(二)棋局表示相关推荐

  1. [转载] 中国象棋软件-引擎实现(一)概述

    2005年6月我系第二批科技小组的项目正式确定为实现一款中国象棋对弈软件.基本功能包括人机对战.网络对战.我负责开发人机对战的引擎部分,也就是让计算机下棋.经过了暑假整整两个月的学习与实践,我终于初步 ...

  2. 中国象棋软件-引擎实现(七)测试程序

    之前我们已经讲了实现一个中国象棋软件的所有要素,本篇我们只是粗略地建一个工程再添加一点文件使得我们能看到程序的运行情况如何. 在界面完成之前,我先建了一个Win32控制台项目(学生朋友们对这个最熟悉也 ...

  3. 中国象棋软件-引擎实现(二)棋局表示

    对于棋盘的表示当前比较先进的思想是"位棋盘"."位棋盘"用于国际象棋非常便捷,因为国际象棋的棋盘正好有64个格子,可以将一个棋盘的信息用一个64位的变量来表示. ...

  4. 中国象棋软件-引擎实现(六)局面评估

    前面已经讲过了棋局表示.着法生成.搜索算法(包括搜索辅助), 在象棋程序中如果说搜索算法是心脏,那么局面评估就是大脑.搜索算法负责驱动整个程序,而局面评估则负责对搜索的内容进行判断评价.因而搜索与局面 ...

  5. 中国象棋软件-引擎实现(一)概述

    程序的基本框架: 从程序的结构上讲,大体上可以将本程序划分为四大部分: 棋局表示. 着法生成. 搜索算法. 局面评估 程序的大概的思想是: 首先使用一个数据结构来描述棋局信息,对某一特定的棋局信息由着 ...

  6. 中国象棋软件-引擎实现(三)着法生成

    我们的程序需要让电脑能够在轮到它走子的时候执行一个它认为对它最有利的着法,那前提就是它要有诸多(也可能是唯一)可供选择的着法,提供所有可选着法的"清单"就是我们的着法生成器所要完成 ...

  7. 中国象棋软件-引擎实现(四)搜索算法

    对于棋类软件的搜索算法经前人的努力已形成了较为成熟的Alpha-Beta搜索算法以及其它一些辅助增强算法.所以小生在自己的程序中直接借鉴了Alpha-Beta搜索算法并辅以了历史启发.对此两者王小春的 ...

  8. 中国象棋通用引擎协议

    一.概述 中国象棋通用引擎协议(Universal Chinese Chess Protocol,简称UCCI),是一种象棋界面和象棋引擎之间的基于文本的通讯协议.设立中国象棋通用引擎协议的目的有: ...

  9. 【C++课程设计】期末大作业 - 基于Qt开发的中国象棋软件

    1 题目 基于Qt的中国象棋软件开发 本博客只是简略的描述论文的大致结构.框架,以及软件开发的大致过程.有兴趣的参考原文档资料. 2总体设计与主要功能 2.1概述 中国象棋是起源于中国的一种棋,属于二 ...

最新文章

  1. 清华浙大年度学生最高奖,都颁向量子物理
  2. 小米履带机器人充电时一直响_小米有品上线擦地机器人,每天放出去溜一圈,老婆夸我家务做的好...
  3. MVC4学习笔记(二)- MVC设计实例,5分钟内完成你的Mvc项目
  4. Apache JMeter rmi 反序列化 cve-2018-1297
  5. EasyRE 寒假逆向生涯(5/100)
  6. 百练OJ:2767:简单密码
  7. Vue 学习 第六天学习笔记
  8. VS中修改站点运行方式(集成 Or 经典)
  9. 保留数据给硬盘增加分区
  10. RabbitMQ 镜像集群之同步策略_专栏讲解
  11. laravel5.6 使用指定字段作为key_MyRocks TTL使用姿势及Bugfix
  12. Python微信公众号后台开发教程001
  13. 【详细服务器配julia】
  14. 读书有益——》生僻字、可能念错的字
  15. 高斯混合模型(matlab代码+注释)
  16. PPT怎么转换成Word文档?分享两种转换小妙招
  17. pip安装及matplotlib安装
  18. Redis分布式缓存学习总结1(安装)
  19. camtasia studio2022电脑屏幕录像录屏剪辑
  20. mac 查ip linux,如何通过mac地址查ip,小编教你Mac怎么查看ip地址

热门文章

  1. 进阶第十一课 Python模块之random
  2. zip压缩工具与tar打包并压缩工具
  3. MaxCompute平台非标准日期和气象数据处理方法--以电力AI赛为例
  4. BIOS基础知识(上)
  5. 自己构造公共程序(3)--DataGrid小方法
  6. Android studio 0.5.0 注意事项
  7. Android中的EditText默认时不弹出软键盘的方法
  8. cts测试之CertificateTest
  9. Date跟String类型之间的转换!
  10. 【刘文彬】 Controller:EOS区块链核心控制器