显示方式:清屏打印二位数组,数组即游戏地图,包括墙面(用‘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. 顺序表应用8:最大子段和之动态规划法(SDUT 3665)

    Problem Description 给定n(1<=n<=100000)个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a ...

  2. 微信小程序_(组件)icon、text、rich-text、progress四大基础组件

    微信小程序基础组件官方文档 传送门 Learn 一.icon图标组件 二.rich-text富文本组件 三.text文本组件 四.progress进度条组件 一.icon图标组件 type:icon的 ...

  3. 线程系列2--Java线程的互斥技术

    java的多线程互斥主要通过synchronized关键字实现.一个线程就是一个执行线索,多个线程可理解为多个执行线索.进程有独立的内存空间,而进程中的线程则是共享数据对象资源.这样当多个执行线索在C ...

  4. 2018-2019-2 20165215《网络对抗技术》Exp8 Web基础

    目录 实验内容 基础问题回答 实验步骤 (一)Web前端HTML (二) Web前端javascipt (三)Web后端:MySQL基础:正常安装.启动MySQL,建库.创建用户.修改密码.建表 (四 ...

  5. lamp 环境利用compser安装tp5

    1.安装compser,这个可以去百度命令 2.cd到根目录 3.composer create-project --prefer-dist topthink/think tp(tp可以随意命名) 4 ...

  6. Java IO & Serialization

    Java IO & Serialization 专为开卷考试准备,内容包括基本的文本文件和二进制文件的读写以及序列化反序列化操作 IO demo package helloworld; imp ...

  7. DP&图论 DAY 1 下午

    DP&图论  DAY 1  下午  区间和序列上的DP 序列上的DP >序列上的dp状态设计最基本的形式 F[i]表示以 i 结尾的最优值或方案数.◦ F[i][k]表示以 i 结尾附加 ...

  8. js闭包1

    闭包是函数和声明该函数的词法环境的组合. function init() { var name = "Mozilla"; // name 是一个被 init 创建的局部变量 fun ...

  9. 转:extjs 添加loading状态的三种解决办法:

    extjs 添加loading状态的三种解决办法: 方法一: //materialGrid 指需要显示loading状态的控件id var o=Ext.getCmp('materialGrid'); ...

  10. jmeter beanShell修改http请求参数

    jmeter beanShell修改http请求参数 在使用jmeter进行测试时,需要对上一步响应的明文参数,如userName='tom' token='%sdf%sdkdfj'之类的参数,加密一 ...