说是c++版,其实只是用到了c++的cout和cin而已。这是我做的第二个控制台游戏,基本上每一行代码都加上了注释。
游戏嘛,我觉得重要的是了解他的思想,所以后期学了面向对象之后这个游戏的代码我也没有重新封装。
下面请看图
代码如下:我是用dev c++写的
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<<"aaa游戏结束!!!"; 643 Sleep(3000);//延时 644 return 1; 645 break; 646 } 647 if(n==81) 648 { 649 gotoxy(25,5); 650 c(15);//调成白色 651 cout<<"aaa恭喜你过关!!!"; 652 Sleep(3000);//延时 653 return 1; 654 break; 655 } 656 show();//用来随机产生障碍物以及食物和生命药水以及用来判断游戏的各种参数(小星星是否吃到,是否撞墙) 657 } 658 return 0; 659 }
下面是c#版的,完全是从c++版的移植过来的,也就改了改界面颜色而已
下面看图:
其他就没有什么变化了,下面是代码
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("aaa游戏结束!!!"); 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("aaa恭喜你过关!!!"); 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 }