用c编写贪吃蛇全过程.docx
《用c编写贪吃蛇全过程.docx》由会员分享,可在线阅读,更多相关《用c编写贪吃蛇全过程.docx(21页珍藏版)》请在冰豆网上搜索。
用c编写贪吃蛇全过程
C语言编写贪吃蛇
此贪吃蛇是我刚学习c语言的时候做的,很手生,写得也不好,而且bug比较多,但做为一般的毕业设计或者是课堂设计是够用了,而且因为不是很专业,但还是希望各位童鞋不要抄袭,毕竟知识是自己的,在看懂了的前提下,自己可以参考着写一遍,弄懂了才是自己的。
废话不说了,大家都懂,现在进入正题。
在vs2010环境下编绎通过,但不保证在其他平台上能通过。
仅做为参考。
具体能实现的功能:
方向控制,吃食物,食物有两种,有毒的,吃了会减少生命值,还有一种是无毒的,吃了会长身体,撞墙死亡,碰身体死亡,死亡重新开始游戏。
首先附上一张游戏截图,仅为初学者参考,高手可以点击右上角,谢谢!
全部代码为在三个文件里面,分别为header.h,src.c,main.c,下面分别发出代码及简单的注解:
一.header.h,这是存放的头文件以及函数声明,就不解释了,直接放代码;
#include
intxy[2][50];
inti;
intfood[2];
intpois[2][5];
intwall(void);
intinit(intlen);
//intway(intflag);
intmov(intkey);
intprint(intret);
intrun(intret);
intfoods(void);
intgrow(void);
intdirection(void);
intdie(void);
intor(void);
intpoi(void);
intgotoxy(intx,inty);
二、资源文件src.c,这里存放的是函数的实现方法:
#include"header.h"
intflag=0;
intlen=5;
intkey=0;
charname[]="name";
intcore=0;
intlife=3;
//初始化墙
intwall(void)
{
inti=0;
intj=0;
for(i=0;i<30;i++)
for(j=0;j<30;j++)
if(i==0)
printf("*");
if(j==29)
printf("\n");
}
if(i>0&&i<29)
if(j==0)
printf("*\n");
if(j>0&&j<29)
printf("");
if(i==29)
}//
//初始化蛇属性
intinit(intlen)
life=3;
core=0;
flag=0;
len=5;
key=0;
gotoxy(8,15);
printf("请输入你的大名,按Enter键开始游戏:
");
scanf("%s",&name);
gotoxy(62,2);
printf("------------");
gotoxy(62,4);
printf("name:
%s",name);
gotoxy(62,6);
printf("方向控制说明:
gotoxy(62,7);
printf("w:
向上s:
向下");
gotoxy(62,8);
printf("a:
向左d:
向右");
gotoxy(62,10);
printf("○表示食物");
gotoxy(62,11);
printf("¤表示有毒");
gotoxy(62,12);
printf("分数:
%d",core);
gotoxy(62,14);
printf("生命值:
for(i=0;i<3;i++)
printf("★");
xy[0][0]=22;
xy[1][0]=22;
for(i=1;i{xy[0][i]=xy[0][i-1]-2;xy[1][i]=xy[1][i-1];}print(len);for(i=0;i<5;i++){pois[0][i]=2*(rand()%(28)+1);pois[1][i]=rand()%(28)+1;gotoxy(pois[0][i],pois[1][i]);printf("¤");}}//蛇移动intrun(intret){for(i=ret-1;i>0;i--){xy[0][i]=xy[0][i-1];xy[1][i]=xy[1][i-1];}}//打印蛇intprint(intret){inti=0;for(i=0;i{if(i==0){gotoxy(xy[0][0],xy[1][0]);printf("◆");}else{gotoxy(xy[0][i],xy[1][i]);printf("●");}}}//定义窗口属性intgotoxy(intx,inty){COORDcoord={x,y};SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);}//蛇移动intmov(intk){switch(k){case1:if(2!=flag){run(len);xy[0][0]=xy[0][0]-2;flag=1;}break;case2:if(1!=flag){run(len);xy[0][0]=xy[0][0]+2;flag=2;}break;case3:if(4!=flag){run(len);xy[1][0]=xy[1][0]-1;flag=3;}break;case4:if(3!=flag){run(len);xy[1][0]=xy[1][0]+1;flag=4;}break;}}//生成食物intfoods(void){food[0]=2*(rand()%(28)+1);food[1]=rand()%(28)+1;gotoxy(food[0],food[1]);printf("○");}//蛇吃食物并成长intgrow(void){if(xy[0][0]==food[0]&&xy[1][0]==food[1]){len++;foods();core=core+100;gotoxy(62,12);printf("分数:%d",core);}returnlen;}//根据键值获取蛇的移动方向intdirection(void){if(_kbhit()){key=_getch();if('a'==key&&flag!=2)flag=1;elseif('d'==key&&flag!=1)flag=2;elseif('w'==key&&flag!=4)flag=3;elseif('s'==key&&flag!=3)flag=4;}returnflag;}//撞强和碰尾死亡方式intdie(void){if(xy[0][0]==0||xy[0][0]==58||xy[1][0]==0||xy[1][0]==29)return-1;for(i=1;i{if(xy[0][0]==xy[0][i]&&xy[1][0]==xy[1][i]){return-2;}}}//死亡后由玩家决定是否继续游戏intor(void){intkey;while(1){if(_kbhit()){key=_getch();if('y'==key)return1;if('n'==key)return2;}}}//吃有毒的食物,生命减少至0;intpoi(void){for(i=0;i<5;i++){if(xy[0][0]==pois[0][i]&&xy[1][0]==pois[1][i]){life--;if(life==0){gotoxy(62,14);printf("");gotoxy(62,14);printf("生命值:");return-3;}gotoxy(62,14);printf("");gotoxy(62,14);printf("生命值:");for(i=1;i<=life;i++){printf("★");}pois[0][i]=2*(rand()%(28)+1);pois[1][i]=rand()%(28)+1;gotoxy(pois[0][i],pois[1][i]);printf("¤");}}} 三、主函数main.c文件#include"header.h" intmain(void){intlen=5;inti;intflag=2;intkill;intret;intret2;system("COLOR0C");//窗口颜色system("MODECON:COLS=99LINES=30");//窗口宽度和高度in:len=5;flag=2;//初始化移动方向kill=1;ret=0;ret2=0;gotoxy(0,0);//光标移动到坐标(0,0)的位置wall();//打印围墙//初始化蛇init(5);//初始化蛇//测试语句//gotoxy(58,29);//printf("这");foods();//调用生成食物的函数,生成一个食物while(1){gotoxy(xy[0][len-1],xy[1][len-1]);printf("");//蛇移动时,蛇尾前移时擦去原蛇尾mov(flag);//控制蛇移动方向len=grow();//蛇生长,并返回蛇的长度ret2=poi();//蛇吃到有毒的食物,如果生命值为0,刚死亡if(ret2==-3)gotoout3;flag=direction();//根据键值,得到蛇移动方向kill=die();//蛇死亡判断,撞墙和碰尾死亡;print(len);//打印当前长度的蛇if(-1==kill)gotoout1;//撞墙死亡if(-2==kill)gotoout2;//碰尾死亡Sleep(300-5*len);//简单延时}out1:gotoxy(15,15);printf("恭喜你撞墙而死!按y重新开始,按n结束游戏");in2:ret=or();//死亡后由玩家决定是否继续游戏,按y继续游戏,按n退出游戏if(1==ret)//复活后游戏,把蛇身置空{for(i=0;i<50;i++){xy[0][i]=NULL;xy[1][i]=NULL;}gotoin;//回到游戏开始的地方,开始游戏}if(2==ret)goto_out;//退出游戏while(1);out2:gotoxy(15,15);printf("恭喜你碰尾而死!按y重新开始,按n结束游戏");gotoin2;out3:gotoxy(15,15);printf("恭喜你中毒而死!按y重新开始,按n结束游戏");gotoin2;while(1);_out:return-1;}别外附上一些必要的关键代码:#include#includevoidgotoxy(intx,inty)//光标跳转{COORDcoord={x,y};SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);}//随机生成坐标rand()%(ORDINATE_2-ORDINATE_1)//窗口属性设置system("COLOR09");system("MODECON:COLS=99LINES=27");//得到键盘输入//key=_getch();if(_kbhit())//有输入//是否按下按键,并弹起以及附上控制台的关键代码:#include"stdio.h"#include"Windows.h"intmain(){HANDLEhandle=GetStdHandle(STD_OUTPUT_HANDLE);//获取控制台句柄SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY|FOREGROUND_RED);//设置为红色printf("把这句话颜色变成红色\n");SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);//设置为黄色printf("把这句话颜色变成黄色\n");}0.设置控制台输出行数和列数 system("modecon:cols=100lines=20000"); 1.改变整个控制台的颜色 用system("color0A"); 其中color后面的0是背景色代号,A是前景色代号。各颜色代码如下: 0=黑色 1=蓝色 2=绿色 3=湖蓝色 4=红色 5=紫色 6=黄色 7=白色 8=灰色 9=淡蓝色 A=淡绿色 B=淡浅绿色 C=淡红色 D=淡紫色 E=淡黄色 F=亮白色 2.改变下一个输出或者输入字体和背景的颜色 采用SetConsoleTextAttribute函数,如 WhiteonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE); RedonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED); GreenonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_GREEN); YellowonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED|FOREGROUND_GREEN); BlueonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_BLUE); MagentaonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED|FOREGROUND_BLUE); CyanonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_GREEN|FOREGROUND_BLUE); BlackonGray: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY| BACKGROUND_INTENSITY); BlackonWhite: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY| FOREGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE); RedonWhite: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY| FOREGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE| FOREGROUND_RED); 等等。 需要引入头文件: windows.h 函数原型: BOOLSetConsoleTextAttribute(HANDLEhConsoleOutput,WORDwAttributes); wAttributes的取值含义对应如下: AttributeMeaning FOREGROUND_BLUETextcolorcontainsblue. FOREGROUND_GREENTextcolorcontainsgreen. FOREGROUND_REDTextcolorcontainsred. FOREGROUND_INTENSITYTextcolorisintensified. BACKGROUND_BLUEBackgroundcolorcontainsblue. BACKGROUND_GREENBackgroundcolorcontainsgreen. BACKGROUND_REDBackgroundcolorcontainsred. BACKGROUND_INTENSITYBackgroundcolorisintensified. COMMON_LVB_LEADING_BYTELeadingbyte. COMMON_LVB_TRAILING_BYTETrailingbyte. COMMON_LVB_GRID_HORIZONTALTophorizontal. COMMON_LVB_GRID_LVERTICALLeftvertical. COMMON_LVB_GRID_RVERTICALRightvertical. COMMON_LVB_REVERSE_VIDEOReverseforegroundandbackgroundattributes. COMMON_LVB_UNDERSCOREUnderscore.
xy[0][i]=xy[0][i-1]-2;
xy[1][i]=xy[1][i-1];
print(len);
for(i=0;i<5;i++)
pois[0][i]=2*(rand()%(28)+1);
pois[1][i]=rand()%(28)+1;
gotoxy(pois[0][i],pois[1][i]);
printf("¤");
//蛇移动
intrun(intret)
for(i=ret-1;i>0;i--)
xy[0][i]=xy[0][i-1];
//打印蛇
intprint(intret)
for(i=0;i{if(i==0){gotoxy(xy[0][0],xy[1][0]);printf("◆");}else{gotoxy(xy[0][i],xy[1][i]);printf("●");}}}//定义窗口属性intgotoxy(intx,inty){COORDcoord={x,y};SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);}//蛇移动intmov(intk){switch(k){case1:if(2!=flag){run(len);xy[0][0]=xy[0][0]-2;flag=1;}break;case2:if(1!=flag){run(len);xy[0][0]=xy[0][0]+2;flag=2;}break;case3:if(4!=flag){run(len);xy[1][0]=xy[1][0]-1;flag=3;}break;case4:if(3!=flag){run(len);xy[1][0]=xy[1][0]+1;flag=4;}break;}}//生成食物intfoods(void){food[0]=2*(rand()%(28)+1);food[1]=rand()%(28)+1;gotoxy(food[0],food[1]);printf("○");}//蛇吃食物并成长intgrow(void){if(xy[0][0]==food[0]&&xy[1][0]==food[1]){len++;foods();core=core+100;gotoxy(62,12);printf("分数:%d",core);}returnlen;}//根据键值获取蛇的移动方向intdirection(void){if(_kbhit()){key=_getch();if('a'==key&&flag!=2)flag=1;elseif('d'==key&&flag!=1)flag=2;elseif('w'==key&&flag!=4)flag=3;elseif('s'==key&&flag!=3)flag=4;}returnflag;}//撞强和碰尾死亡方式intdie(void){if(xy[0][0]==0||xy[0][0]==58||xy[1][0]==0||xy[1][0]==29)return-1;for(i=1;i{if(xy[0][0]==xy[0][i]&&xy[1][0]==xy[1][i]){return-2;}}}//死亡后由玩家决定是否继续游戏intor(void){intkey;while(1){if(_kbhit()){key=_getch();if('y'==key)return1;if('n'==key)return2;}}}//吃有毒的食物,生命减少至0;intpoi(void){for(i=0;i<5;i++){if(xy[0][0]==pois[0][i]&&xy[1][0]==pois[1][i]){life--;if(life==0){gotoxy(62,14);printf("");gotoxy(62,14);printf("生命值:");return-3;}gotoxy(62,14);printf("");gotoxy(62,14);printf("生命值:");for(i=1;i<=life;i++){printf("★");}pois[0][i]=2*(rand()%(28)+1);pois[1][i]=rand()%(28)+1;gotoxy(pois[0][i],pois[1][i]);printf("¤");}}} 三、主函数main.c文件#include"header.h" intmain(void){intlen=5;inti;intflag=2;intkill;intret;intret2;system("COLOR0C");//窗口颜色system("MODECON:COLS=99LINES=30");//窗口宽度和高度in:len=5;flag=2;//初始化移动方向kill=1;ret=0;ret2=0;gotoxy(0,0);//光标移动到坐标(0,0)的位置wall();//打印围墙//初始化蛇init(5);//初始化蛇//测试语句//gotoxy(58,29);//printf("这");foods();//调用生成食物的函数,生成一个食物while(1){gotoxy(xy[0][len-1],xy[1][len-1]);printf("");//蛇移动时,蛇尾前移时擦去原蛇尾mov(flag);//控制蛇移动方向len=grow();//蛇生长,并返回蛇的长度ret2=poi();//蛇吃到有毒的食物,如果生命值为0,刚死亡if(ret2==-3)gotoout3;flag=direction();//根据键值,得到蛇移动方向kill=die();//蛇死亡判断,撞墙和碰尾死亡;print(len);//打印当前长度的蛇if(-1==kill)gotoout1;//撞墙死亡if(-2==kill)gotoout2;//碰尾死亡Sleep(300-5*len);//简单延时}out1:gotoxy(15,15);printf("恭喜你撞墙而死!按y重新开始,按n结束游戏");in2:ret=or();//死亡后由玩家决定是否继续游戏,按y继续游戏,按n退出游戏if(1==ret)//复活后游戏,把蛇身置空{for(i=0;i<50;i++){xy[0][i]=NULL;xy[1][i]=NULL;}gotoin;//回到游戏开始的地方,开始游戏}if(2==ret)goto_out;//退出游戏while(1);out2:gotoxy(15,15);printf("恭喜你碰尾而死!按y重新开始,按n结束游戏");gotoin2;out3:gotoxy(15,15);printf("恭喜你中毒而死!按y重新开始,按n结束游戏");gotoin2;while(1);_out:return-1;}别外附上一些必要的关键代码:#include#includevoidgotoxy(intx,inty)//光标跳转{COORDcoord={x,y};SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);}//随机生成坐标rand()%(ORDINATE_2-ORDINATE_1)//窗口属性设置system("COLOR09");system("MODECON:COLS=99LINES=27");//得到键盘输入//key=_getch();if(_kbhit())//有输入//是否按下按键,并弹起以及附上控制台的关键代码:#include"stdio.h"#include"Windows.h"intmain(){HANDLEhandle=GetStdHandle(STD_OUTPUT_HANDLE);//获取控制台句柄SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY|FOREGROUND_RED);//设置为红色printf("把这句话颜色变成红色\n");SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);//设置为黄色printf("把这句话颜色变成黄色\n");}0.设置控制台输出行数和列数 system("modecon:cols=100lines=20000"); 1.改变整个控制台的颜色 用system("color0A"); 其中color后面的0是背景色代号,A是前景色代号。各颜色代码如下: 0=黑色 1=蓝色 2=绿色 3=湖蓝色 4=红色 5=紫色 6=黄色 7=白色 8=灰色 9=淡蓝色 A=淡绿色 B=淡浅绿色 C=淡红色 D=淡紫色 E=淡黄色 F=亮白色 2.改变下一个输出或者输入字体和背景的颜色 采用SetConsoleTextAttribute函数,如 WhiteonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE); RedonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED); GreenonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_GREEN); YellowonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED|FOREGROUND_GREEN); BlueonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_BLUE); MagentaonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED|FOREGROUND_BLUE); CyanonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_GREEN|FOREGROUND_BLUE); BlackonGray: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY| BACKGROUND_INTENSITY); BlackonWhite: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY| FOREGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE); RedonWhite: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY| FOREGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE| FOREGROUND_RED); 等等。 需要引入头文件: windows.h 函数原型: BOOLSetConsoleTextAttribute(HANDLEhConsoleOutput,WORDwAttributes); wAttributes的取值含义对应如下: AttributeMeaning FOREGROUND_BLUETextcolorcontainsblue. FOREGROUND_GREENTextcolorcontainsgreen. FOREGROUND_REDTextcolorcontainsred. FOREGROUND_INTENSITYTextcolorisintensified. BACKGROUND_BLUEBackgroundcolorcontainsblue. BACKGROUND_GREENBackgroundcolorcontainsgreen. BACKGROUND_REDBackgroundcolorcontainsred. BACKGROUND_INTENSITYBackgroundcolorisintensified. COMMON_LVB_LEADING_BYTELeadingbyte. COMMON_LVB_TRAILING_BYTETrailingbyte. COMMON_LVB_GRID_HORIZONTALTophorizontal. COMMON_LVB_GRID_LVERTICALLeftvertical. COMMON_LVB_GRID_RVERTICALRightvertical. COMMON_LVB_REVERSE_VIDEOReverseforegroundandbackgroundattributes. COMMON_LVB_UNDERSCOREUnderscore.
gotoxy(xy[0][0],xy[1][0]);
printf("◆");
else
gotoxy(xy[0][i],xy[1][i]);
printf("●");
//定义窗口属性
intgotoxy(intx,inty)
COORDcoord={x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
intmov(intk)
switch(k)
case1:
if(2!
=flag)
run(len);
xy[0][0]=xy[0][0]-2;
flag=1;
break;
case2:
if(1!
xy[0][0]=xy[0][0]+2;
flag=2;
case3:
if(4!
xy[1][0]=xy[1][0]-1;
flag=3;
case4:
if(3!
xy[1][0]=xy[1][0]+1;
flag=4;
//生成食物
intfoods(void)
food[0]=2*(rand()%(28)+1);
food[1]=rand()%(28)+1;
gotoxy(food[0],food[1]);
printf("○");
//蛇吃食物并成长
intgrow(void)
if(xy[0][0]==food[0]&&xy[1][0]==food[1])
len++;
foods();
core=core+100;
returnlen;
//根据键值获取蛇的移动方向
intdirection(void)
if(_kbhit())
key=_getch();
if('a'==key&&flag!
=2)
elseif('d'==key&&flag!
=1)
elseif('w'==key&&flag!
=4)
elseif('s'==key&&flag!
=3)
returnflag;
//撞强和碰尾死亡方式
intdie(void)
if(xy[0][0]==0||xy[0][0]==58||xy[1][0]==0||xy[1][0]==29)
return-1;
for(i=1;i{if(xy[0][0]==xy[0][i]&&xy[1][0]==xy[1][i]){return-2;}}}//死亡后由玩家决定是否继续游戏intor(void){intkey;while(1){if(_kbhit()){key=_getch();if('y'==key)return1;if('n'==key)return2;}}}//吃有毒的食物,生命减少至0;intpoi(void){for(i=0;i<5;i++){if(xy[0][0]==pois[0][i]&&xy[1][0]==pois[1][i]){life--;if(life==0){gotoxy(62,14);printf("");gotoxy(62,14);printf("生命值:");return-3;}gotoxy(62,14);printf("");gotoxy(62,14);printf("生命值:");for(i=1;i<=life;i++){printf("★");}pois[0][i]=2*(rand()%(28)+1);pois[1][i]=rand()%(28)+1;gotoxy(pois[0][i],pois[1][i]);printf("¤");}}} 三、主函数main.c文件#include"header.h" intmain(void){intlen=5;inti;intflag=2;intkill;intret;intret2;system("COLOR0C");//窗口颜色system("MODECON:COLS=99LINES=30");//窗口宽度和高度in:len=5;flag=2;//初始化移动方向kill=1;ret=0;ret2=0;gotoxy(0,0);//光标移动到坐标(0,0)的位置wall();//打印围墙//初始化蛇init(5);//初始化蛇//测试语句//gotoxy(58,29);//printf("这");foods();//调用生成食物的函数,生成一个食物while(1){gotoxy(xy[0][len-1],xy[1][len-1]);printf("");//蛇移动时,蛇尾前移时擦去原蛇尾mov(flag);//控制蛇移动方向len=grow();//蛇生长,并返回蛇的长度ret2=poi();//蛇吃到有毒的食物,如果生命值为0,刚死亡if(ret2==-3)gotoout3;flag=direction();//根据键值,得到蛇移动方向kill=die();//蛇死亡判断,撞墙和碰尾死亡;print(len);//打印当前长度的蛇if(-1==kill)gotoout1;//撞墙死亡if(-2==kill)gotoout2;//碰尾死亡Sleep(300-5*len);//简单延时}out1:gotoxy(15,15);printf("恭喜你撞墙而死!按y重新开始,按n结束游戏");in2:ret=or();//死亡后由玩家决定是否继续游戏,按y继续游戏,按n退出游戏if(1==ret)//复活后游戏,把蛇身置空{for(i=0;i<50;i++){xy[0][i]=NULL;xy[1][i]=NULL;}gotoin;//回到游戏开始的地方,开始游戏}if(2==ret)goto_out;//退出游戏while(1);out2:gotoxy(15,15);printf("恭喜你碰尾而死!按y重新开始,按n结束游戏");gotoin2;out3:gotoxy(15,15);printf("恭喜你中毒而死!按y重新开始,按n结束游戏");gotoin2;while(1);_out:return-1;}别外附上一些必要的关键代码:#include#includevoidgotoxy(intx,inty)//光标跳转{COORDcoord={x,y};SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);}//随机生成坐标rand()%(ORDINATE_2-ORDINATE_1)//窗口属性设置system("COLOR09");system("MODECON:COLS=99LINES=27");//得到键盘输入//key=_getch();if(_kbhit())//有输入//是否按下按键,并弹起以及附上控制台的关键代码:#include"stdio.h"#include"Windows.h"intmain(){HANDLEhandle=GetStdHandle(STD_OUTPUT_HANDLE);//获取控制台句柄SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY|FOREGROUND_RED);//设置为红色printf("把这句话颜色变成红色\n");SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);//设置为黄色printf("把这句话颜色变成黄色\n");}0.设置控制台输出行数和列数 system("modecon:cols=100lines=20000"); 1.改变整个控制台的颜色 用system("color0A"); 其中color后面的0是背景色代号,A是前景色代号。各颜色代码如下: 0=黑色 1=蓝色 2=绿色 3=湖蓝色 4=红色 5=紫色 6=黄色 7=白色 8=灰色 9=淡蓝色 A=淡绿色 B=淡浅绿色 C=淡红色 D=淡紫色 E=淡黄色 F=亮白色 2.改变下一个输出或者输入字体和背景的颜色 采用SetConsoleTextAttribute函数,如 WhiteonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE); RedonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED); GreenonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_GREEN); YellowonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED|FOREGROUND_GREEN); BlueonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_BLUE); MagentaonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED|FOREGROUND_BLUE); CyanonBlack: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_GREEN|FOREGROUND_BLUE); BlackonGray: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY| BACKGROUND_INTENSITY); BlackonWhite: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY| FOREGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE); RedonWhite: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY| FOREGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE| FOREGROUND_RED); 等等。 需要引入头文件: windows.h 函数原型: BOOLSetConsoleTextAttribute(HANDLEhConsoleOutput,WORDwAttributes); wAttributes的取值含义对应如下: AttributeMeaning FOREGROUND_BLUETextcolorcontainsblue. FOREGROUND_GREENTextcolorcontainsgreen. FOREGROUND_REDTextcolorcontainsred. FOREGROUND_INTENSITYTextcolorisintensified. BACKGROUND_BLUEBackgroundcolorcontainsblue. BACKGROUND_GREENBackgroundcolorcontainsgreen. BACKGROUND_REDBackgroundcolorcontainsred. BACKGROUND_INTENSITYBackgroundcolorisintensified. COMMON_LVB_LEADING_BYTELeadingbyte. COMMON_LVB_TRAILING_BYTETrailingbyte. COMMON_LVB_GRID_HORIZONTALTophorizontal. COMMON_LVB_GRID_LVERTICALLeftvertical. COMMON_LVB_GRID_RVERTICALRightvertical. COMMON_LVB_REVERSE_VIDEOReverseforegroundandbackgroundattributes. COMMON_LVB_UNDERSCOREUnderscore.
if(xy[0][0]==xy[0][i]&&xy[1][0]==xy[1][i])
return-2;
//死亡后由玩家决定是否继续游戏
intor(void)
intkey;
while
(1)
if('y'==key)
return1;
if('n'==key)
return2;
//吃有毒的食物,生命减少至0;
intpoi(void)
if(xy[0][0]==pois[0][i]&&xy[1][0]==pois[1][i])
life--;
if(life==0)
return-3;
for(i=1;i<=life;i++)
三、主函数main.c文件
intmain(void)
intflag=2;
intkill;
intret;
intret2;
system("COLOR0C");//窗口颜色
system("MODECON:
COLS=99LINES=30");//窗口宽度和高度
in:
flag=2;//初始化移动方向
kill=1;
ret=0;
ret2=0;
gotoxy(0,0);//光标移动到坐标(0,0)的位置
wall();//打印围墙
//初始化蛇
init(5);//初始化蛇
//测试语句
//gotoxy(58,29);
//printf("这");
foods();//调用生成食物的函数,生成一个食物
gotoxy(xy[0][len-1],xy[1][len-1]);
printf("");//蛇移动时,蛇尾前移时擦去原蛇尾
mov(flag);//控制蛇移动方向
len=grow();//蛇生长,并返回蛇的长度
ret2=poi();//蛇吃到有毒的食物,如果生命值为0,刚死亡
if(ret2==-3)
gotoout3;
flag=direction();//根据键值,得到蛇移动方向
kill=die();//蛇死亡判断,撞墙和碰尾死亡;
print(len);//打印当前长度的蛇
if(-1==kill)
gotoout1;//撞墙死亡
if(-2==kill)
gotoout2;//碰尾死亡
Sleep(300-5*len);//简单延时
out1:
gotoxy(15,15);
printf("恭喜你撞墙而死!
按y重新开始,按n结束游戏");
in2:
ret=or();//死亡后由玩家决定是否继续游戏,按y继续游戏,按n退出游戏
if(1==ret)//复活后游戏,把蛇身置空
for(i=0;i<50;i++)
xy[0][i]=NULL;
xy[1][i]=NULL;
gotoin;//回到游戏开始的地方,开始游戏
if(2==ret)
goto_out;//退出游戏
(1);
out2:
printf("恭喜你碰尾而死!
gotoin2;
out3:
printf("恭喜你中毒而死!
_out:
别外附上一些必要的关键代码:
voidgotoxy(intx,inty)//光标跳转
//随机生成坐标
rand()%(ORDINATE_2-ORDINATE_1)
//窗口属性设置system("COLOR09");
COLS=99LINES=27");
//得到键盘输入
//key=_getch();
if(_kbhit())//有输入//是否按下按键,并弹起
以及附上控制台的关键代码:
#include"stdio.h"
#include"Windows.h"
intmain(){
HANDLEhandle=GetStdHandle(STD_OUTPUT_HANDLE);//获取控制台句柄
SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY|FOREGROUND_RED);//设置为红色
printf("把这句话颜色变成红色\n");
SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);//设置为黄色
printf("把这句话颜色变成黄色\n");
0.设置控制台输出行数和列数
system("modecon:
cols=100lines=20000");
1.改变整个控制台的颜色
用system("color0A");
其中color后面的0是背景色代号,A是前景色代号。
各颜色代码如下:
0=黑色
1=蓝色
2=绿色
3=湖蓝色
4=红色
5=紫色
6=黄色
7=白色
8=灰色
9=淡蓝色
A=淡绿色
B=淡浅绿色
C=淡红色
D=淡紫色
E=淡黄色
F=亮白色
2.改变下一个输出或者输入字体和背景的颜色
采用SetConsoleTextAttribute函数,如
WhiteonBlack:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
RedonBlack:
FOREGROUND_RED);
GreenonBlack:
FOREGROUND_GREEN);
YellowonBlack:
FOREGROUND_RED|FOREGROUND_GREEN);
BlueonBlack:
FOREGROUND_BLUE);
MagentaonBlack:
FOREGROUND_RED|FOREGROUND_BLUE);
CyanonBlack:
FOREGROUND_GREEN|FOREGROUND_BLUE);
BlackonGray:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY|
BACKGROUND_INTENSITY);
BlackonWhite:
FOREGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE);
RedonWhite:
FOREGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|
等等。
需要引入头文件:
windows.h
函数原型:
BOOLSetConsoleTextAttribute(HANDLEhConsoleOutput,WORDwAttributes);
wAttributes的取值含义对应如下:
AttributeMeaning
FOREGROUND_BLUETextcolorcontainsblue.
FOREGROUND_GREENTextcolorcontainsgreen.
FOREGROUND_REDTextcolorcontainsred.
FOREGROUND_INTENSITYTextcolorisintensified.
BACKGROUND_BLUEBackgroundcolorcontainsblue.
BACKGROUND_GREENBackgroundcolorcontainsgreen.
BACKGROUND_REDBackgroundcolorcontainsred.
BACKGROUND_INTENSITYBackgroundcolorisintensified.
COMMON_LVB_LEADING_BYTELeadingbyte.
COMMON_LVB_TRAILING_BYTETrailingbyte.
COMMON_LVB_GRID_HORIZONTALTophorizontal.
COMMON_LVB_GRID_LVERTICALLeftvertical.
COMMON_LVB_GRID_RVERTICALRightvertical.
COMMON_LVB_REVERSE_VIDEOReverseforegroundandbackgroundattributes.
COMMON_LVB_UNDERSCOREUnderscore.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1