Как исправить ошибку Run-Time Check Failure #2 на C++?

Доброго времени суток, подскажите пожалуйста почему программа иногда заканчивается, выдавая ошибку
5a3a70ebd8ad8527366721.png
_____________________________________________________________________________________________________________________________________
#include <iostream>
#include <time.h>
#include <windows.h>
#include <conio.h>
#include <fstream>

using namespace std;

// N - размер поля по умолчанию (оно квадратное); M - число мин на поле
#define N 10
#define M 10
#define ignorecin std::cin.clear(); std::cin.ignore(std::cin.rdbuf()->in_avail())
#define clearcin std::cin.clear(); while(std::cin.get()!='\n');

// поле, и массив логических значений, обозначающий те поля, что открыты
int matrix[N][N];
bool open[N][N];

// проверяет ячейку на мину (тупо конечно, ну да ладно); выход за пределы возвращает false
bool mine(int i, int j) {
	if ((i >= 0) && (i<N)) {
		if ((j >= 0) && (j<N)) {
			if (matrix[i][j] == -1) return true;
		}
	}
	return false;
}

// проверяет ячейку на пустоту (true), выход за пределы массива возвращает false
bool empty(int i, int j) {
	if ((i >= 0) && (i<N)) {
		if ((j >= 0) && (j<N)) {
			if (matrix[i][j] == 0) return true;
		}
	}
	return false;
}

// рекурсивная функция, которая открывает поля в точке попадания

void clean(int i, int j) {
	
	
	// проверим на выход за пределы массива
	if ((i >= 0) && (i<N)) {
		if ((j >= 0) && (j<N)) {
			
			
			// проверим, не было ли открыто поле раньше
			if (!open[i][j]) {
				// откроем

				open[i][j] = true;
				
				// если поле пустое (=0), просто пооткрываем всех его соседей
				if (matrix[i][j] == 0) {
					clean(i - 1, j - 1);
					clean(i - 1, j);
					clean(i - 1, j + 1);
					clean(i, j - 1);
					clean(i, j + 1);
					clean(i + 1, j - 1);
					clean(i + 1, j);
					clean(i + 1, j + 1);
				}
				// если не пустое (!=0) открываем только пустых (=0) соседей
				else {
					if (empty(i - 1, j - 1)) clean(i - 1, j - 1);
					if (empty(i - 1, j)) clean(i - 1, j);
					if (empty(i - 1, j + 1)) clean(i - 1, j + 1);
					if (empty(i, j - 1)) clean(i, j - 1);
					if (empty(i, j + 1)) clean(i, j + 1);
					if (empty(i + 1, j - 1)) clean(i + 1, j - 1);
					if (empty(i + 1, j)) clean(i + 1, j);
					if (empty(i + 1, j + 1)) clean(i + 1, j + 1);
				}
			}
		}
	}

}


// рисует "мину" - звездочку красного цвета
void coutmine(HANDLE hConsole) {
	SetConsoleTextAttribute(hConsole, 12);  // red text
	cout << "* ";
	SetConsoleTextAttribute(hConsole, 7);   // white text
}

// рисует минное поле с учетом открытых и закрытых полей
// и вспомогательные оси
void draw_matrix(HANDLE hConsole) {
	SetConsoleTextAttribute(hConsole, 9);  //  LightBlue text
	cout << "  A B C D E F G H I J\n";
	SetConsoleTextAttribute(hConsole, 7);  // white text
	for (int x = 0; x<N; x++) {
		SetConsoleTextAttribute(hConsole, 9);  //  LightBlue text
		cout << x << " ";
		SetConsoleTextAttribute(hConsole, 7);  // white text
		for (int y = 0; y<N; y++) {
			if (open[x][y]) {
				SetConsoleTextAttribute(hConsole, 8);  // gray text
				if (matrix[x][y] == -1) coutmine(hConsole);
				else if (matrix[x][y] == 0) cout << ". ";
				else cout << matrix[x][y] << " ";
				SetConsoleTextAttribute(hConsole, 7);  // white text
			}
			else {

				cout << "# ";

			}
		}
		cout << "\n";
	}
}

// функция завершает игру, выведя одну из двух надписей "Loser!" или "Winner!"
void fin(HANDLE hConsole, bool loser) {
	COORD coord;
	coord.X = 33;
	coord.Y = 10;
	system("cls");
	draw_matrix(hConsole);
	SetConsoleCursorPosition(hConsole, coord);
	if (loser) {
		SetConsoleTextAttribute(hConsole, 12);  // red text
		cout << "\tDont cry. Повезет в следующий раз :)\n";
		SetConsoleTextAttribute(hConsole, 7);  // white text
	}
	else {
		SetConsoleTextAttribute(hConsole, 10);  // green text
		cout << "| congratulation you ARE THE BEST |";
		SetConsoleTextAttribute(hConsole, 7);  // white text
	}
	cout << "\n\n\n\n";
	//_getch();
	system("pause");
}

// в случае проигрыша эта функция откроет все мины
void openmines() {
	for (int i = 0; i<N; i++) {
		for (int j = 0; j<N; j++) {
			if (matrix[i][j] == -1) open[i][j] = true;
		}
	}
}

// проверяет, все ли поле открыто, кроме мин (таково условие победы =)
bool checkwin() {
	for (int x = 0; x<N; x++) {
		for (int y = 0; y<N; y++) {
			if ((matrix[x][y] != -1) && (!open[x][y])) return false;
		}
	}
	return true;
}

int main(int argc, char *argv[])
{

	int i, j, m, k = 0;
	char s[3], name[20];
	ofstream score("result.txt");
	//ifstream score("result.txt");
	// хэндл экна необходим для рисования цветного текста
	HANDLE  hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
	// инициализация
	system("chcp 1251");
	setlocale(0, ".1251");
	system("cls");
	SetConsoleTextAttribute(hConsole, 15);  // white text
	cout << "*************************GOOD AFTERNOON****************************************\n";
	cout << "*               Введите количество мин (не больше 100)                        *\n";
	cout << "*******************************************************************************\n";
	//cout << 
//	cout << "Введите количество мин (не больше 100):\n";
	cin >> m;
	do
	{
		if (m < 0 || m > 100) {

			ignorecin;
			cout << "Вы ввели некорректное значение. Попробуйте снова:\n";
		}

		else break;
	} while (!(cin >> m) || m < 0 || m > 100);
	clearcin;
	
	SetConsoleTextAttribute(hConsole, 11);
	cout << "Введите имя игрока: ";
	cin >> name;
	score <<"Имя последнего, кто играл: " <<name;
	srand((int)time(NULL));

	// все чистим
	for (int c = 0; c < 100; c++) { matrix[c / 10][c % 10] = 0; open[c / 10][c % 10] = false; }
	// заполняем массив поля минами

	for (int c = 0; c < m; c++)
	{
	
		do {
			i = rand() % N; j = rand() % N;
		} while (matrix[i][j] != 0);
		matrix[i][j] = -1;	

	}

	// заполняем массив поля цифрами
	for (i = 0; i < N; i++) {
		for (j = 0; j < N; j++) {
			if (matrix[i][j] != -1) {
				k = 0;
				if (mine(i - 1, j - 1)) k++;
				if (mine(i - 1, j)) k++;
				if (mine(i - 1, j + 1)) k++;
				if (mine(i, j - 1)) k++;
				if (mine(i, j + 1)) k++;
				if (mine(i + 1, j - 1)) k++;
				if (mine(i + 1, j)) k++;
				if (mine(i + 1, j + 1)) k++;
				matrix[i][j] = k;
			}
		}
	}

	// главный игровой цикл
	while (true) {
		// чистим экран от старого рисунка
		system("cls");
		SetConsoleTextAttribute(hConsole, 7);
		cout << "| Вы ввели " << m << " мин(ы)|\n";
		cout << "---------------------\n";
		SetConsoleTextAttribute(hConsole, 11);
		cout << "Игрок: " << name << endl << endl;
		// рисуем поле	
		draw_matrix(hConsole);
		cout << "\n";
		// запрашиваем координаты 
		cout << "Введите координаты удара (например, A8): ";
		cin >> s;
		int score = 0;
		if (!open) score++;

		// переводим координаты в цифровой вид
		if ((s[0] >= 65) && (s[0] <= 74)) j = s[0] - 65;        // буква в промежутке от A до J
		else if ((s[0] >= 97) && (s[0] <= 106)) j = s[0] - 97;  // буква в промежутке от a до j
		else continue;                              // если введены неверные значения, возврат в начало цикла
		if ((s[1] >= 48) && (s[1] <= 57)) i = s[1] - 48;
		else continue;
		// далее проверяем все восемь окрестных полей на пустые клетки
		// и если надо показываем некий кусок поля (ну, много пустых клеток, например)
		clean(i, j);

		if (mine(i, j)) { openmines(); fin(hConsole, true); break; }  // программа покидает цикл в случае проигрыша
		if (checkwin()) { fin(hConsole, false); break; }                 // или победы
	
	}
	score.close();
	//system("pause");
	return 0;
}
  • Вопрос задан
  • 117 просмотров
Пригласить эксперта
Ответы на вопрос 1
Можно я вам тоже вопрос задам?
Сколько символов в итоге программа получит, если ввести те же А8 и нажать Enter?
char s[3];
cout << "Введите координаты удара (например, A8): ";
cin >> s;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы