我目前正在编写一个使用alpha-beta修剪和启发式游戏的检查程序。我正在尝试打印董事会评估董事会,我遇到了让它工作的问题。我的老师给了我们运行程序所需的所有代码减去评估函数和alpha-beta修剪函数。打印棋盘的方法与为棋盘游戏找到最佳动作的方法不同。
下面是搜索功能类标题的一部分(它不包括所有方法调用)和我们想要打印电路板的evalBoard方法
double evalBoard1(State *state) {
int x, y;
double rval = 0.0;
double rval2 = 0.0;
evals++;
for (x = 0; x < 8; x++)
for (y = 0; y < 8; y++) {
if (x % 2 != y % 2 && !empty(state->board[y][x])) {
if (king(state->board[y][x])) { /* King */
if (((state->board[y][x] & White) && !player1)
|| (!(state->board[y][x] & White) && player1))
rval += 2.0;
else
rval2 += 2.0;
} else if (piece(state->board[y][x])) { /* Piece */
if (((state->board[y][x] & White) && !player1)
|| (!(state->board[y][x] & White) && player1))
rval += 1.0;
else
rval2 += 1.0;
}
}
}
state->PrintBoard(); //should print the board
fprintf(stderr,"Value = %g\n",rval); //prints the evaluation of that board
if(rval <= 0.0) return -10000.0;
if(rval2 <= 0.0) return 10000.0;
return rval - rval2;
}
#ifndef COMPUTER_H
#define COMPUTER_H
#define Empty 0x00
#define Piece 0x20
#define King 0x60
#define Red 0x00
#define White 0x80
#define number(x) ((x)&0x1f)
#define empty(x) ((((x)>>5)&0x03)==0?1:0)
#define piece(x) ((((x)>>5)&0x03)==1?1:0)
#define king(x) ((((x)>>5)&0x03)==3?1:0)
#define color(x) ((((x)>>7)&1)+1)
#define Clear 0x1f
typedef struct{
int player;
char board[8][8];
char movelist[48][12];
int numLegalMoves;
}State;
//all method calls occur after here
#endif
下面是checkers.h文件(它不包括PrintBoard()旁边的所有其他方法调用)和checkers.c文件(仅包括printBoard方法和Struct方形调用)
struct Square square[16][16];
void PrintBoard() {
int board[8][8];
int x,y;
char ch = 127;
for(y=0; y<8; y++)
{
for(x=0; x<8; x++)
{
if(x%2 != y%2) {
if(square[y][x].state) {
if(square[y][x].col)
{
if(square[y][x].state == King) board[y][x] = 'B';
else board[y][x] = 'b';
}
else
{
if(square[y][x].state == King) board[y][x] = 'A';
else board[y][x] = 'a';
}
} else board[y][x] = ' ';
} else board[y][x] = ch;
printf("%c",board[y][x]);
}
printf("\n");
}
}
#ifndef CHECKERS_H
#define CHECKERS_H
#define Empty 0
#define Piece 1
#define King 2
#define HUMAN 1
#define COMPUTER 2
struct Square {
Widget widget;
int val;
int state;
int col;
int hilite;
};
void PrintBoard();
#endif
我试图只调用state-&gt; PrintBoard(),但程序无法识别该调用。我还尝试将Square结构添加到计算机头文件中的State结构中,但也创建了一个错误。我还在computer.c文件中创建了一个新的PrintBoard方法,但它不知道每个方块中的颜色状态。任何帮助将不胜感激,如果需要,我可以发布更多代码。
答案 0 :(得分:4)
根据您当前编写代码的方式,PrintBoard
是一个独立的函数,因为它应该在C程序中......它不像State
类的方法一样有C ++。因此,如果要调用state->PrintBoard()
,则必须使该函数成为State
类的方法,并使用C ++编译器编译程序...否则,如果要保留它作为一个独立的函数并使用C编译器,您将不得不向State*
添加PrintBoard
参数,然后将其称为PrintBoard(state)
。
答案 1 :(得分:1)
将方法PrintBoard()
放在State
结构中,然后使用C ++。然后你可以拨打state->PrintBoard()
。
typedef struct{
void PrintBoard() { // <---this is what you need to do
...
}
int player;
char board[8][8];
char movelist[48][12];
int numLegalMoves;
}State;
如果您不想这样做,请将其称为PrintBoard(state)
并更改PrintBoard
功能。
而且,还要决定你是否正在进行面向对象。你听起来很困惑。
答案 2 :(得分:-2)
大多数(如果不是全部)游戏程序员使用一维板。此外,对于检查器,您可以省略一半的方块,因为它们没有被使用。