本题要求:
作为一个一心搞游戏程序员,怎么可能不写游戏呢?今天我就带大家来写一个AI贪吃蛇,让这条小蛇吃满屏幕~
输入格式:
无
输出格式:
无
输入样例:
无
输出样例:
无
解题思路 :
代码 :
#include <iostream>
#include <cstring>
#include <conio.h>
#include <windows.h>
#include <cstdlib>
#include <ctime>
using namespace std;
#define X 15
#define Y 15
enum FACE {UP_, DOWN_, RIGHT_, LEFT_};
int gameMap[X][Y];
class Snake {
public:
int x; // 头部位置
int y;
int tx; // 尾巴位置
int ty;
int food;
int point;
FACE face;
Snake(int gameMap[X][Y]) {
init(gameMap);
}
void init(int gameMap[X][Y]) {
x = X / 2;
y = Y / 2;
tx = x;
ty = y;
food = 2;
point = 3;
face = UP_;
gameMap[x][y] = point;
setFood(gameMap);
}
void setFace(FACE f) {
face = f;
}
void setFood(int gameMap[X][Y]) {
int tempX, tempY;
srand(time(0));
do {
tempX = rand() % (X - 1) + 1;
tempY = rand() % (X - 1) + 1;
} while (gameMap[tempX][tempY]);
gameMap[tempX][tempY] = 2;
}
bool check(int gameMap[X][Y], int x, int y) {
if (x < 0 || y < 0 || x >= X || y >= Y || (gameMap[x][y] != 2 && gameMap[x][y] != 0)) {
return false;
} else {
if (gameMap[x][y] == 2) {
food++;
setFood(gameMap);
}
return true;
}
}
bool move(int gameMap[X][Y]) {
return moveTail(gameMap), moveHead(gameMap);
}
bool moveHead(int gameMap[X][Y]) {
switch(face) {
case UP_:
y--;
break;
case DOWN_:
y++;
break;
case LEFT_:
x--;
break;
case RIGHT_:
x++;
break;
}
if (check(gameMap, x, y)) {
gameMap[x][y] = ++point;
return true;
} else {
return false;
}
}
void moveTail(int gameMap[X][Y]) {
if (food != 0) {
food--;
return;
}
int nextX = tx;
int nextY = ty;
int fx[4] = {1, -1, 0, 0};
int fy[4] = {0, 0, -1, 1};
for (int i = 0; i < 4; i++) {
if (gameMap[tx + fx[i]][ty + fy[i]] == gameMap[tx][ty] + 1) {
nextX = tx + fx[i];
nextY = ty + fy[i];
break;
}
}
gameMap[tx][ty] = 0;
tx = nextX;
ty = nextY;
}
};
Snake snake(gameMap);
void init();
void display();
void setFood(int gameMap[X][Y]);
void control(int ch);
int main()
{
init();
display();
while (true) {
if (kbhit()) {
char a = getch();
control(a);
}
Sleep(100);
if (snake.move(gameMap)) {
system("cls");
display();
} else {
system("cls");
cout << "GameOver!" << endl;
break;
}
}
return 0;
}
void init() {
memset(gameMap, 0, sizeof(gameMap));
for (int y = 0; y < Y; y++) {
for (int x = 0; x < X; x++) {
if (x == 0 || y == 0 || x == X - 1 || y == Y - 1) {
gameMap[x][y] = 1;
}
}
}
snake.init(gameMap);
}
void display() {
for (int y = 0; y < Y; y++) {
for (int x = 0; x < X; x++) {
switch(gameMap[x][y]) {
case 0: // 空白
cout << " ";
break;
case 1: // 墙
cout << "█";
break;
case 2: // 苹果
cout << "★";
break;
default: // 蛇身
cout << "□";
break;
}
}
cout << endl;
}
}
void setFood(int gameMap[X][Y]) {
int tempX, tempY;
srand(time(0));
do {
tempX = rand() % (X - 1) + 1;
tempY = rand() % (X - 1) + 1;
} while (gameMap[tempX][tempY]);
gameMap[tempX][tempY] = 2;
}
void control(int ch) {
switch(ch) {
case 'w':
case 'W':
if (snake.face != DOWN_) {
snake.setFace(UP_);
}
break;
case 'a':
case 'A':
if (snake.face != RIGHT_) {
snake.setFace(LEFT_);
}
break;
case 'd':
case 'D':
if (snake.face != LEFT_) {
snake.setFace(RIGHT_);
}
break;
case 's':
case 'S':
if (snake.face != UP_) {
snake.setFace(DOWN_);
}
break;
}
}