C语言简易贪吃蛇(附完整代码)
贪吃蛇小游戏
刚学完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语言简易贪吃蛇(附完整代码)相关推荐
- c语言贪吃蛇游戏完整代码
该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105147610 废 ...
- 花狗C语言彩色贪吃蛇(完整代码)
2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票! 我的投票地址:点击为我投票 写在前面: 大家好,我是 花狗Fdog ,来自内蒙古的一个小城市,目前在泰州读书. 很感谢能有这样一个平 ...
- JAVA课程设计(小游戏贪吃蛇)完整源码附素材(二)
目录 JAVA课程设计(小游戏贪吃蛇)完整源码附素材(一) JAVA课程设计(小游戏贪吃蛇)完整源码附素材(二) JAVA课程设计(小游戏贪吃蛇)完整源码附素材(三) 前言 1. 任务描述 1.1 ...
- c语言安卓贪吃蛇代码下载,C语言贪吃蛇代码
c语言编写贪吃蛇源代码,简单易懂,文件为VC源代码.如果你正在学习c语言,就来下载吧.很经典的 C语言贪吃蛇代码部分 #include #include #include#include #defin ...
- C语言实现贪吃蛇代码
C语言实现贪吃蛇,有点难写啊. 我是用VS写的 代码里有注释 我就不多说了 大家也可以直接去下载我的可执行文件 #include<stdio.h> #include<time.h&g ...
- JavaGUI 简易贪吃蛇代码详解+图片素材
简易贪吃蛇 运行截图 图片素材 代码详解 package com.du.snake; import javax.swing.*; import java.awt.*; import java.awt. ...
- c语言字符蛇代码,C语言实现贪吃蛇代码
本文实例为大家分享了C语言实现贪吃蛇代码的具体代码,供大家参考,具体内容如下 #include"stdafx.h" #include #include #include #incl ...
- C语言实现贪吃蛇小游戏1.0
C语言实现贪吃蛇小游戏1.0 贪吃蛇游戏要有三个东西:边框.蛇.食物 还有两个灵魂的东西:光标的移动与按键监控 一.光标的移动 在我看来在控制台上移动光标画图是实现这个小游戏的灵魂了,在这之前我一直以 ...
- 安卓c语言自动补全软件吾爱,C语言实现贪吃蛇小游戏
本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 一.程序实现的原理: 1.构造蛇身:定义一个坐标数组,存放的是蛇的每一节蛇身所在的坐标位置.这样就将移动蛇身的操作转换为 ...
- 【笔记】用vs2017 c语言写 贪吃蛇 小游戏
目录 文章目录 前言 一.贪吃蛇游戏 设计逻辑 二.详细介绍 1.设置界面(界面大小,背景颜色) 2.设置贪吃蛇的身体并显示 3.使之能够移动并能够穿墙 4.添加食物并让蛇吃掉 5.设置背景音乐 完整 ...
最新文章
- 【MFC三天一个游戏】之 局域网黑白棋
- POJ 3517 And Then There Was One( 约瑟夫环模板 )
- Some Essential JavaScript Questions And Answers(2)
- C#异常--System.IO.FileLoadException:“混合模式程序集是针对“v2.0.50727”版的运行时生成的错误...
- Base64编码的原理与常用实现
- C#常用42个操作类
- 因非法扣押物资 华为向伟创力发律师函索赔数亿元
- php免费下载手册,php手册|php中文手册下载|好特下载
- wps怎么做时间线_时间不够用怎么办?如何做才会更高效
- 使用Nexus搭建Maven仓库私服的权限配置心得
- mysql 队列表设计_mysql主从同步操作,及队列设计
- 浙江理工考研c语言程序设计,浙江理工大学C程序设计期末试卷A卷
- SQLServer 删除表中重复数据(除ID不同的)
- linux 中文ssid 显示乱码,把中文SSID变成乱码!一切正常了?_网络设备-中关村在线...
- 索尼电视总出现Android,索尼BRAVIA电视推送更新:升级安卓8.0,修复众多问题
- PHP支付接口对接curl Post方式提交详解
- 根据输入数字显示对应的英文星期名称缩写
- 使用wps-excell画折线图
- c语言实验题数鸽子和兔子,[TZOJ] 平台训练-V1
- Outlook 2016 配置QQ邮箱