C程序设计 贪吃蛇分析(2)

时间:2021-10-22 23:36:11

自己想改一改,结果发现不能这样,,写出来是错误的,

双字符不能这样弄。。。

  1 //简单的控制台 贪吃蛇
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 #include<conio.h>
  5 #include<time.h>
  6 #include<string.h>
  7 
  8 #define H 30
  9 #define L 30
 10 
 11 int key; //用来存放按键
 12 int length = 1, over = 0; //蛇的长度, 结束 
 13 int dx[4]={0,0,-1,1}; //控制方向,左右,上下
 14 int dy[4]={-1,1,0,0};char Sharps[][3] = {"",  "", "", "  "};//蛇头,蛇身,食物,空白处。
 15 char *GameMap[H*L][3];
 16 
 17 
 18 
 19 struct Snake
 20 {
 21     int x, y;
 22     int dir; //存放当前节点的方向,0,1,2,3分别表示左右上下
 23 
 24 }Snake[H*L];
 25 void Initial();//地图初始化函数
 26 void Create_Food();//食物随机产生函数
 27 void Game();//游戏函数
 28 void Button();//取按键,判断方向函数
 29 void Move();//蛇移动函数
 30 void Check_Border();//越界检查函数
 31 void Check_Head(int x, int y);//蛇头移动检查函数
 32 
 33 
 34 int main()
 35 {
 36     Initial();
 37     Game();
 38 
 39     return 0;
 40 }
 41 
 42 
 43 void Initial()
 44 {
 45     int i, j;
 46     int hx, hy;
 47 
 48     system("title By:Lee Snake");//控制台标题
 49 //    memset(GameMap, ' ',sizeof(GameMap));//初始化地图全部为空
 50     
 51     system("cls");
 52     srand(time(0));
 53     hx=rand()%H;
 54     hy=rand()%L;
 55     *GameMap[hx * L+ hy] = "";
 56     Snake[0].x = hx;
 57     Snake[0].y = hy;
 58 
 59     Create_Food();   //随机产生食物
 60 
 61     for(i = 0; i < H; i++)   //地图显示
 62     { 
 63         for(j = 0; j < L; j++)
 64             printf("%s", *GameMap[i*L+j]);    //将蛇头 和 其他 字符 打印出来
 65         printf("\n");
 66     }
 67     printf("\n小小C语言贪吃蛇\n");
 68     printf("按任意方向键开始游戏\n");
 69     
 70     getch();   //先接受一个按键,使蛇开始往该方向走
 71     Button();  //取出按键,并判断方向
 72 }
 73 
 74 
 75 void Create_Food()
 76 {
 77     int fx, fy;
 78     while(1)
 79     {
 80         fx=rand()&H;
 81         fy=rand()%L;
 82 
 83         if(*GameMap[fx*fy]=="  ")
 84         {
 85             *GameMap[fx*fy] = Sharps[2];
 86             break;
 87         }
 88     }
 89 }
 90 
 91 void Game()
 92 {
 93     int i, j;
 94 
 95     while(1)
 96     {
 97         _sleep(200);
 98 
 99         Button();
100         Move();
101 
102         if(over)
103         {
104             printf("\n\n啊噢,你输了,Gameover !!\n\n");
105             printf("        >_<\n");
106             getchar();
107             break;
108         }
109         system("cls");
110         for(i = 0; i < H; i++)
111         {
112             for(j = 0; j < L; j++)
113             {
114                 printf("%s", *GameMap[i*L+j]);
115                 printf("\n");
116             }
117             
118         printf("\n小小C语言贪吃蛇\n");
119         printf("按任意方向键开始游戏\n");
120         }
121     }
122 }
123 
124 void Button()
125 {
126     if(kbhit()!=0)
127     {
128         while(kbhit()!=0)
129             key = getch();
130 
131         switch(key)
132         {
133         case 75: Snake[0].dir = 0; break;
134         case 77: Snake[0].dir = 1; break;
135         case 72: Snake[0].dir = 2; break;
136         case 80: Snake[0].dir = 3; break;
137         }
138     }
139 }
140 
141 
142 
143 void Move()
144 {
145     int i, x, y;
146     int tmp = length;
147     x = Snake[0].x;  
148     y = Snake[0].y;  
149     *GameMap[x*L+y] = "  ";
150     Snake[0].x = Snake[0].x + dx[ Snake[0].dir ];
151     Snake[0].y = Snake[0].y + dy[ Snake[0].dir ];
152 
153     Check_Border();   //蛇头是否越界
154     Check_Head(x, y);
155 
156     if(length == tmp)
157         for(i = 1; i < length; i++)
158         {
159             if(i == 1)
160                 *GameMap[Snake[i].x * L+Snake[i].y]="  ";
161 
162             if(i == length - 1)
163             {
164                 Snake[i].x = x;
165                 Snake[i].y = y;
166                 Snake[i].dir = Snake[0].dir;
167             }
168             else
169             {
170                 Snake[i].x = Snake[i+1].x;
171                 Snake[i].y = Snake[i+1].y;
172                 Snake[i].dir = Snake[i+1].dir;        
173             }
174 
175             *GameMap[Snake[i].x * L+ Snake[i].y] = Sharps[1];
176         }
177     
178 }
179 
180 void Check_Border()  //检查蛇头是否越界
181 {
182     if(Snake[0].x < 0 || Snake[0].x >= H || Snake[0].y < 0 || Snake[0].y >= L)
183         over = 1;
184 }
185 
186 void Check_Head(int x, int y)  //检查蛇头移动后的位置情况
187 {
188     
189     if(*GameMap[ Snake[0].x * L + Snake[0].y ] == "  ")  //为空
190         *GameMap[ Snake[0].x * L + Snake[0].y ] = Sharps[0];
191     else
192         if(*GameMap[ Snake[0].x * L + Snake[0].y ] == Sharps[2])  //为食物
193         {
194             *GameMap[ Snake[0].x * L + Snake[0].y ] = Sharps[0];
195             
196             Snake[length].x = x;   //新增加的蛇身为蛇头后面的那个
197             Snake[length].y = y;
198             Snake[length].dir = Snake[0].dir;
199             
200             *GameMap[ Snake[length].x * L + Snake[length].y ] = Sharps[1]; 
201             length++;
202             
203             Create_Food();  //食物吃完了马上再产生一个食物
204         }
205         else
206             over = 1;
207 }