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