Печать шахматной доски - PullRequest
       3

Печать шахматной доски

1 голос
/ 20 октября 2011

В настоящее время я пишу программу для проверки, которая использует альфа-бета-обрезку и эвристику для игры.Я пытаюсь распечатать доску при оценке платы, и я сталкиваюсь с проблемами, заставляя ее работать.Мой учитель дал нам весь код, который нам нужен для запуска программы, за исключением функции оценки и функции сокращения альфа-бета.Метод печати доски находится в другом классе, чем методы поиска лучшего хода для игры в шашки.

Ниже приведена часть заголовка класса функции поиска (она не включает все вызовы метода) и метод 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 ()) и шашкиФайл .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-> PrintBoard (), но программа не смогла распознать вызов.Я также попытался добавить структуру Square в структуру State в файле заголовка компьютера, но это также привело к ошибке.Я также создал новый метод PrintBoard в файле computer.c, но он не знал, какое состояние цвета было в каждом квадрате.Буду признателен за любую помощь, и я могу опубликовать больше кода, который у меня есть, если нужно.

Ответы [ 3 ]

4 голосов
/ 20 октября 2011

При таком способе написания кода, PrintBoard - это отдельная функция, как и в C-программе ... это не метод класса State, как в C ++.Поэтому, если вы хотите вызвать state->PrintBoard(), вам нужно будет сделать эту функцию методом класса State и использовать компилятор C ++ для компиляции вашей программы ... в противном случае, если вы хотите сохранить ее как подставкуи использовать C-компилятор, вам нужно добавить State* аргумент к PrintBoard, а затем вызвать его как PrintBoard(state).

1 голос
/ 20 октября 2011

Поместите метод 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 голосов
/ 20 октября 2011

Большинство (если не все) программисты игр используют одноразмерную доску.Также для шашек вы можете опустить половину квадратов, так как они не используются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...