显示方式:清屏打印二位数组,数组即游戏地图,包括墙面(用‘W’表示),蛇(‘H’表蛇头,‘B’表身体)和食物(用‘f’表示)。

const int MaxMap = ;
char map[MaxMap][MaxMap];

边缘为墙面:

    for (int i = ; i < MaxMap; i++){
map[][i] = 'W';
map[MaxMap - ][i] = 'W';
}
for (int i = ; i < MaxMap-; i++){
map[i][] = 'W';
map[i][MaxMap - ] = 'W';
}

蛇的身体用结构体连接:

struct snake{
int x;
int y;
struct snake *next;
}head,body1,body2,tail;

初始蛇长为4,head表示蛇头,其next指向NULL;tail表示蛇尾,进食后增加的身体加到tail之前。

    int centerpoint = MaxMap / ;
head = { centerpoint, centerpoint, NULL };
body1 = { centerpoint, centerpoint-, &head };
body2 = { centerpoint, centerpoint - , &body1 };
tail = { centerpoint, centerpoint - , &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 = , y = ;
srand(time());
while (map[x][y]!=' '){
x = rand() % (MaxMap - ) + ;
y = rand() % (MaxMap - ) + ;
}
map[x][y] = 'f';
return;
}

蛇的移动:

首先定义蛇的默认移动方向,这里默认为右(WSAD)。

char direction = 'd';

接收键盘输入的移动方向,并将其替换为默认方向;如果键盘未输入,则为默认方向。

(蛇不能向身体方向移动,此方向无效。)

(nextX,nextY表示蛇头下一个位置与此时的相对位置。)

计算蛇头应出现的下一个位置。蛇的身体跟随移动,清除原蛇尾。

    char letter = direction;
struct snake *p = &tail;
int nextX = , nextY = , tailX = p->x, tailY = p->y;
if (_kbhit()){
letter = _getch();
if (letter == 'w' || letter == 's' || letter == 'a' || letter == 'd'){
if ( != (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 = -;
nextY = ;
break;
case 's':
nextX = ;
nextY = ;
break;
case 'a':
nextX = ;
nextY = -;
break;
case 'd':
nextX = ;
nextY = ;
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 ;
else
return ;
}

蛇头出现的下一个位置如果有食物,蛇长加1。

bool eat(int x,int y){
if (map[x][y] == 'f'){
food();
return ;
}
else{
return ;
}
}

进食后,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

c++贪吃蛇的更多相关文章

  1. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  2. 用C++实现的贪吃蛇游戏

    我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...

  3. [LeetCode] Design Snake Game 设计贪吃蛇游戏

    Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...

  4. JavaScript-简单的贪吃蛇小游戏

    实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...

  5. juery实现贪吃蛇的游戏

    今天用juery做了一个贪吃蛇的游戏,代码比较简陋,不过作为这些天学习juery的成果,非常有成就感.另外关于代码内容如有雷同不胜荣幸. 更改了下 让头和身子的颜色不一样 这样好区分些,虽然还是不怎么 ...

  6. HTML 5 背离贪吃蛇 写成了类似于屏幕校准

    中间写了改 改了写 还是没做出自己满意的效果 ,看来自己的确不是一个走前端的料子.当然h5还是学一点好一点 具体说来 就是 在canvas 的画布中 鼠标点击后画上一个圆形 然后就有随机的在画布上面出 ...

  7. 控制台游戏引擎CGE——贪吃蛇

    今天我也来发一个控制台游戏.先看图: 缘起 LZ是一个有严重拖延症的人,表现的形式就是隔一段时间就要刷一刷博客园. 这不前几天,看到了魏大师<使用Lua脚本语言开发出高扩展性的系统...> ...

  8. 原生JS制作贪吃蛇小游戏

    感情都在代码里,来,干了!... <!doctype html> <html> <head> <meta http-equiv="Content-T ...

  9. 基于AT89C51单片机的贪吃蛇电子游戏(仿真)

    有关贪吃蛇的历史发展可以看一下这个网址,贪吃蛇最初的设计和现在并不相同..http://www.techweb.com.cn/internet/2013-02-21/1278055.shtml 该项目 ...

  10. 小菜学习Winform(一)贪吃蛇2

    前言 上一篇<小菜学习Winform(一)贪吃蛇>中实现了简单版的贪吃蛇,在文章末也提到需要优化的地方,比如使用oo.得分模式.速度加快模式和减少界面重绘.因为是优化篇,实现方式上一篇有, ...

随机推荐

  1. 第06课:作用域、JS预解析机制

    从字面上理解----域就是空间.范围.区域,作用就是读.写,所以作用域我们可以简单理解为:在什么样空间或者范围内对数据进行什么样的读或写操作. 看一下代码 alert(a); // 为什么是undef ...

  2. AcWing:175. 电路维修(bfs)

    达达是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女翰翰,从而被收留在地球上. 翰翰的家里有一辆飞行车. 有一天飞行车的电路板突然出现了故障,导致无法启动. 电路板的整体结构是一个R ...

  3. git commit -m "XX"报错 pre -commit hook failed (add --no-verify to bypass)问题

    在同步本地文件到线上仓库的时候 报错 pre -commit hook failed (add --no-verify to bypass) 当你在终端输入git commit -m "xx ...

  4. Oracle For Linux

    安装前检查 检查是否安装以下软件rpm -qa | grep **下面**软件包 安装包名称 是否安装 binutils-2.17.50.0.6 √ compat-libstdc++-33-3.2. ...

  5. error while loading shared libraries: libXXXX.so: cannot open shared object file: No such file or directory

    出现这个问题的原因是运行程序缺少依赖库,或者运行程序的依赖库缺少依赖库,可能你的本地目录下面就有这个库文件,但是linux搜索路劲不会从当前路径下去搜索:这种情况可能出现在切换环境上,可能你在一个li ...

  6. iOS8-Sampler

    https://github.com/shu223/iOS8-Sampler iOS8-Sampler Code examples for the new functions of iOS 8. Ho ...

  7. 浅析SPDY

    1.什么是SPDY? 简单地说,在SSL层上增加一个SPDY会话层,以在一个TCP连接支持并发的HTTP请求.也就是他能通过复用仅仅一条(或几条)TCP连接,在客户端与服务器间发送几十个请求或回应. ...

  8. leetcode-hard-ListNode-23. Merge k Sorted Lists

    mycode   91.2% # Definition for singly-linked list. # class ListNode(object): # def __init__(self, x ...

  9. RGB颜色透明度转换

    100% — FF95% — F290% — E685% — D980% — CC75% — BF70% — B365% — A660% — 9955% — 8C50% — 8045% — 7340% ...

  10. 使用ViewFlipper实现广告信息栏的上下翻滚效果

    import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.Gestu ...