Итак, я делаю игру со змеями (она еще не закончена), и у меня есть векторный индекс из-за ошибки диапазона. Я действительно новичок в 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;
}
}