У меня проблема с моим кодом.
Когда я добавляю элемент в 2d-массив, вместо этого добавляется два. Вот некоторые результаты, которые помогут объяснить проблему:
Blank game board:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Adding to board: 7, 0
After adding first piece:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 7
7 0 0 0 0 0 0 0
Found a 7 at: 6, 7
Found a 7 at: 7, 0
Я инициализирую 2D-массив (я пробовал локально и глобально), где каждый элемент равен 0. Затем я добавляю игровую фигуру на доску.
Вот мой полный код:
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
// 2D array representing the board
int gameBoard[7][7];
// Translates chess code to array index
int translate(char letter){
if ( letter == 'a' || letter == '8' ){
return 0;
} else if ( letter == 'b' || letter == '7' ){
return 1;
} else if ( letter == 'c' || letter == '6' ){
return 2;
} else if ( letter == 'd' || letter == '5' ){
return 3;
} else if ( letter == 'e' || letter == '4' ){
return 4;
} else if ( letter == 'f' || letter == '3' ){
return 5;
} else if ( letter == 'g' || letter == '2' ){
return 6;
} else if ( letter == 'h' || letter == '1' ){
return 7;
} else {
return -1;
}
}
// Displays current game board
void showBoard(){
for (int i = 0; i <= 7; i++) {
for (int j = 0; j <= 7; j++) {
cout << gameBoard[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
// Initiates game board
void initBoard(){
for (int i=0; i <= 7; i++){
for (int j=0; j <= 7; j++){
gameBoard[i][j] = 0;
}
}
}
// Adds a piece to the board
void addPiece(string square){
int x = translate(square[1]);
int y = translate(square[0]);
cout << "Adding to board: " << x << ", " << y << endl;
gameBoard[x][y] = 7;
}
int main() {
// Initialize game board with zeros
initBoard();
// Display 2d array (game board)
cout << "Blank game board:\n\n";
showBoard();
// Place first piece on board
string firstPiece = "a1";
addPiece(firstPiece);
// Display 2d array (game board)
cout << "After adding first piece:\n\n";
showBoard();
for (int i = 0; i <= 7; i++){
for (int j = 0; j <= 7; j++){
if (gameBoard[i][j] == 7){
cout << "Found a 7 at: " << i << ", " << j << endl;
}
}
}
}
Я могу подтвердить, что эта часть «перевода» работает правильно. Все, что здесь происходит, — это перевод a1 в 7 и 0 для координат строки и столбца.
Как видите, даже выполнение программы согласно с тем, что на доску добавляется только 1 элемент. Так почему же я продолжаю находить двоих? Любая помощь будет очень признательна, спасибо!
Я пробовал объявить массив (GameBoard) разными способами, и он все равно добавляет два, когда я добавляю только один элемент. Я хочу, чтобы на GameBoard был добавлен только один элемент.
Эта проблема возникает не для каждой клетки, на которую я решаю добавить фигуру. Допустимые поля связаны с шахматной доской, поэтому a1-h8.
int gameBoard[7][7];
и for (int i = 0; i <= 7; i++)
. Размеры не совпадают. Шахматная доска имеет размер 8x8, что означает, что ее следует объявить как int gameBoard[8][8]
, и вы обычно записываете условие циклов for с меньшим, а не меньшим или равным, что будет выглядеть следующим образом: for (int i = 0; i < 8; i++)
. С помощью вашего текущего кода вы получаете доступ к элементам, которые не существуют, потому что 2d-массив недостаточно велик. Это означает, что ваша программа имеет неопределенное поведение (UB).
или, что еще лучше, используйте std::array
и диапазон на основе циклов for
Кстати, вашу функцию translate()
можно упростить до двух if
, например: int translate(char letter){ if ( letter >= 'a' && letter <= 'h' ) { return letter - 'a'; } else if ( letter >= '1' && letter <= '8' ) { return 8 - (letter - '0'); } else { return -1; } }
Когда вы объявляете массив с помощью int array[7]
, длина массива равна 7, поэтому максимальный индекс равен 6.
int array[] = { 1, 2, 3, 4, 5, 6, 7 };
// index: 0, 1, 2, 3, 4, 5, 6
Когда вы используете любой индекс, превышающий максимальный индекс (или меньше нуля), вы получаете доступ к памяти, которая не принадлежит вам. Это может вызвать такие проблемы, как сбой, если эта память содержит ваш код.
Чтобы решить эту проблему, инициализируйте игровое поле правильной длины. Шахматная доска имеет размер 8x8, поэтому вам следует изменить строку int gameBoard[7][7];
на int gameBoard[8][8];
. В моем тестировании это устранило проблему.
в массиве из 7 элементов 7 элементов, но ваши циклы
for (int i = 0; i <= 7; i++) {
имеют 8 итераций. Последний действительный индекс в массиве из 7 элементов равен 6, а не 7.