贪吃蛇小游戏

刚学完C语言写的第一个小游戏,代码主要参考:
https://blog.csdn.net/qq_37074040/article/details/54766680
我在模仿代码的过程中发现了原作者程序中的一些bug,以下f附有我加以改进后的代码。

1.游戏界面
这个小游戏游戏界面的核心在于光标的控制。只要我们能让光标到达我们想要的地方,我们就能完成游戏界面的绘制,蛋的生成。简直就像天上地下,无所不能。
实现:gotoxy()函数

2.游戏体验感
如何将用户的输入读入,而不显示在屏幕上?
实现:getch()函数(包含在<conio.h>中)
如何防止用户的非法输入?玩游戏的过程中难免会摁到其他的键,如何让它不影响到我们的游戏?如果蛇在往前行走,我们控制方向向后,该怎么处理?
实现:保存蛇的前进状态。

3.游戏关键
蛇该如何打印?如何实现蛇的行走?
如何完成吃蛋的过程?
游戏结束的条件是什么?
这几个问题都是实现游戏的关键步骤,但是实际操作起来并没有想象中的那么难,希望读者结合下文代码自行思考。

代码还可以大幅度优化,读者可以自行思考。

如果发现代码有bug,欢迎下方留言。

如果觉得楼主的代码对你有帮助的话,可以点个关注,点个赞,谢谢!

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
#include <conio.h>#define frame_height 30//地图尺寸
#define frame_width 50
#define UP 'w'//移动
#define DOWN 's'
#define LEFT 'a'
#define RIGHT 'd'int i,j,k,sp,score;
char ch=UP,state=UP,choo,n;//初始化方向
int grow=0;struct Food//食物
{int x;//横坐标int y;//纵坐标
} food;struct Snake//蛇
{/*用数组储存蛇的每一部分的坐标*/int x[100];int y[100];int len;//长度int speed;//速度
} snake;void map(void);//地图
void update_food(void);//更新食物
void move_snake(void);//蛇的移动
int alive(void);//判断蛇是否死亡
void get_speed(void);//更新速度
void gotoxy(int x,int y);//移动光标,进行游戏界面的打印int main()
{do{score=0;//初始化分数为0/*让用户进行难度选择,有彩蛋*/printf("Choose the degree of difficulty:\n1:easy\t2:middle  3:difficult\n");n=getch();switch(n){case '1':{sp=300;break;}case '2':{sp=230;break;}case '3':{sp=180;break;}default:{printf("Congratulations!Welcome to Devil's difficulty\n");sp=120;break;}}system("cls");//每次新一局游戏先清屏,包含在<stdlib.h>map();//打印地图/*开始游戏*/while(1){update_food();//生产食物get_speed();//获取速度move_snake();//移动Sleep(snake.speed);//延时函数,speed数值越大延时越长if(!(alive()))//判断蛇是否死亡{break;//死亡则退出循环}}printf("Game Over!\n");printf("1:Restart\t2:exit");choo=getch();}while(choo=='1');return 0;
}void map()
{srand(time(NULL));/*打印第一个食物*//*Attention!此处留了一个bug:可能食物的位置与初始的蛇重合,然后食物就会消失,读者可以加以改进*/food.x=rand()%(frame_height-2)+1;food.y=rand()%(frame_width-2)+1;//在框内gotoxy(food.x,food.y);//把光标移动到该坐标printf("$");//打印食物/*snake的初始化*/snake.x[0]=frame_height/2;snake.y[0]=frame_width/2;gotoxy(snake.x[0],snake.y[0]);printf("@");snake.len=3;snake.speed=200;for(k=1; k<snake.len; k++){snake.x[k]=snake.x[k-1]+1;snake.y[k]=snake.y[k-1];gotoxy(snake.x[k],snake.y[k]);printf("@");}/*墙壁*/for(j=0; j<frame_width; j++){gotoxy(0,j);printf("#");gotoxy(frame_height-1,j);printf("#");}for(i=0; i<frame_height-1; i++){gotoxy(i,0);printf("#");gotoxy(i,frame_width-1);printf("#");}gotoxy(2,frame_width+3);if(n=='1') printf("Difficulty:   easy");else if(n=='2') printf("Difficulty:   middle");else if(n=='3') printf("Difficulty:   difficult");else printf("Welcome to the Devil's difficulty");gotoxy(4,frame_width+3);printf("UP:   w");gotoxy(6,frame_width+3);printf("DOWN: s");gotoxy(8,frame_width+3);printf("LEFT: a");gotoxy(10,frame_width+3);printf("RIGHT:d");gotoxy(12,frame_width+3);printf("Your score:%d",score);gotoxy(28,frame_width+3);printf("Made by Zhao Hejie");
}
/*食物*/
void update_food()
{if(snake.x[0]==food.x&&snake.y[0]==food.y)//吃到食物{score+=10;gotoxy(12,frame_width+3);printf("Your score:%d",score);srand(time(NULL));/*以下是更新食物的代码,里面排除了食物与蛇重合的情况,读者可以参考以下代码完成对上述bug的改进*/int flag=1;//标记变量do{food.x=rand()%(frame_height-2)+1;food.y=rand()%(frame_width-2)+1;//在框内for(i=0; i<snake.len; i++){if(food.x==snake.x[i]&&food.y==snake.y[i]){flag=0;//有重合break;}}}while(flag==0);/*打印食物*/gotoxy(food.x,food.y);printf("$");snake.len++;grow=1;//表明长了,在move_snake函数中有用到}
}
/*移动蛇*/
void move_snake()
{while(kbhit())//键盘有输入{ch=getch();}if(!grow)//没有长{gotoxy(snake.x[snake.len-1],snake.y[snake.len-1]);printf(" ");//走了,在数组的最后打印空格,清除原有的蛇尾}for(k=snake.len-1; k>0; k--)//更新蛇的坐标,除了蛇头,其余位置继承上一个点的坐标{snake.x[k]=snake.x[k-1];snake.y[k]=snake.y[k-1];//移动位置}switch(ch)//改变方向{case UP:{if(state==DOWN)//如果此时方向向下,输入向上的作用要被无视{snake.x[0]++;break;}else{snake.x[0]--;state=UP;//其余的改变状态为向上break;}}case DOWN:{if(state==UP){snake.x[0]--;break;}else{snake.x[0]++;state=DOWN;break;}}case LEFT:{if(state==RIGHT){snake.y[0]++;break;}else{snake.y[0]--;state=LEFT;break;}}case RIGHT:{if(state==LEFT){snake.y[0]--;break;}else{snake.y[0]++;state=RIGHT;break;}}/*摁其余键,保持原有状态*/default:{if(state==DOWN){snake.x[0]++;break;}else if(state==UP){snake.x[0]--;break;}else if(state==LEFT){snake.y[0]--;break;}else if(state==RIGHT){snake.y[0]++;break;}}}gotoxy(snake.x[0],snake.y[0]);printf("@");//打印蛇头grow=0;//初始成长状态为0gotoxy(frame_height,0);//光标移动到地图左下角下方
}
/*存活状态*/
int alive(void)
{if(snake.x[0]==0||snake.x[0]==frame_height-1||snake.y[0]==0||snake.y[0]==frame_width-1)//撞墙return 0;for(k=1; k<snake.len; k++) //咬到自己{if(snake.x[0]==snake.x[k]&&snake.y[0]==snake.y[k])return 0;}return 1;
}
/*加速*/
/*speed越大,蛇的速度越小*/
void get_speed()
{if(snake.len<=6)snake.speed=sp;else if(snake.len<=10)snake.speed=sp-20;else if(snake.len<=20)snake.speed=sp-50;else if(snake.len<=30)snake.speed=sp-60;elsesnake.speed=sp-70;
}
/*移动光标*/
void gotoxy(int x,int y)
{HANDLE hout;COORD cor;/*typedef struct _COORD{SHORT X; // horizontal coordinateSHORT Y; // vertical coordinate} COORD;用该结构体来储存坐标*/hout=GetStdHandle(STD_OUTPUT_HANDLE);//从标准输出设备中取得一个句柄/*这其中x,y的赋值对象要注意,不懂的好好想想*/cor.X=y;cor.Y=x;SetConsoleCursorPosition(hout,cor);//定位光标的函数
}

C语言简易贪吃蛇(附完整代码)相关推荐

  1. c语言贪吃蛇游戏完整代码

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105147610 废 ...

  2. 花狗C语言彩色贪吃蛇(完整代码)

    2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票! 我的投票地址:点击为我投票 写在前面: 大家好,我是 花狗Fdog ,来自内蒙古的一个小城市,目前在泰州读书. 很感谢能有这样一个平 ...

  3. JAVA课程设计(小游戏贪吃蛇)完整源码附素材(二)

    目录 JAVA课程设计(小游戏贪吃蛇)完整源码附素材(一) JAVA课程设计(小游戏贪吃蛇)完整源码附素材(二) JAVA课程设计(小游戏贪吃蛇)完整源码附素材(三) 前言 1. 任务描述 1.1  ...

  4. c语言安卓贪吃蛇代码下载,C语言贪吃蛇代码

    c语言编写贪吃蛇源代码,简单易懂,文件为VC源代码.如果你正在学习c语言,就来下载吧.很经典的 C语言贪吃蛇代码部分 #include #include #include#include #defin ...

  5. C语言实现贪吃蛇代码

    C语言实现贪吃蛇,有点难写啊. 我是用VS写的 代码里有注释 我就不多说了 大家也可以直接去下载我的可执行文件 #include<stdio.h> #include<time.h&g ...

  6. JavaGUI 简易贪吃蛇代码详解+图片素材

    简易贪吃蛇 运行截图 图片素材 代码详解 package com.du.snake; import javax.swing.*; import java.awt.*; import java.awt. ...

  7. c语言字符蛇代码,C语言实现贪吃蛇代码

    本文实例为大家分享了C语言实现贪吃蛇代码的具体代码,供大家参考,具体内容如下 #include"stdafx.h" #include #include #include #incl ...

  8. C语言实现贪吃蛇小游戏1.0

    C语言实现贪吃蛇小游戏1.0 贪吃蛇游戏要有三个东西:边框.蛇.食物 还有两个灵魂的东西:光标的移动与按键监控 一.光标的移动 在我看来在控制台上移动光标画图是实现这个小游戏的灵魂了,在这之前我一直以 ...

  9. 安卓c语言自动补全软件吾爱,C语言实现贪吃蛇小游戏

    本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 一.程序实现的原理: 1.构造蛇身:定义一个坐标数组,存放的是蛇的每一节蛇身所在的坐标位置.这样就将移动蛇身的操作转换为 ...

  10. 【笔记】用vs2017 c语言写 贪吃蛇 小游戏

    目录 文章目录 前言 一.贪吃蛇游戏 设计逻辑 二.详细介绍 1.设置界面(界面大小,背景颜色) 2.设置贪吃蛇的身体并显示 3.使之能够移动并能够穿墙 4.添加食物并让蛇吃掉 5.设置背景音乐 完整 ...

最新文章

  1. 【MFC三天一个游戏】之 局域网黑白棋
  2. POJ 3517 And Then There Was One( 约瑟夫环模板 )
  3. Some Essential JavaScript Questions And Answers(2)
  4. C#异常--System.IO.FileLoadException:“混合模式程序集是针对“v2.0.50727”版的运行时生成的错误...
  5. Base64编码的原理与常用实现
  6. C#常用42个操作类
  7. 因非法扣押物资 华为向伟创力发律师函索赔数亿元
  8. php免费下载手册,php手册|php中文手册下载|好特下载
  9. wps怎么做时间线_时间不够用怎么办?如何做才会更高效
  10. 使用Nexus搭建Maven仓库私服的权限配置心得
  11. mysql 队列表设计_mysql主从同步操作,及队列设计
  12. 浙江理工考研c语言程序设计,浙江理工大学C程序设计期末试卷A卷
  13. SQLServer 删除表中重复数据(除ID不同的)
  14. linux 中文ssid 显示乱码,把中文SSID变成乱码!一切正常了?_网络设备-中关村在线...
  15. 索尼电视总出现Android,索尼BRAVIA电视推送更新:升级安卓8.0,修复众多问题
  16. PHP支付接口对接curl Post方式提交详解
  17. 根据输入数字显示对应的英文星期名称缩写
  18. 使用wps-excell画折线图
  19. c语言实验题数鸽子和兔子,[TZOJ] 平台训练-V1
  20. Outlook 2016 配置QQ邮箱

热门文章

  1. python+java家庭理财个人理财管理系统记账系统
  2. EOS钱包、账号及其关系详解
  3. 6 款好用到爆的 JSON 处理工具,极大提高效率!
  4. 数据采集与清洗基础习题(四)Pandas初体验,头歌参考答案
  5. 身份证编码与校验码计算规则
  6. 北京化工大学研究生学堂在线矩阵论及其应用答案
  7. tomcat下载安装步骤(超详细)
  8. Bolt界面引擎中XLUE布局XML文件节点属性配置详解
  9. Kubernetes学习笔记 ~~~黑马程序员
  10. NDS –无法加载数据(解决方案)–如何更新R4内核