C++ 向量下标在我(未完成)的蛇游戏中超出范围

C++ 向量下标在我(未完成)的蛇游戏中超出范围,c++,vector,C++,Vector,所以我正在做一个蛇游戏(它还没有完成),我得到了向量下标超出范围的错误。我对C++很陌生,也很困惑。它没有说明错误在哪里(不在错误列表中) 错误只会在运行时出现。因为我不知道问题出在哪里,下面是全部代码 #include <iostream> #include <string> #include <stdio.h> #include <conio.h> #include "windows.h" #include <vector>

所以我正在做一个蛇游戏(它还没有完成),我得到了向量下标超出范围的错误。我对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;
        }

    }
}
#包括
#包括
#包括
#包括
#包括“windows.h”
#包括
使用名称空间std;
向上作废(内部和方向)
{
方向=1;
}
左侧空白(内部和方向)
{
方向=2;
}
向下作废(内部和方向)
{
方向=3;
}
右侧无效(内部和方向)
{
方向=4;
}
结构点
{
int x;
int-y;
};
int main()
{
向量snek;
snek.推回({10,10});
snek.推回({10,9});
snek.推回({10,8});
snek.推回({10,7});
焦移动;
int方向=2;
炭板[20][20];
对于(int i=0;i<20;i++)
{
对于(int j=0;j<20;j++)
{
董事会[i][j]='';
}
}
while(true)
{
开关(方向)
{
案例1:
for(无符号整数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};
案例2:
for(无符号整数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)};
案例3:
for(无符号整数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};
案例4:
for(无符号整数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(无符号整数i=1;i<(snek.size()-1);i++)
{
snek[snek.size()-(i-1)]=snek[snek.size()-i];
}
for(无符号整数i=0;i<(20-1);i++)
{
for(无符号整数j=0;j<20;j++)
{
你有这个循环吗

for (unsigned int i = 1; i < (snek.size() - 1); i++)
{
    snek[snek.size() - (i - 1)] = snek[snek.size() - i];
}
for(无符号整数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()]
,这当然是越界的。

你有了循环

for (unsigned int i = 1; i < (snek.size() - 1); i++)
{
    snek[snek.size() - (i - 1)] = snek[snek.size() - i];
}
        for (unsigned int i = 1; i < (snek.size() - 1); i++)
        {
            snek[snek.size() - (i - 1)] = snek[snek.size() - i];
        }
for(无符号整数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()][/code>,这当然是越界的。

;i++)
        for (unsigned int i = 1; i < (snek.size() - 1); i++)
        {
            snek[snek.size() - (i - 1)] = snek[snek.size() - i];
        }
{ snek[snek.size()-(i-1)]=snek[snek.size()-i]; }
该循环从i=1开始。因此您尝试写入snek[snek.size()],这是向量的内存之后的内存

将at()用于对向量(或一般容器)的非时间关键访问也很好。

for(unsigned int i=1;i<(snek.size()-1);i++)
{
snek[snek.size()-(i-1)]=snek[snek.size()-i];
}
该循环从i=1开始。因此您尝试写入snek[snek.size()],这是向量的内存之后的内存


使用at()对向量(或容器)进行非时间关键访问也很好。

使用调试器运行程序以定位错误。您的循环是相同的。您是否考虑过编写一个函数来“移位”蛇?是的,但我不想做那么多引用honestly@Odysseus “Source2.exe中0x79F5F2F6(ucrtbased.dll)处未处理的异常:向认为无效参数致命的函数传递了无效参数。发生了”是代码snek[snek.size()-(i-2)]=snek[snek.size()-i]的错误;使用调试器运行程序以定位错误。您的循环是相同的。您是否考虑过编写一个函数来“移动”蛇?是的,但我不想做那么多引用honestly@Odysseus“0x79F5F2F6处未处理的异常(基于UCRTBASE.dll)在Source2.exe中:向认为无效参数致命的函数传递了一个无效参数。出现“是代码snek[snek.size()-(i-2)]=snek[snek.size()-i]的错误;那么我该怎么办?我希望它将snek[4]更改为snek[3]以此类推。@PolarBear你正在从1索引跳到0索引,并让自己对允许的范围感到困惑……你可以只使用0索引,然后生活变得更美好easier@PolarBear提示:你需要移动所有的snek部件吗?唯一真正改变的是snek end(这里不再有snek)和snek start(这里是新的snek部件)。如果你从vector中删除最后一个元素,并在前面插入一个元素,你就不必移动任何东西。@PolarBear使用索引从0开始的知识重写你的程序,并坚持使用它。我看到大多数新程序员在试图伪造基于1的数组时都会陷入这样的陷阱。错误一个接一个,流入Index 0等。如果你想向用户显示基于1的输出,那么只在输出信息时才这样做。@PolarBear当你陷入基于1的数组陷阱时,你给自己挖了一个洞。你现在不知道是否或在哪里潜伏着任何基于1的bug。所以说实话,是的,重写你的