G373829 2023-08-17 00:47 采纳率: 50%
浏览 27
已结题

这串贪吃蛇的代码不知道为什么一输入w,a,s,d就会自动结束程序,如何解决?

这串贪吃蛇的代码不知道为什么一输入w,a,s,d就会自动结束程序,如何解决?

img

 C:\Users\Administrator Desktop\snakegame.exe                                                                                                                      X
                                                                        *
             after 6.098 seconds with return value 3221225477
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
char ch; 
int score = 0;
vector<vector<int>> candy;  
vector<vector<int>> body; 
vector<int> clone_body;
vector<int> head;
void gotoxy(short x, short y) 
{
    COORD coord = {x, y};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void print_candy(int headx , int heady , char ch)
{
    int ret = 0;
    for(auto x : candy)
    {
        if(headx == x[0] && heady == x[1])  
        {
            candy.erase(candy.begin() + ret);
            clone_body.resize(0);
            if(body.size() > 1)
            {
                clone_body.push_back(body[body.size() - 1][0] + 1);
                clone_body.push_back(body[body.size() - 1][1]);
                body.push_back(clone_body);
            }
            else
            {
                clone_body.push_back(headx+1);
                clone_body.push_back(heady);
                body.push_back(clone_body);
            } 
            score++; 
            print_candy(headx,heady,ch);    
            break;
        }
        else
        {
            gotoxy(x[0],x[1]);
            cout<<"*";
        }
        ret++;
    }    
}
void print_edge()
{
    for(int i = 5; i <= 109 ; i++) { gotoxy(i,4); cout << "__"; }
    for(int i = 5; i <= 109 ; i++) { gotoxy(i,22); cout << "__"; }
    for(int i = 5; i <= 22 ; i++) { gotoxy(5,i); cout << "|"; }
    for(int i = 5; i <= 22 ; i++) { gotoxy(110,i); cout << "|"; }
}
int main()
{
    int headx = 58 , heady = 13; 
    print_edge();
    for(int i = 0 ; i <= 120 ; i++) 
    {
        int candyx = rand()%(100) + 6 , candyy = rand()%(15)+6;
        gotoxy(candyx,candyy); 
        candy.resize(121);
        candy[i].resize(3);
        candy[i][0] = candyx;
        candy[i][1] = candyy;
        cout<<"*";
    }
    head.push_back(headx);
    head.push_back(heady);
    gotoxy(headx,heady);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
    cout<<":";
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
    int life = 3;
    gotoxy(5,24);
    cout << "life : ";
    for(int i = 1 ; i <= 3 ; i++)  cout << "# ";
    gotoxy(5,25);
    cout<< "score : " << score;
    gotoxy(5,29);
    cout << "注意 :不要去边缘!";
    gotoxy(5,27); 
    cout << "请在这里输入指示符(wasd) : ";
    while(cin>>ch)
    {    
        Sleep(500);
        int judgex = 0;
        if(headx < 109 && headx > 5 && heady > 5 && heady < 21)
        {
            if(ch == 'w') heady-=1; 
            if(ch == 's') heady+=1;
            if(ch == 'a') headx-=1;
            if(ch == 'd') headx+=1;
        }    
        if(headx == 109) { headx = 108;  life--; } 
        if(heady == 21)  { heady = 20;   life--; } 
        if(heady == 5)   { heady = 6;    life--; }
        if(headx == 5)   { headx = 6;    life--; }
        system("cls");
        print_edge();
        print_candy(headx , heady , ch);
        gotoxy(headx,heady);
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
        cout<<":";
        body.pop_back();
        body[0][0] = head[0] , body[0][1] = head[1];
        for(auto i = body.size() - 2 ; i >= 1 ; i--)  
        {
            body[i][0] = body[i - 1][0];
            body[i][1] = body[i - 1][1];
            gotoxy(body[i][0],body[i][1]);
            cout<<"+";
        }
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
        gotoxy(5,24);
        if(life == 0) 
        {
            Sleep(800);
            Beep(698,700);
            Sleep(1000);
            cout << "You lose!" << endl << endl << "     本次得分:" << score << "分!" << endl  << endl << endl << endl << endl << endl;
            return 0;
        }
        cout << "life : ";
        for(int i = 1 ; i <= life ; i++)  cout << "# ";
        gotoxy(5,25);
        cout<< "score : " << score;
        gotoxy(5,29);
        cout << "注意 :不要去边缘!";
        gotoxy(5,27); 
        head.resize(0); 
        head.push_back(headx);
        head.push_back(heady);
        cout << "请在这里输入指示符(wasd) : "; 
    }
    return 0;
}
  • 写回答

7条回答 默认 最新

  • chuifengde 2023-08-17 08:19
    关注

    因为body里没有值,导致body.pop_back()出错。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月18日
  • 已采纳回答 8月17日
  • 赞助了问题酬金15元 8月17日
  • 创建了问题 8月17日