1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<conio.h> 4 #include<windows.h> 5 6 #define High 20 7 #define Width 50 8 9 int direction,food_x,food_y; 10 int canvas[High][Width]={0};//二维数组为小蛇运动空间 11 12 void goto_xy(int x,int y)//光标移动函数 https://blog.csdn.net/konghouy/article/details/80230571 13 { 14 HANDLE handle_out=GetStdHandle(STD_OUTPUT_HANDLE); 15 COORD pos; 16 pos.X=x; 17 pos.Y=y; 18 SetConsoleCursorPosition(handle_out,pos); 19 } 20 21 void Init(void)//初始化函数 22 { 23 int i,j; 24 for(i=0;i<High;i++) 25 { 26 canvas[i][0]=-1; 27 canvas[i][Width-1]=-1; 28 } 29 for(j=0;j<Width;j++) 30 { 31 canvas[0][j]=-1; 32 canvas[High-1][j]=-1;//以上为边框对应的数组元素值 33 } 34 for(i=0;i<5;i++) 35 { 36 canvas[High/2][Width/2-i]=i+1;//蛇头蛇身对应数组元素值 37 } 38 begin:food_x=rand()%(High-5)+2; //食物生成 https://blog.csdn.net/u010141928/article/details/71439570 39 food_y=rand()%(Width-5)+2; 40 if(canvas[food_x][food_y]==0) 41 canvas[food_x][food_y]=-2;//食物对应数组元素值 42 else 43 goto begin; 44 } 45 46 void show(void)//显示函数 47 { 48 goto_xy(0,0);//每次界面显示都从原点处光标开始 49 int i,j; 50 for(i=0;i<High;i++) 51 { 52 for(j=0;j<Width;j++) 53 { 54 if(canvas[i][j]==-1) 55 printf("#"); 56 else if(canvas[i][j]==1) 57 printf("@"); 58 else if(canvas[i][j]>1) 59 printf("*"); 60 else if(canvas[i][j]==-2) 61 printf("F"); 62 else 63 printf(" "); 64 } 65 printf("\n"); 66 } 67 Sleep(100); //https://zhidao.baidu.com/question/106833147.html 68 } 69 70 void Snake_Move(void) 71 { 72 int i,j; 73 int max=1; 74 int Old_Tail_x,Old_Tail_y,Old_Head_x,Old_Head_y,New_Head_x,New_Head_y; 75 for(i=1;i<High-1;i++) 76 for(j=1;j<Width-1;j++) 77 { 78 if(canvas[i][j]>0) 79 { 80 canvas[i][j]++; 81 if(canvas[i][j]==2) 82 { 83 Old_Head_x=i; 84 Old_Head_y=j; 85 } 86 if(max<canvas[i][j]) 87 { 88 max=canvas[i][j]; 89 Old_Tail_x=i; 90 Old_Tail_y=j; 91 } 92 } 93 } 94 if(direction==1) //‘D‘小蛇向右走 95 { 96 New_Head_x=Old_Head_x; 97 New_Head_y=Old_Head_y+1; 98 } 99 else if(direction==2) //‘W‘小蛇向上走 100 { 101 New_Head_x=Old_Head_x-1; 102 New_Head_y=Old_Head_y; 103 } 104 else if(direction==3) //‘A‘小蛇向左走 105 { 106 New_Head_x=Old_Head_x; 107 New_Head_y=Old_Head_y-1; 108 } 109 else if(direction==4) //‘S‘小蛇向下走 110 { 111 New_Head_x=Old_Head_x+1; 112 New_Head_y=Old_Head_y; 113 } 114 if(canvas[New_Head_x][New_Head_y]==-1||canvas[New_Head_x][New_Head_y]>0)//判定失败 115 { 116 printf("游戏失败\n"); 117 exit(-1); 118 } 119 else if(canvas[New_Head_x][New_Head_y]==-2)//吃到食物 120 { 121 begin:food_x=rand()%(High-5)+2; 122 food_y=rand()%(Width-5)+2; 123 if(canvas[food_x][food_y]==0) 124 canvas[food_x][food_y]=-2; 125 else 126 goto begin; 127 canvas[New_Head_x][New_Head_y]=1; 128 } 129 else 130 { 131 canvas[Old_Tail_x][Old_Tail_y]=0; 132 canvas[New_Head_x][New_Head_y]=1; 133 } 134 } 135 136 int Direction_Control(void) 137 { 138 int input=0; 139 if(kbhit()) //https://blog.csdn.net/boreassoft/article/details/76728405 140 { 141 input=getch(); 142 if(‘D‘==input) //https://zhidao.baidu.com/question/309492191.html 143 { 144 direction=1; 145 Snake_Move(); 146 } 147 else if(‘W‘==input) 148 { 149 direction=2; 150 Snake_Move(); 151 } 152 else if(‘A‘==input) 153 { 154 direction=3; 155 Snake_Move(); 156 } 157 else if(‘S‘==input) 158 { direction=4; 159 Snake_Move(); 160 } 161 } 162 return input; 163 } 164 165 int main(void) 166 { 167 int t; 168 Init(); 169 direction=1;//设定初始运动方向向右 170 while(1) 171 { 172 show(); 173 t=Direction_Control(); 174 if(t==0) 175 Snake_Move(); 176 } 177 return 0; 178 }