贪吃蛇源码
2006-05-08 23:52
302 查看
去年五一写的一个贪吃蛇游戏,在TC3下运行成功,过几天加点注释~~ 大家先凑和看吧...HOHO....
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <time.h>
#include <conio.h>
#include <graphics.h>
#define VK_ESC 0x11b
#define VK_UP 0x4800
#define VK_DOWN 0x5000
#define VK_LEFT 0x4b00
#define VK_RIGHT 0x4d00
#define TIMER 0x1c
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
int TimerCounter=0;
typedef struct {
int x,y,di,length,isdrawed;
}snakenode,*snakelink;
typedef struct {
int x,y;
}beandef,*beanlink;
void initsnake(snakelink,beanlink);
void showsnake(snakelink,beanlink);
void randbean(beanlink);
void snakedeath(int);
void interrupt ( *oldhandler)(__CPPARGS);
void interrupt newhandler(__CPPARGS)
{
TimerCounter++;
oldhandler();
}
void SetTimer(void interrupt (*IntProc)(__CPPARGS))
{
oldhandler=getvect(TIMER);
disable();
setvect(TIMER,IntProc);
enable();
}
void KillTimer()
{
disable();
setvect(TIMER,oldhandler);
enable();
}
void main(void)
{
int key,time=0;
int gdriver = VGA, gmode=VGAHI, errorcode;
char *bgifile=""; //注意:图形文件的路径要改
snakenode snode[61];
beandef bean={0,0};
SetTimer(newhandler);
initgraph(&gdriver, &gmode, bgifile);
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %sn", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
setbkcolor(1);
// outtextxy(1,1,"You canceled!! Thanks for playing!!");
outtextxy(230,200,"Press key to Start Snake!");
getchar();
setcolor(1);
outtextxy(230,200,"Press key to Start Snake!");
initsnake(snode,&bean);
setcolor(5);
showsnake(snode,&bean);
while(1)
{
if (bioskey(1))
{
key=bioskey(0);
switch(key)
{
case VK_ESC:
snakedeath(0);
case VK_LEFT:
if(3!=snode[0].di)
snode[0].di=1;
break;
case VK_UP:
if(4!=snode[0].di)
snode[0].di=2;
break;
case VK_RIGHT:
if(1!=snode[0].di)
snode[0].di=3;
break;
case VK_DOWN:
if(2!=snode[0].di)
snode[0].di=4;
break;
}
}
if (TimerCounter>2)
{
TimerCounter=0;
showsnake(snode,&bean);
}
}
KillTimer();
closegraph();
}
void initsnake(snakelink snode,beanlink bean)
{
int i;
for(i=0;i<4;i++)
{
snode[i].x=320+i*10;
snode[i].y=240;
snode[i].di=1;
snode[i].length=4;
snode[i].isdrawed=0;
}
randbean(bean);
for(i=0;i<15;i++)
{
setcolor(i);
rectangle(0+i,0+i,640-i,480-i);
line(480-i,15,480-i,465);
}
setcolor(12);
outtextxy(510,45,"SNAKE v1.0");
setcolor(11);
rectangle(508,43,590,53);
setcolor(6);
outtextxy(485,85,"Design by Gabriel");
outtextxy(540,100,"BNU");
outtextxy(490,180,"Snake Length:");
}
void showsnake(snakelink snode,beanlink bean)
{
int i,lx,ly;
static int len=3;
static char num[3]=" 4";
lx=snode[snode[0].length-1].x;ly=snode[snode[0].length-1].y;
if(len!=snode[0].length)
{
setcolor(1);
outtextxy(600,180,num);
len++;
sprintf(num,"%2d",snode[0].length);
setcolor(2);
outtextxy(600,180,num);
if(snode[0].length==60) snakedeath(3);
}
for(i=snode[0].length-1;i>0;i--)
{
snode[i].x=snode[i-1].x;
snode[i].y=snode[i-1].y;
}
switch(snode[0].di)
{
case 1:
snode[0].x-=10;
break;
case 2:
snode[0].y-=10;
break;
case 3:
snode[0].x+=10;
break;
case 4:
snode[0].y+=10;
break;
}
if(snode[0].x<=15||snode[0].x>=465||snode[0].y<=15||snode[0].y>=465) snakedeath(1);
for(i=0;i<snode[0].length;i++)
{
if(i==0) setcolor(3);//bar(snode[i].x-4,snode[i].y-4,snode[i].x+4,snode[i].y+4);
else setcolor(5);
rectangle(snode[i].x-4,snode[i].y-4,snode[i].x+4,snode[i].y+4);
if(i==1) snode[i].di=snode[0].di;
}
if(bean->x*10==snode[0].x&&bean->y*10==snode[0].y)
{
setcolor(1);
circle(bean->x*10,bean->y*10,3);
randbean(bean);
snode[snode[0].length].x=lx;
snode[snode[0].length].y=ly;
snode[snode[0].length].di=snode[snode[0].length-1].di;
snode[0].length++;
}
else
{
setcolor(1);
rectangle(lx-4,ly-4,lx+4,ly+4);
}
for(i=1;i<snode[0].length-1;i++)
if(snode[0].x==snode[i].x&&snode[0].y==snode[i].y) snakedeath(2);
//setcolor(1);
//bar(snode[1].x-4,snode[1].y-4,snode[1].x+4,snode[1].y+4);
//if(snode[0].x<=15||snode[0].x>=465||snode[0].y<=15||snode[0].y>=465) snakedeath(1);
setcolor(14);
circle(bean->x*10,bean->y*10,3);
//gotoxy(1,1);printf("<%d,%d><%d,%d>",bean->x,bean->y,snode[0].x,snode[0].y);
setcolor(5);
}
void randbean(beanlink bean)
{
srand((unsigned)time(NULL));
bean->x=rand()%44+2;bean->y=rand()%44+2;
}
void snakedeath(int death)
{
setcolor(9);
switch(death)
{
case 0:
outtextxy(500,420,"You canceled!!");
outtextxy(490,430, "Thx for playing!!");
break;
case 1:
outtextxy(480,420,"You meet the wall!");
break;
case 2:
outtextxy(480,420,"You kill yourself!");
break;
case 3:
outtextxy(520,420,"You Win!!");
break;
}
KillTimer();
getchar();
closegraph();
exit(0);
}
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <time.h>
#include <conio.h>
#include <graphics.h>
#define VK_ESC 0x11b
#define VK_UP 0x4800
#define VK_DOWN 0x5000
#define VK_LEFT 0x4b00
#define VK_RIGHT 0x4d00
#define TIMER 0x1c
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
int TimerCounter=0;
typedef struct {
int x,y,di,length,isdrawed;
}snakenode,*snakelink;
typedef struct {
int x,y;
}beandef,*beanlink;
void initsnake(snakelink,beanlink);
void showsnake(snakelink,beanlink);
void randbean(beanlink);
void snakedeath(int);
void interrupt ( *oldhandler)(__CPPARGS);
void interrupt newhandler(__CPPARGS)
{
TimerCounter++;
oldhandler();
}
void SetTimer(void interrupt (*IntProc)(__CPPARGS))
{
oldhandler=getvect(TIMER);
disable();
setvect(TIMER,IntProc);
enable();
}
void KillTimer()
{
disable();
setvect(TIMER,oldhandler);
enable();
}
void main(void)
{
int key,time=0;
int gdriver = VGA, gmode=VGAHI, errorcode;
char *bgifile=""; //注意:图形文件的路径要改
snakenode snode[61];
beandef bean={0,0};
SetTimer(newhandler);
initgraph(&gdriver, &gmode, bgifile);
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %sn", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
setbkcolor(1);
// outtextxy(1,1,"You canceled!! Thanks for playing!!");
outtextxy(230,200,"Press key to Start Snake!");
getchar();
setcolor(1);
outtextxy(230,200,"Press key to Start Snake!");
initsnake(snode,&bean);
setcolor(5);
showsnake(snode,&bean);
while(1)
{
if (bioskey(1))
{
key=bioskey(0);
switch(key)
{
case VK_ESC:
snakedeath(0);
case VK_LEFT:
if(3!=snode[0].di)
snode[0].di=1;
break;
case VK_UP:
if(4!=snode[0].di)
snode[0].di=2;
break;
case VK_RIGHT:
if(1!=snode[0].di)
snode[0].di=3;
break;
case VK_DOWN:
if(2!=snode[0].di)
snode[0].di=4;
break;
}
}
if (TimerCounter>2)
{
TimerCounter=0;
showsnake(snode,&bean);
}
}
KillTimer();
closegraph();
}
void initsnake(snakelink snode,beanlink bean)
{
int i;
for(i=0;i<4;i++)
{
snode[i].x=320+i*10;
snode[i].y=240;
snode[i].di=1;
snode[i].length=4;
snode[i].isdrawed=0;
}
randbean(bean);
for(i=0;i<15;i++)
{
setcolor(i);
rectangle(0+i,0+i,640-i,480-i);
line(480-i,15,480-i,465);
}
setcolor(12);
outtextxy(510,45,"SNAKE v1.0");
setcolor(11);
rectangle(508,43,590,53);
setcolor(6);
outtextxy(485,85,"Design by Gabriel");
outtextxy(540,100,"BNU");
outtextxy(490,180,"Snake Length:");
}
void showsnake(snakelink snode,beanlink bean)
{
int i,lx,ly;
static int len=3;
static char num[3]=" 4";
lx=snode[snode[0].length-1].x;ly=snode[snode[0].length-1].y;
if(len!=snode[0].length)
{
setcolor(1);
outtextxy(600,180,num);
len++;
sprintf(num,"%2d",snode[0].length);
setcolor(2);
outtextxy(600,180,num);
if(snode[0].length==60) snakedeath(3);
}
for(i=snode[0].length-1;i>0;i--)
{
snode[i].x=snode[i-1].x;
snode[i].y=snode[i-1].y;
}
switch(snode[0].di)
{
case 1:
snode[0].x-=10;
break;
case 2:
snode[0].y-=10;
break;
case 3:
snode[0].x+=10;
break;
case 4:
snode[0].y+=10;
break;
}
if(snode[0].x<=15||snode[0].x>=465||snode[0].y<=15||snode[0].y>=465) snakedeath(1);
for(i=0;i<snode[0].length;i++)
{
if(i==0) setcolor(3);//bar(snode[i].x-4,snode[i].y-4,snode[i].x+4,snode[i].y+4);
else setcolor(5);
rectangle(snode[i].x-4,snode[i].y-4,snode[i].x+4,snode[i].y+4);
if(i==1) snode[i].di=snode[0].di;
}
if(bean->x*10==snode[0].x&&bean->y*10==snode[0].y)
{
setcolor(1);
circle(bean->x*10,bean->y*10,3);
randbean(bean);
snode[snode[0].length].x=lx;
snode[snode[0].length].y=ly;
snode[snode[0].length].di=snode[snode[0].length-1].di;
snode[0].length++;
}
else
{
setcolor(1);
rectangle(lx-4,ly-4,lx+4,ly+4);
}
for(i=1;i<snode[0].length-1;i++)
if(snode[0].x==snode[i].x&&snode[0].y==snode[i].y) snakedeath(2);
//setcolor(1);
//bar(snode[1].x-4,snode[1].y-4,snode[1].x+4,snode[1].y+4);
//if(snode[0].x<=15||snode[0].x>=465||snode[0].y<=15||snode[0].y>=465) snakedeath(1);
setcolor(14);
circle(bean->x*10,bean->y*10,3);
//gotoxy(1,1);printf("<%d,%d><%d,%d>",bean->x,bean->y,snode[0].x,snode[0].y);
setcolor(5);
}
void randbean(beanlink bean)
{
srand((unsigned)time(NULL));
bean->x=rand()%44+2;bean->y=rand()%44+2;
}
void snakedeath(int death)
{
setcolor(9);
switch(death)
{
case 0:
outtextxy(500,420,"You canceled!!");
outtextxy(490,430, "Thx for playing!!");
break;
case 1:
outtextxy(480,420,"You meet the wall!");
break;
case 2:
outtextxy(480,420,"You kill yourself!");
break;
case 3:
outtextxy(520,420,"You Win!!");
break;
}
KillTimer();
getchar();
closegraph();
exit(0);
}
相关文章推荐
- Java GUI编程之贪吃蛇游戏简单实现方法【附demo源码下载】
- HTML5游戏源码《贪吃蛇》
- 贪吃蛇 源码
- 五指棋,贪吃蛇,中国银行ATM源码链接
- c语言贪吃蛇的源码,用'A''S''D''W'操作
- 贪吃蛇游戏源码,基于javaMe
- 纯js 贪吃蛇游戏解析与源码
- Love2d新手入门历程之贪吃蛇(附源码)
- C语言之贪吃蛇游戏源码
- [VB.NET源码]贪吃蛇下游戏
- 贪吃蛇思路及源码
- C++ 简易的贪吃蛇源码 简单易懂 画面精美
- 贪吃蛇游戏源码,基于javaMe
- Love2d新手入门教程之贪吃蛇(附源码)
- 原生JS实现贪吃蛇项目,附源码下载!
- 第26天 贪吃蛇项目源码
- Android游戏——贪吃蛇开发实录(改进后的源码和详解)
- 贪吃蛇游戏源码设计
- javascript贪吃蛇完整版(源码)
- java贪吃蛇源码(注意图片路径)