贪吃蛇程序和编译器问题

一个PROJECT,让别人帮忙做了一个贪吃蛇的代码,在他的devc++ 6.5上可以运行,但是在我的MinGW环境下就会重复生成地图,这到底是怎么回事,该如何解决呢?

#include <iostream>
#include <vector>
#include <ctime>
#include <conio.h>
#include <windows.h>
#include <thread>

using namespace std;

int speed = 150;
int cur = 0;

class Pos {
    public:
        int i;
        int j;
};

class Snake {
    public:
        int speed;    // ?  ?
        vector<Pos> ps;
};

class PrintUtil {
    public:
        void print(int r) {
            switch (r) {
                case 0:
                    cout << "#";break;
                case 1:
                    cout << " ";break;
                case 2:
                    cout << "O";break;
                case 3:
                    cout << "o";break;
                case 4:
                    cout << "$";break;
                case 5:
                    cout << "x";
            }
        }
        string getString(int r) {
            switch (r) {
                case 0:
                    return "#";break;
                case 1:
                    return " ";break;
                case 2:
                    return "O";break;
                case 3:
                    return "o";break;
                case 4:
                    return "$";break;
                case 5:
                    return "x";break;
            }
        }
        int getWall() {return 0;}
        int getNoWall() {return 1;}
        int getSnakeHead() {return 2;}
        int getSnakeBody() {return 3;}
        int getFood() {return 4;}
        int getObstacle() {return 5;}
};

class Game {
    public:
        Game(int, int, vector<Pos>);
        void printSnake();
        void setMap();
        void printAndInitWall();//    ? ?        ?
        void start();
        void changeMap();
        void addKeyBoardListenner();
        void printFood();
        void updateSnake();        //  map     и
        void clearScreen() {
            HANDLE hConsole =
                GetStdHandle(STD_OUTPUT_HANDLE);
            COORD coordScreen =
                { 0, 0 };
            SetConsoleCursorPosition(hConsole, coordScreen);
        }
        int mapcount;
        vector<vector<int>> map2;
    private:
        int height;
        int weight;
        vector<vector<int>> map;
        PrintUtil util;
        Snake snake;
        int pos;
        int lastPos;
        Pos foodPos;    //?
        int count;        // ÷
        bool end;
        vector<Pos> obstacles;    // ?
};
Game::Game(int weight, int height, vector<Pos> obs) {
    this->height = height;
    this->weight = weight;
    end = false;
    count = 0;
    snake.speed = 250;
    obstacles = obs;
}
void Game::setMap() {
    if(mapcount == 1){
        for (int i = 0; i < this->height; i++) {
            vector<int> v;
            for (int j = 0; j < this->weight; j++) {
                if (i == 0) {
                    v.push_back(util.getWall());
                } else if (i == this->height - 1) {
                    v.push_back(util.getWall());
                } else {
                    if (j == 0) {
                        v.push_back(util.getWall());
                    } else if (j == this->weight - 1) {
                        v.push_back(util.getWall());
                    } else {
                        v.push_back(util.getNoWall());
                    }
                }
            }
            map.push_back(v);
            map2.push_back(v);
        }
        for(int i = 0; i < this->height; i++){
            for(int j = 0; j < this->weight; j++){
                if(i == 0 && j > 6 && j < 14)map[i][j] = 1;
                if(i == this->height - 1 && j > 6 && j < 14)map[i][j] = 1;
                if(j == 0 && i > 6 && i < 14)map[i][j] = 1;
                if(j == this->weight - 1 && i > 6 && i < 14)map[i][j] = 1;
                if(i == 4 && j > 6 && j < 14)map[i][j] = 0;
                if(i == 16 && j > 6 && j < 14)map[i][j] = 0;
            }
        }
    }else if(mapcount == 2){
        for (int i = 0; i < this->height; i++) {
            vector<int> v;
            for (int j = 0; j < this->weight; j++) {
                if(j == 6 && i < 10){
                    v.push_back(util.getWall());
                }else if(i > 9 && j == 13){
                    v.push_back(util.getWall());
                }else if(i == 16 && j < 7){
                    v.push_back(util.getWall());
                }else if(i == 5 && j > 13){
                    v.push_back(util.getWall());
                }else{
                    v.push_back(util.getNoWall());
                }
            }
            map.push_back(v);
            map2.push_back(v);
        }
    }
    for (int i = 0; i < (int)obstacles.size(); i++) {
        Pos p = obstacles[i];
        //cout << p.i << " " << p.j << endl;
        map[p.i][p.j] = util.getObstacle();
        //cout << "aa" << endl;
    }

    for(int i = 0; i < this->height; i++){
        for(int j = 0; j < this->weight; j++){
            map2[i][j] = map[i][j];
        }
    }
//    for(int i = 0; i < this->height; i++){
//            for(int j = 0; j < this->weight; j++){
//                cout << map[i][j];
//            }
//            cout << endl;
//    }
}
void Game::printFood() {
    bool isRepeat = true;
    int randomX, randomY;
    while (isRepeat) {
        srand(time(0));
        randomX = rand() % weight;
        randomY = rand() % height;
        if (randomX <= 0) {
            randomX = 1;
        }
        if (randomX >= weight - 1) {
            randomX--;
        }
        if (randomY <= 0) {
            randomY = 1;
        }
        if (randomY >= height - 2) {
            randomY -= 4;
        }
        if (map[randomX][randomY] == 0){
            continue;
        }
        for (int i = 0; i < (int)snake.ps.size(); i++) {
            if (snake.ps[i].j == randomY && snake.ps[i].i == randomX) {
                break;
            }
            if (i == (int)snake.ps.size() - 1) {
                isRepeat = false;
            }
        }
    }
    foodPos.i = randomX;
    foodPos.j = randomY;
    map[randomX][randomY] = util.getFood();
}
void Game::printAndInitWall() {
    cout << "\n\t\tSnake little Game\n\n" << endl;
    cout << "\tcount:" << count << "" << endl;
    cout << "\tspeed:" << speed << "\n" << endl;
    cout << "" << endl;
    for (int i = 0; i < this->height; i++) {
        cout << "\t";
        for (int j = 0; j < this->weight; j++) {
            if (map[i][j] == util.getWall()) {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
                util.print(map[i][j]);
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |
                                        FOREGROUND_GREEN | FOREGROUND_BLUE);
            } else if (map[i][j] == util.getObstacle()) {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
                util.print(map[i][j]);
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |
                                        FOREGROUND_GREEN | FOREGROUND_BLUE);
            } else {
                util.print(map[i][j]);
            }
        }
        cout << endl;
    }
}

void Game::printSnake() {
    int randomX = 10;
    int randomY = 10;

    map[randomX][randomY] = util.getSnakeHead();
    Pos p;
    p.i = randomX;
    p.j = randomY;
    snake.ps.push_back(p);
}
void Game::updateSnake() {
    int snakeSize = snake.ps.size();
    Pos head, foot;
    Pos poss[snakeSize];
    head = snake.ps[snakeSize - 1];
    foot = snake.ps[0];
    switch (pos) {
        //     ?
        case 72:
            if (lastPos == 80) {
                pos = 80;
                return;
            } else {
                for (int i = 0 ; i < snakeSize ; i++) {
                    poss[i] = snake.ps[i];
                }
                //    snake
                if(snake.ps[snakeSize - 1].i == 0)snake.ps[snakeSize - 1].i = height;
                snake.ps[snakeSize - 1].i--;        //    ?
                for (int i = 0 ; i < snakeSize - 1 ; i++) {
                    snake.ps[i] = poss[i + 1];
                }
                if (snakeSize != 1) {
                    map[snake.ps[snakeSize - 1].i][snake.ps[snakeSize - 1].j] = util.getSnakeHead();
                }
                lastPos = 72;
            }
            break;
        //     ?
        case 80:
            if (lastPos == 72) {
                pos = 72;
                return;
            } else {
                for (int i = 0 ; i < snakeSize ; i++) {
                    poss[i] = snake.ps[i];
                }
                //    snake
                if(snake.ps[snakeSize - 1].i == height - 1)snake.ps[snakeSize - 1].i = -1;
                snake.ps[snakeSize - 1].i++;        //    ?
                for (int i = 0 ; i < snakeSize - 1 ; i++) {
                    snake.ps[i] = poss[i + 1];
                }
                if (snakeSize != 1) {
                    map[snake.ps[snakeSize - 1].i][snake.ps[snakeSize - 1].j] = util.getSnakeHead();
                }
                lastPos = 80;
            }
            break;
        //
        case 75:
            if (lastPos == 77) {
                pos = 77;
                return;
            } else {
                for (int i = 0 ; i < snakeSize ; i++) {
                    poss[i] = snake.ps[i];
                }
                //    snake
                if(snake.ps[snakeSize - 1].j == 0)snake.ps[snakeSize - 1].j = weight;
                snake.ps[snakeSize - 1].j--;        //    ?
                for (int i = 0 ; i < snakeSize - 1 ; i++) {
                    snake.ps[i] = poss[i + 1];
                }
                if (snakeSize != 1) {
                    map[head.i][head.j - 1] = util.getSnakeHead();
                }
                lastPos = 75;
            }

            break;
        case 77:
            if (lastPos == 75) {
                pos = 75;
                return;
            } else {
                for (int i = 0 ; i < snakeSize ; i++) {
                    poss[i] = snake.ps[i];
                }
                //    snake
                if(snake.ps[snakeSize - 1].j == weight - 1)snake.ps[snakeSize - 1].j = -1;
                snake.ps[snakeSize - 1].j++;        //    ?
                for (int i = 0 ; i < snakeSize - 1 ; i++) {
                    snake.ps[i] = poss[i + 1];
                }

                if (snakeSize != 1) {
                    map[head.i][head.j + 1] = util.getSnakeHead();
                }

                lastPos = 77;
            }
            break;
    }
    if (snakeSize != 1) {
        map[snake.ps[snakeSize - 2].i][snake.ps[snakeSize - 2].j] = util.getSnakeBody();
        map[foot.i][foot.j] = util.getNoWall();
    } else {
        map[snake.ps[0].i][snake.ps[0].j] = util.getSnakeHead();
        map[head.i][head.j] = util.getNoWall();
    }
}
void Game::changeMap() {
    int snakeSize = snake.ps.size();
    //     ?  ?
    updateSnake();
    //   72,  80    75    77
    //    ?   ? ?   ?
    if (snake.ps[snakeSize - 1].i == foodPos.i && snake.ps[snakeSize - 1].j == foodPos.j) {
        count += 20;
        cur += 20;
        Pos p;
        p.i = foodPos.i;
        p.j = foodPos.j;
        snake.ps.push_back(p);
        printFood();
    }
    //   ?? 100 ?         ?
    if (cur == 100) {
        speed /= 2;
        cur -= 100;
    }
    //      ?      ?
    for (int i = 0; i < (int)snake.ps.size() - 2 && snake.ps.size() != 3; i++) {
        if (snake.ps[i].j == snake.ps[snakeSize - 1].j && snake.ps[i].i == snake.ps[snakeSize - 1].i) {
            end = true;
            break;
        }
    }
    //       ?    ?
    int i = snake.ps[snakeSize - 1].i;
    int j = snake.ps[snakeSize - 1].j;
    if(map2[i][j] == 0){
        end = true;
    }

    //    ?
    if (map2[i][j] == 5) {
        //end = true;
        map2[i][j] = 1;
        Sleep(600);
        if(snakeSize > 1){
            Pos deletedPart = snake.ps[0]; //   ??  ?         岿 ? λ
            snake.ps.erase(snake.ps.begin()); // ?         ?
            map[deletedPart.i][deletedPart.j] = util.getNoWall(); //  ? ?     ? ?         岿  ?  ?  ??

        }
//        thread([this, i, j]() {
//            Sleep(3000);
//            map2[i][j] = 5; // 3   ?       3    ? ?
//            map[i][j] = 5;
//        }).detach();
    }
}
void Game::addKeyBoardListenner() {
    //   72,  80    75    77
    while (_kbhit()) {
        pos = _getch();
    }
}

void Game::start() {
    this->setMap();
    this->printSnake();
    this->printFood();
    this->printAndInitWall();

    while (true) {
        if (end) {
            printf("Gameover");
            //MessageBox(NULL, "?     ?   ", "  ?    ", MB_OK);
            break;
        }
        clearScreen();
        this->addKeyBoardListenner();
        changeMap();
        this->printAndInitWall();
        Sleep(speed);
    }
}


int main() {
    CONSOLE_CURSOR_INFO cursor_info = {1, 0};
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
    vector<Pos> obs;
    Pos p1,p2;
    p1.i = 8;
    p1.j = 10;
    p2.i = 13;
    p2.j = 10;
    obs.push_back(p1);
    obs.push_back(p2);
    Game *game = new Game(20, 20, obs);
    int choice = -1;
    while(true){
        system("cls");
        cout << "1.map1\n";
        cout << "2.map2\n";
        cout << "0.exit\n";
        cout << "choose a map:";
        cin >> choice;
        if(choice == 0){
            exit(0);
        }else if(choice == 1 || choice == 2){
            game->mapcount = choice;
            break;
        }else{
            cout << "error ,please input again\n";
        }
    }
    system("cls");
    game->start();
    return 0;
}

img

img

可以试着检查一下环境,我的devc++5.9.2也不能运行,可能跟版本有关