Переполнение вектора. line 1566. Вброс исключения. С++
Пытаюсь написать консольную змейку на С++. Получившийся неоконченный код вроде даже работает, но при запуске отладчика при после перехода с процедуры showFild() к findFood(), ловит исключение на 70 строке
if (foodC[i][0] == y && foodC[i][1] == x)
По идее, переходить к проверке должен только при условии, что вектор заполнен. Никак не могу понять в чем дело(
Зы: ссылки и указатели тоже явно не использовать.
#include <iostream>
#include <conio.h>
#include <vector>
#include <windows.h>
#include <time.h>
#include <thread>
using namespace std;
vector < vector <int>> snake;//initiation of array of the snake coordinates (y,x)
int fHeight = 5;
int fWidth = 10;
int foodval = 3;
vector < vector <int>> foodC;
int speed = 150;
int side2m = 1;
bool alive = true;
int score = 0;
void fillCooSnake() {
vector <int> sYsX;
sYsX.push_back(fHeight / 2);//first y coordinte of the snake
sYsX.push_back(1 + fWidth / 2);//first x coordinte of the snake
snake.push_back(sYsX);
}
void fillCooSnake(int y, int x) {
vector <int> sYsX;
sYsX.push_back(y);
sYsX.push_back(x);
snake.push_back(sYsX);
}
bool findSnake(int y, int x) {
for (int i = 0; i < size(snake); i++) {
if (snake[i][0] == y && snake[i][1] == x) {
return true;
}
}
return false;
}
void foodGen() {
do {
foodC.clear();
for (int i = 0; i < foodval; i++) {
vector <int> fYfX;
do {
fYfX.clear();
fYfX.push_back(rand() % (fHeight - 2) + 2);
fYfX.push_back(rand() % (fWidth - 3) + 3);
} while (findSnake(fYfX[0], fYfX[1]));
foodC.push_back(fYfX);
}
Sleep(speed * 50);
} while (alive);
}
int findFood(int y, int x) {
for (int i = 0; i < size(foodC); i++) {
if (foodC[i][0] == y && foodC[i][1] == x) {//на этой строке выдает ловит исключение и выдает ошибку
return i;
}
}
return -1;
}
void keyControl() {
while (alive) {
switch (_getch())
{
case 72://up
side2m = 1;
break;
case 80://down
side2m = 3;
break;
case 75://left
side2m = 4;
break;
case 77://right
side2m = 2;
break;
}
}
}
void snakeMove() {
while (alive) {
if (side2m == 1) {
if (snake[0][0] - 1 != 0) {
snake[0][0]--;
}
}
else if (side2m == 2) {
if (snake[0][1] + 1 != fWidth + 1) {
snake[0][1]++;
}
}
else if (side2m == 3) {
if (snake[0][0] + 1 != fHeight + 1) {
snake[0][0]++;
}
}
else if (side2m == 4) {
if (snake[0][1] - 1 != 1) {
snake[0][1]--;
}
}
if (side2m == 1 || side2m == 3) {
Sleep(speed / 2);
}
Sleep(speed);
}
}
void showFild() {
while (true) {
//COORD test = { 1,1 };
system("cls");
for (int y = 0; y <= fHeight + 2; y++) {
for (int x = 0; x <= fWidth + 4; x++) {
if (y == 0 || y == fHeight + 2 || x == 0 || x == 1 || x == fWidth + 3 || x == fWidth + 4) {
cout << (char)177;
}
else if ((findSnake(y, x))) {
cout << (char)254;
}
else if (!foodC.empty() && findFood(y, x) >=0 && !findSnake(y, x)) {
cout << (char)3;
}
/*
else if (findFood(y, x)>=0 && snake[size(snake) - 1][0] == y && snake[size(snake) - 1][1] == x) {
foodC[findFood(y, x)][0] = -1;
foodC[findFood(y, x)][1] = -1;
//foodC.erase(foodC.begin() + 1);
}
*/
else {
cout << " ";
}
}
cout << endl;
}
cout << endl << endl << snake[0][0] << " " << snake[0][1] << endl;
Sleep(30);
}
}
int main()
{
srand(time(0));
//HANDLE hOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
fillCooSnake();
thread T_foodG(foodGen);
thread T_fShow(showFild);
thread T_kC(keyControl);
thread T_sMove(snakeMove);
T_foodG.join();
T_fShow.join();
T_kC.join();
T_sMove.join();
return 0;
}