码迷,mamicode.com
首页 > 编程语言 > 详细

贪吃蛇C++实现

时间:2017-03-20 22:04:17      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:logs   fine   windows   long   准备   getc   模式   pac   时间间隔   

  1 #include <windows.h>  
  2 #include <stdlib.h>  
  3 #include <conio.h>  
  4 #include <time.h>  
  5 #include <cstring>  
  6 #include <cstdio>  
  7 #include <iostream>  
  8 #define  N 22  
  9 using namespace std;  
 10  
 11     int gameover;  
 12  
 13     int x1, y1; // 随机出米  
 14  
 15     int x,y;  
 16  
 17     long start;  
 18  
 19 //=======================================  
 20 //类的实现与应用initialize  
 21 //=======================================  
 22  
 23 //下面定义贪吃蛇的坐标类  
 24 class snake_position  
 25 {  
 26 public:  
 27  
 28     int x,y;      //x表示行,y表示列  
 29  
 30     snake_position(){};  
 31  
 32     void initialize(int &);//坐标初始化  
 33  
 34  
 35 };  
 36  
 37 snake_position position[(N-2)*(N-2)+1]; //定义贪吃蛇坐标类数组,有(N-2)*(N-2)个坐标  
 38  
 39 void snake_position::initialize(int &j)  
 40 {  
 41         x = 1;  
 42  
 43         y = j;  
 44 }  
 45  
 46  
 47 //下面定义贪吃蛇的棋盘图  
 48  
 49 class snake_map  
 50 {  
 51  
 52 private:  
 53  
 54     char s[N][N];//定义贪吃蛇棋盘,包括墙壁。  
 55  
 56     int grade, length;  
 57  
 58     int gamespeed; //前进时间间隔  
 59  
 60     char direction; // 初始情况下,向右运动  
 61  
 62     int head,tail;  
 63  
 64     int score;  
 65  
 66     bool gameauto;  
 67  
 68 public:  
 69  
 70     snake_map(int h=4,int t=1,int l=4,char d=77,int s=0):length(l),direction(d),head(h),tail(t),score(s){}  
 71  
 72     void initialize();   //初始化函数  
 73  
 74     void show_game();  
 75  
 76     int updata_game();  
 77  
 78     void setpoint();  
 79  
 80     void getgrade();  
 81  
 82     void display();  
 83  
 84  
 85 };  
 86  
 87 //定义初始化函数,将贪吃蛇的棋盘图进行初始化  
 88  
 89 void snake_map::initialize()  
 90 {  
 91     int i,j;  
 92  
 93     for(i=1;i<=3;i++)  
 94  
 95         s[1][i] = *;  
 96  
 97     s[1][4] = #;  
 98  
 99     for(i=1;i<=N-2;i++)  
100  
101         for(j=1;j<=N-2;j++)  
102  
103             s[i][j]= ; // 初始化贪吃蛇棋盘中间空白部分  
104  
105     for(i=0;i<=N-1;i++)  
106  
107         s[0][i] = s[N-1][i] = -; //初始化贪吃蛇棋盘上下墙壁  
108  
109     for(i=1;i<=N-2;i++)  
110  
111         s[i][0] = s[i][N-1] = |; //初始化贪吃蛇棋盘左右墙壁  
112 }  
113  
114  
115 //============================================  
116 //输出贪吃蛇棋盘信息  
117  
118 void snake_map::show_game()  
119  
120 {  
121  
122     system("cls"); // 清屏  
123  
124     int i,j;  
125  
126     cout << endl;  
127  
128     for(i=0;i<N;i++)  
129     {  
130  
131         cout << \t;  
132  
133         for(j=0;j<N;j++)  
134  
135             cout<<s[i][j]<< ; // 输出贪吃蛇棋盘  
136  
137         if(i==2) cout << "\t等级:" << grade;  
138  
139         if(i==6) cout << "\t速度:" << gamespeed;  
140  
141         if(i==10) cout << "\t得分:" << score << "" ;  
142  
143         if(i==14) cout << "\t暂停:按一下空格键" ;  
144  
145         if(i==18) cout << "\t继续:按两下空格键" ;  
146  
147         cout<<endl;  
148     }  
149 }  
150  
151 //输入选择等级  
152 void snake_map::getgrade()  
153 {  
154     cin>>grade;  
155  
156     while( grade>7 || grade<1 )  
157     {  
158         cout << "请输入数字1-7选择等级,输入其他数字无效" << endl;  
159  
160         cin >> grade;  
161     }  
162     switch(grade)  
163     {  
164         case 1: gamespeed = 1000;gameauto = 0;break;  
165  
166         case 2: gamespeed = 800;gameauto = 0;break;  
167  
168         case 3: gamespeed = 600;gameauto = 0;break;  
169  
170         case 4: gamespeed = 400;gameauto = 0;break;  
171  
172         case 5: gamespeed = 200;gameauto = 0;break;  
173  
174         case 6: gamespeed = 100;gameauto = 0;break;  
175  
176         case 7: grade = 1;gamespeed = 1000;gameauto = 1;break;  
177  
178     }  
179  
180 }  
181  
182 //输出等级,得分情况以及称号  
183  
184 void snake_map::display()  
185 {  
186  
187     cout << "\n\t\t\t\t等级:" << grade;  
188  
189     cout << "\n\n\n\t\t\t\t速度:" << gamespeed;  
190  
191     cout << "\n\n\n\t\t\t\t得分:" << score << "" ;  
192  
193 }  
194  
195 //随机产生米  
196 void snake_map::setpoint()  
197 {  
198     srand(time(0));  
199  
200     do  
201     {  
202  
203         x1 = rand() % (N-2) + 1;  
204  
205         y1 = rand() % (N-2) + 1;  
206  
207     }while(s[x1][y1]!= );  
208  
209     s[x1][y1]=*;  
210 }  
211  
212 char key;  
213  
214 int snake_map::updata_game()  
215 {  
216     gameover = 1;  
217  
218     key = direction;  
219  
220     start = clock();  
221  
222     while((gameover=(clock()-start<=gamespeed))&&!kbhit());  
223  
224     //如果有键按下或时间超过自动前进时间间隔则终止循环  
225  
226  
227  
228         if(gameover)  
229         {  
230  
231             getch();  
232  
233             key = getch();  
234         }  
235  
236         if(key ==  )  
237  
238         {  
239             while(getch()!= ){};//这里实现的是按空格键暂停,按空格键继续的功能,但不知为何原因,需要按两下空格才能继续。这是个bug。  
240         }  
241  
242         else  
243  
244             direction = key;  
245  
246         switch(direction)  
247         {  
248             case 72: x= position[head].x-1; y= position[head].y;break; // 向上  
249  
250             case 80: x= position[head].x+1; y= position[head].y;break; // 向下  
251  
252             case 75: x= position[head].x; y= position[head].y-1;break; // 向左  
253  
254             case 77: x= position[head].x; y= position[head].y+1; // 向右  
255  
256         }  
257  
258         if(!(direction==72||direction==80||direction==75 ||direction==77))   // 按键非方向键  
259  
260             gameover = 0;  
261  
262         else if(x==0 || x==N-1 ||y==0 || y==N-1)   // 碰到墙壁  
263  
264             gameover = 0;  
265  
266         else if(s[x][y]!= &&!(x==x1&&y==y1))    // 蛇头碰到蛇身  
267  
268             gameover = 0;  
269  
270         else if(x==x1 && y==y1)  
271  
272         { // 吃米,长度加1  
273  
274             length ++;  
275  
276             if(length>=8 && gameauto)  
277  
278             {  
279  
280                 length -= 8;  
281  
282                 grade ++;  
283  
284                 if(gamespeed>=200)  
285  
286                     gamespeed -= 200; // 改变贪吃蛇前进速度  
287  
288                 else  
289  
290                     gamespeed = 100;  
291  
292             }  
293  
294             s[x][y]= #;  //更新蛇头  
295  
296             s[position[head].x][position[head].y] = *; //吃米后将原先蛇头变为蛇身  
297  
298             head = (head+1) % ( (N-2)*(N-2) );   //取蛇头坐标  
299  
300             position[head].x = x;  
301  
302             position[head].y = y;  
303  
304             show_game();  
305  
306             gameover = 1;  
307  
308             score += grade*20;  //加分  
309  
310             setpoint();   //产生米  
311  
312         }  
313  
314         else  
315         { // 不吃米  
316  
317             s[position[tail].x][position[tail].y]= ;//将蛇尾置空  
318  
319             tail= (tail+1) % ( (N-2) * (N-2) );//更新蛇尾坐标  
320  
321             s[position[head].x][position[head].y]=*;  //将蛇头更为蛇身  
322  
323             head= (head+1) % ( (N-2) * (N-2) );  
324  
325             position[head].x = x;  
326  
327             position[head].y = y;  
328  
329             s[position[head].x][position[head].y]=#; //更新蛇头  
330  
331             gameover = 1;  
332  
333         }  
334     return gameover;  
335  
336 }  
337 //====================================  
338 //主函数部分  
339 //====================================  
340 int main()  
341 {  
342     char ctn = y;  
343  
344     int nodead;  
345  
346     cout<<"\n\n\n\n\n\t\t\t 欢迎进入贪吃蛇游戏!"<<endl;//欢迎界面;  
347  
348     cout<<"\n\n\n\t\t\t 按任意键马上开始。。。"<<endl;//准备开始;;  
349  
350     getch();  
351  
352     while( ctn==y )  
353     {  
354         system("cls"); // 清屏  
355  
356         snake_map snake;  
357  
358         snake.initialize();  
359  
360         cout << "\n\n请输入数字选择游戏等级:" << endl;  
361  
362         cout << "\n\n\n\t\t\t1.等级一:速度 1000 \n\n\t\t\t2.等级二:速度 800 \n\n\t\t\t3.等级三:速度 600 ";  
363  
364         cout << "\n\n\t\t\t4.等级四:速度 400 \n\n\t\t\t5.等级五:速度 200 \n\n\t\t\t6.等级六:速度 100 \n\n\t\t\t7.自动升级模式" << endl;  
365  
366         snake.getgrade();//获取等级  
367  
368         for(int i=1;i<=4;i++)  
369         {  
370             position[i].initialize(i);//初始化坐标  
371         }  
372  
373         snake.setpoint();  // 产生第一个米  
374  
375         do  
376         {  
377             snake.show_game();  
378  
379             nodead = snake.updata_game();  
380  
381         }while(nodead);  
382  
383         system("cls"); //清屏  
384  
385  
386  
387         cout << "\n\n\n\t\t\t\tGameover!\n\n"<<endl;  
388  
389         snake.display();//输出等级/得分情况  
390  
391         cout << "\n\n\n\t\t    是否选择继续游戏?输入 y 继续,n 退出" << endl;  
392  
393         cin >> ctn;  
394  
395     }  
396  
397     return 0;  
398 }  

 

贪吃蛇C++实现

标签:logs   fine   windows   long   准备   getc   模式   pac   时间间隔   

原文地址:http://www.cnblogs.com/yhyl/p/6591829.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!