Подпись вектора вне диапазона в моей (незаконченной) игре со змеями - PullRequest
0 голосов
/ 11 февраля 2020

Итак, я делаю игру со змеями (она еще не закончена), и у меня есть векторный индекс из-за ошибки диапазона. Я действительно новичок в C ++ и также очень смущен. Там не указано, где находится ошибка (ее нет в списке ошибок), и эта ошибка появляется только во время выполнения. Поскольку я не знаю, в чем проблема, вот весь код.

    #include <iostream>
#include <string>
#include <stdio.h>
#include <conio.h>
#include "windows.h" 
#include <vector>
using namespace std;
void up(int& direction)
{
    direction = 1;
}
void left(int& direction)
{
    direction = 2;
}
void down(int& direction)
{
    direction = 3;
}
void right(int& direction)
{
    direction = 4;
}
struct point
{
    int x;
    int y;
};

int main()
{
    vector<point> snek;
    snek.push_back({ 10,10 });
    snek.push_back({ 10,9 });
    snek.push_back({ 10,8 });
    snek.push_back({ 10,7 });
    char move;
    int direction=2;
    char board[20][20];
    for (int i = 0; i < 20; i++)
    {
        for (int j = 0; j < 20; j++)
        {
            board[i][j] = ' ';
        }
    }
    while (true)
    {
        switch (direction)
        {
        case 1:
            for (unsigned int i = 1; i < (snek.size() - 1); i++)
            {
                snek[snek.size() - (i - 1)] = snek[snek.size() - i];
            }
            snek[0] = { (snek[0].x - 1),snek[0].y };
        case 2:
            for (unsigned int i = 1; i < (snek.size() - 1); i++)
            {
                snek[snek.size() - (i - 1)] = snek[snek.size() - i];
            }
            snek[0] = {snek[0].x ,(snek[0].y-1) };
        case 3:
            for (unsigned int i = 1; i < (snek.size() - 1); i++)
            {
                snek[snek.size() - (i - 1)] = snek[snek.size() - i];
            }
            snek[0] = {( snek[0].x + 1),snek[0].y};
        case 4:
            for (unsigned int i = 1; i < (snek.size() - 1); i++)
            {
                snek[snek.size() - (i - 1)] = snek[snek.size() - i];
            }
            snek[0] = {snek[0].x ,(snek[0].y+1) };
        }
        for (unsigned int i = 1; i < (snek.size() - 1); i++)
        {
            snek[snek.size() - (i - 1)] = snek[snek.size() - i];
        }
        for (unsigned int i = 0; i < (20 - 1); i++)
        {
            for (unsigned int j = 0; j < 20; j++)
            {
                cout << board[i][j];
            }
            cout<<endl;
        }
        move = _getch();
        switch (move) 
        {
        case 'w':
            up(direction);
            Sleep(1);
            break;
        case 'a':
            left(direction);
            Sleep(1);
            break;
        case 's':
            down(direction);
            Sleep(1);
            break;
        case'd':
            right(direction);
            Sleep(1);
            break;
        }

    }
}

РЕДАКТИРОВАТЬ: я полностью переписал свою программу, и теперь она работает нормально. Спасибо!

#include <iostream>
#include <string>
#include <stdio.h>
#include <conio.h>
#include "windows.h" 
#include <vector>
#include <random>
#include <ctime>
#include <cmath>
using namespace std;

struct point
{
    int x;
    int y;
};

void goTo(point p,vector<point>& snek)
{
    bool flag=false;
    for (unsigned int i = 0; i < snek.size(); i++)
    {
        if (p.x == snek[i].x && p.y == snek[i].y)
        {
            flag = true;
        }
    }
    for (int i=snek.size()-1; i >0; i--)
    {
        if (!flag)
        {
            snek[i] = snek[i - 1];
        }
        else
        {
            return;
        }
    }
    snek[0] = p;
}
void makeFood(point& apple, vector<point> snek)
{
    bool appleValid = true;
    apple.x = (rand() % 19) + 1;
    apple.y = (rand() % 19) + 1;
    for (int i = 0; i < snek.size() - 1; i++)
    {
        if (apple.x == snek[i].x && apple.y == snek[i].y)
        {
            appleValid = false;
        }
    }
    if (!appleValid)
    {
        srand(time(NULL));
        makeFood;
    }

}
int main()
{
    vector<point> snek;
    snek.push_back({ 10,10 });
    snek.push_back({ 10,9 });
    snek.push_back({ 10,8 });
    snek.push_back({ 10,7 });
    char move = 'w';
    string board[21][21];
    int direction=2;
    point apple;
    apple.x = rand() % 20;
    apple.y = rand() % 20;
    for (int i = 0; i < 20; i++)
    {
        for (int j = 0; j < 20; j++)
        {
            board[i][j] = "  ";
        }
    }
    while (true)
    {
        bool loss=false;
        int highscore=0;
        bool  appleEaten = false;
        srand(time(NULL));
        if (snek[0].x == 0 && snek[1].x == 1)
            loss = true;
        if (snek[0].x == 20 && snek[1].x == 19)
            loss = true;
        if (snek[0].y == 0 && snek[1].y == 1)
            loss = true;
        if (snek[0].y == 20 && snek[1].y == 19)
            loss = true;
        if (loss)
        {
            system("CLS");
            cout << "You lost with a score of " << snek.size() - 4 << endl;
            system("PAUSE");
        }
        Sleep(100);
        if (_kbhit())
        {
            move = _getch();
        }
        system("CLS");
        switch (move) 
        {
        case 'w':
            goTo({ (snek[0].x - 1),snek[0].y }, snek);
            Sleep(10);
            break;
        case 'a':
            goTo({ snek[0].x ,(snek[0].y - 1) }, snek);
            Sleep(10);
            break;
        case 's':
            goTo({ (snek[0].x + 1),snek[0].y }, snek);
            Sleep(10);
            break;
        case'd':
            goTo({ snek[0].x ,(snek[0].y + 1) }, snek);
            Sleep(10);
            break;
        }
        board[apple.x][apple.y] = " 0";
        for (int k = 0; k < snek.size() - 1; k++)
        {
            board[snek[k].x][snek[k].y] = " *";
            board[snek[snek.size() - 1].x] [snek[snek.size() - 1].y] = "  ";
        }
        if (apple.x == snek[0].x && apple.y == snek[0].y)
        {
            snek.push_back({snek[snek.size()-1].x+1,snek[snek.size() - 1].y});
            appleEaten = true;
        }
        if (appleEaten)
        {
            makeFood(apple,snek);
        }
        for (int i = 0; i < 20; i++)
        {
            board[0][i] = "--";
            board[20][i] = "--";
        }
        for (int i = 0; i < 20; i++)
        {
            board[i][0] = '|';
            board[i][20] = '|';
        }
        for (int i = 0; i < 21; i++)
        {
            for (int j = 0; j < 21; j++)
            {
                cout << board[i][j];
            }
            cout << endl;
        }
        cout << "Score: " << snek.size() - 4;
    }
}

Ответы [ 2 ]

1 голос
/ 11 февраля 2020
        for (unsigned int i = 1; i < (snek.size() - 1); i++)
        {
            snek[snek.size() - (i - 1)] = snek[snek.size() - i];
        }

То, что l oop начинается с i = 1. Таким образом, вы пытаетесь записать в snek [snek.size ()], который является единицей памяти после памяти вашего вектора.

Использование at () для некритического доступа к вектору ( или контейнер вообще) тоже было бы неплохо.

1 голос
/ 11 февраля 2020

У вас есть l oop

for (unsigned int i = 1; i < (snek.size() - 1); i++)
{
    snek[snek.size() - (i - 1)] = snek[snek.size() - i];
}

На самой первой итерации, когда i == 1, тогда snek[snek.size() - (i - 1)] будет эквивалентно snek[snek.size() - (1 - 1)], то есть snek[snek.size() - 0], что snek[snek.size()] что, конечно, за пределами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...