Я кодирую свою собственную игру в сапер для развлечения на C++ (язык, с которым я наиболее знаком), и когда я сохраняю константу в 2-мерном массиве, она иногда заканчивается случайным значением.
Вот мой код:
using namespace std;
Table::Table() {
tiles[16][16] = {0};
covers[16][16] = {1};
}//stores position of mines, covers, and values
//places mines on the board
void Table::placemines() {
int minecount=0;
int i = rand()%15;
int j = rand()%15;
while(minecount<40){
if (tiles[i][j] == 0) {
tiles[i][j] = -10;
minecount++;
} else {}
i = rand()%15;
j = rand()%15;
}
}
и мой main.cpp для отображения значений
using namespace std;
int main() {
Table newtable = Table();
newtable.placemines(6, 7);
for (int j = 0; j < 16; j++) {
for (int i = 0; i < 16; i++) {
cout << newtable.tiles[i][j] << ' ';
}
cout << '\n';
}
}
и выход
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 -10 -10 -10 0 0 1 -10 0 0
0 0 0 0 0 0 0 -10 0 -10 -10 0 -10 0 0 0
0 0 0 0 0 -10 0 0 0 -10 -10 0 -10 0 0 0
-10 0 0 -10 -10 0 0 -10 -10 0 0 0 0 -10 0 0
-10 0 -10 0 0 -10 0 0 0 0 0 0 0 -10 0 0
0 0 0 0 0 0 0 0 -10 -10 0 1920169263 0 -10 0 0
0 0 -10 0 0 0 0 0 0 -10 -10 1651076143 0 0 0 0
0 0 0 0 0 0 0 0 -10 -10 0 1819894831 -10 0 0 0
0 0 0 0 0 0 0 0 0 0 0 100 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 -10 0 0 0 0
0 0 0 0 0 0 0 -10 0 -10 0 32 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-10 0 0 -10 0 0 0 0 0 0 -10 2 0 0 0 0
-10 0 0 0 0 -10 0 0 0 -10 0 4 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0
Кто-нибудь может сказать, что происходит? Спасибо!
Заполните нулями и затем добавьте свои мины.
Я не думаю, что tiles[16][16] = {0}
делает то, что вы думаете.
Если вы хотите получить доступ к индексам от 0 до 15 плиток и покрытий массивов, вам нужно применить модуль 16. Если вы примените 15, то вы покрываете только индекс массива от 0 до 14.
Не компилируется как есть (с помощью копирования и вставки). Я думаю, что ошибка может быть в коде, который не предоставлен, или может быть взаимодействием между предоставленным и не предоставленным кодом.
Отсутствует слишком много кода, нет декларации, нет кода placemines()
У вас здесь ошибка:
tiles[16][16] = {0};
Этот оператор устанавливает для некоторого элемента массива с индексами 16 и 16 значение 0. Если ваш массив определен как type tiles[16][16]
, это означает, что вы записываете в Abyss и вызываете UB (поскольку последний элемент массива - tiles[15][15]
).
Если вам нужно инициализировать массив, используйте std::fill
http://en.cppreference.com/w/cpp/algorithm/fill. Для нулевой инициализации это работает:
Table::Table() : tiles{0} {
Возможна другая ошибка:
int i = rand()%15;
Вы должны использовать размер массива, чтобы правильно охватить диапазон.
PS. Избегайте using namespace std;
в глобальном масштабе, пожалуйста.
код не должен даже компилироваться. что происходит с 6 и 7 в placemines (6,7)