C语言snake的源代码怎么用?

C语言snake的源代码必须由相应的C/C++编译器编译成EXE文件才能运行。

因为我们平时使用的操作系统是Windows,而这个系统下最长的C/C++编译器是VC++编译器,所以目前高校普遍使用的版本是VC++6.0。

让我们用VC++6.0来说明编译过程:

1.在VC++6.0中通过“文件”菜单下的“打开”子菜单打开snake代码。

2.通过“构建”菜单下的“编译xxxx.xx”子菜单,在VC++6.0中编译snake代码。

3.通过“构建”菜单下的“执行xxxx.exe”子菜单,在VC++6.0中运行snake程序。

附:能在VC++6环境下运行的C/C++ snake源代码(无版权,自己写,欢迎随意修改复制)

/*

C/C++贪吃蛇游戏,zjlj,2015.3.16

*/

#定义?调试?0?//程序在调试阶段的时候?调试是?1

# include & ltiostream & gt

# include & ltwindows.h & gt

# include & lttime.h & gt

# include & ltconio.h & gt

使用?命名空间?std

作废?readini(文件?**fphead,?int?*分数,?夏尔?*argv[])?//创建或打开运行文件对应的ini文件,读取最高记录。

{

夏尔?文件名[200],* pfilename

int?flag=-1,I;

strcpy(文件名,argv[0]);

for(I = 0;文件名[i]!='\0';i++)

{

如果?('.'= = filename[I])flag = 1;

}

if(1==flag)

{

filename[I-1]= ' I ';

文件名[I-2]= ' n ';

文件名[I-3]= ' I ';

}

其他

{

文件名[i]= ' . ';

filename[I+1]= ' I ';

文件名[I+2]= ' n ';

文件名[I+3]= ' I ';

文件名[I+4]= ' \ 0 ';

}

for(;文件名[i]!= ' \ \ ' & amp& amp我& gt=0;I-)pfilename = & amp;文件名[I];

如果?(?(*fphead=fopen(pfilename," r b+ ")= = NULL)

{

如果?(?(*fphead=fopen(pfilename," WB+")= = NULL)

{

Printf("无法创建或打开\"%s\ "文件\n ",pfilename);

系统(“暂停”);

退出(0);

}

}

其他

{

fread(score,sizeof(int),1,* fphead);

}

}

作废?writeini(文件?**fphead,?int?*分数,?夏尔?*argv[])?//打开运行文件对应的ini文件,写入最高记录。

{

夏尔?文件名[200],* pfilename

int?flag=-1,I;

strcpy(文件名,argv[0]);

for(I = 0;文件名[i]!='\0';i++)

{

如果?('.'= = filename[I])flag = 1;

}

if(1==flag)

{

filename[I-1]= ' I ';

文件名[I-2]= ' n ';

文件名[I-3]= ' I ';

}

其他

{

文件名[i]= ' . ';

filename[I+1]= ' I ';

文件名[I+2]= ' n ';

文件名[I+3]= ' I ';

文件名[I+4]= ' \ 0 ';

}

for(;文件名[i]!= ' \ \ ' & amp& amp我& gt=0;I-)pfilename = & amp;文件名[I];

如果?(?(*fphead=fopen(pfilename," WB+")= = NULL)

{

Printf("无法写入\"%s\ "文件,磁盘被写保护!\n ",pfilename);

系统(“暂停”);

退出(0);

}

其他

{

倒带(* fphead);

fwrite(score,sizeof(int),1,* fphead);

fclose(* FP head);

}

}

作废?gotoxy(int?x,int?Y)//光标定位,光标定位函数SetConsoleCursorPosition是左上角位置为0,然后向左下方延伸。

{

坐标?pos

位置。x = 2 * y;

位置。y = x;

SetConsoleCursorPosition(GetStdHandle(STD _ OUTPUT _ HANDLE),pos);

}

作废?颜色(int?A)//颜色函数

{

SetConsoleTextAttribute(GetStdHandle(STD _ OUTPUT _ HANDLE),a);

}

作废?刷新(int?q[][22],?int?等级,?int?gamespeed?int?长度,int?分数)?//?输出蛇棋盘

{

int?I,j;

for(I = 0;我& lt22;i++)

{

for(j = 0;j & lt22;j++)

{

If(q[i][j]==0)//输出棋盘空白。

{

gotoxy(i,j);

颜色(11);

cout & lt& lt"■";

}

if(q[I][j]= = 1 | | q[I][j]= = 2)//输出棋盘墙

{?

gotoxy(i,j);

颜色(11);

cout & lt& lt"□";

}

If(q[i][j]==3)//输出黑鱼

{?

gotoxy(i,j);

颜色(14);

cout & lt& lt"★";

}

If(q[i][j]==4)//输出蛇体。

{?

gotoxy(i,j);

颜色(12);

cout & lt& lt"◆";

}

If(q[i][j]==5)//输出果实。

{?

gotoxy(i,j);

颜色(12);

cout & lt& lt"●";

}

}

if(i==0)?cout?& lt& lt?”\ t * * * * * * * * * * * * * * * * * * * * * *”;

if(i==1)?cout?& lt& lt?" \t等级:"?& lt& lt?等级;//显示级别

if(i==3)?cout?& lt& lt?”\t自动提前时间”;

if(i==4)?cout?& lt& lt?" \t间隔是:"?& lt& lt?gamespeed?& lt& lt?”女士”;//显示时间

if(i==6)?cout?& lt& lt?" \ t历史最高分是"?& lt& lt?得分?& lt& lt?“分”;

if(i==7)?cout?& lt& lt?\t你现在的分数是多少?& lt& lt?(长度+(等级-1)*8)*10?& lt& lt?“分”;

if(i==8)?cout?& lt& lt?" \ t * * * * * * * * * * * * * * * * * * * * * * * *;

if(i==9)?cout?& lt& lt?" \ t游戏描述:";

if(i==10)?cout?& lt& lt?”\t(1)由键盘控制”;

if(i==11)?cout?& lt& lt?" \ t蛇头的运动方向;";

if(i==12)?cout?& lt& lt?" \t(2)蛇每吃一个果子,蛇身";

if(i==13)?cout?& lt& lt?" t添加一个节;";

if(i==14)?cout?& lt& lt?“\t(3)蛇咬自己或撞墙”;

if(i==15)?cout?& lt& lt?"墙壁游戏结束了。";

if(i==18)?cout?& lt& lt?" \ t * * * * * * * * * * * * * * * * * * * * * * * *;

if(i==19)?cout?& lt& lt?" \tC/C++语言作业:";

如果(i==20)?cout?& lt& lt?\tzjlj,2015.03.16?;

}

}

int?main(int?argc,?夏尔?*argv[]){

int?tcsQipan[22][22];?//?蛇棋盘是二维数组(如22*22,含墙)。

int?I,j,score,directiontemp

文件?* fpini//*fpini?信息文件

readini(& amp;fpini,?& amp分数,?argv);//读取ini文件的最高记录。

如果?(分数& lt0)//如果最高分小于零,设置为零,则初始文件为负数。

得分= 0;

while(1)

{

for(I = 1;我& lt=20;i++)

for(j = 1;j & lt=20;j++)

tcsQipan[I][j]= 0;//蛇棋盘对应的坐标用中间空白部分的符号0标注。

for(I = 0;我& lt=21;i++)

tcsQipan[0][i]?=?tcsQipan[21][i]?=?1;?//蛇棋盘对应坐标标有上下壁1的标志。

for(I = 1;我& lt=20;i++)

tcsQipan[i][0]?=?tcsQipan[i][21]?=?2;?//蛇棋盘的对应坐标在左右两面墙上用标志标出2。

int?tcszoo Biao[2][500];?//snake坐标数组

for(I = 0;?我& lt4;?i++)

{

tcszoobao[0][I]?=?1;//蛇身和蛇头的X坐标

tcszoobao[1][I]?=?我?+?1;//蛇身和蛇头的Y坐标

}

int?头?=?3、尾巴?=?0;//表示蛇头和蛇头的数组偏移量。

for(I = 1;我& lt=3;i++)

tcsQipan[1][I]= 4;//蛇身

tcsQipan[1][4]= 3;//蛇头

int?x1,?y 1;//?随机水果

srand(time(0));//设置随机种子

{

x 1 = rand()% 20+1;

y 1 = rand()% 20+1;

}

while(tcsQipan[x 1][y 1]!=0);//如果你不在空白处重新生产水果,

tcsQipan[x 1][y 1]= 5;//蛇棋盘对应的坐标标有水果5的符号。

颜色(12);

cout & lt& lt" \ n \ n \ t \ t \ t \贪吃蛇游戏就要开始了?!"& lt& ltendl//准备开始

龙?start,starttemp

int?年级?=?1,?长度?=?4;?//设置蛇的初始级别和初始长度。

int?gamespeed?=?500;?//设置初始转发时间间隔

for(I = 3;我& gt=0;我-)

{

start =时钟();

while(clock()-start & lt;=1000);

系统(“cls”);

如果(i & gt0)

cout?& lt& lt?\ n \ n \ t \ t \ t \输入倒计时?& lt& lt?我?& lt& lt?endl?//倒计时显示

其他

刷新(tcsQipan,等级,gamespeed,长度,分数);?//初始棋盘显示

}

int?timeover=1,other key = 1;//初始化超时和关键判断参数。

夏尔?方向?=?77;?//?在初始设置中,向右移动。

int?x = tcszuobao[0][head],y = tcszuobao[1][head];//将黑鱼的坐标保存到x,y变量中。

While(1)//运行一个游戏。

{

开始?=?clock();

while((time over =((start temp = clock())-start & lt;= gamespeed))& amp;& amp!kb hit());//如果按下某个键或时间超过自动前进间隔,则循环终止。

if(方向= = 72 | |方向= = 80 | |方向==75?| |方向==77)

directiontemp =方向;//保留最后一个方向键。

//start temp = gamespeed+start-start temp;//保留时间

如果(超时)

{

#如果?(调试==1)

方向?=?getch();//调试代码

#否则

如果((方向?=getch())==-32)

方向?=?getch();

#endif

}

#如果?(DEBUG==1)//调试代码

start =时钟();

while(clock()-start & lt;=2000);

gotoxy(24,4);

cout?& lt& lt?" \ t键入ASCII代码"

#endif

如果(!(方向= = 72 | |方向= = 80 | |方向==75?| |方向==77))

{

other key = 0;//?该键不是方向键,otherkey设置为0。

}

其他

{

other key = 1;//?这个键是方向键,另一个键设置为1。

}

如果(方向==72?& amp& amp?Directiontemp==80)//忽略反向键。

{

方向= 32°;

other key = 0;

//开始?=?clock();

//while(clock()-start & lt;= start temp);

}

不然呢?如果(方向==80?& amp& amp?directiontemp==72)

{

方向= 32°;//将键设置为非方向键。

other key = 0;//?该键为非方向键,其他键设置为0。

//?开始?=?clock();

//while(clock()-start & lt;= start temp);//补偿等待时间

}

不然呢?如果(方向==75?& amp& amp?directiontemp==77)

{

方向= 32°;

other key = 0;

//开始?=?clock();

//while(clock()-start & lt;= start temp);

}

不然呢?如果(方向==77?& amp& amp?directiontemp==75)

{

方向= 32°;

other key = 0;

//开始?=?clock();

//while(clock()-start & lt;= start temp);

}

开关(方向)//确定方向键

{

案子?72:?x=?tcszuobao[0][head]-1;?y=?tcszuobao[1][head];打破;?//?向上

案子?80:?x=?tcszuobao[0][head]+1;?y=?tcszuobao[1][head];打破;?//?向下

案子?75:?x=?tcszoobao[0][head];?y=?tcszuobao[1][head]-1;打破;?//?向左

案子?77:?x=?tcszoobao[0][head];?y=?tcszuobao[1][头]+1;打破;?//?向右走

默认:?打破;

}

if(x==0?||?x==21?||y==0?||?y==21)?//?蛇头撞墙,结束这局比赛。

{?

gotoxy(22,12);

cout?& lt& lt?" \ t游戏结束了!"?& lt& lt?endl

if(score & gt;=(length+(grade-1)* 8)* 10)//判断是否破纪录。

{

gotoxy(10,7);

颜色(12);

cout?& lt& lt?“没能打通?加油!”?& lt& lt?endl

fclose(fpini);//关闭ini文件

}

其他

{

gotoxy(10,7);

颜色(12);

cout?& lt& lt?“恭喜破纪录”?& lt& lt?endl

得分=(长度+(年级-1)* 8)* 10;

write ini(& amp;fpini,?& amp分数,?argv);ini文件中写入的最高记录

}

gotoxy(23,12);

cout?& lt& lt?“按回车重启,按ESC退出游戏”?& lt& lt?endl//显示提示

打破;//退出游戏

}

if(tcsQipan[x][y]!= 0 & amp& amp!(x = = x 1 & amp;& ampy = = y 1)& amp;& amptcsQipan[x][y]!=3)?//蛇头碰到蛇身,结束此局游戏。

{

gotoxy(22,12);

cout?& lt& lt?" \ t游戏结束了!"?& lt& lt?endl

if(score & gt;=(length+(grade-1)* 8)* 10)//判断是否破纪录。

{

gotoxy(10,7);

颜色(12);

cout?& lt& lt?“没能打通?加油!”?& lt& lt?endl

fclose(fpini);//关闭ini文件

}

其他

{

gotoxy(10,7);

颜色(12);

cout?& lt& lt?“恭喜破纪录”?& lt& lt?endl

得分=(长度+(年级-1)* 8)* 10;

write ini(& amp;fpini,?& amp分数,?argv);ini文件中写入的最高记录

}

gotoxy(23,12);

cout?& lt& lt?“按回车重启,按ESC退出游戏”?& lt& lt?endl//显示提示

打破;//退出游戏

}

/*

游戏运行时核心算法开始。

*/

if(x==x1?& amp& amp?y==y1)?//?吃水果,长度加1

{

长度?++;

if(长度& gt=8)//如果长度大于等于8,则重新计算长度,并将1加到等级上。

{

长度?-=?8;//重新计算长度

年级?++;//年级加1

if(gamespeed & gt;50)//最快控制速度50。

gamespeed?=?550?-?年级?*?50;?//?更改自动推进时间间隔

}

tcsQipan[x][y]=?3;//贪吃蛇棋盘对应坐标现在改为蛇头符号3。

tcsQipan[tcszuobao[0][head]][tcszuobao[1][head]]?=?4;//贪吃蛇棋盘对应坐标由原来的蛇头符号改为蛇身符号4。

头?=?(head+1)% 400;//防止数组越界

tcszoobao[0][head]?=?x;//蛇头的X坐标

tcszoobao[1][head]?=?y;//蛇头的Y坐标

做//随机水果

{

x 1 = rand()% 20+1;

y 1 = rand()% 20+1;

}

while(tcsQipan[x 1][y 1]!=0);//如果你不在空白处重新生产水果,

tcsQipan[x 1][y 1]= 5;//蛇棋盘对应的坐标标有水果5的符号。

gotoxy(22,12);

cout?& lt& lt?" \ t游戏正在进行中!"?& lt& lt?endl

刷新(tcsQipan,等级,gamespeed,长度,分数);

}

不然呢?//?不要吃水果

{?

if(其他键)

{

tcsQipan?[tcszuobao[0][tail]][tcszuobao[1][tail]]= 0;

tail =(tail+1)% 400;//防止数组越界

tcsQipan?[tcszuobao[0][head]][tcszuobao[1][head]]= 4;

head =(head+1)% 400;//防止数组越界

tcszuobao[0][head]= x;//蛇头的X坐标

tcszuobao[1][head]= y;//蛇头的Y坐标

tcsQipan[tcszuobao[0][head]][tcszuobao[1][head]]= 3;

gotoxy(22,12);

cout?& lt& lt?" \ t游戏正在进行中!"?& lt& lt?endl

刷新(tcsQipan,等级,gamespeed,长度,分数);

}

其他

{

gotoxy(22,12);

cout?& lt& lt?" \ t游戏暂停!"?& lt& lt?endl

}

}

/*

游戏运行时的核心算法结束。

*/

}

while(1)

{

而(!kb hit());

如果((方向?= getch()= = 13)//回车开始下一局。

打破;

如果(方向?==27)//按ESC退出游戏。

退出(0);

}

系统(“cls”);//清空屏幕,重新开始。

}

回归?0;

}