2011-10-19 46 views
1

我目前正在編寫使用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 

低於此的是跳棋.h文件中(它不不包括printBoard()旁邊的所有其他方法調用)和checkers.c文件(僅包括printBoard方法和結構方調用)

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 

我試圖只是調用狀態 - > PrintBoard()但程序無法識別該呼叫。我也嘗試在計算機頭文件的狀態結構中添加一個Square結構,但也會產生錯誤。我還在computer.c文件中創建了一個新的PrintBoard方法,但它不知道每個方塊中的哪種顏色狀態。任何幫助將不勝感激,我可以發佈更多的代碼,如果需要的話。

+3

你爲什麼認爲PrintBoard連接狀態?這是C還是C++?我覺得你很困惑。在C中沒有類或方法。 – Falmarri

+1

你很困惑... – mtahmed

+0

我們的老師給了我們所有的代碼來運行這個程序,除了實際的搜索功能,但要求我們在每個評估狀態下使用PrintBoard打印板()方法從一個不同的類。我只是遇到問題試圖找出如何使用該方法的另一個類需要訪問的Square結構 – Kat

回答

4

隨着代碼當前編寫的方式,PrintBoard是一個獨立的函數,因爲它應該是在C程序中......它不是像C++一樣的State類的方法。因此,如果你想調用state->PrintBoard(),你將不得不使用State類的該方法,並使用C++編譯器編譯你的程序......否則,如果你想保持它作爲一個獨立的函數,並且使用C編譯器,您將不得不添加State*參數到PrintBoard,然後將其稱爲PrintBoard(state)

-2

大多數(如果不是全部的話)遊戲程序員使用一維棋盤。另外,對於棋子,您可以省略一半的方塊,因爲它們不被使用。

+1

這不是問題... – mtahmed

+0

它避免了很多麻煩。 – wildplasser

+1

是的,我知道這是相關的,但仍然不是答案...你應該在評論中說這個... – mtahmed

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功能。

而且,決定你是否正在做面向對象或不。你聽起來很迷惑。

+0

我沒有寫任何這樣的代碼。它是我們的老師給我們的,我們只需要實現實際的搜索功能。但是,他希望我們使用預先編寫的代碼並對其進行修改,以便在每個評估狀態下打印該板,以確保啓發式功能是正確的。 – Kat

+0

然後,只需將該函數放入State類即可。另外,你使用什麼語言? C還是C++? – mtahmed

+0

我們在這個程序中使用C – Kat