c语言贪吃蛇_C语言贪吃蛇完整代码

c69297f4f06e2715fe3b8743dce68f7a.png

#include

#include

#include //windows编程头文件

#include

#include //控制台输入输出头文件

#ifndef __cplusplus

typedef char bool;

#define false 0

#define true  1

#endif

//将光标移动到控制台的(x,y)坐标点处

void gotoxy(int x, int y)

{

COORD coord;

coord.X = x;

coord.Y = y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

}

#define SNAKESIZE 100//蛇的身体最大节数

#define MAPWIDTH 78//宽度

#define MAPHEIGHT 24//高度

//食物的坐标

struct {

int x;

int y;

}food;

//蛇的相关属性

struct {

int speed;//蛇移动的速度

int len;//蛇的长度

int x[SNAKESIZE];//组成蛇身的每一个小方块中x的坐标

int y[SNAKESIZE];//组成蛇身的每一个小方块中y的坐标

}snake;

//绘制游戏边框

void drawMap();

//随机生成食物

void createFood();

//按键操作

void keyDown();

//蛇的状态

bool snakeStatus();

//从控制台移动光标

void gotoxy(int x, int y);

int key = 72;//表示蛇移动的方向,72为按下“↑”所代表的数字

//用来判断蛇是否吃掉了食物,这一步很重要,涉及到是否会有蛇身移动的效果以及蛇身增长的效果

int changeFlag = 0;

int sorce = 0;//记录玩家的得分

int i;

void drawMap()

{

//打印上下边框

for (i = 0; i <= MAPWIDTH; i += 2)//i+=2是因为横向占用的是两个位置

{

//将光标移动依次到(i,0)处打印上边框

gotoxy(i, 0);

printf("■");

//将光标移动依次到(i,MAPHEIGHT)处打印下边框

gotoxy(i, MAPHEIGHT);

printf("■");

}

//打印左右边框

for (i = 1; i < MAPHEIGHT; i++)

{

//将光标移动依次到(0,i)处打印左边框

gotoxy(0, i);

printf("■");

//将光标移动依次到(MAPWIDTH, i)处打印左边框

gotoxy(MAPWIDTH, i);

printf("■");

}

//随机生成初试食物

while (1)

{

srand((unsigned int)time(NULL));

food.x = rand() % (MAPWIDTH - 4) + 2;

food.y = rand() % (MAPHEIGHT - 2) + 1;

//生成的食物横坐标的奇偶必须和初试时蛇头所在坐标的奇偶一致,因为一个字符占两个字节位置,若不一致

//会导致吃食物的时候只吃到一半

if (food.x % 2 == 0)

break;

}

//将光标移到食物的坐标处打印食物

gotoxy(food.x, food.y);

printf("*");

//初始化蛇的属性

snake.len = 3;

snake.speed = 200;

//在屏幕中间生成蛇头

snake.x[0] = MAPWIDTH / 2 + 1;//x坐标为偶数

snake.y[0] = MAPHEIGHT / 2;

//打印蛇头

gotoxy(snake.x[0], snake.y[0]);

printf("■");

//生成初试的蛇身

for (i = 1; i < snake.len; i++)

{

//蛇身的打印,纵坐标不变,横坐标为上一节蛇身的坐标值+2

snake.x[i] = snake.x[i - 1] + 2;

snake.y[i] = snake.y[i - 1];

gotoxy(snake.x[i], snake.y[i]);

printf("■");

}

//打印完蛇身后将光标移到屏幕最上方,避免光标在蛇身处一直闪烁

gotoxy(MAPWIDTH - 2, 0);

return;

}

void keyDown()

{

int pre_key = key;//记录前一个按键的方向

if (_kbhit())//如果用户按下了键盘中的某个键

{

fflush(stdin);//清空缓冲区的字符

//getch()读取方向键的时候,会返回两次,第一次调用返回0或者224,第二次调用返回的才是实际值

key = _getch();//第一次调用返回的不是实际值

key = _getch();//第二次调用返回实际值

}

/*

*蛇移动时候先擦去蛇尾的一节

*changeFlag为0表明此时没有吃到食物,因此每走一步就要擦除掉蛇尾,以此营造一个移动的效果

*为1表明吃到了食物,就不需要擦除蛇尾,以此营造一个蛇身增长的效果

*/

if (changeFlag == 0)

{

gotoxy(snake.x[snake.len - 1], snake.y[snake.len - 1]);

printf("  ");//在蛇尾处输出空格即擦去蛇尾

}

//将蛇的每一节依次向前移动一节(蛇头除外)

for (i = snake.len - 1; i > 0; i--)

{

snake.x[i] = snake.x[i - 1];

snake.y[i] = snake.y[i - 1];

}

//蛇当前移动的方向不能和前一次的方向相反,比如蛇往左走的时候不能直接按右键往右走

//如果当前移动方向和前一次方向相反的话,把当前移动的方向改为前一次的方向

if (pre_key == 72 && key == 80)

key = 72;

if (pre_key == 80 && key == 72)

key = 80;

if (pre_key == 75 && key == 77)

key = 75;

if (pre_key == 77 && key == 75)

key = 77;

/**

*控制台按键所代表的数字

*“↑”:72

*“↓”:80

*“←”:75

*“→”:77

*/

//判断蛇头应该往哪个方向移动

switch (key)

{

case 75:

snake.x[0] -= 2;//往左

break;

case 77:

snake.x[0] += 2;//往右

break;

case 72:

snake.y[0]--;//往上

break;

case 80:

snake.y[0]++;//往下

break;

}

//打印出蛇头

gotoxy(snake.x[0], snake.y[0]);

printf("■");

gotoxy(MAPWIDTH - 2, 0);

//由于目前没有吃到食物,changFlag值为0

changeFlag = 0;

return;

}

void createFood()

{

if (snake.x[0] == food.x && snake.y[0] == food.y)//蛇头碰到食物

{

//蛇头碰到食物即为要吃掉这个食物了,因此需要再次生成一个食物

while (1)

{

int flag = 1;

srand((unsigned int)time(NULL));

food.x = rand() % (MAPWIDTH - 4) + 2;

food.y = rand() % (MAPHEIGHT - 2) + 1;

//随机生成的食物不能在蛇的身体上

for (i = 0; i < snake.len; i++)

{

if (snake.x[i] == food.x && snake.y[i] == food.y)

{

flag = 0;

break;

}

}

//随机生成的食物不能横坐标为奇数,也不能在蛇身,否则重新生成

if (flag && food.x % 2 == 0)

break;

}

//绘制食物

gotoxy(food.x, food.y);

printf("*");

snake.len++;//吃到食物,蛇身长度加1

sorce += 10;//每个食物得10分

snake.speed -= 5;//随着吃的食物越来越多,速度会越来越快

changeFlag = 1;//很重要,因为吃到了食物,就不用再擦除蛇尾的那一节,以此来造成蛇身体增长的效果

}

return;

}

bool snakeStatus()

{

//蛇头碰到上下边界,游戏结束

if (snake.y[0] == 0 || snake.y[0] == MAPHEIGHT)

return false;

//蛇头碰到左右边界,游戏结束

if (snake.x[0] == 0 || snake.x[0] == MAPWIDTH)

return false;

//蛇头碰到蛇身,游戏结束

for (i = 1; i < snake.len; i++)

{

if (snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])

return false;

}

return true;

}

int main()

{

drawMap();

while (1)

{

keyDown();

if (!snakeStatus())

break;

createFood();

Sleep(snake.speed);

}

gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2);

printf("Game Over!\n");

gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2 + 1);

printf("本次游戏得分为:%d\n", sorce);

Sleep(5000);

return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上海市计算机一级客观题,2012年上海市高校计算机等级考试(一级)模拟卷客观题...

2012年上海市高校计算机等级考试(一级)模拟卷客观题 (5页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;11.9 积分关于防火墙&#xff0c;以下说法不正确的是____A____。下列属于视频制作的常用软件的…

百度云盘云知梦php_教你搭建私有云盘,简单快速,完全傻瓜式!不限速,永久有效!...

免费的云盘服务有很多&#xff0c;但是总感觉把重要文件存在上面不安全&#xff0c;动不动就跑路或者限速。辛辛苦苦收集的学习资料&#xff0c;一夜直接可能就会付诸东流。最稳妥的方式是存放在本地硬盘中&#xff0c;但是要进行共享或者不同设备之间进行交换&#xff0c;就显…

结束 txt进程_Python多进程抓取拉钩网十万数据

转载&#xff1a;Python多进程抓取拉钩网十万数据准备安装Mongodb数据库其实不是一定要使用MongoDB&#xff0c;大家完全可以使用MySQL或者Redis&#xff0c;全看大家喜好。这篇文章我们的例子是Mongodb&#xff0c;所以大家需要下载它。在Windows中。由于MongoDB默认的数据目录…

计算机休眠怎么唤醒,电脑休眠后,就无法唤醒了?怎么办?快速教你解决这个问题...

电脑是目前人们生活、工作中使用最多的电子产品之一&#xff0c;我们都经常会使用到电脑。但是如果电脑在一段时间后不使用&#xff0c;电脑就会自动进入休眠状态&#xff0c;而在进入休眠状态的之后&#xff0c;只有当我们将电脑唤醒了&#xff0c;电脑才能够回到菜单界面当中…

python爬虫爬取音乐单曲_Python爬取qq音乐的过程实例

一、前言qq music上的音乐还是不少的&#xff0c;有些时候想要下载好听的音乐&#xff0c;但有每次在网页下载都是烦人的登录什么的。于是&#xff0c;来了个qqmusic的爬虫。至少我觉得for循环爬虫&#xff0c;最核心的应该就是找到待爬元素所在url吧。二、Python爬取QQ音乐单曲…

python类定义的讲解_python面向对象、自定义类等使用实例讲解

python 面向对象相对别的语言来说缺少两个功能&#xff1a; 1、python不具备重载&#xff0c;重载是指在同一个类中&#xff0c;使得方法有相同的名称&#xff0c;但是有不同的参数列表&#xff0c;但由于python函数具有强大的参数处理功能&#xff0c;因此这不是一个问题。 2、…

ubutun 更换网络源_「ubuntu脚本1」开启ssh替换第三方源开启tab键补齐屏蔽nouveau

Ubuntu初始化脚本,安装显卡驱动专用初始化脚本替换apt源为国内清华源,增加docker-ce国内源开启tab键补齐桌面版开启ssh仅支持Ubuntu16/18桌面版安装gcc make屏蔽nouveau 自动重启服务器生效#!/bin/bash #检测网络是否通畅 ping -w 5 qq.com || { echo "网络异常,脚本终止&…

matlab meshgrid函数_matlab入门(三)图像可视化

matlab图像可视化基本要求(1)掌握图形窗口的创建与控制&#xff0c;以及图形窗口的基本操作&#xff1b;(2)熟练掌握二维和三维绘图基本的命令、线型控制&#xff1b;(3)初步掌握用特殊的图形来表现特殊数据的性质&#xff0c;如面积图、直方 图、饼图等。(4)掌握坐标轴的控制和…

hashmap remove 没释放内存_java从零开始手写 redis(13)HashMap 源码原理详解

为什么学习 HashMap 源码&#xff1f;作为一名 java 开发&#xff0c;基本上最常用的数据结构就是 HashMap 和 List&#xff0c;jdk 的 HashMap 设计还是非常值得深入学习的。无论是在面试还是工作中&#xff0c;知道原理都对会我们有很大的帮助。本篇的内容较长&#xff0c;建…

南京高中计算机老师,南京市教育局召开中小学教师信息技术应用能力提升工程2.0市级专家组工作会议...

2021年3月2日上午&#xff0c;南京市中小学教师信息技术应用能力提升工程2.0市级专家组工作会议在雨花台区教师发展中心召开。市教育局副局长祁寿东出席会议并讲话&#xff0c;市教研室、教科所、电教馆、教师发展学院主要负责同志&#xff0c;市级专家团队成员及各区教师发展中…

python计算执行时间的函数_[python] 统计函数运行时间

第一种&#xff1a; import time def time_me(fn): #fn 是要修饰/修改 的函数 def _wrapper(*args, **kwargs): #这个 _wrapper(*args, **kwargs) 则代指fn, *args 代表一般变量参数&#xff0c; **kwargs代表 字典&#xff0c;哈希等参数 start time.perf_counter() fn(*args…

arthas 排查内存溢出_Java 应用线上问题排查思路、常用工具小结

前言本文总结了一些常见的线上应急现象和对应排查步骤和工具。分享的主要目的是想让对线上问题接触少的同学有个预先认知&#xff0c;免得在遇到实际问题时手忙脚乱。毕竟作者自己也是从手忙脚乱时走过来的。只不过这里先提示一下。在线上应急过程中要记住&#xff0c;只有一个…

flutter listview 滚动到指定位置_Flutter 布局原理及实战

1. Flutter UI架构Flutter将视图数据抽象成为三个部分&#xff0c;即Widget树、Element树和RenderObject树。Widget树&#xff1a;控件的配置信息&#xff0c;不涉及渲染&#xff0c;更新代价极低。RenderObject树&#xff1a;真正的UI渲染树&#xff0c;负责渲染UI&#xff0c…

雷神开机logo更改_国产外星人雷神再发新品 911MT逐影者RTX2060光追游戏本评测

随着NVIDIA发布了笔记本20系显卡之后&#xff0c;宣示着全民进入了“RTX光线追踪时代”&#xff0c;各种新款的游戏也纷纷宣布支持“光线追踪”技术来吸引更多的玩家&#xff0c;似乎现在游戏本上没有个“RTX”贴纸就已经不好意思跟别人打招呼了。说到2019年的RTX新品&#xff…

AJAX框架衣柜内部布局,​最合理的衣柜内部布局解析,3大细节不容小觑

时常有业主或者朋友问小轻&#xff0c;最合理的衣柜内部布局应该是怎样的&#xff0c;确实这对于非业内人士一般都是不太清楚的&#xff0c;即使有的朋友已经有了丰富的生活经验&#xff0c;甚至是业内人士也不一定对此完全了解。那么到底最合理的衣柜内部布局是怎样的呢&#…

python爬取数据保存为csv时生成编号_将爬取到到数据以CSV格式存储

CSV文件存储 CSV&#xff0c;全称为Comma-Separated Values&#xff0c;中文可以叫做逗号分隔值或字符分隔值&#xff0c;其文件以纯文本形式存储表格数据。该文件是一个字符序列&#xff0c;可以由任意数目的记录组成&#xff0c;记录间以某种换行符分隔。每条记录由字段组成&…

博达3956交换机配置手册_网络设备维保浅谈之交换机维保

随着信息化的飞速发展&#xff0c;交换机作为信息流通的承载者&#xff0c;是应用最为广泛的网络设备之一&#xff0c;其作用不言而喻。因此&#xff0c;在日产使用中&#xff0c;要注意交换机这种核心的设备的维护与保养&#xff0c;以免引发故障。交换机运维需要注意哪些问题…

java cas原理_Java并发之原子变量及CAS算法-上篇

Java并发之原子变量及CAS算法-上篇编辑​概述本文主要讲在Java并发编程的时候&#xff0c;如果保证变量的原子性&#xff0c;在JDK提供的类中是怎么保证变量原子性的呢&#xff1f;。对应Java中的包是&#xff1a;java.util.concurrent.atomic包下。因为涉及到了CAS算法&#x…

node ajax validator,使用validator.js对字符串数据进行验证

validator.js是一个对字符串进行数据验证和过滤的工具库&#xff0c;同时支持Node端和浏览器端&#xff0c;github地址是https://github.com/chriso/validator.js主要API如下&#xff1a;验证APIcontains(str, seed)验证str中是否含有seedequals(str, comparison)验证是否相等i…

css span 右端对齐_CSS标准文档流

web页面的制作&#xff0c;是个“流”&#xff0c;像水流一样&#xff0c;必须从上往下&#xff0c;一点点的编织&#xff0c;不像画画&#xff0c;可以这个地方画一个&#xff0c;另一个地方画一个&#xff0c;随意而为。标准文档流的一些微观现象1. 空白折叠现象1)标签与标签…