控制檯小遊戲-貪吃蛇,c++和c#版

說是c++版,其實只是用到了c++的cout和cin而已。這是我作的第二個控制檯遊戲,基本上每一行代碼都加上了註釋。ios

遊戲嘛,我以爲重要的是瞭解他的思想,因此後期學了面向對象以後這個遊戲的代碼我也沒有從新封裝。c++

下面請看圖c#

 

 

代碼以下:我是用dev c++寫的dom

  1 //註釋。 ---星辰 
  2 
  3 #include <iostream>
  4 #include<Windows.h>
  5 #include<ctime>
  6 #include<cstdlib>
  7 #include "conio.h"//非標準輸入輸出庫函數 
  8 
  9 using namespace std;
 10 
 11 
 12 const int UP=72;//
 13 const int DOWN=80;//
 14 const int LEFT=75;//
 15 const int RIGHT=77;//
 16 
 17 int n=4;//n用來記錄蛇身長度,初始爲2節
 18 int guan;//用來記錄關卡
 19 int T;//用來給記錄蛇的移動速度
 20 int t1,t2,t3=0;//用來記錄以用時間
 21 int HP=5;//記錄蛇的生命值,初始化爲6
 22 int food=0;//用來記錄所吃到的食物數
 23 int x=12,y=12;//記錄食物所在地
 24 
 25 struct snake
 26 {
 27     int x;//蛇身所在橫座標
 28     int y;//蛇身所在縱座標
 29     int direction;//行走方向
 30 }p[81];
 31 
 32 
 33 struct map
 34 {
 35     int food;//此map[x][y]處是否有食物有的話food爲1
 36     int star;//此map[x][y]處是否有星星的話值爲1
 37     int barrier;//此map[x][y]處是否有障礙物有的話值爲1
 38 }map[26][22];
 39 
 40 
 41 inline void c(int k)//改變輸出字體的顏色
 42 {
 43     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), k);
 44 }
 45 
 46 inline int time()//用來計時
 47 {
 48     clock_t t=clock()/CLOCKS_PER_SEC;//記錄當前程序已用時間
 49     return t;
 50 }
 51 
 52 inline void gotoxy(int x,int y) //移動座標
 53 {
 54     COORD coord; 
 55     coord.X=x;
 56     coord.Y=y;
 57     SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
 58 }
 59 
 60 inline int random()//用來輸出隨機值
 61 {
 62     srand(t1+rand());//將隨機數種子初始化
 63     return rand();//返回隨機數
 64 }
 65 
 66 void ycgb(int);//隱藏光標
 67 void start();//繪製啓動畫面以及隔牆
 68 void guanka();//用來選擇關卡並根據關卡設置蛇的移動速度
 69 void data();//用來記錄遊戲的各類狀態數據
 70 int game();//遊戲運行
 71 void show();//用來隨機產生障礙物以及食物和生命藥水以及用來判斷遊戲的各類參數(小星星是否吃到,是否撞牆)
 72 void key();//用戶是否操做鍵盤
 73 void qp();//清除屏幕
 74 
 75 
 76 int main()
 77 {
 78     ycgb(0);//隱藏光標
 79     start();//繪製啓動畫面以及隔牆
 80     while(1)
 81     {
 82        guanka();//用來選擇關卡並根據關卡設置蛇的移動速度
 83        ycgb(0);//隱藏光標
 84        if(!game()) break;//遊戲運行
 85     }
 86 }
 87 
 88 void ycgb(int k)//隱藏光標
 89 {
 90     HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
 91     CONSOLE_CURSOR_INFO cci;
 92     GetConsoleCursorInfo(hOut,&cci);
 93     cci.bVisible=k;//賦1爲顯示,賦0爲隱藏
 94     SetConsoleCursorInfo(hOut,&cci);
 95 }
 96 
 97 
 98 void start()//繪製牆/繪製啓動畫面以及隔牆
 99 {
100     int i,j,z;
101     for(i=0;i<25;i++)
102     {
103         cout<<"                                                                                ";
104     }
105     c(14);//調成紅色
106     for(z=0;z<20;z++)
107     {
108         if(z>=0)
109         {
110             gotoxy(12,z);
111             cout<<"              ~--______-~                ~-___-~\"       ";  
112         }
113         if(z>=1)
114         {
115             gotoxy(12,z-1);
116             cout<<"            ~-_           _-~          ~-_       _-~    ";
117         }
118         if(z>=2)
119         {
120             gotoxy(12,z-2);
121             cout<<"          \\     ~-____-~     _-~    ~-_    ~-_-~    / ";
122         }
123         if(z>=3)
124         {
125             gotoxy(12,z-3);
126             cout<<"         (     (         _-~    _--_    ~-_    _/   |  ";
127         }
128         if(z>=4)
129         {
130             gotoxy(12,z-4);
131             cout<<"          /    /            _-~      ~-_        |   |  "; 
132         }
133         if(z>=5)
134         {
135             gotoxy(12,z-5);
136             cout<<"           /    /              _----_           \\  \\ ";
137         }
138         if(z>=6)
139         {
140             gotoxy(12,z-6);
141             cout<<"             /    /                            \\ \\   ";
142         }
143         if(z>=7)
144         {
145             gotoxy(12,z-7);
146             cout<<"              /    /                          \\\\     ";
147         }
148         if(z>=8)
149         {
150             gotoxy(12,z-8);
151             cout<<"                /    /                      \\\\       ";
152         }
153         if(z>=9)
154         {
155             gotoxy(12,z-9);
156             cout<<"                 /     /                   \\            ";
157         }
158         if(z>=10)
159         {
160             gotoxy(12,z-10);
161             cout<<"                  |     |                \\                ";
162         }
163         if(z>=11)
164         {
165             gotoxy(12,z-11);
166             cout<<"                 \\     \\                                 ";
167         }
168         if(z>=12)
169         {
170             gotoxy(12,z-12);
171             cout<<"        \\_______      \\                                  ";
172         }
173         if(z>=13)
174         {
175             gotoxy(12,z-13);
176             cout<<" \\____|__________/  \\                                    "; 
177         }
178         if(z>=14)
179         {
180             gotoxy(12,z-14);
181             cout<<"\\/     /~     \\_/ \\                                     ";
182         }
183         if(z>=15)
184         {
185             gotoxy(12,z-15);
186             cout<<"        _|__|  O|                                          ";
187         }
188         for(int k=15;k<z;k++)
189         {
190             gotoxy(12,k-15);
191             cout<<"                                                           ";
192         }
193         Sleep(30);
194     }
195     Sleep(2000);
196     c(0);//調成黑底色
197     gotoxy(0,0);
198     for(i=0;i<25;i++)
199     {
200         cout<<"                                                                                ";
201     }
202     c(252);//調整輸出顏色 
203     for(i=0,j=60;i<60;i++,j--)//if是爲了異步輸出 
204     {
205        if(j>20)
206        {              
207            gotoxy(2*(j-21),0);
208            cout<<"";//輸出第一行
209        }                                            
210        if(i<40)
211        {
212            gotoxy(2*i,23);
213            cout<<"";// 輸出最下面一行 
214        }  
215        if(j>22&&j<45)
216        {
217            gotoxy(78,j-22);
218            cout<<"";//輸出最右邊列
219        }    
220        if(j>22&&j<45)
221        {
222            gotoxy(0,i-15);
223            cout<<"";//輸出第一列
224        }
225        if(i>37&&i<60)
226        {
227            gotoxy(54,i-37);
228            Sleep(10);
229            cout<<"";//輸出中間那列
230        } 
231        Sleep(30);
232      }
233      gotoxy(56,11);
234      cout<<"▉▉▉▉▉▉▉▉▉▉▉";                                            //56 
235      gotoxy(19,0);    
236      c(14);//調整輸出顏色 
237      cout<<"| | |貪 吃 蛇| | |";//輸出標題 
238      
239      gotoxy(56,2);
240      cout<<"已用時間:";
241      gotoxy(75,2);
242      cout<<"";
243      gotoxy(56,4);
244      cout<<"生命值:";
245      gotoxy(56,6);
246      cout<<"當前長度:";
247      gotoxy(56,8);
248      cout<<"已吃食物:";
249      gotoxy(56,10);
250      cout<<"第             關";
251      gotoxy(64,12);
252      cout<<"提示:";
253      gotoxy(56,13);
254      cout<<"向上:↑   向上:←"; 
255      gotoxy(56,14);
256      cout<<"向下:↓   向右:→";
257      gotoxy(56,15);
258      cout<<"暫停/開始:肯定鍵 ";
259      gotoxy(56,16);
260      cout<<"從新選關 :Esc鍵";
261      gotoxy(64,18);
262      cout<<"注意!";
263      gotoxy(56,19);
264      cout<<"1:撞到障礙物或者牆生命";
265      gotoxy(56,20);
266      cout<<"  值減一 ";
267      gotoxy(56,21);
268      cout<<"2:吃到小星星生命值加一";  
269 }
270 void guanka()//用來選擇關卡並根據關卡設置蛇的移動速度
271 {
272     ycgb(1);//顯示光標
273     n=4;//n用來記錄蛇身長度,初始爲3節
274     HP=6;//記錄蛇的生命值,初始化爲6
275     p[0].x=6;                    //
276     p[0].y=10;                   //
277     p[0].direction=RIGHT;        //
278     p[1].x=4;                   //
279     p[1].y=10;                  //     初始化蛇所在位置和移動方向   
280     p[1].direction=RIGHT;       //
281     p[2].x=2;                   //
282     p[2].y=10;                  //
283     p[2].direction=RIGHT;      //
284     p[3].x=4;////////////////
285     p[3].y=4;///////////////記錄蛇尾的信息
286     p[3].direction=RIGHT;////
287     while(1)
288     {
289         gotoxy(15,3);
290         cout<<"請輸入關數(1-6):";
291         cin>>guan;
292         cin.get();
293         if(guan==0)     //判斷是否做弊
294         {
295             gotoxy(15,3);
296             c(12);//變成紅色
297             cout<<"  做弊有害智商,需謹慎";
298             gotoxy(15,5);
299             c(14);//變成黃色
300             cout<<"請輸入你想要的蛇的生命值:";
301             cin>>HP;
302             cin.get();
303             gotoxy(15,3);
304             cout<<"                      ";
305             gotoxy(15,5);
306             cout<<"                                    ";
307             continue;//返回選關處
308         }
309         if(guan<7&&guan>0) break;//判斷關數是否溢出
310         gotoxy(15,5);
311         cout<<"輸入錯誤!";
312         gotoxy(32,3);
313         cout<<"          ";
314         
315     }
316     gotoxy(15,3);
317     cout<<"                   ";
318     switch (guan)
319     {
320         case 1:{T=600;break;}//
321         case 2:{T=400;break;}//
322         case 3:{T=200;break;}//    根據關數來設定蛇的移動速度
323         case 4:{T=150;break;}//
324         case 5:{T=100;break;}//
325         case 6:{T=60;break;}//
326     }
327     qp();//清除屏幕
328 }
329 void data()//用來記錄和判斷遊戲的各類狀態數據
330 {
331     gotoxy(66,2);
332     c(12);//調成紅色
333     cout<<t1;//程序已用時間
334     switch (guan)
335     {
336     case 1:
337         gotoxy(59,10);
338         c(12);//調成紅色
339         cout<<"1";
340         c(14);//調成黃色
341         cout<<" 2 3 4 5 6";
342         break;
343     case 2:
344         gotoxy(59,10);
345         c(14);//調成黃色
346         cout<<"1 ";
347         c(12);//調成紅色
348         cout<<"2";
349         c(14);//調成黃色
350         cout<<" 3 4 5 6 ";
351         break;
352     case 3:
353         gotoxy(59,10);
354         c(14);//調成黃色
355         cout<<"1 2 ";
356         c(12);//調成紅色
357         cout<<"3";
358         c(14);//調成黃色
359         cout<<" 4 5 6 ";
360         break;
361     case 4:
362         gotoxy(59,10);
363         c(14);//調成黃色
364         cout<<"1 2 3 ";
365         c(12);//調成紅色
366         cout<<"4";
367         c(14);//調成黃色
368         cout<<" 5 6 ";
369         break;
370     case 5:
371         gotoxy(59,10);
372         c(14);//調成黃色
373         cout<<"1 2 3 4 ";
374         c(12);//調成紅色
375         cout<<"5";
376         c(14);//調成黃色
377         cout<<" 6 ";
378         break;
379     case 6:
380         gotoxy(59,10);
381         c(14);//調成黃色
382         cout<<"1 2 3 4 5 ";
383         c(12);//調成紅色
384         cout<<"6";
385         break;
386     }
387     switch (HP)
388     {
389     case 1:
390         gotoxy(65,4);
391         c(10);//調成綠色
392         cout<<""; 
393         c(12);//調成紅色
394         cout<<"▂▃▅▆▇";
395         break;
396     case 2:
397         gotoxy(65,4);
398         c(10);//調成綠色
399         cout<<"▁▂"; 
400         c(12);//調成紅色
401         cout<<"▃▅▆▇";
402         break;
403     case 3:
404         gotoxy(65,4);
405         c(10);//調成綠色
406         cout<<"▁▂▃";
407         c(12);//調成紅色
408         cout<<"▅▆▇";
409         break;
410     case 4:
411         gotoxy(65,4);
412         c(10);//調成綠色
413         cout<<"▁▂▃▅";
414         c(12);//調成紅色
415         cout<<"▆▇";
416         break;
417     case 5:
418         gotoxy(65,4);
419         c(10);//調成綠色
420         cout<<"▁▂▃▅▆";
421         c(12);//調成紅色
422         cout<<"";
423         break;
424     case 6:
425         gotoxy(65,4);
426         c(10);//調成綠色
427         cout<<"▁▂▃▅▆▇";
428         break;
429     default:
430         gotoxy(65,4);
431         c(10);//調成紅色
432         cout<<"!超級模式 !";
433         break;
434     }
435     gotoxy(66,6);
436     c(12);//調成紅色
437     cout<<n-1;//輸出蛇的當前長度
438     gotoxy(66,8);
439     cout<<food;//輸出蛇當前已經吃到食物
440 }
441 void qp()//用來清除屏幕
442 {
443     for(int i=1;i<23;i++)
444     {
445        gotoxy(2,i);
446        cout<<"                                                    ";
447     } 
448     map[x][y].food=0;//將食物清空
449     map[x][y].barrier=0;//將障礙物清除
450     map[x][y].star=0;//將星星清除 
451 }
452 
453 void show()//用來隨機產生障礙物以及食物和生命藥水以及用來判斷遊戲的各類參數
454 {
455     int a,b,e,f; //a,b用來表示小星星的座標   c,d表明障礙物座標
456     if(map[x][y].food==0)//判斷食物是否是被吃掉
457     { 
458         while(1)
459         {                                                                                                  
460             x=random()%26;//產生隨機橫座標
461             y=random()%22;//產生隨機縱座標
462             if(map[x][y].barrier==0&&map[x][y].star==0) break;//當此處無其餘元素是才生效 
463         }
464         map[x][y].food=1;//隨機出現食物
465         gotoxy(2*(x+1),y+1);//定位到食物出現的位置
466         c(11);//調成黃色
467         cout<<"";//打印出食物
468     }
469     if(t1/20>0&&t1%12==0&&t1>t3&&map[(p[0].x-1)/2][p[0].y-1].food==0&&map[(p[0].x-1)/2][p[0].y-1].star==0)
470     {
471         while(1)
472         {                                                                                                  
473             e=random()%26;//產生隨機橫座標
474             f=random()%22;//產生隨機縱座標
475             if(map[e][f].food==0&&map[e][f].star==0) break;//當此處無其餘元素是才生效 
476         }
477         gotoxy(2*(e+1),f+1);//定位到障礙物出現的位置
478         map[e][f].barrier=1;//隨機出現障礙物
479         c(12);//調成黃色
480         cout<<"";//打印出障礙物
481         t3=t1;//以避免產生多個障礙物
482         if(HP<7)
483         {
484           gotoxy(18,24);
485           c(15);//調成白色
486           cout<<"舒適提示:在選關的時候輸入0能夠開啓做弊模式";
487         }
488     }
489     if(t1/25>0&&t1%15==0&&t1>t3&&map[(p[0].x-1)/2][p[0].y-1].food==0&&map[(p[0].x-1)/2][p[0].y-1].barrier==0)//減小星星出現的概率 
490     {
491         while(1)
492         {                                                                                                  
493             a=random()%26;//產生隨機橫座標
494             b=random()%22;//產生隨機縱座標
495             if(map[a][b].barrier==0&&map[a][b].food==0) break;//當此處無其餘元素是才生效 
496         }
497         map[a][b].star=1;//隨機出現小星星(吃到星星長度減1)
498         gotoxy(2*(a+1),b+1);//定位到星星出現的位置(吃到星星長度減1)
499         c(14);//調成黃色
500         cout<<"";//打印出星星(吃到星星長度減1)
501         t3=t1;//以避免產生多個障礙物
502         if(HP<7)
503         {
504            gotoxy(18,24);
505            cout<<"                                            ";
506         }
507     }
508     for(int i=0;i<n;i++)
509     {
510         if(map[(p[i].x-1)/2][p[i].y-1].food==1)//判斷蛇是否吃到食物
511         {
512             ++n;//讓蛇長度加1
513             food++;//將食物數加1
514             map[(p[i].x-1)/2][p[i].y-1].food=0;//讓食物標示歸零
515             break;
516         }
517     }
518     if(map[(p[0].x-1)/2][p[0].y-1].star==1)//判斷蛇是否吃到星星
519     {
520         map[(p[0].x-1)/2][p[0].y-1].star=0;//讓星星標示歸零
521         if(HP<6)
522            ++HP;//將生命值加1
523     }
524     t1=time()-t2;//刷新遊戲運行時間
525 }
526 void key()//用戶是否操做鍵盤
527 {
528     if(kbhit())//判斷是否按鍵
529     {              
530         int ch=getch();
531         if(ch==224)//判斷按的是否是方向鍵
532         {
533            ch=getch();               
534            if((ch==72||ch==75||ch==80||ch==77)&&(ch+p[0].direction!=152)&&ch!=p[0].direction)  //判斷按鍵是不是方向鍵,而且是否是蛇移動方向的反方向
535                   p[0].direction=ch;//若是不是就改變蛇頭方向
536            else rewind(stdin); 
537         }
538         else if(ch==13)//判斷用戶是否暫停
539         {
540             clock_t a,b;
541             a=time();//記錄當前程序已用時間
542             gotoxy(20,1);
543             c(15);//調成白色
544             cout<<"已暫停,按肯定鍵開始";
545             while(1)
546             {
547                 if(kbhit()&&getch()==13)////判斷是否按鍵且是否解除暫停
548                 {
549                     gotoxy(20,1);
550                     cout<<"                     ";//清除"已暫停,按肯定鍵開始"這行字                     
551                     break;
552                 } 
553             }
554             b=time();//記錄當前程序已用時間
555             t2+=(b-a);//將暫停加到t2上供t1減去
556         }
557         else if(ch==27)//判斷是否從新選關
558         {
559             guanka();//用來選擇關卡並根據關卡設置蛇的移動速度
560             game();//開始遊戲        
561         }
562         else rewind(stdin); 
563     }    
564 }
565 int game()
566 {
567     int i;
568     int ch=RIGHT;//向右
569     t2=time();//記錄當前程序已用時間
570     while(1)
571     {
572         t1=time()-t2;//刷新遊戲運行時間
573         data();//用來記錄遊戲的各類狀態數據
574         gotoxy(p[0].x,p[0].y);//轉到蛇頭位置
575         c(12);//改爲紅色
576         cout<<"";//打印蛇頭
577         for(i=1;i<n-1;i++)
578         {
579             gotoxy(p[i].x,p[i].y);//轉到當前蛇身位置
580             c(14);//改爲黃色
581             cout<<"";//打印蛇身
582         }
583         gotoxy(p[n-2].x,p[n-2].y);//轉到當前蛇尾位置
584         c(12);//改爲紅色
585         cout<<"";//打印蛇尾
586         Sleep(T);//控制蛇的移動速度
587         t1=time()-t2;//刷新遊戲運行時間
588         gotoxy(p[n-2].x,p[n-2].y);//移到蛇尾所在地
589         cout<<" ";//清除上個循環的蛇尾
590         for(i=n-1;i>0;i--) p[i]=p[i-1];//移動蛇
591         key();//用戶是否操做鍵盤
592         switch (p[0].direction)
593         {
594             case UP:{p[0].y-=1;break;}//改變蛇頭座標,移動蛇頭
595             case DOWN:{p[0].y+=1;break;}//改變蛇頭座標,移動蛇頭
596             case LEFT:{p[0].x-=2;break;}//改變蛇頭座標,移動蛇頭
597             case RIGHT:{p[0].x+=2;break;}//改變蛇頭座標,移動蛇頭
598         }
599         if(p[0].x==0)//當蛇撞到左牆時
600         {
601             cout<<"\a";
602             --HP;//將生命值減一
603             p[0].x=52;//將其穿牆
604         }
605         if(p[0].x==54)//當蛇撞到右牆時
606         {
607             cout<<"\a";
608             --HP;//將生命值減一
609             p[0].x=2;//將其穿牆
610         }
611         if(p[0].y==0)//當蛇撞到上牆時
612         {
613             cout<<"\a";
614             --HP;//將生命值減一
615             p[0].y=22;//將其穿牆
616         }
617         if(p[0].y==23)//當蛇撞到下牆時
618         {
619             cout<<"\a";
620             --HP;//將生命值減一
621             p[0].y=1;//將其穿牆
622         }
623         for(i=1;i<n-1;i++)
624         {
625            if(p[0].x==p[i].x&&p[0].y==p[i].y) i=n+1;//判斷蛇是否撞到自
626         }
627         if(i>=n)//當蛇撞到本身
628         {
629             cout<<"\a";
630             HP=0;//將蛇死亡  
631         }
632         if(map[(p[0].x-1)/2][p[0].y-1].barrier==1)//當蛇障礙物時
633         {
634             cout<<"\a";
635             --HP;//將生命值減一
636             map[(p[0].x-1)/2][p[0].y-1].barrier=0;
637         }
638         if(HP==0)
639         {
640             gotoxy(25,5);
641             c(15);//調成白色
642             cout<<"\a\a\a遊戲結束!!!";
643             Sleep(3000);//延時
644             return 1;
645             break;
646         }
647         if(n==81)
648         {
649             gotoxy(25,5);
650             c(15);//調成白色
651             cout<<"\a\a\a恭喜你過關!!!";
652             Sleep(3000);//延時
653             return 1;
654             break;
655         }
656         show();//用來隨機產生障礙物以及食物和生命藥水以及用來判斷遊戲的各類參數(小星星是否吃到,是否撞牆)
657     }
658     return 0;
659 }
顯示代碼


下面是c#版的,徹底是從c++版的移植過來的,也就改了改界面顏色而已異步

下面看圖:ide

 

其餘就沒有什麼變化了,下面是代碼函數

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 using System.Windows.Input;
  7 using System.Threading;
  8 using System.Runtime.InteropServices;
  9 
 10 namespace ConsoleApplication3
 11 {
 12 
 13 
 14     class Game
 15     {
 16         public struct Snake
 17         {
 18             public int x;//蛇身所在橫座標
 19             public int y;//蛇身所在縱座標
 20             public ConsoleKey direction;//行走方向
 21         }
 22 
 23         public struct Map
 24         {
 25             public int food;//此map[x][y]處是否有食物有的話food爲1
 26             public int star;//此map[x][y]處是否有星星的話值爲1
 27             public int barrier;//此map[x][y]處是否有障礙物有的話值爲1
 28         }
 29 
 30         Thread readKeyThread;
 31 
 32         Snake[] p = new Snake[81];
 33         Map[,] map = new Map[26, 22];
 34 
 35         const ConsoleKey UP = ConsoleKey.UpArrow;//
 36         const ConsoleKey DOWN = ConsoleKey.DownArrow;//
 37         const ConsoleKey LEFT = ConsoleKey.LeftArrow;//
 38         const ConsoleKey RIGHT = ConsoleKey.RightArrow;//
 39 
 40         int n = 4;//n用來記錄蛇身長度,初始爲2節
 41         int guan;//用來記錄關卡
 42         int T;//用來給記錄蛇的移動速度
 43         int t1 = 0, t2 = 0, t3 = 0;//用來記錄以用時間
 44         int HP = 5;//記錄蛇的生命值,初始化爲6
 45         int food = 0;//用來記錄所吃到的食物數
 46         int x = 12, y = 12;//記錄食物所在地
 47         bool pause = false;//記錄是否暫停;
 48 
 49         public void c(ConsoleColor k)//改變輸出字體的顏色
 50         {
 51             Console.ForegroundColor = k;
 52         }
 53 
 54         public int time()//用來計時
 55         {
 56             DateTime dt = System.DateTime.Now;//記錄當前程序已用時間
 57             return dt.Second;
 58         }
 59 
 60         public void gotoxy(int x, int y) //移動座標
 61         {
 62             Console.SetCursorPosition(x, y);
 63         }
 64 
 65         public int random()//用來輸出隨機值
 66         {
 67 
 68             Random rd = new Random();
 69             return rd.Next();//返回隨機數
 70         }
 71 
 72         public void ycgb(bool k)//隱藏光標
 73         {
 74             Console.CursorVisible = k; //隱藏光標
 75         }
 76 
 77         public void Sleep(int s)
 78         {
 79             System.Threading.Thread.Sleep(s);
 80         }
 81 
 82         public void start()//繪製牆/繪製啓動畫面以及隔牆
 83         {
 84             readKeyThread = new Thread(new ThreadStart(key));
 85             c(ConsoleColor.Yellow);//改爲黃色
 86             int i, j, z;
 87             for (i = 0; i < 25; i++)
 88             {
 89                 Console.Write("                                                                                ");
 90             }
 91             for (z = 0; z < 20; z++)
 92             {
 93                 if (z >= 0)
 94                 {
 95                     gotoxy(12, z);
 96                     Console.Write("              ~--______-~                ~-___-~\"       ");
 97                 }
 98                 if (z >= 1)
 99                 {
100                     gotoxy(12, z - 1);
101                     Console.Write("            ~-_           _-~          ~-_       _-~    ");
102                 }
103                 if (z >= 2)
104                 {
105                     gotoxy(12, z - 2);
106                     Console.Write("          \\     ~-____-~     _-~    ~-_    ~-_-~    / ");
107                 }
108                 if (z >= 3)
109                 {
110                     gotoxy(12, z - 3);
111                     Console.Write("         (     (         _-~    _--_    ~-_    _/   |  ");
112                 }
113                 if (z >= 4)
114                 {
115                     gotoxy(12, z - 4);
116                     Console.Write("          /    /            _-~      ~-_        |   |  ");
117                 }
118                 if (z >= 5)
119                 {
120                     gotoxy(12, z - 5);
121                     Console.Write("           /    /              _----_           \\  \\ ");
122                 }
123                 if (z >= 6)
124                 {
125                     gotoxy(12, z - 6);
126                     Console.Write("             /    /                            \\ \\   ");
127                 }
128                 if (z >= 7)
129                 {
130                     gotoxy(12, z - 7);
131                     Console.Write("              /    /                          \\\\     ");
132                 }
133                 if (z >= 8)
134                 {
135                     gotoxy(12, z - 8);
136                     Console.Write("                /    /                      \\\\       ");
137                 }
138                 if (z >= 9)
139                 {
140                     gotoxy(12, z - 9);
141                     Console.Write("                 /     /                   \\            ");
142                 }
143                 if (z >= 10)
144                 {
145                     gotoxy(12, z - 10);
146                     Console.Write("                  |     |                \\                ");
147                 }
148                 if (z >= 11)
149                 {
150                     gotoxy(12, z - 11);
151                     Console.Write("                 \\     \\                                 ");
152                 }
153                 if (z >= 12)
154                 {
155                     gotoxy(12, z - 12);
156                     Console.Write("        \\_______      \\                                  ");
157                 }
158                 if (z >= 13)
159                 {
160                     gotoxy(12, z - 13);
161                     Console.Write(" \\____|__________/  \\                                    ");
162                 }
163                 if (z >= 14)
164                 {
165                     gotoxy(12, z - 14);
166                     Console.Write("\\/     /~     \\_/ \\                                     ");
167                 }
168                 if (z >= 15)
169                 {
170                     gotoxy(12, z - 15);
171                     Console.Write("        _|__|  O|                                          ");
172                 }
173                 for (int k = 15; k < z; k++)
174                 {
175                     gotoxy(12, k - 15);
176                     Console.Write("                                                           ");
177                 }
178                 Sleep(30);
179             }
180             Sleep(2000);
181             c(ConsoleColor.Gray);//調成白色
182             gotoxy(0, 0);
183             for (i = 0; i < 25; i++)
184             {
185                 Console.Write("                                                                                ");
186             }
187             //c(252);//調整輸出顏色 
188             for (i = 0, j = 60; i < 60; i++, j--)//if是爲了異步輸出 
189             {
190                 if (j > 20)
191                 {
192                     gotoxy(2 * (j - 21), 0);
193                     Console.Write("");//輸出第一行
194                 }
195                 if (i < 40)
196                 {
197                     gotoxy(2 * i, 23);
198                     Console.Write("");// 輸出最下面一行 
199                 }
200                 if (j > 22 && j < 45)
201                 {
202                     gotoxy(78, j - 22);
203                     Console.Write("");//輸出最右邊列
204                 }
205                 if (j > 22 && j < 45)
206                 {
207                     gotoxy(0, i - 15);
208                     Console.Write("");//輸出第一列
209                 }
210                 if (i > 37 && i < 60)
211                 {
212                     gotoxy(54, i - 37);
213                     Sleep(10);
214                     Console.Write("");//輸出中間那列
215                 }
216                 Sleep(30);
217             }
218             gotoxy(56, 11);
219             Console.Write("▉▉▉▉▉▉▉▉▉▉▉");                                            //56 
220             gotoxy(19, 0);
221             c(ConsoleColor.Red);//調整輸出顏色 
222             Console.Write("| | |貪 吃 蛇| | |");//輸出標題 
223 
224             gotoxy(56, 2);
225             Console.Write("已用時間:");
226             gotoxy(75, 2);
227             Console.Write("");
228             gotoxy(56, 4);
229             Console.Write("生命值:");
230             gotoxy(56, 6);
231             Console.Write("當前長度:");
232             gotoxy(56, 8);
233             Console.Write("已吃食物:");
234             gotoxy(56, 10);
235             Console.Write("第             關");
236             gotoxy(64, 12);
237             Console.Write("提示:");
238             gotoxy(56, 13);
239             Console.Write("向上:↑   向上:←");
240             gotoxy(56, 14);
241             Console.Write("向下:↓   向右:→");
242             gotoxy(56, 15);
243             Console.Write("暫停/開始:肯定鍵 ");
244             gotoxy(56, 16);
245             Console.Write("從新選關 :Esc鍵");
246             gotoxy(64, 18);
247             Console.Write("注意!");
248             gotoxy(56, 19);
249             Console.Write("1:撞到障礙物或者牆生命");
250             gotoxy(56, 20);
251             Console.Write("  值減一 ");
252             gotoxy(56, 21);
253             Console.Write("2:吃到小星星生命值加一");
254         }
255 
256         public void guanka()//用來選擇關卡並根據關卡設置蛇的移動速度
257         {
258             ycgb(true);//顯示光標
259             n = 4;//n用來記錄蛇身長度,初始爲3節
260             HP = 6;//記錄蛇的生命值,初始化爲6
261 
262             p[0].x = 6;                    //
263             p[0].y = 10;                   //
264             p[0].direction = RIGHT;        //
265             p[1].x = 4;                   //
266             p[1].y = 10;                  //     初始化蛇所在位置和移動方向   
267             p[1].direction = RIGHT;       //
268             p[2].x = 2;                   //
269             p[2].y = 10;                  //
270             p[2].direction = RIGHT;      //
271             p[3].x = 4;////////////////
272             p[3].y = 4;///////////////記錄蛇尾的信息
273             p[3].direction = RIGHT;////
274             while (true)
275             {
276                 gotoxy(15, 3);
277                 Console.Write("請輸入關數(1-6):");
278                 guan = Console.Read() - 48;
279                 //Console.Write("關卡:{0}", guan);
280                 if (guan == 0)     //判斷是否做弊
281                 {
282                     gotoxy(15, 3);
283                     c(ConsoleColor.Red);//變成紅色
284                     Console.Write("  做弊有害智商,需謹慎");
285                     gotoxy(15, 5);
286                     c(ConsoleColor.Yellow);//變成黃色
287                     Console.Write("請輸入你想要的蛇的生命值:");
288                     HP = Console.Read(); ;
289 
290                     gotoxy(15, 3);
291                     Console.Write("                      ");
292                     gotoxy(15, 5);
293                     Console.Write("                                    ");
294                     continue;//返回選關處
295                 }
296                 if (guan < 7 && guan > 0) break;//判斷關數是否溢出
297                 gotoxy(15, 5);
298                 Console.Write("輸入錯誤!");
299                 gotoxy(32, 3);
300                 Console.Write("          ");
301             }
302             gotoxy(15, 3);
303             Console.Write("                   ");
304             switch (guan)
305             {
306                 case 1: { T = 600; break; }//
307                 case 2: { T = 400; break; }//
308                 case 3: { T = 200; break; }//    根據關數來設定蛇的移動速度
309                 case 4: { T = 150; break; }//
310                 case 5: { T = 100; break; }//
311                 case 6: { T = 60; break; }//
312             }
313             qp();//清除屏幕
314         }
315 
316         void data()//用來記錄和判斷遊戲的各類狀態數據
317         {
318             c(ConsoleColor.Red);//調成紅色
319             gotoxy(66, 2);
320             Console.Write("{0}", t1);//程序已用時間
321             switch (guan)
322             {
323                 case 1:
324                     gotoxy(59, 10);
325                     c(ConsoleColor.Red);//調成紅色
326                     Console.Write("1");
327                     c(ConsoleColor.Yellow);//調成黃色
328                     Console.Write(" 2 3 4 5 6");
329                     break;
330                 case 2:
331                     gotoxy(59, 10);
332                     c(ConsoleColor.Yellow);//調成黃色
333                     Console.Write("1 ");
334                     c(ConsoleColor.Red);//調成紅色
335                     Console.Write("2");
336                     c(ConsoleColor.Yellow);//調成黃色
337                     Console.Write(" 3 4 5 6 ");
338                     break;
339                 case 3:
340                     gotoxy(59, 10);
341                     c(ConsoleColor.Yellow);//調成黃色
342                     Console.Write("1 2 ");
343                     c(ConsoleColor.Red);//調成紅色
344                     Console.Write("3");
345                     c(ConsoleColor.Yellow);//調成黃色
346                     Console.Write(" 4 5 6 ");
347                     break;
348                 case 4:
349                     gotoxy(59, 10);
350                     c(ConsoleColor.Yellow);//調成黃色
351                     Console.Write("1 2 3 ");
352                     c(ConsoleColor.Red);//調成紅色
353                     Console.Write("4");
354                     c(ConsoleColor.Yellow);//調成黃色
355                     Console.Write(" 5 6 ");
356                     break;
357                 case 5:
358                     gotoxy(59, 10);
359                     c(ConsoleColor.Yellow);//調成黃色
360                     Console.Write("1 2 3 4 ");
361                     c(ConsoleColor.Red);//調成紅色
362                     Console.Write("5");
363                     c(ConsoleColor.Yellow);//調成黃色
364                     Console.Write(" 6 ");
365                     break;
366                 case 6:
367                     gotoxy(59, 10);
368                     c(ConsoleColor.Yellow);//調成黃色
369                     Console.Write("1 2 3 4 5 ");
370                     c(ConsoleColor.Red);//調成紅色
371                     Console.Write("6");
372                     break;
373             }
374             switch (HP)
375             {
376                 case 1:
377                     gotoxy(65, 4);
378                     c(ConsoleColor.Green);//調成綠色
379                     Console.Write("");
380                     c(ConsoleColor.Red);//調成紅色
381                     Console.Write("▂▃▅▆▇");
382                     break;
383                 case 2:
384                     gotoxy(65, 4);
385                     c(ConsoleColor.Green);//調成綠色
386                     Console.Write("▁▂");
387                     c(ConsoleColor.Red);//調成紅色
388                     Console.Write("▃▅▆▇");
389                     break;
390                 case 3:
391                     gotoxy(65, 4);
392                     c(ConsoleColor.Green);//調成綠色
393                     Console.Write("▁▂▃");
394                     c(ConsoleColor.Red);//調成紅色
395                     Console.Write("▅▆▇");
396                     break;
397                 case 4:
398                     gotoxy(65, 4);
399                     c(ConsoleColor.Green);//調成綠色
400                     Console.Write("▁▂▃▅");
401                     c(ConsoleColor.Red);//調成紅色
402                     Console.Write("▆▇");
403                     break;
404                 case 5:
405                     gotoxy(65, 4);
406                     c(ConsoleColor.Green);//調成綠色
407                     Console.Write("▁▂▃▅▆");
408                     c(ConsoleColor.Red);//調成紅色
409                     Console.Write("");
410                     break;
411                 case 6:
412                     gotoxy(65, 4);
413                     c(ConsoleColor.Green);//調成綠色
414                     Console.Write("▁▂▃▅▆▇");
415                     break;
416                 default:
417                     gotoxy(65, 4);
418                     c(ConsoleColor.Red);//調成紅色
419                     Console.Write("!超級模式 !");
420                     break;
421             }
422             gotoxy(66, 6);
423             c(ConsoleColor.Red);//調成紅色
424             Console.Write("{0}", n - 1);//輸出蛇的當前長度
425             gotoxy(66, 8);
426             Console.Write("{0}", food);//輸出蛇當前已經吃到食物
427         }
428         void qp()//用來清除屏幕
429         {
430             for (int i = 1; i < 23; i++)
431             {
432                 gotoxy(2, i);
433                 Console.Write("                                                    ");
434             }
435             map[x, y].food = 0;//將食物清空
436             map[x, y].barrier = 0;//將障礙物清除
437             map[x, y].star = 0;//將星星清除 
438         }
439 
440         void show()//用來隨機產生障礙物以及食物和生命藥水以及用來判斷遊戲的各類參數
441         {
442             int a, b, e, f; //a,b用來表示小星星的座標   c,d表明障礙物座標
443             if (map[x, y].food == 0)//判斷食物是否是被吃掉
444             {
445                 while (true)
446                 {
447                     x = random() % 26;//產生隨機橫座標
448                     y = random() % 22;//產生隨機縱座標
449                     if (map[x, y].barrier == 0 && map[x, y].star == 0) break;//當此處無其餘元素是才生效 
450                 }
451                 map[x, y].food = 1;//隨機出現食物
452                 gotoxy(2 * (x + 1), y + 1);//定位到食物出現的位置
453                 c(ConsoleColor.Yellow);//調成黃色
454                 Console.Write("");//打印出食物
455             }
456             if (t1 / 20 > 0 && t1 % 12 == 0 && t1 > t3 && map[(p[0].x - 1) / 2, p[0].y - 1].food == 0 && map[(p[0].x - 1) / 2, p[0].y - 1].star == 0)
457             {
458                 while (true)
459                 {
460                     e = random() % 26;//產生隨機橫座標
461                     f = random() % 22;//產生隨機縱座標
462                     if (map[e, f].food == 0 && map[e, f].star == 0) break;//當此處無其餘元素是才生效 
463                 }
464                 gotoxy(2 * (e + 1), f + 1);//定位到障礙物出現的位置
465                 map[e, f].barrier = 1;//隨機出現障礙物
466                 c(ConsoleColor.Yellow);//調成黃色
467                 Console.Write("");//打印出障礙物
468                 t3 = t1;//以避免產生多個障礙物
469                 if (HP < 7)
470                 {
471                     gotoxy(18, 24);
472                     c(ConsoleColor.White);//調成白色
473                     Console.Write("舒適提示:在選關的時候輸入0能夠開啓做弊模式");
474                 }
475             }
476             if (t1 / 25 > 0 && t1 % 15 == 0 && t1 > t3 && map[(p[0].x - 1) / 2, p[0].y - 1].food == 0 && map[(p[0].x - 1) / 2, p[0].y - 1].barrier == 0)//減小星星出現的概率 
477             {
478                 while (true)
479                 {
480                     a = random() % 26;//產生隨機橫座標
481                     b = random() % 22;//產生隨機縱座標
482                     if (map[a, b].barrier == 0 && map[a, b].food == 0) break;//當此處無其餘元素是才生效 
483                 }
484                 map[a, b].star = 1;//隨機出現小星星(吃到星星長度減1)
485                 gotoxy(2 * (a + 1), b + 1);//定位到星星出現的位置(吃到星星長度減1)
486                 c(ConsoleColor.Red);//調成紅色
487                 Console.Write("");//打印出星星(吃到星星長度減1)
488                 t3 = t1;//以避免產生多個障礙物
489                 if (HP < 7)
490                 {
491                     gotoxy(18, 24);
492                     Console.Write("                                            ");
493                 }
494             }
495             for (int i = 0; i < n; i++)
496             {
497                 if (map[(p[i].x - 1) / 2, p[i].y - 1].food == 1)//判斷蛇是否吃到食物
498                 {
499                     ++n;//讓蛇長度加1
500                     food++;//將食物數加1
501                     map[(p[i].x - 1) / 2, p[i].y - 1].food = 0;//讓食物標示歸零
502                     break;
503                 }
504             }
505             if (map[(p[0].x - 1) / 2, p[0].y - 1].star == 1)//判斷蛇是否吃到星星
506             {
507                 map[(p[0].x - 1) / 2, p[0].y - 1].star = 0;//讓星星標示歸零
508                 if (HP < 6)
509                     ++HP;//將生命值加1
510             }
511             t1 = time() - t2;//刷新遊戲運行時間
512         }
513 
514         void key()//用戶是否操做鍵盤
515         {
516             while (true)//判斷是否按鍵
517             {
518                 ConsoleKey ch = Console.ReadKey().Key;
519                 if (ch == ConsoleKey.Enter)//判斷用戶是否暫停
520                 {
521                     pause = true;
522                     int a, b;
523                     a = time();//記錄當前程序已用時間
524                     gotoxy(20, 1);
525                     c(ConsoleColor.White);//調成白色
526                     Console.Write("已暫停,按肯定鍵開始");
527                     while (true)
528                     {
529                         gotoxy(0, 24);//將光標設置到最後一行,防止用戶亂輸入數據
530                         ConsoleKey temp = Console.ReadKey().Key;
531                         if (temp == ConsoleKey.Enter)////判斷是否按鍵且是否解除暫停
532                         {
533                             pause = false;
534                             gotoxy(20, 1);
535                             Console.Write("                     ");//清除"已暫停,按肯定鍵開始"這行字                     
536                             break;
537                         }
538                         else
539                         {
540                             gotoxy(Console.CursorLeft - 1, Console.CursorTop);//將位置移到用戶輸入的非正常數據
541                             Console.Write(" ");//清除這個數據
542                         }
543                     }
544                     b = time();//記錄當前程序已用時間
545                     t2 += (b - a);//將暫停加到t2上供t1減去
546                 }
547                 else if (ch == ConsoleKey.Escape)//判斷是否從新選關
548                 {
549                     guanka();//用來選擇關卡並根據關卡設置蛇的移動速度
550                     game();//開始遊戲        
551                 }
552                 else if ((ch == RIGHT || ch == LEFT || ch == DOWN || ch == UP) && ch != p[0].direction && (int)ch - 2 != (int)p[0].direction && (int)ch + 2 != (int)p[0].direction)  //判斷按鍵是不是方向鍵,而且是否是蛇移動方向的反方向
553                     p[0].direction = ch;//若是不是就改變蛇頭方向
554             }
555         }
556 
557         public bool game()
558         {
559             readKeyThread.Start();//啓動按鍵獲取
560 
561             int i;
562             //ConsoleKey ch = RIGHT;//向右
563             t2 = time();//記錄當前程序已用時間
564             while (true)
565             {
566                 if (pause) continue;//若是暫停了
567 
568                 t1 = time() - t2;//刷新遊戲運行時間
569                 data();//用來記錄遊戲的各類狀態數據
570                 gotoxy(p[0].x, p[0].y);//轉到蛇頭位置
571                 c(ConsoleColor.Yellow);//改爲黃色
572                 Console.Write("");//打印蛇頭
573                 for (i = 1; i < n - 1; i++)
574                 {
575                     gotoxy(p[i].x, p[i].y);//轉到當前蛇身位置
576                     c(ConsoleColor.Red);//改爲紅色
577                     Console.Write("");//打印蛇身
578                 }
579                 gotoxy(p[n - 2].x, p[n - 2].y);//轉到當前蛇尾位置
580                 c(ConsoleColor.Yellow);//改爲紅色
581                 Console.Write("");//打印蛇尾
582                 Sleep(T);//控制蛇的移動速度
583                 t1 = time() - t2;//刷新遊戲運行時間
584                 gotoxy(p[n - 2].x, p[n - 2].y);//移到蛇尾所在地
585                 Console.Write(" ");//清除上個循環的蛇尾
586                 for (i = n - 1; i > 0; i--) p[i] = p[i - 1];//移動蛇
587                 switch (p[0].direction)
588                 {
589                     case UP: { p[0].y -= 1; break; }//改變蛇頭座標,移動蛇頭
590                     case DOWN: { p[0].y += 1; break; }//改變蛇頭座標,移動蛇頭
591                     case LEFT: { p[0].x -= 2; break; }//改變蛇頭座標,移動蛇頭
592                     case RIGHT: { p[0].x += 2; break; }//改變蛇頭座標,移動蛇頭
593                 }
594                 if (p[0].x == 0)//當蛇撞到左牆時
595                 {
596                     Console.Write("\a");
597                     --HP;//將生命值減一
598                     p[0].x = 52;//將其穿牆
599                 }
600                 if (p[0].x == 54)//當蛇撞到右牆時
601                 {
602                     Console.Write("\a");
603                     --HP;//將生命值減一
604                     p[0].x = 2;//將其穿牆
605                 }
606                 if (p[0].y == 0)//當蛇撞到上牆時
607                 {
608                     Console.Write("\a");
609                     --HP;//將生命值減一
610                     p[0].y = 22;//將其穿牆
611                 }
612                 if (p[0].y == 23)//當蛇撞到下牆時
613                 {
614                     Console.Write("\a");
615                     --HP;//將生命值減一
616                     p[0].y = 1;//將其穿牆
617                 }
618                 for (i = 1; i < n - 1; i++)
619                 {
620                     if (p[0].x == p[i].x && p[0].y == p[i].y) i = n + 1;//判斷蛇是否撞到自
621                 }
622                 if (i >= n)//當蛇撞到本身
623                 {
624                     Console.Write("\a");
625                     HP = 0;//將蛇死亡  
626                 }
627                 if (map[(p[0].x - 1) / 2, p[0].y - 1].barrier == 1)//當蛇障礙物時
628                 {
629                     Console.Write("\a");
630                     --HP;//將生命值減一
631                     map[(p[0].x - 1) / 2, p[0].y - 1].barrier = 0;
632                 }
633                 if (HP == 0)
634                 {
635                     readKeyThread.Abort();//中止按鍵檢測
636                     gotoxy(25, 5);
637                     c(ConsoleColor.White);//調成白色
638                     Console.Write("\a\a\a遊戲結束!!!");
639                     Sleep(3000);//延時
640                     return true;
641                 }
642                 if (n == 81)
643                 {
644                     readKeyThread.Abort();//中止按鍵檢測
645                     gotoxy(25, 5);
646                     c(ConsoleColor.White);//調成白色
647                     Console.Write("\a\a\a恭喜你過關!!!");
648                     Sleep(3000);//延時
649                     return true;
650                 }
651                 show();//用來隨機產生障礙物以及食物和生命藥水以及用來判斷遊戲的各類參數(小星星是否吃到,是否撞牆)
652             }
653         }
654 
655     }
656 
657     class Program
658     {
659         static void Main(string[] args)
660         {
661             Game game = new Game();
662             game.ycgb(false);//隱藏光標
663             game.start();//繪製啓動畫面以及隔牆
664             while (true)
665             {
666                 game.guanka();//用來選擇關卡並根據關卡設置蛇的移動速度
667                 game.ycgb(false);//隱藏光標
668                 if (!game.game()) break;//遊戲運行
669             }
670         }
671     }
672 }
顯示代碼
相關文章
相關標籤/搜索