Переполнение вектора. 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;
}

Ответы (0 шт):