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

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

显示模仿别人,然后是自己做了点修改,包括游戏结束和界面上。。

这个终于写出来了。

早上的时间没有白费。

  1 //Lee. 控制台 贪吃蛇
  2 //测试版本
  3 
  4 
  5 #include<stdio.h>
  6 #include<windows.h>
  7 #include<conio.h>
  8 #include<time.h>
  9 #include<stdlib.h>
 10 
 11 #define UP 72        //定义上下左右常量
 12 #define DOWN 80
 13 #define LEFT 75
 14 #define RIGHT 77
 15 
 16 int X, Y;//食物坐标
 17 
 18 int Map[79][24]={{0}};    //    地图尺寸,其实有食物记为1
 19 int over=0;             //用来标记游戏结束
 20 
 21 struct Snake
 22 {
 23     int x, y;            //坐标
 24     int direction;        //方向
 25 }Snake[100];            //蛇最多100个节点
 26 
 27 int length = 3;            //初始化蛇的长度为3
 28 
 29 void GamePrint();        //游戏开始画面函数
 30 void Gameinit();        //游戏初始化函数
 31 void Sweep_Screem();    //清屏函数
 32 void Gotoxy(int , int); //光标移动函数
 33 void Hid_Cursor();        //光标隐藏函数
 34 void Snake_Move();        //蛇运动函数
 35 void Create_Food();        //食物产生函数
 36 void Pwall();            //画墙函数
 37 void Key();                //键盘操作函数
 38 void Hit_Wall();        //判断是否撞墙
 39 void Eat_Itself();        //判断是否咬到自己
 40 void Whether_Eat();        //判断蛇是否吃到食物
 41 void GameRun();            //游戏运行函数
 42 
 43 int main()
 44 {
 45     Hid_Cursor();
 46     GamePrint();
 47     Gameinit();        //游戏初始化函数
 48     GameRun();
 49 
 50     return 0;
 51 }
 52 
 53 
 54 
 55 
 56 void GamePrint()        //游戏开始画面函数
 57 {
 58     Gotoxy(30,9);
 59         printf("Welcome to RedSnake.");
 60     Gotoxy(36,12);
 61         printf("by_Lee.");
 62     Sleep(2000);
 63     Sweep_Screem();
 64     Gotoxy(30, 11);
 65     printf("方向键 ↑ 向上");
 66     Gotoxy(30, 12);
 67     printf("方向键 ↓ 向下");
 68     Gotoxy(30, 13);
 69     printf("方向键 ← 向左");
 70     Gotoxy(30, 14);
 71     printf("方向键 → 向右");
 72     Gotoxy(30, 15);
 73     printf("按 ESC 键 退出游戏");
 74     Sleep(2000);   
 75     Sweep_Screem();
 76     Pwall();            //画墙函数
 77     Sleep(1300);
 78 }
 79 
 80 
 81 void Gameinit()
 82 {
 83     Snake[0].x = 10;
 84     Snake[0].y = 12;
 85     Snake[1].x = 8;
 86     Snake[1].y = 12;
 87     Snake[2].x = 6;
 88     Snake[2].y = 12;
 89     Snake[0].direction = RIGHT;
 90     Gotoxy(10, 12);
 91     printf("");
 92     Gotoxy(8, 12);
 93     printf("");
 94     Gotoxy(6, 12);
 95     printf("");
 96 }
 97 
 98 
 99 void Sweep_Screem()//清屏函数
100 {
101     int i;
102     Gotoxy(0, 0);
103     for(i = 0;i < 25; i++)
104     {
105         printf("                                                                                ");
106     }
107 }
108 
109 void Gotoxy(int x, int y)//移动光标
110 {
111     COORD coord; 
112     coord.X=x;
113     coord.Y=y;
114     SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
115 }
116 
117 void Hid_Cursor()        //光标隐藏函数
118 {
119     HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
120     CONSOLE_CURSOR_INFO cci;
121     GetConsoleCursorInfo(hOut,&cci);
122     cci.bVisible=0;//赋1为显示,赋0为隐藏
123     SetConsoleCursorInfo(hOut,&cci);
124 }
125 
126 void Snake_Move()        //蛇运动函数
127 {
128     int i;
129     Gotoxy(Snake[0].x, Snake[0].y);
130         printf("");
131     Gotoxy(Snake[1].x, Snake[1].y);
132         printf("");
133     Gotoxy(Snake[length].x, Snake[length].y);
134         printf(" ");
135     Whether_Eat();                    //判断蛇是否吃到食物
136     Eat_Itself();                    //判断蛇是否咬到自己
137     for(i = length; i > 0; i--)        //移动蛇的坐标
138         Snake[i] = Snake[i-1];
139     Key();                            //判断用户的键盘输入
140     switch(Snake[0].direction)
141     {
142         case 72: Snake[0].y-=1; break;
143         case 80: Snake[0].y+=1; break;
144         case 75: Snake[0].x-=2; break;
145         case 77: Snake[0].x+=2; break;
146     }    
147 }
148 
149 
150 void Create_Food()    //食物产生函数
151 {
152     int i;
153     if(Map[X][Y] == 0)
154     {
155         srand((unsigned int)time(0) + X);
156         X = (rand() % 38 + 1) * 2;
157         srand((unsigned int)time(0) + Y + rand());
158         Y = rand() % 23 + 1;
159         for(i = 0; i < length; i++)
160             if(Snake[i].x == X && Snake[i].y == Y)
161             {
162                 i = -1;
163                 break;
164             }
165             if(i != -1)
166             {
167                 Map[X][Y] = 1;
168                 Gotoxy(X, Y);
169                 printf("");
170             }
171     }
172 }
173 
174 void Whether_Eat()            //判断蛇是否吃到食物
175 {
176     if(Map[Snake[0].x][Snake[0].y] == 1)
177     {    
178         length++;
179         Map[Snake[0].x][Snake[0].y] = 0;
180     }
181 }
182 
183 void Eat_Itself()            //判断蛇是否咬到自己
184 {
185     int i;
186     for(i = 3; i < length; i++)
187     {
188         if(Snake[0].x == Snake[i].x && Snake[0].y == Snake[i].y)
189         {
190             over=1;
191             break;
192         }
193     }
194 }
195 
196 
197 void Hit_Wall()            //判断是否撞墙
198 {
199     if(Snake[0].x == 0)        Snake[0].x = 76;
200     if(Snake[0].x == 78)    Snake[0].x = 2;
201     if(Snake[0].y == 0)        Snake[0].y = 23;
202     if(Snake[0].y == 24)    Snake[0].y = 1;
203 }
204 
205 
206 void Key()//用户是否操作键盘
207 {
208     if(_kbhit())//判断是否按键
209     {              
210         int ch = _getch();
211         if(ch == 224)//判断按的是不是方向键
212         {
213            ch = _getch();
214            if(ch+Snake[0].direction != 152)//判断按键是否是反方向
215            Snake[0].direction = ch;//如果不是就改变蛇头方向
216         }
217         else if(ch == 27)//判断用户是否退出
218         {
219             exit(0);
220         }
221     }
222 }
223 
224 void Pwall()//画墙函数
225 {
226     int i, j;
227     for(i = 39,j = 0; j < 39; i--, j++)
228     {
229         Gotoxy(j*2, 0);
230         printf("");
231         if(j < 24)
232         {
233             Gotoxy(78, j);
234             printf("");
235         }
236         Gotoxy(i*2, 24);
237         printf("");
238         if(i > 15)
239         {
240             Gotoxy(0, i-15);
241             printf("");
242         }
243         Sleep(50);
244     }
245     Gotoxy(52,24);
246     printf("RedSnake v1.0 by_Lee");
247 }
248 
249 void GameRun()        //游戏运行函数
250 {
251     while(1)
252     {
253         Snake_Move();        //控制蛇的运动
254         Hit_Wall();            //判断是否撞墙
255         Create_Food();        //随机产生食物
256 
257         if(length == 99)
258         {
259             Sweep_Screem();
260             Gotoxy(28, 12);
261             printf("You Win.");
262             Sleep(2000);
263             break;
264         }
265         if(over)
266         {
267             Sweep_Screem();
268             Gotoxy(28, 12);
269             printf("Game Over.");
270         }
271         Sleep(80);
272     }
273 }

 

测试结果如下

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

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