每日一题 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
- 每日一题 No.36 AI贪吃蛇(一)
- 每日一题 No.37 AI贪吃蛇(二)
- 每日一题 No.38 AI贪吃蛇(三)
- c\c++学习 No.4 AI贪吃蛇(一)
- 每日一题 No.39 贪吃蛇总结与后记
- 每日一题 No.43 Java基础学习(一)
- c/c++学习 No.5 AI贪吃蛇(二)
- 每日一题 No.14 全排列(利用next_permutation)
- 每日一题 No.24 跑马灯(字符串运用)
- 每日一题 No.42 最长上升序列(优化)
- 每日一题 No.5 括号匹配
- 每日一题 No.7 从小到大输出
- 每日一题 No.8 求最大公约数
- 每日一题 No.9 赛车比赛
- 每日一题 No.23 字符串学习
- 每日一题 No.35 五一劳动节快乐~
- 每日一题 No.45 输出素数
- 每日一题 No.51 API市场
- 喝茶:早上红茶,下午绿茶,晚上黑茶
- JNI中的内存管理
- CentOS6.5防火墙相关命令
- linux下php源码安装步骤
- 对于父类上转型和接口回调的理解
- 每日一题 No.36 AI贪吃蛇(一)
- Tinkphp定时发布文章的教程
- sudo指令
- Spring之AOP(非XML配置)
- 用echarts3和worldcloud制作炫酷的字符云图
- 网络协议详解
- 信息系统项目管理知识--项目整合管理
- Android工具类(时间格式化、获取地址)
- linux命令之mv