代码: 全选
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>
/**********按键定义**************/
#define U 8
#define D 6
#define L 9
#define R 7
/**********初始化参数************/
int Level=1,Score=0,ST;
int POINT_V[31][31],SS=8,S=8;
int Xe=15,Ye=30,X=15,Y=26,Xf,Yf,Xo=7,Yo=2;
/**********光标位置函数**********/
void Pos(int x,int y)
{
COORD pos;
HANDLE hOutput;
pos.X=x;
pos.Y=y;
hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput,pos);
}
/***********标数转换器***********/
int Dx(int N)
{
return (8-(N|1))*(N&1);
}
int Dy(int N)
{
return (8-(N|1))*((N^1)&1);
}
/***********判断自己的肉*********/
int Sme(int N)
{
if(N>5 && N<10){return 1;}
return 0;
}
/**********初始化地图************/
void CreatMap()
{
int i,j;
printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
for(j=1;j<=30;j++) {printf("┃ ┃\n");}
printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛");
for(j=1;j<=30;j++){
for(i=1; i<=30;i++){
POINT_V[i][j]=0;
}
}
for(j=27;j<=30;j++){
Pos(2*15,j);printf("■");
POINT_V[15][j]=8;
}
Pos(2*15,26);printf("⊙");
Pos(2*7,2);printf("△");
POINT_V[15][26]=3,POINT_V[7][2]=10;
}
/**********按键获取**************/
int Getkey(int N,int T)
{
int i,KEY_V,start=clock();
do{
if(kbhit()){
KEY_V=(int)(getch());
if(KEY_V<97){KEY_V+=32;}
return KEY_V;
}
for(i=0;i<=N;i++);
}while((clock()-start)<T);
return -1;
}
/***********游戏主程序***********/
int GameCycle(int N, int T, int F1)
{
int KEY_V;
while(1) {
KEY_V=Getkey(N,T);
if (KEY_V==119 && SS!=D){SS=8;}
else if(KEY_V==115 && SS!=U){SS=6;}
else if(KEY_V==97 && SS!=R){SS=9;}
else if(KEY_V==100 && SS!=L){SS=7;}
else if(KEY_V==112){getch();}
else if(KEY_V==113){return 0;}
Pos(2,31);
S=POINT_V[Xe][Ye],Xf=X+Dx(SS),Yf=Y+Dy(SS); //数据处理
if(Sme(POINT_V[Xf][Yf])){
if(F1==1 && (KEY_V<0)){
if(Dy(SS)==0){
ST=POINT_V[Xf][Yf],SS=(ST==6)?8:6,Xf=X,Yf=Y+Dy(SS);
}
else if(Dx(SS)==0){
ST=POINT_V[Xf][Yf],SS=(ST==7)?9:7,Xf=X+Dx(SS),Yf=Y;
}
}else{
if(KEY_V<0){
printf("蛇太贪了,连自己的肉也不放过!");
}else{
printf("蛇被你害死了!");
}
getch();
return 0;
}
}
if(F1==1 && (KEY_V<0)){
if(Xf==0 || Xf==31 || Yf==0 || Yf==31){
if(!Dy(SS)){
SS=6+2*(rand()%2),Xf=X,Yf=Y+Dy(SS);
if(Yf==0 || Yf==31){
SS=(SS==6)?8:6,Yf=Y+Dy(SS);
}
}else{
SS=7+2*(rand()%2),Xf=X+Dx(SS),Yf=Y;
if(Xf==0 || Xf==31){
SS=(SS==7)?9:7,Xf=X+Dx(SS);
}
}
}
if(Dy(SS)==0 && X==Xo){
ST=SS,SS=(Y-Yo)>0?8:6,Xf=X,Yf=Y+Dy(SS);
if(Sme(POINT_V[Xf][Yf])){SS=ST,Xf=X+Dx(SS),Yf=Y+Dy(SS);}
}
else if(Dx(SS)==0 && Y==Yo){
ST=SS,SS=(X-Xo)>0?9:7,Xf=X+Dx(SS),Yf=Y;
if(Sme(POINT_V[Xf][Yf])){SS=ST,Xf=X+Dx(SS),Yf=Y+Dy(SS);}
}
}
else if(Xf==0 || Xf==31 || Yf==0 || Yf==31){
printf("蛇死了,游戏结束!");
getch();
return 0;
}
if(Sme(POINT_V[Xf][Yf])){
printf("蛇已被困住了!!!");
getch();
return 0;
}
Pos(2*Xf,Yf);printf("⊙"); //动态显示
Pos(2*X,Y);printf("■");
POINT_V[X][Y]=SS;
if(POINT_V[Xf][Yf]<10){
Pos(2*Xe,Ye);printf(" ");
POINT_V[X][Y]=SS,POINT_V[Xe][Ye]=0;
Xe+=Dx(S),Ye+=Dy(S);
}else{
do{
Xo=1+rand()%30,Yo=1+rand()%30; //随机食物
if(POINT_V[Xo][Yo]==0){break;}
}while(POINT_V[Xo][Yo]!=0);
Pos(2*Xo,Yo);printf("△");
POINT_V[Xo][Yo]=10,Score++;
if(Score>Level*5){
Level++,T-=1;
}
}
X=Xf,Y=Yf;
Pos(2,0);printf("[LEVEL %d] Score:%d\n",Level,Score);
}
}
/**********Main主函数***********/
int main()
{
srand((unsigned)time(NULL));
int N=50,T=20,F=1;
CreatMap();
GameCycle(N,T,F);
return 0;
}