标题:一个经典小游戏(贪食蛇)
只看楼主
yuleol
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2005-12-10
 问题点数:0 回复次数:20 
一个经典小游戏(贪食蛇)

本人刚学C不久,编了这个小游戏在windows2000+ccdos+tc2,0下编译通过!
欢迎大家提意见!附件里有编译好的可执行文件和源码!

coEsBTZu.rar (34.38 KB) 一个经典小游戏(贪食蛇)



/*============================================================
贪食蛇游戏V1.0
============================================================*/
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <bios.h>
#include <dos.h>
#define SPACE 0x3920
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define ESC 0x011b
#define LONG 100/*定义最大蛇身长度!*/
struct container{
int left;
int top;
int right;
int bottom;
int sign; /*记号,0表示空白,1表示墙,2表示食物*/
}lab[22][42];/*定义大容器存储结构*/

struct snakes{
int i;
int j;
int sign;/*0空白,1蛇头,2蛇身*/
}snake[LONG];

int mark,grade,max;
/*初始化图形显示*/
int initialize(void)
{
int gdriver, gmode,errorcode;
gdriver=VGA;
gmode=VGAHI;
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
if (errorcode != grOk) /* an error occurred */
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1); /* return with error code */
}
return 0;
}

void showcontainer(int i,int j)
{/*显示容器函数*/
switch(lab[i][j].sign)
{
case 0: setfillstyle(SOLID_FILL,LIGHTBLUE);break;
case 1: setfillstyle(SOLID_FILL,RED); break;
case 2: setfillstyle(SOLID_FILL,LIGHTCYAN);break;
}
bar(lab[i][j].left,lab[i][j].top,lab[i][j].right,lab[i][j].bottom);
}

/*生成容器函数*/
void initialcontainer()
{
int i,j,leftx=100,topy=50,rightx=110,bottomy=60;
for(i=0;i<22;i++)
for(j=0;j<42;j++)
{
lab[i][j].left=leftx+j*10;
lab[i][j].top=topy+i*10;
lab[i][j].right=rightx+j*10;
lab[i][j].bottom=bottomy+i*10;
lab[i][j].sign=0;
}
for(i=0;i<22;i++)
{
lab[i][0].sign=1;
lab[i][41].sign=1;
}
for(j=0;j<42;j++)
{
lab[0][j].sign=1;
lab[21][j].sign=1;
}
for(i=0;i<22;i++)
for(j=0;j<42;j++)
showcontainer(i,j);
}

void initialsnake()
{/*初始化蛇身*/
int i;
for(i=3;i<LONG;i++)
snake[i].sign=0;
snake[0].i=10;
snake[0].j=3;
snake[0].sign=1;

snake[1].i=10;
snake[1].j=2;
snake[1].sign=2;

snake[2].i=10;
snake[2].j=1;
snake[2].sign=2;
}

void showsnake()
{/*显示蛇*/
int n,i,j;
for(n=0;n<LONG && snake[n].sign!=0;n++)
{
switch(snake[n].sign)
{
case 1:setfillstyle(SOLID_FILL,BLUE);break;
case 2:setfillstyle(SOLID_FILL,GREEN);break;
}
i=snake[n].i;
j=snake[n].j;
bar(lab[i][j].left,lab[i][j].top,lab[i][j].right,lab[i][j].bottom);
}
}

void cleansnake()
{/*擦除蛇*/
int n,i,j;
for(n=0;n<LONG && snake[n].sign!=0;n++)
{
setfillstyle(SOLID_FILL,LIGHTBLUE);
i=snake[n].i;
j=snake[n].j;
bar(lab[i][j].left,lab[i][j].top,lab[i][j].right,lab[i][j].bottom);
}
}

void createfood()
{/*创建食物*/
int n,i,j,flag;
srand((int)time(0));
do{
flag=1;
i=rand()%20+1;
j=rand()%40+1;
for(n=0;n<LONG && snake[n].sign!=0;n++)
if(i==snake[n].i && j==snake[n].j)
{
flag=0;
break;
}
}while(flag==0);
lab[i][j].sign=2;
showcontainer(i,j);
}
void showmark()
{/*显示分数和等及*/
char b[10],*p=b;
p=itoa(mark,p,10);
setfillstyle(SOLID_FILL,BLUE);
bar(200,20, 400, 40);
moveto(210,25);
outtext("score:");
outtext(p);
p=itoa(grade,p,10);
outtext(" grade:");
outtext(p);
}
int run(int i,int j)
{
int n;
if(i<1 || i>20 || j<1 || j>40)
return 0;/*碰壁*/
for(n=0;n<LONG && snake[n].sign!=0;n++)
if(snake[n].i==i && snake[n].j==j)
return 0;/*碰到自己*/
cleansnake();
if(lab[i][j].sign==2)
{/*遇到食物*/
snake[max].sign=2;
max++;
lab[i][j].sign=0;
mark=mark+100*grade;
if((max-3)%10==0) grade++;
showmark();
createfood();
}
for(n=max;n>=1;n--)
{
snake[n].i=snake[n-1].i;
snake[n].j=snake[n-1].j;
}
snake[0].i=i;
snake[0].j=j;
showsnake();
return 1;
}
void pause()
{/*暂停*/
setfillstyle(SOLID_FILL,BLUE);
bar(120,300, 480, 350);
moveto(130,320);
outtext("Press any key to start...");
while(!bioskey(1)) sleep(1);
bar(120,300, 480, 350);
moveto(130,320);
outtext("Press SPACE to pause,ESC to exit...");
}

int main(void)
{
int i=10,j=3,flag=1,n;
int key=RIGHT,keytemp,keyreve=LEFT;
mark=0;
grade=1;
max=3;
initialize();/*初始化图形显示*/
setbkcolor(LIGHTBLUE);
setcolor(RED);
initialcontainer();
initialsnake();
showsnake();
createfood();
showmark();
pause();
while(flag==1)
{
if(bioskey(1))
keytemp=bioskey(0);
if(keytemp==ESC)
break;
if(keytemp==SPACE)
{
pause();
keytemp=key;
}
else
{
if(keytemp==UP || keytemp==DOWN || keytemp==RIGHT || keytemp==LEFT)
if(keytemp!=key && keytemp!=keyreve)
key=keytemp;
switch(key)
{
case UP: i--;keyreve=DOWN;break;
case DOWN: i++;keyreve=UP;break;
case RIGHT: j++;keyreve=LEFT;break;
case LEFT: j--;keyreve=RIGHT;break;
}
flag=run(i,j);
for(n=0;n<20-grade*2;n++)
delay(9000);/*关于这个函数的使用,我一直弄不明白,按照资料说明这应该暂停了9秒钟,但是我在实际编译中,只暂字了不到十分之一秒~晕*/
}
}
setfillstyle(SOLID_FILL,BLUE);
bar(120,300, 480, 350);
moveto(130,310);
outtext("GAME OVER!");
moveto(130,330);
outtext("Press any key to exit...");
sleep(5);
fflush(stdin);
getch();
closegraph();/*关闭图形显示*/
return 0;
}



vZ6mOwse.jpg (13.23 KB)
搜索更多相关主题的帖子: 小游戏 include 经典 define graphics 
2006-07-05 23:35
jig
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
帖 子:530
专家分:242
注 册:2005-12-27
得分:0 
不错,顶~~!!

个人网站 -  http://.h001.
2006-07-06 09:10
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
得分:0 
不错..不过没有加速度..用delay() 做点文章就可以了

[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-07-06 11:03
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
得分:0 
sleep呢

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-07-06 11:14
yuleol
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2005-12-10
得分:0 
我有用delay()函数啊,但是用了delay(9000);感觉也没有停顿0.1秒,

而用sleep呢,最小停顿1秒~~

游戏又太慢~

兴趣是我的源动力!
2006-07-06 11:27
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
得分:0 

#include <time.h>
#include <stdio.h>
void my_delay(unsigned long ms);

int main(void)
{
int i;
for(i=0;i<10;i++)
{
printf("nihao ");

my_delay(100);
}
printf("\n") ;

return 0;
}

void my_delay(unsigned long ms)
{
double start_time = (double)clock() / CLOCKS_PER_SEC * 1000;
while ( (double)clock() / CLOCKS_PER_SEC * 1000 - start_time < ms ) ;
}

标准C的模拟delay函数版本...不过不知道TC下如何.


[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-07-06 11:38
yuleol
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2005-12-10
得分:0 
先去吃饭,回来后测一下你这个函数

兴趣是我的源动力!
2006-07-06 11:47
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
得分:0 
delay()与CPU处理速度有关.

[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-07-06 11:53
yuleol
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2005-12-10
得分:0 
错误 aa.c 21: 未定义的符号'CLOCKS_PER_SEC'在 my_delay 函数中

win-tc

兴趣是我的源动力!
2006-07-06 11:57
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
得分:0 
C-FREE  无错误..

[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-07-06 12:16



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-76801-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.305554 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved