说是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<<"\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 }