一个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;
}
可以试着检查一下环境,我的devc++5.9.2也不能运行,可能跟版本有关