思路:函数gotoxy(x,y)使光标移植屏幕的x,y坐标(屏幕左上角为0,0),用来绘制蛇和界面,color()函数用来设置绘制的颜色。设有snakelong节,第i节蛇的x坐标为x[i],y坐标为y[i],以用户设置重新绘制蛇,

根据键盘输入控制蛇头(x[1],y[1])的坐标,然后绘制蛇头,并且擦掉蛇尾(x[snakelong],y[snakelong]),每次更新界面时判断蛇头是否和蛇身相交或者与墙壁相交,如果有则退出循环结束游戏,每次更新界面

判断蛇头是否和苹果(使蛇变长)相交,相交的话snakelong++。并且下次绘制时不擦蛇尾。当苹果被吃掉了,则新随机生成一个苹果,苹果在界面内并且不与蛇相交。

其他积分计算什么的看代码吧。

#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <dos.h>
int x[10000];
int y[10000];
int snakelong=3;
int applex,appley;
char c;
int h=25;
int w=50;
int life=0;
int speed;
int go=5; //0:front 1:back 2:left 3:right
int eatapple=1; //0:yes 1:no
int setapple=0; //0:yes 1:no
void color(int b)
{
HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ;
SetConsoleTextAttribute(hConsole,b) ;
}
void gotoxy(int x, int y)
{
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void snakemove(int go)
{
if(eatapple==0)
{
eatapple=1;
setapple=0;
snakelong++;
}
else
{
gotoxy(x[snakelong]+1,y[snakelong]);
printf("\b ");
}
int i;
for(i=snakelong;i>=2;i--)
{
x[i]=x[i-1];
y[i]=y[i-1];
}
if(go==0)
{
y[1]--;
gotoxy(x[1],y[1]);
printf("■");
}
if(go==1)
{
y[1]++;
gotoxy(x[1],y[1]);
printf("■");
}
if(go==2)
{
x[1]=x[1]-2;
gotoxy(x[1],y[1]);
printf("■");
}
if(go==3)
{
x[1]=x[1]+2;
gotoxy(x[1],y[1]);
printf("■");
}
}
void printback(int high,int weight)
{
int i;
for(i=1;i<=weight;i=i+2)
{
gotoxy(i,0);
printf("□");
}
for(i=1;i<=weight;i=i+2)
{
gotoxy(i,high-1);
printf("□");
}
for(i=1;i<=high;i++)
{
gotoxy(0,i-1);
printf("□");
}
for(i=1;i<=high;i++)
{
gotoxy(weight,i-1);
printf("□");
}
gotoxy(w+3,0);
printf("按空格键暂停");
gotoxy(w+3,1);
printf("按wasd控制前后左右与继续");
}
void drawapple()
{
color(14);
int i;
int a=0;
srand(time(0));
while(1)
{
int a=0;
applex=(rand()%((w/2)-1))*2+2;
appley=(rand()%(h-2))+1;
for(i=1;i<=snakelong;i++)if(applex!=x[i]||appley!=y[i]) a++;
if(a==snakelong) break;
}
gotoxy(applex,appley);
printf("★");
setapple=1;
color(10);
}
int main()
{
system("chcp 936>NUL");//设置编码为UNICODE
SetConsoleTitle("贪吃蛇 by 软剑攻城狮");
printf("请输入速度等级(1-10),等级越高速度越快,按回车确认:");
scanf("%d",&speed);
if(speed<1||speed>10)
{
printf("输入错误,按任意键退出!");
getch();
exit(0);
}
x[1]=10;
y[1]=10;
int i;
gotoxy(0,0);
for(i=1;i<=1000;i++)printf(" ");
color(12);
printback(h,w);
color(10);
gotoxy(x[1],y[1]);
printf("■");
while(life==0)
{
if(kbhit())
{
c=getch();
if(c=='w'&&go!=1) go=0;
if(c=='s'&&go!=0) go=1;
if(c=='a'&&go!=3) go=2;
if(c=='d'&&go!=2) go=3;
if(c==' ') go=5;
}
for(i=2;i<=snakelong;i++)
if(x[1]==x[i]&&y[1]==y[i])
{
life=1;
break;
}
if(life==1) break;
if(x[1]<=0||x[1]>=w||y[1]<=0||y[1]>=h-1) break;
if(x[1]==applex&&y[1]==appley)
{
eatapple=0;
Beep(2000,50);
}
if(go!=5) snakemove(go);
if(setapple==0) drawapple();
gotoxy(w+3,3);
printf("分数:%d",(snakelong-3)*10);
Sleep(250-speed*20);
}
Beep(350,200);
Beep(250,200);
gotoxy(0,h+1);
printf("你的蛇死了,按任意键退出游戏");
getch();
return 0;
}

随意转载,没有版权~(要转载还是说上是我写的啊!)

c语言贪吃蛇的更多相关文章

  1. c语言贪吃蛇详解3.让蛇动起来

    c语言贪吃蛇详解3.让蛇动起来 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 上次 ...

  2. c语言贪吃蛇详解-2.画出蛇

    c语言贪吃蛇详解-2.画出蛇 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 蛇的身 ...

  3. c语言贪吃蛇详解1.画出地图

    c语言贪吃蛇详解-1.画出地图 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 首先 ...

  4. c语言贪吃蛇详解5.GameOver功能与显示成绩

    c语言贪吃蛇详解5.GameOver功能与显示成绩 以前我们已经做出来了一个能吃东西变长的蛇.不过它好像不会死... 现在就来实现一下game over的功能吧. 写个函数判断蛇是否撞到自己或者撞到墙 ...

  5. c语言贪吃蛇详解4.食物的投放与蛇的变长

    c语言贪吃蛇详解4.食物的投放与蛇的变长 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识 ...

  6. 程序游戏推荐(C语言贪吃蛇,python天天酷跑(需要安装pygame),js是狠人就坚持30s)

    下面是下载位置,我把他们上传到我的文件下了. C语言贪吃蛇:https://files.cnblogs.com/files/ITXiaoAng/%E8%B4%AA%E5%90%83%E8%9B%87. ...

  7. C/C++编程笔记:C语言贪吃蛇源代码控制台(二),分数和食物!

    接上文<C/C++编程笔记:C语言贪吃蛇源代码控制台(一),会动的那种哦!>如果你在学习C语言开发贪吃蛇的话,零基础建议从上一篇开始哦!接下来正式开始吧! 三.蛇的运动 上次我已经教大家画 ...

  8. C/C++编程笔记:C语言贪吃蛇源代码控制台(一),会动的那种哦!

    前几天有个同学加我QQ私聊我说他们老师布置了一个贪吃蛇,他不知道怎么写所以来找我求解,我给他简单讲解了思路和一些难点之后他也能够自己独立将项目完成了!考虑到更多同学可能有贪吃蛇上的问题,今天有时间就来 ...

  9. [C语言]贪吃蛇_结构数组实现

    一.设计思路 蛇身本质上就是个结构数组,数组里存储了坐标x.y的值,再通过一个循环把它打印出来,蛇的移动则是不断地刷新重新打印.所以撞墙.咬到自己只是数组x.y值的简单比较. 二.用上的知识点 结构数 ...

随机推荐

  1. Google, FaceBook, Amazon 加州求职记 (转)

    http://blog.csdn.net/ithomer/article/details/8774006 http://www.myvisajobs.com 一年多前,出于显而易见的原因,下定决心肉身 ...

  2. RPM的基础命令/yum基本命令

    rpm的使用方式非常简单,常用的一些命令如下: 安装软件:rpm -ivh *.rpm 卸载软件:rpm -e 软件名 升级形式安装:rpm -U *.rpm 常用参数: -v 显示详细信息 -h 显 ...

  3. Elasticsearch 搜索不到数据问题(_mapping 设置)

    需求 由于 kibana3 中,不支持直接在请求的 url 中设置搜索的 type (是不是我不知道???). 为了支持特定 type 的搜索,所以我设置了个下每个 panel 的查询语句,让它增加一 ...

  4. 关于常用的git命令列表

    我博客园中所写的git内容几乎都是看的蒋鑫老师的<git权威指南>这本书实在太好了. 常用的Git命令. git add  添加到暂存区 git add interactive  交互式添 ...

  5. Linux下安装MATLAB的一些注意事项

    1,下载matlab的linux版本. matlab2012a的种子文件, Matlab_Unix_2012a.torrent 我是在window机子上下载了MATLAB的Linux版本. 2,把MA ...

  6. golang 依赖控制反转(IoC)

    主流开发语言,为了达到项目间的低耦合,都会借助IoC框架来实现.即抽象和实现分离,使用抽象层,不用关心这些抽象层的具体实现:抽象层的实现,可以独立实现.现在比较流行的领域驱动设计(ddd),为了达到将 ...

  7. Lodop实现web套打

    WEB套打可选方案不多,理想的更少,利用免费控件Lodop+JavaScript实现精确套打,算是较为经典的选择.这种方案其实比较简单,利用一个htm文件就可以实现模板设计过程,几乎是“空手套”式的开 ...

  8. 【转】MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突

    [转]MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体 ...

  9. activiti源码解读之心得整编

    TaskService.completeTask()的执行内幕是啥? activiti采取了command模式,completeTask会被包装成一个CompleteTaskCmd,一个Cmd执行的时 ...

  10. ASP 生成带日期的随机数

    <% Function getRnd() '**************************************** '返回值:如getRnd(),即输出2008082415534646 ...