2018/3/17 参照《c/c++中国象棋程序入门与提高》一书进行中国象棋人机对弈程序的编写。对书中的算法自己动手实现,和原书上的代码大有不同。
局面表示:
1. 整数转换成对应的字符
书中算法及代码:
我的代码如下:
//written by dingshengli 2018-3-17
//棋子值转换成对应的字符
#include<iostream>
using namespace std;
char intTochar(int a){
if(a&16){
switch(a){
case 16: return 'K'; break;
case 17:
case 18: return 'A'; break;
case 19:
case 20: return 'B'; break;
case 21:
case 22: return 'N'; break;
case 23:
case 24: return 'R'; break;
case 25:
case 26: return 'C'; break;
case 27:
case 28:
case 29:
case 30:
case 31: return 'P'; break;
default: return 0; break;
}
}
else{
a = a-16;
switch(a){
case 16: return 'k'; break;
case 17:
case 18: return 'a'; break;
case 19:
case 20: return 'b'; break;
case 21:
case 22: return 'n'; break;
case 23:
case 24: return 'r'; break;
case 25:
case 26: return 'c'; break;
case 27:
case 28:
case 29:
case 30:
case 31: return 'p'; break;
default: return 0; break;
}
}
}
运行结果:
2 一维数组转换成FEN串
/*16*16二维数组转换成一维数组*/
int chess[16][16],position[256];/*扩展数组可以用空间的浪费换取时间*/
int k =0;
for(int i=0;i++;i<16)
for(int j=0;j++;j<16){
k =i<<4+j;//左移节省时间
position[k] =chess[i][j];
}
char fenString[128];
int arrayTostring(){
char *str =null;//直接对数组操作不方便
for(int i=3;i<=12;i++){
int k=0;
for (int j = 3; i <=11 ; j++)
{
pc =position[i<<4+j];
if(pc!=0){
if(k>0){
*str =k+'0';
str++;
k =0;
}
*str =intTochar(pc);
str ++;
}
else
{
k++;
}
if(k>0){
*str =k+'0';
str++
}
*str ='/'
str ++;
}
str--;
*str =' ';
str++;
*str =(side==0?'w':'b');
str++;
*str =' ';
return 0;
}
3 FEN转一维数组
//可能有点问题
int clearArray(){
for (int i = 0; i < 256; ++i)
{
position[i] =0;//position一定是全局定义的
}
return 0;
}
int stringToarray(){
const char *p =fenString;
int pcWhite[7] ={16,17,19,21,23,25,27};
int pcBlack[7] ={32,33,35,37,39,41,43};
//设置每一个棋子的初始值,加1表示转换到另一个棋子,这样方便操作
clearArray();
if(*str ='\0'){
return 0;
}
int i =3;
int j =3;
while(str != ' '){
if(*p=='/'){
i++;
j =3;//转到下一行的开头
if(i>12)
break;
}
if(*p >='1'&&*p<='9'){
for(int k=0;k<(*p-'0');k++){
if(j>11) break;
j++;
}
}
if(*p>='A'&&*p<='Z'){
if(j<=11){
k =charTosubscript(*p);
if(k<7){
if(pcWhite[k]<32){
position[(i<<4)+j] =pcWhite[k];
pcWhite[k]++;//切换成另一个同名棋子
}
}
j++;
}
}
if(*p>='a'&&*p<='z'){
if(j<=11){
k =charTosubscript(*p);
if(k<7){
if(pcBlack[k]<48){
position[(i<<4)+j] =pcWhite[k];
pcBlack[k]++;//切换成另一个同名棋子
}
}
j++;
}
}
str ++;
if(*p =='\0'){
return 0;
}
}
str ++;
if(*str =='b')side =1;
else side =0;
return 0;
}