C语言贪吃蛇小游戏 | 源码

点击蓝字

ed3b7810b849bdce525ee7868f6c63a3.png

关注我们

该程序已经在VS2019上验证过了,可以直接运行。
程序目录
程序里就只有一个test.cpp文件,也就是说大家可以先创建工程,然后直

562a27051e967b559aa40dcd391de505.png

运行效果

f20138a62dc3187bd38efb5674793429.png

C语言学习资源汇总【最新版】

a82f73035351b1f4539a32d8945b6d8b.png

源码

#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<time.h>
#include<conio.h>
constexpr auto maphigh = 28, mapwide = 84;
struct virus
{
int x;
int y;
}virus;
unsigned short snakesize = 50, speed = 300, len = 4;
struct snake
{
int x[50];
int y[50];
int len;//蛇的长度
int speed;//蛇的速度
}snake;
int key = 'w';//初始化方向
void gotoxy(int x, int y);
void drawmap();
void keydown();
void creatvirus();
int snakestatus();
void startgame();
int menuselect();
void goodbye();
void introduce();
void edition();
int setup();
void respect();
int setup1();
int modifydiffculty();
void diffculty();
int customize();
void customize1();
int main()
{
for (;;){system("cls");//清屏
switch (menuselect()){
case 1://开始游戏startgame();
break;
case 2://介绍introduce();
break;
case 3://版本edition();
break;
case 4://设置setup1();
break;
case 5:goodbye();
return 0;
default:
break;}}
}
void drawmap()//1.画地图
{
//⊙:病毒    █:蛇身(占用两个字符)srand((unsigned int)time(NULL));//随机病毒出现的位置
int i, k;
for (i = 0; i <= maphigh; i++){gotoxy(0, i);
printf("█");//打印左边框gotoxy(mapwide, i);
printf("█");//打印右边框}
for (i = 0; i <= mapwide; i += 2)//+=2因为 █占两个字节{gotoxy(i, 0);
printf("█");//打印下边框gotoxy(i, maphigh);
printf("█");//打印上边框}
//画蛇snake.len = len;snake.speed = speed;
//初始化蛇的位置snake.x[0] = mapwide / 2;snake.y[0] = maphigh / 2;//[0]为蛇头的位置
//画蛇头gotoxy(snake.x[0], snake.y[0]);
printf("█");
//画蛇身
for (k = 1; k < snake.len; k++){snake.x[k] = snake.x[k - 1] + 2;snake.y[k] = snake.y[k - 1];gotoxy(snake.x[k], snake.y[k]);
printf("█");}
while (1){virus.x = rand() % (mapwide - 4) + 2;//+2,+1这个与█所占的字符有关,长占两个字符宽1个virus.y = rand() % (maphigh - 2) + 1;//画个图,显而易见
if (virus.x % 2 == 0)
break;}gotoxy(virus.x, virus.y);
printf("⊙");gotoxy(mapwide + 4, maphigh);
printf("⊙:%d", snakesize - snake.len);
}
void creatvirus()//2.产生病毒
{
if (snake.x[0] == virus.x && snake.y[0] == virus.y){
//printf("\a");//声音snake.len++;srand((unsigned)time(NULL));
while (1){
int flag = 1;virus.x = rand() % (mapwide - 4) + 2;//+2,+1这个与█所占的字符有关,长占两个字符宽1个virus.y = rand() % (maphigh - 2) + 1;//画个图,显而易见
//产生的病毒不能在蛇的身上
for (int k = 0; k < snake.len; k++){
if (snake.x[k] == virus.x && snake.y[k] == virus.y){flag = 0;//virus不合适的标志
break;}}
if (flag == 1 && virus.x % 2 == 0)//病毒位置合法且x坐标为偶数{//x左右是以两个字节为单位运动的,若virus的x坐标为奇数,就不存在snake.x[k] == virus.x
break;}}}gotoxy(virus.x, virus.y);
printf("⊙");gotoxy(mapwide + 8, 0);//将光标移走
printf("W");gotoxy(mapwide + 6, 1);
printf("A S D \t进行控制");gotoxy(mapwide + 4, maphigh);
printf("⊙:%d", snakesize - snake.len);
}
void keydown()//3.按键
{
int i, temp;
if (_kbhit()) //kbhit函数检查当前是否有键盘输入,若有则返回一个非0值,否则返回0{fflush(stdin);// 清空输入缓冲区,通常是为了确保不影响后面的数据读取temp = _getch();//getch:从控制台读取一个字符,但不显示在屏幕上
if ((temp == 'a' || temp == 'A') && (key != 'D' && key != 'd'))//解决了按反方向键蛇自杀的问题{key = temp;}
if ((temp == 'w' || temp == 'W') && (key != 's' && key != 'S')){key = temp;}
if ((temp == 's' || temp == 'S') && (key != 'W' && key != 'w')){key = temp;}
if ((temp == 'D' || temp == 'd') && (key != 'a' && key != 'A')){key = temp;}}
//擦除最后一节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];//以前1的位置现在变成了2,0变成了1snake.y[i] = snake.y[i - 1];}
switch (key)//最后一节已经擦出,前移后0,1位置重合,左上角坐标为0,0{
case'w':
case'W':snake.y[0]--;
break;
case's':
case'S':snake.y[0]++;
break;
case'a':
case'A':snake.x[0] -= 2;
break;
case'd':
case'D':snake.x[0] += 2;
break;}gotoxy(snake.x[0], snake.y[0]);
printf("█");gotoxy(mapwide + 2, 0);//将光标移走
}
int snakestatus()//4.蛇的状态
{
if ((snake.x[0] == 0 || snake.x[0] == mapwide) || (snake.y[0] == 0 || snake.y[0] == maphigh))
return 0;
for (int k = 1; k < snake.len; k++){
if (snake.x[0] == snake.x[k] && snake.y[0] == snake.y[k])
return 0;}
return 1;
}
void gotoxy(int x, int y)
{//1.找到控制台这个窗口HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
/*HANDLE为句柄  ↑得到(输出窗口的)句柄。Windows是一个以虚拟内存为基础的操作系统,很多时候,进程的代码和数据并不全部装入内存,进程的某一段装入内存后,还可能被换出到外存,当再次需要时,再装入内存。两次装入的地址绝大多数情况下是不一样的。也就是说,同一对象在内存中的地址会变化。那么,程序怎么才能准确地访问到对象呢?为了解决这个问题,Windows引入了句柄。数值上,是一个32位无符号整型值(32位系统下);逻辑上,相当于指针的指针;形象理解上,是Windows中各个对象的一个唯一的、固定不变的ID;作用上,Windows使用句柄来标识诸如窗口、位图、画笔等对象,并通过句柄找到这些对象。*/
//2.设置光标COORD coord;
/*COORD 为Windows.h中自带函数原型大体为struct _coord{short x;short y;}coord;*/coord.X = x;coord.Y = y;
//4.同步到控制台SetConsoleCursorPositionSetConsoleCursorPosition(handle, coord);//定位到handle这个窗口,把光标打在coord坐标
}
void startgame()
{system("cls");drawmap();
while (1){creatvirus();keydown();Sleep(snake.speed);//void sleep(int seconds)自带函数参数 seconds 为要暂停的毫秒数。
if (!snakestatus())//判断死亡时snakestaus为0,{gotoxy(mapwide / 2, maphigh / 2);
printf("Game Over");getchar();getchar();
break;}
if (snake.len == snakesize){gotoxy(mapwide / 3, maphigh / 2);
printf("恭喜您消灭了全部病毒,胜利(^-^)V");getchar();respect();
break;}}
}
int menuselect()
{
char number;
int a;
printf("\n\n\t\t\t\t\t\t1.开始游戏\n");
printf("\n\t\t\t\t\t\t2.游戏介绍\n");
printf("\n\t\t\t\t\t\t3.游戏版本\n");
printf("\n\t\t\t\t\t\t4.设置\n");
printf("\n\t\t\t\t\t\t5.退出游戏\n");
printf("\n\t\t\t\t\t\t请选择(数字)");
while (1){number = getchar();a = (int)number - 48;
if (number <= '5' && number >= '1')
return a;
printf("\n\t\t\t\t\t\t\t      ");}
}
void goodbye()
{system("cls");SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);//设置红色gotoxy(0, 12);
printf("\t\t\t\t\t\t谢谢使用!再见!\n");getchar();getchar();
}
void respect()
{system("cls");gotoxy(0, 4);
printf("\t\t*在此向全国的医护人员表示敬意*\n\n");Sleep(1000);
printf("\t\t*感谢他们的默默付出*\n\n");Sleep(1000);
printf("\t\t*感谢他们对抗击疫情做出的贡献*\n\n");Sleep(1000);
printf("\t\t*此致*\n\n");
printf("\t\t*                      敬礼 *\n\n");Sleep(2000);getchar();
}
void introduce()
{system("cls");gotoxy(0, 4);
printf("\t\t\t\t        游戏规则           \n\n");
printf("\t\t\t\t2020年新冠病毒肆虐,威胁着人类\n\n");
printf("\t\t\t\t玩家将控制蛇消灭随机出现的病毒⊙\n\n");
printf("\t\t\t\t消灭所有病毒即可获得胜利。\n\n");
printf("\n\n\n\n\n");
printf("\t\t\t\t\tEnter返回主菜单");getchar();getchar();
}
void edition()
{system("cls");gotoxy(0, 4);
printf("\t\t\t\t*********************************************\n\n");
printf("\t\t\t\t*               欢         迎               *\n\n");
printf("\t\t\t\t*                版本号:1.2               *\n\n");
printf("\t\t\t\t*        更新:1.修复了反方向自杀的问题     *\n\n");
printf("\t\t\t\t*              2.修复了蛇吃墙的问题         *\n\n");
printf("\t\t\t\t*              3.新增了菜单与设置功能       *\n\n");
printf("\t\t\t\t*              4.修改了部分整形变量节省空间 *\n\n");
printf("\t\t\t\t*********************************************\n\n");
printf("\t\t\t\t\tEnter返回主菜单");getchar();getchar();
}
int setup()
{
//system("color 6f"); //第一个为背景色,第二个为字体颜色
/*0 = 黑色       8 = 灰色1 = 蓝色       9 = 淡蓝色2 = 绿色       A = 淡绿色3 = 湖蓝色     B = 淡浅绿色4 = 红色       C = 淡红色5 = 紫色       D = 淡紫色6 = 黄色       E = 淡黄色7 = 白色       F = 亮白色*/
char s;
int a;system("cls");
printf("\n\n\t\t\t\t\t\t1.修改难度\n");
printf("\n\t\t\t\t\t\t2.自义定设置\n");
printf("\n\t\t\t\t\t\t3.颜色设置\n");
printf("\n\t\t\t\t\t\t4.音效设置\n");
printf("\n\t\t\t\t\t\t5.返回\n");
printf("\n\t\t\t\t\t\t请选择(数字)");
while (1){s = getchar();a = (int)s - 48;
if (s <= '5' && s >= '1')
return a;
printf("\n\t\t\t\t\t\t\t      ");}
}
int setup1()
{
switch (setup()){
case 1:diffculty();
break;
case 2:customize1();
break;
default:
break;}
return 0;
}
int modifydiffculty()
{
char s;
int a;system("cls");
printf("\n\n\t\t\t\t\t\t1.简单\n");
printf("\n\t\t\t\t\t\t2.普通\n");
printf("\n\t\t\t\t\t\t3.困难\n");
printf("\n\t\t\t\t\t\t4.修罗地狱\n");
printf("\n\t\t\t\t\t\t请选择(数字)");
while (1){s = getchar();a = (int)s - 48;
if (s <= '4' && s >= '1')
return a;
printf("\n\t\t\t\t\t\t\t      ");}
}
void diffculty()
{
switch (modifydiffculty()){
case 1:len = 4;speed = 500;snakesize = 10;system("cls");gotoxy(8, 8);
printf("\t\t\t\t\t\t 修改成功!\n");
printf("\t\t\t\t\t\t \n");system("pause");
break;
case 2:len = 4;speed = 300;snakesize = 25;system("cls");gotoxy(8, 8);
printf("\t\t\t\t\t\t 修改成功!\n");
printf("\t\t\t\t\t\t \n");system("pause");
break;
case 3:len = 4;speed = 70;snakesize = 50;system("cls");gotoxy(8, 8);
printf("\t\t\t\t\t\t 修改成功!\n");
printf("\t\t\t\t\t\t \n");system("pause");
break;
case 4:len = 4;speed = 25;snakesize = 70;system("cls");gotoxy(8, 8);
printf("\t\t\t\t\t\t 修改成功!\n");
printf("\t\t\t\t\t\t \n");system("pause");
break;
default:
break;}
}
int customize()
{
char s;
int a;system("cls");
printf("\n\n\t\t\t\t\t\t1.自定义速度\n");
printf("\n\t\t\t\t\t\t2.自定义初始长度\n");
printf("\n\t\t\t\t\t\t请选择(数字)");
while (1){s = getchar();a = (int)s - 48;
if (s <= '2' && s >= '1')
return a;
printf("\n\t\t\t\t\t\t\t      ");}
}
void customize1()
{
int s;
switch (customize()){
case 1://自定义速度system("cls");gotoxy(8, 8);
printf("\t\t\t\t请输入速度(1-999)");scanf_s("%d", &s);speed = (1000 - s);
break;
case 2:system("cls");gotoxy(8, 8);
printf("\t\t\t\t请输入初始长度:");scanf_s("%d", &s);len = s;
break;
default:
break;}
}

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

ade58fa691d1b8625a229c17709196f4.png

d526285b51c4dafaf3dd45afa17bf3ea.gif

戳“阅读原文”我们一起进步

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

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

相关文章

东华大学计算机学院讲座单,计信学院成功举办2018级专业导师面对面系列讲座活动...

为帮助大一新生尽快适应大学生活&#xff0c;了解专业&#xff0c;掌握知识&#xff0c;计信学院积极响应学校号召&#xff0c;成立由教授、博士组成的专业导师团队&#xff0c;为各专业开展系列专业知识讲座。自10月17日晚7点至10月26日下午4点&#xff0c;各专业导师面对面系…

C函数指针别再停留在语法,得上升到软件设计

点击蓝字关注我们经常有朋友问到底如何在C程序中采用面向对象编程?如何让模块之间松耦合&#xff1f;......其实究其原因还是没有把C语言与软件设计很好的联系起来。这里跟大家找了一些内容&#xff0c;相信认真看完全文多多少少会有你想要的答案&#xff1a;正文部分&#xf…

spring默认缓存管理器_使用Spring的缓存管理器缓存Web内容

spring默认缓存管理器在这篇文章中&#xff0c;我想向大家展示如何使用Spring的CacheManager&#xff0c; Cacheable和JMX批注来缓存和管理Web内容的缓存的基础知识。 想象一下一个网上商店&#xff0c;它从远程WCMS&#xff08;Web内容管理系统&#xff09;获取一些内容&#…

计算机软件选修课选什么好,大学值得选的“选修课”,一点不比专业课差,能选上最好认真听...

原标题&#xff1a;大学值得选的“选修课”&#xff0c;一点不比专业课差&#xff0c;能选上最好认真听文/小哈你是怎样对待你的选修课的&#xff1f;以前经常听学长学姐们说过这样一句话&#xff0c;“上大学之后&#xff0c;专业课选逃&#xff0c;选修课必逃”。不知道大家是…

C/C++程序员的编程修养

点击蓝字关注我们什么是好的C/C程序员&#xff1f;是不是懂得很多技术细节&#xff1f;还是懂底层编程&#xff1f;还是编程速度比较快&#xff1f;我觉得都不是。对于一些技术细节来说和底层的技术&#xff0c;只要看帮助&#xff0c;查资料就能找到&#xff0c;对于速度快&am…

python账号密码一一对应_python模拟用户登录系统,如何两个用户输入各自的密码才能登入?...

展开全部 #我可以把我自己2113的成果送你&#xff0c;你来研究5261研究 import json #用来存储数据4102的模块 import os #用来进行文件操作1653 import sys #获取脚本所在目录用 import re #用来进行字符串操作 script_path os.path.realpath(__file__) PATH os.path.dirnam…

C语言#define与typedef的区别

点击蓝字关注我们在C语言编程中&#xff0c;typedef 和 #define是最常用语句&#xff0c;可能很多工作过几年的工程师都没有去深究过它们的一些用法和区别。typedef的用法在C/C语言中&#xff0c;typedef常用来定义一个标识符及关键字的别名&#xff0c;它是语言编译过程的一部…

html文字添加波浪线,利用css渐变给文字下方加波浪线

具体代码如下.wavy-line-decoration {position: relative;line-height: 1.5em;}.wavy-line-decoration::before {content: ;position: absolute;bottom: -3px;width: 100%;height: 0.25em;background: // 可以给同一个元素同时添加多个背景渐变图层&#xff0c;用逗号隔开&…

新旧C++生成随机浮点数方法,你喜欢哪个?

点击蓝字关注我们一、在C11之前&#xff0c;我们通常采用rand函数来生成随机数。有时我们想用rand生成一组随机数&#xff0c;即使我们调用了srand&#xff0c;但生成的还是相同值。为什么会产生这种情况&#xff1f;又该如何解决&#xff1f;下面将用第一视角一起探究这其中的…

html页面加载完成后会触发的事件_前端隐秘角落 - 页面渲染

前言如图所示&#xff0c;webkit内核浏览器的渲染过程(解析HTML&#xff0c;构建DOM树&#xff0c;解析CSS&#xff0c;构建CSSOM树 &#xff0c;构建render树&#xff0c;布局layout&#xff0c;绘制painting)&#xff0c;这些过程理解起来可能有些抽象&#xff0c;今天我们一…

计算机进管理提示找不到入口,win10系统开机提示xxxdll模块已加载但找不到入口点的教程...

有关win10系统开机提示xxxdll模块已加载但找不到入口点的操作方法想必大家有所耳闻。但是能够对win10系统开机提示xxxdll模块已加载但找不到入口点进行实际操作的人却不多。其实解决win10系统开机提示xxxdll模块已加载但找不到入口点的问题也不是难事&#xff0c;小编这里提示两…

十大经典排序,你真的都会了吗?(源码详解)

点击蓝字关注我们一、前言&#xff1a;排序的概念排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键…

jvm 架构_不可变的基础架构,热部署和JVM

jvm 架构您是否在生产中部署和取消部署基于JVM的应用程序&#xff08;无论JVM容器/无容器&#xff09;&#xff1f; 也就是说&#xff0c;当您拥有某个应用程序或服务的新版本时&#xff0c;是否通过“取消部署”和“热部署”该应用程序的新更新版本来更改正在运行的JVM&#x…

c语言默认参数_5.1 C++有默认参数的函数

点击上方“C语言入门到精通”&#xff0c;选择置顶第一时间关注程序猿身边的故事作者闫小林白天搬砖&#xff0c;晚上做梦。我有故事&#xff0c;你有酒么&#xff1f;C有默认参数的函数在函数调用时形参从实参获取值&#xff0c;因为实参的个数要和形参相同&#xff0c;但有时…

计算机组成原理唐朔飞课后答案第六章,计算机组成原理第六章部分课后题答案(唐朔飞版)...

计算机组成原理第六章部分课后题答案(唐朔飞版) 6.4 设机器数字‎长为8位(含1位符号‎位在内)&#xff0c;写出对应下‎列各真值的‎原码、补码和反码‎。 -13/64&#xff0c;29/128&#xff0c;100&#xff0c;-87 解&#xff1a;十进制数 二进制数 原 码 反 码 补 码 -13/64 …

jboss eap 7.0_是时候抛弃Java 7 – JBoss EAP 6.4了!

jboss eap 7.0这一周真是太棒了。 JBoss EAP 6.4已发布&#xff0c;在众多技术增强和新功能中 &#xff0c;最大的是&#xff1a;Java 8已添加到受支持的配置列表中。 其中包括Oracle JDK和IBM JDK。 Java SE 7公开更新结束通知 2015年4月之后&#xff0c;Oracle将不再将Java …

C语言史上最愚蠢的BUG ???

点击蓝字关注我们本文来自“The most stupid C bug ever”&#xff0c;很有意思&#xff0c;分享给大家。我相信这样的bug&#xff0c;就算你是高手你也会犯的。你来看看作者犯的这个Bug吧。。首先&#xff0c;作者想用一段程序来创建一个文件&#xff0c;如果有文件名的话&…

python 字符串转日期_我总结的130页Python与机器学习之路V1.2.pdf,都是干货!

告别枯燥&#xff0c;通过学习有趣的小例子&#xff0c;扎实而系统的入门Python&#xff0c;从菜鸟到大师&#xff0c;个人觉得这是很靠谱的一种方法。通过一个又一个的小例子&#xff0c;真正领悟Python之强大&#xff0c;之简洁&#xff0c;真正做到高效使用Python.两周前发出…

大学计算机需要论文吗,大一新生刚开学,是否有必要带电脑?听听辅导员的建议,非常中肯...

原标题&#xff1a;大一新生刚开学&#xff0c;是否有必要带电脑&#xff1f;听听辅导员的建议&#xff0c;非常中肯各大高校的录取工作正在如火如荼的进行&#xff0c;很快考生们就能接到来自各个学校的录取通知书。对于考生来说&#xff0c;没有什么事情会比被心仪的大学录取…

计算机系统是连续系统,连续系统的计算机模拟

连续系统的计算机模拟 (36页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;29.9 积分&#xfeff; 第2章 连续系统的计算机模拟本章讨论连续系统的模拟技术,由于这类系统中状态随时间连续动态地变化&…