2017-01-13 16 views
6

Так что я занимаюсь шахматной игрой, однако я не могу правильно перемещать часть епископа.C++ - Ошибка шахматного Bishop MoveCode?

Это моя шахматная доска:

string board[8][8] = { 

{"_" , "_", "_" , "_" ,"_", "_" , "_" , "_"}, 
{"_" , "_", "_" , "_" ,"_", "_" , "_" , "_"}, 
{"_" , "_", "_" , "_" ,"_", "B" , "_" , "_"}, 
{"_" , "_", "_" , "_" ,"_", "_" , "_" , "_"}, 
{"_" , "_", "_" , "_" ,"_", "_" , "_" , "_"}, 
{"_" , "_", "_" , "_" ,"_", "_" , "_" , "_"}, 
{"_" , "_", "_" , "_" ,"_", "_" , "_" , "_"}, 
{"_" , "_", "_" , "_" ,"_", "_" , "_" , "_"} }; 

Вот функция Draw, чтобы нарисовать доску.

void Draw() 
{ 
for(int i = 0; i < 8; i++) 
{ 
    for(int j = 0; j < 8; j++) 
     std::cout << board[ i ][ j ] << ' '; 

    std::cout << '\n'; 
} 
cout<<"\n"; 
} 

Епископский код движения до сих пор.

if (board[x][y] == "B") 
{  //Highlight the users chosen piece 
    board[x][y] = "\033[0;31mB\033[0m"; 
    //Now showing available moves the chosen bishop can move to 
    for(int counter=1; counter <=7; counter++) { 
     if(board[x+counter][y+counter] == "_") { //if there is an empty space, then place X to show peice can move there 
      board[x+counter][y+counter] = "X"; 
     } 
     else { //if cannot move their ,then break 
      break; 
     } 
    } 
} 

Это моя проблема. Он показывает пробелы X, которые кусок может перемещаться к пользователю в некоторых местах на доске. однако, когда кусок находится в определенных местах массива, как место, которое оно находится в коде платы. Он перекрывает и показывает Xs на другой стороне платы, вместо того, чтобы останавливать рисование Xs, когда их нет «_».

+0

Вы пытались выполнить свой код с помощью отладчика? –

+2

У вас превышены и недоиспользуются индексы платы [x + counter] [y + counter]. – PanicSheep

+0

кроме комментария @ PanicSheep, епископ также движется назад. – bansi

ответ

7

Вам необходимо проверить, не попали ли x + counter и y + counter.

if (board[x][y] == "B") 
{  //Highlight the users chosen piece 
    board[x][y] = "\033[0;31mB\033[0m"; 
    //Now showing available moves the chosen bishop can move to 
    for(int counter = 1; (x + counter) <= 7 && (y + counter) <= 7; counter++){ 
     if(board[x + counter][y + counter] == "_") { 
      //if there is an empty space, then place X to show peice can move there 
      board[x + counter][y + counter] = "X"; 
     } 
     else { //if cannot move their ,then break 
      break; 
     } 
    } 
} 

Конечно, это отмечает только одно направление, в то время как епископ может фактически двигаться в четырех направлениях.

Кроме того, это не проверяет, есть ли какие-либо фрагменты между дорожкой.

Чтобы рассмотреть все четыре направления, вы можете создать матрицу направлений, которая сохраняет изменение в x и y для каждого из направлений.

// 4 directions in which bishop can move 
int dx[4] = {-1, -1, 1, 1}; 
int dy[4] = {-1, 1, -1, 1}; 


if (board[x][y] == "B") 
{ 
    // for each direction 
    for(int dir = 0; dir < 4; dir++) { 

     // the bishop can move to a maximum of 7 squares 
     for(int counter = 1; counter < 8; counter++) { 

      // calculate where the bishop will be 
      // after moving "counter" number of squares 
      int new_x, new_y; 
      new_x = x + dx[dir] * counter; 
      new_y = y + dy[dir] * counter; 

      // check if the square lies within the board 
      if(new_x >= 0 && new_x < 8 && new_y >= 0 && new_y < 8) { 

       // if there is an empty space, then place X to show peice can move there 
       if(board[cur_x][cur_y] == "_") { 
        board[cur_x][cur_y] = "X"; 
       } 

       // if there is any other piece in between, the bishop can't move further 
       else { 
        break; 
       } 
      } 

      // break if the square is outside the board 
      else { 
       break; 
      } 
     } 
    } 
} 
+0

Благодарим за отзыв. Я многому научился от вашего ответа. –

+1

Отличный ответ! ;) '++' – Inian

+0

Спасибо @Inian :) –

 Смежные вопросы

  • Нет связанных вопросов^_^