2011-10-19 28 views
1

私は現在、アルファベットプルーニングとヒューリスティックを使用してゲームをプレイするチェッカープログラムを作成しています。ボードの評価時にボードを印刷しようとしていますが、問題が発生して動作しています。私の先生は、プログラムを実行するために必要なすべてのコードから、評価関数とアルファベータプルーニング関数を除いたものを教えてくれました。ボードを印刷する方法は、チェッカーゲームにとって最良の動きを見つける方法とは異なるクラスにあります。チェッカーチェッカーボードの印刷

以下は、我々はボードにこの下に

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 

を印刷したいところである検索機能クラスヘッダー(それはメソッド呼び出しのすべてが含まれていません)とevalBoard方法の額面あるあります.hファイルはとcheckers.cファイル私はちょうど状態を呼び出そう

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方法及び構造体の正方形のコールが含まれます)(それはPrintBoard()の横にある他のすべてのメソッド呼び出しを含まないいません) - > PrintBoard()、プログラムが呼び出しを認識できませんでした。私はまた、コンピュータのヘッダーファイルのState構造体にSquare構造体を追加しようとしましたが、これもエラーを作成しました。私もcomputer.cファイルに新しいPrintBoardメソッドを作成しましたが、どの色の状態が各四角形に入っているのか分かりません。何か助けていただければ幸いです。必要に応じて私が持っているコードを投稿することができます。

+3

なぜPrintBoardが状態に接続されていると思いますか?これはCかC++ですか?私はあなたが混乱していると思う。 Cでクラスやメソッドなどのことはありません。 – Falmarri

+1

あなたは混乱しています... – mtahmed

+0

先生は、実際の検索機能を除いてこのプログラムを実行するためのコードをすべて教えてくれましたが、PrintBoardを使用して各評価状態でボードを印刷するようにお願いしました()メソッドを別のクラスから削除します。私はちょうどスクエアの構造体へのアクセスが必要な別のクラスのためにそのメソッドを使用する方法を理解しようとしていた – Kat

答えて

4

あなたのコードが現在書かれている通り、PrintBoardはスタンドアローンの関数なので、Cプログラムでなければなりません。C++のようにStateクラスのメソッドではありません。したがって、state->PrintBoard()を呼び出す場合は、その関数をStateクラスのメソッドにし、C++コンパイラを使用してプログラムをコンパイルする必要があります。スタンドアロン関数として保持する場合は、 Cコンパイラを使用する場合は、引数をPrintBoardに追加し、PrintBoard(state)のように呼び出す必要があります。

-2

ゲームプログラマーの多くは、すべてではないにしても1つのディメンショナルボードを使用しています。また、チェッカーの場合は、四角形の半分を省略することができます。これは、使用されていないためです。

+1

それは質問ではなかった... – mtahmed

+0

それは多くのトラブルを避ける。 – wildplasser

+1

はい、これは関連していますが、答えはまだわかりません...コメントでこれを言う必要があります... – mtahmed

1

State構造体内にメソッドPrintBoard()を置き、代わりに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