说是c++版,其实只是用到了c++的cout和cin而已。这是我做的第二个控制台游戏,基本上每一行代码都加上了注释。
游戏嘛,我觉得重要的是了解他的思想,所以后期学了面向对象之后这个游戏的代码我也没有重新封装。
下面请看图
代码如下:我是用dev c++写的
1 //注释。 ---星辰 2 3 #include4 #include 5 #include 6 #include 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 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;//记录蛇的生命值,初始化为6275 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< 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 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)//当蛇撞到自己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 }
下面看图:
其他就没有什么变化了,下面是代码
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;//记录蛇的生命值,初始化为6261 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;//让蛇长度加1500 food++;//将食物数加1501 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;//将生命值加1510 }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 else539 {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 Program658 {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 }