每日一题 No.36 AI贪吃蛇(一)

来源:互联网 发布:乐清网络问政平台 编辑:程序博客网 时间:2024/05/16 07:40

本题要求:

作为一个一心搞游戏程序员,怎么可能不写游戏呢?今天我就带大家来写一个AI贪吃蛇,让这条小蛇吃满屏幕~

输入格式:

输出格式:

输入样例:

输出样例:

解题思路 :

c\c++ 学习AI贪吃蛇(一)

代码 :

#include <iostream>#include <cstring>#include <conio.h>#include <windows.h>#include <cstdlib>#include <ctime>using namespace std;#define X 15#define Y 15enum 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;    }}
0 0