#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<dos.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x11b
#define N 200
struct SNAKE
{
int x;
int y;
int direction;
int data;
}Snake[N];
int len=-1;
struct FOOD
{
int x;
int y;
int status;
}Food;
void Init();
void ShowSnake(struct SNAKE *);
void ShowOldFood(struct FOOD *);
void ShowNewFood(struct FOOD *);
void ShowScore(int);
void ShowSpeed(int);
void MoveSnake(struct SNAKE *,int);
void mydelay(int);
void GameOver();
int gameover=0;
int speed=1;
int score=0;
int speed_step=100;
int delaycount=5000;
void main()
{
int key;
randomize();
Init();
while(1)
{
while(!kbhit())
{
MoveSnake(Snake,Snake[0].direction);
ShowSnake(Snake);
if(gameover==1)
{
GameOver();
exit(0);
}
ShowOldFood(&Food);
if(Food.status==0)
ShowNewFood(&Food);
mydelay(delaycount);
}
key=bioskey(0);
if(key==UP&&Snake[0].direction!=2)
MoveSnake(Snake,0);
else if(key==DOWN && Snake[0].direction!=0)
MoveSnake(Snake,2);
else if(key==LEFT && Snake[0].direction!=1)
MoveSnake(Snake,3);
else if(key==RIGHT && Snake[0].direction!=3)
MoveSnake(Snake,1);
else if(key==ESC)
{
gameover=1;
break;
}
ShowSnake(Snake);
ShowOldFood(&Food);
if(Food.status==0)
ShowNewFood(&Food);
if(gameover==1)
break;
}
if(gameover)
{
GameOver();
exit(0);
}
}
void Init()
{
int i,j;
textcolor(14);
for(i=5;i<55;i++)
{
gotoxy(i,5);
cprintf("%c",219);
gotoxy(i,19);
cprintf("%c",219);
}
for(j=5;j<20;j++)
{
gotoxy(5,j);
cprintf("%c",219);
gotoxy(54,j);
cprintf("%c",219);
}
for(i=0;i<4;i++)
{
Snake[i].x=20-i;
Snake[i].y=10;
Snake[i].direction=1;
Snake[i].data=219;
}
Snake[i].x=20-i;
Snake[i].y=10;
Snake[i].direction=1;
Snake[i].data=32;
len=i;
Food.x=20;
Food.y=20;
ShowSnake(Snake);
ShowNewFood(&Food);
ShowSpeed(speed);
ShowScore(score);
}
void ShowSnake(struct SNAKE *s)
{
int i;
for(i=0;i<=len;i++)
{
gotoxy(s->x,s->y);
cprintf("%c",s->data);
s++;
}
}
void ShowNewFood(struct FOOD *f)
{
int x,y;
gotoxy(f->x,f->y);
cprintf("%c",32);
do
{
x=rand()%54;
y=rand()%19;
}while(x<=5||y<=5);
f->x=x;
f->y=y;
gotoxy(x,y);
textcolor(14);
cprintf("\1");
f->status=1;
}
void ShowOldFood(struct FOOD *f)
{
textcolor(14);
gotoxy(f->x,f->y);
cprintf("\1");
}
void ShowScore(int score)
{
textcolor(10);
gotoxy(60,8);
cprintf("SCORE:");
gotoxy(62,9);
cprintf("%-5d",score);
}
void ShowSpeed(int speed)
{
textcolor(10);
gotoxy(60,12);
cprintf("SPEED:");
gotoxy(62,13);
cprintf("%-5d",speed);
}
void MoveSnake(struct SNAKE *s,int direct)
{
int x,y;
int i;
int flag=0;
struct SNAKE *p=s;
p->direction=direct;
switch(direct)
{
case 0:
x=p->x;
y=p->y-1;
if(x==Food.x && y==Food.y)
{
len++;
for(i=len;i>=1;i--)
*(p+i)=*(p+i-1);
Food.status=0;
flag=1;
}
p->x=x;
p->y=y;
if(!flag)
{
for(i=len;i>=1;i--)
{
switch((p+i)->direction)
{
case 0:((p+i)->y)--;break;
case 1:((p+i)->x)++;break;
case 2:((p+i)->y)++;break;
case 3:((p+i)->x)--;break;
}
(p+i)->direction=(p+i-1)->direction;
}
}
for(i=1;i<len;i++)
{
if(p->x==(p+i)->x && p->y==(p+i)->y)
{
gameover=1;
break;
}
}
if(p->x<=5 || p->x>=54 || p->y<=5|| p->y>=19)
{
gameover=1;
break;
}
break;
case 1:
x=p->x+1;
y=p->y;
if(x==Food.x&&y==Food.y)
{
len++;
for(i=len;i>=1;i--)
*(p+i)=*(p+i-1);
Food.status=0;
flag=1;
}
p->x=x;
p->y=y;
if(!flag)
{
for(i=len;i>=1;i--)
{
switch((p+i)->direction)
{
case 0:((p+i)->y)--;break;
case 1:((p+i)->x)++;break;
case 2:((p+i)->y)++;break;
case 3:((p+i)->x)--;break;
}
(p+i)->direction=(p+i-1)->direction;
}
}
for(i=1;i<len;i++)
{
if(p->x==(p+i)->x && p->y==(p+i)->y)
{
gameover=1;
break;
}
}
if(p->x<=5 || p->x>=54 || p->y<=5|| p->y>=19)
{
gameover=1;
break;
}
break;
case 2:
x=p->x;
y=p->y+1;
if(x==Food.x && y==Food.y)
{
len++;
for(i=len;i>=1;i--)
*(p+i)=*(p+i-1);
Food.status=0;
flag=1;
}
p->x=x;
p->y=y;
if(!flag)
{
for(i=len;i>=1;i--)
{
switch((p+i)->direction)
{
case 0:((p+i)->y)--;break;
case 1:((p+i)->x)++;break;
case 2:((p+i)->y)++;break;
case 3:((p+i)->x)--;break;
}
(p+i)->direction=(p+i-1)->direction;
}
}
for(i=1;i<len;i++)
{
if(p->x==(p+i)->x && p->y==(p+i)->y)
{
gameover=1;
break;
}
}
if(p->x<=5 || p->x>=54 || p->y<=5|| p->y>=19)
{
gameover=1;
break;
}
break;
case 3:
x=p->x-1;
y=p->y;
if(x==Food.x && y==Food.y)
{
len++;
for(i=len;i>=1;i--)
*(p+i)=*(p+i-1);
Food.status=0;
flag=1;
}
p->x=x;
p->y=y;
if(!flag)
{
for(i=len;i>=1;i--)
{
switch((p+i)->direction)
{
case 0:((p+i)->y)--;break;
case 1:((p+i)->x)++;break;
case 2:((p+i)->y)++;break;
case 3:((p+i)->x)--;break;
}
(p+i)->direction=(p+i-1)->direction;
}
}
for(i=1;i<len;i++)
{
if(p->x==(p+i)->x && p->y==(p+i)->y)
{
gameover=1;
break;
}
}
if(p->x<=5 || p->x>=54 || p->y<=5|| p->y>=19)
{
gameover=1;
break;
}
break;
}
if(flag==1)
{
score=score+10;
ShowScore(score);
if(score/speed_step+1>speed)
{
speed=score/speed_step+1;
ShowSpeed(speed);
delaycount=5000-speed*1000;
}
}
}
void GameOver()
{
clrscr();
textcolor(12);
gotoxy(30,12);
cprintf("----GAME OVER-----");
gotoxy(30,13);
cprintf("THANKS FOR THE GAME!");
gotoxy(30,14);
cprintf("YOUR SCORE IS:%-5d.",score);
gotoxy(30,15);
getch();
}
void mydelay(int count)
{
int i;
for(i=0;i<50;i++)
delay(count);
}
没有合适的资源?快使用搜索试试~ 我知道了~
贪吃蛇小游戏(我自己设计的),有不足之处请指教(我的邮箱hnhefrank@126.com)
共2个文件
c:1个
exe:1个
需积分: 32 9 下载量 86 浏览量
2008-12-11
17:44:09
上传
评论
收藏 9KB RAR 举报
温馨提示
这是一个我用C写的小游戏,由于我的电脑不能运行c语言写的图形程序,所以这个程序实在字符模式下运行的,所以应该一直性要好一些. 另外,有什么不足的地方请指教
资源推荐
资源详情
资源评论
收起资源包目录
Ver1.rar (2个子文件)
贪吃蛇
snake.C 6KB
snake.exe 13KB
共 2 条
- 1
资源评论
Frank_He
- 粉丝: 8
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功