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

对于棋盘的表示当前比较先进的思想是“位棋盘”。“位棋盘”用于国际象棋非常便捷,因为国际象棋的棋盘正好有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
时间: 2024-10-09 20:12:57

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

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

2005年6月我系第二批科技小组的项目正式确定为实现一款中国象棋对弈软件.基本功能包括人机对战.网络对战.我负责开发人机对战的引擎部分,也就是让计算机下棋.经过了暑假整整两个月的学习与实践,我终于初步完成了程序,虽然电脑的下棋水平实在不敢恭维,但好歹也是我心血所成,所以就苟且将其命名为scCChess1.0版本,整理一下发到blog上来.(本程序在8月底就完工了,之所以现在才贴上来是因为我本想在这个学期对它进行改善,力求让电脑的下棋水平再上一个层次之后再贴出来,免得众老鸟笑话.结果这个学期实在是

JavaScript中国象棋程序(0) - 前言

"JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.希望通过这个系列,我们对博弈程序的算法有一定的了解.同时,我们也将构建出一个不错的中国象棋程序. JavaScript中国象棋程序系列共有9个部分: 0.JavaScript中国象棋程序(0)- 前言 1.JavaScript中国象棋程序(1)- 界面设计 2.JavaScript中国象棋程序(2)- 校验棋子走法 3.JavaScript中国象棋程序(3)- 电脑自动走棋 4.J

中国象棋棋子及棋盘的绘制

一.题目简介 本课程设计主要是使用Swing这个Java自带的图形开发工具实现中国象棋棋子及棋盘的绘制,并根据相应的象棋规则,可以设计棋谱,完成棋谱的保存和对已保存的棋谱的演示,方便现在爱棋人士对残局的收藏于研究,而且达到了进一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念及其面向对象的特性,熟练的应用面向对象的思想和设计方法解决实际问题的能力的目的. 1.当两方有一方将(帅)被吃掉后,程序不能自动结束或提示游戏结束,但想到该程序并不是要进行两方对弈,而是要设计棋谱所以在能力实现范围内

Qt版本中国象棋开发(四)

内容:走法产生 中国象棋基础搜索AI, 极大值,极小值剪枝搜索, 静态估值函数 理论基础: (一)人机博弈走法产生: 先遍历某一方的所有棋子,再遍历整个棋盘,得到每个棋子的所有走棋情况(效率不高,可以改进) 1 void SingleGame::getAllPossibleMove(QVector<Step *> &steps) 2 { 3 int min, max; 4 if(this->_bRedTurn) 5 { 6 min = 0, max = 16; 7 } 8 els

中国象棋将帅问题

中国象棋将帅问题 flyfish 2015-8-11 问题引自 <编程之美>中国象棋将帅问题 将帅每一着只许走一步,前进.后退.横走都可以,但不能走出"九宫",被限制在3×3的格子里运动.将和帅不准在同一直线上直接对面. 请写出一个程序,输出将帅所有合法的位置,要求在代码中只能使用一个变量. 约定用a表示"将",b表示"帅" 一个解法是关于位操作 跳过 原文提供解法一 struct { unsigned char a:4; unsig

团队-团队编程项目中国象棋-项目总结

一. 项目背景: 中国象棋是一款益智类的游戏.采用html ,css,js,开发一个操作简单,功能较全的"中国象棋"游戏. 二.功能说明 1.使用鼠标对棋子进行控制,让棋子按规则运动. 3.初始场景棋子按照规则摆放,每次落子没有时间限制. 4.可以进行人机对战,按照规则判断胜负 三.设计思路 这个程序的关键是棋子的行走规则和判断胜负的条件.每个棋子都有自己的移动规则.游戏通过鼠标点击控制. 四.技术要点 1.棋子的处理 2.棋子移动的处理 3.棋子被吃掉时的处理 4判断游戏是否胜利 5

团队-中国象棋-项目总结

一. 项目背景: 中国象棋是一款益智类的游戏.采用html ,css,js,开发一个操作简单,功能较全的"中国象棋"游戏. 二.功能说明 1.使用鼠标对棋子进行控制,让棋子按规则运动. 3.初始场景棋子按照规则摆放,每次落子没有时间限制. 4.可以进行人机对战,按照规则判断胜负 三.设计思路 这个程序的关键是棋子的行走规则和判断胜负的条件.每个棋子都有自己的移动规则.游戏通过鼠标点击控制. 四.技术要点 1.棋子的处理 2.棋子移动的处理 3.棋子被吃掉时的处理 4判断游戏是否胜利 5

中国象棋残局库构建[抄]

残局库是经特别算法产生的特定格式的.储存各限定棋子数目的残局之所有局面及其估值的数据库文件集合.概述地说,残局数据库是储存了残局局面并经回溯分析计算过的数据库文件,它使用在棋弈程序上,当进入残局时,只要适合使用的残局数据库文件存在,程序将走得非常完美. 多数棋弈引擎并不一定要到达残局库所涵盖的局面时才使用残局库.例如,在到达如此局面之前几步,引擎计算(但还没走棋)一系列交换之后直接进入残局库里存有的局面.引擎于是搜索探查残局库并取得那个设想局面的结果.如此当然提高了棋力. 在残局库的开发方面,K

1.2中国象棋将帅问题

(根据中国象棋的基本原则)在只有双的将帅棋盘上,找出所有双方可以落子的位置(将帅不能碰面),但只能使用一个变量. 直觉上我们想到,只要遍历将帅所有可能的位置,去除将帅冲突的位置即可.可见,剩下的问题就在于如何使用一个变量来做二重循环的遍历.书中解法一给出的方法是将一个Byte变量拆成两个用,前一半代表"帅"可以走的位置,后一个变量代表"将"可以走的位置(事先已经将"将"和"帅"可以走的3*3的位置进行了编号),利用位操作即可获