c++贪吃蛇
2019-06-13 09:02:21来源:博客园 阅读 ()
显示方式:清屏打印二位数组,数组即游戏地图,包括墙面(用‘W’表示),蛇(‘H’表蛇头,‘B’表身体)和食物(用‘f’表示)。
const int MaxMap = 20; char map[MaxMap][MaxMap];
边缘为墙面:
for (int i = 0; i < MaxMap; i++){ map[0][i] = 'W'; map[MaxMap - 1][i] = 'W'; } for (int i = 1; i < MaxMap-1; i++){ map[i][0] = 'W'; map[i][MaxMap - 1] = 'W'; }
蛇的身体用结构体连接:
struct snake{ int x; int y; struct snake *next; }head,body1,body2,tail;
初始蛇长为4,head表示蛇头,其next指向NULL;tail表示蛇尾,进食后增加的身体加到tail之前。
int centerpoint = MaxMap / 2; head = { centerpoint, centerpoint, NULL }; body1 = { centerpoint, centerpoint-1, &head }; body2 = { centerpoint, centerpoint - 2, &body1 }; tail = { centerpoint, centerpoint - 3, &body2 }; struct snake *p = &tail; while (p != NULL){ map[p->x][p->y] = 'B'; p = p->next; } map[head.x][head.y] = 'H';
引入一个随机种子,生成食物:
void food(){ int x = 0, y = 0; srand(time(0)); while (map[x][y]!=' '){ x = rand() % (MaxMap - 1) + 1; y = rand() % (MaxMap - 1) + 1; } map[x][y] = 'f'; return; }
蛇的移动:
首先定义蛇的默认移动方向,这里默认为右(WSAD)。
char direction = 'd';
接收键盘输入的移动方向,并将其替换为默认方向;如果键盘未输入,则为默认方向。
(蛇不能向身体方向移动,此方向无效。)
(nextX,nextY表示蛇头下一个位置与此时的相对位置。)
计算蛇头应出现的下一个位置。蛇的身体跟随移动,清除原蛇尾。
char letter = direction; struct snake *p = &tail; int nextX = 0, nextY = 0, tailX = p->x, tailY = p->y; if (_kbhit()){ letter = _getch(); if (letter == 'w' || letter == 's' || letter == 'a' || letter == 'd'){ if (0 != (direction - letter)){ if (!((letter == 'w' && direction == 's') || (letter == 's' && direction == 'w') || (letter == 'a' && direction == 'd') || (letter == 'd' && direction == 'a'))) direction = letter; } } } switch (direction){ case 'w': nextX = -1; nextY = 0; break; case 's': nextX = 1; nextY = 0; break; case 'a': nextX = 0; nextY = -1; break; case 'd': nextX = 0; nextY = 1; break; default: break; } map[p->x][p->y] = ' ';
蛇身的移动,蛇头位置的计算
while (p->next != NULL){ p->x = p->next->x; p->y = p->next->y; map[p->x][p->y] = 'B'; p = p->next; } map[head.x][head.y] = 'B'; head.x += nextX; head.y += nextY;
吃食和游戏结束判定:
蛇头出现的下一个位置如果为墙面或自己的身体,游戏结束。
bool gameover(int x,int y){ if (map[x][y] == 'W' || map[x][y] == 'B') return 1; else return 0; }
蛇头出现的下一个位置如果有食物,蛇长加1。
bool eat(int x,int y){ if (map[x][y] == 'f'){ food(); return 1; } else{ return 0; } }
进食后,new一个新身体:
if (eat(head.x, head.y)){ snake *newBody = new snake; newBody->x = tail.x; newBody->y = tail.y; newBody->next = tail.next; tail.x = tailX, tail.y = tailY; tail.next = newBody; map[tailX][tailY] = 'B'; snakeLength++; } map[head.x][head.y] = 'H';
显示:
循环执行蛇的移动过程,并清屏打印地图。
完整代码:https://github.com/shuiguai/games/blob/master/snake.cpp
环境:win64,VS2010
原文链接:https://www.cnblogs.com/DarkMario/p/11012663.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:ARTS 第一周打卡
- C++ 转换函数搭配友元函数 2020-06-10
- C++ 自动转换和强制类型转换(用户自定义类类型) 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ 运算符重载 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash