C语言snake的源代码怎么用?
因为我们平时使用的操作系统是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;
}