【转】控制台小游戏-贪吃蛇,c++和c#版
本文作者:☆雨后星辰☆
原文链接:http://www.cnblogs.com/AfterTheRainOfStars/p/3702581.html
说是c++版,其实只是用到了c++的cout和cin而已。这是我做的第二个控制台游戏,基本上每一行代码都加上了注释。
游戏嘛,我觉得重要的是了解他的思想,所以后期学了面向对象之后这个游戏的代码我也没有重新封装。
下面请看图
代码如下:我是用dev c++写的
//注释。 ---星辰 #include <iostream> #include<Windows.h> #include<ctime> #include<cstdlib> #include "conio.h"//非标准输入输出库函数 using namespace std; const int UP=72;//上 const int DOWN=80;//下 const int LEFT=75;//左 const int RIGHT=77;//右 int n=4;//n用来记录蛇身长度,初始为2节 int guan;//用来记录关卡 int T;//用来给记录蛇的移动速度 int t1,t2,t3=0;//用来记录以用时间 int HP=5;//记录蛇的生命值,初始化为6 int food=0;//用来记录所吃到的食物数 int x=12,y=12;//记录食物所在地 struct snake { int x;//蛇身所在横坐标 int y;//蛇身所在纵坐标 int direction;//行走方向 }p[81]; struct map { int food;//此map[x][y]处是否有食物有的话food为1 int star;//此map[x][y]处是否有星星的话值为1 int barrier;//此map[x][y]处是否有障碍物有的话值为1 }map[26][22]; inline void c(int k)//改变输出字体的颜色 { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), k); } inline int time()//用来计时 { clock_t t=clock()/CLOCKS_PER_SEC;//记录当前程序已用时间 return t; } inline void gotoxy(int x,int y) //移动坐标 { COORD coord; coord.X=x; coord.Y=y; SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord ); } inline int random()//用来输出随机值 { srand(t1+rand());//将随机数种子初始化 return rand();//返回随机数 } void ycgb(int);//隐藏光标 void start();//绘制启动画面以及隔墙 void guanka();//用来选择关卡并根据关卡设置蛇的移动速度 void data();//用来记录游戏的各种状态数据 int game();//游戏运行 void show();//用来随机产生障碍物以及食物和生命药水以及用来判断游戏的各种参数(小星星是否吃到,是否撞墙) void key();//用户是否操作键盘 void qp();//清除屏幕 int main() { ycgb(0);//隐藏光标 start();//绘制启动画面以及隔墙 while(1) { guanka();//用来选择关卡并根据关卡设置蛇的移动速度 ycgb(0);//隐藏光标 if(!game()) break;//游戏运行 } } void ycgb(int k)//隐藏光标 { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO cci; GetConsoleCursorInfo(hOut,&cci); cci.bVisible=k;//赋1为显示,赋0为隐藏 SetConsoleCursorInfo(hOut,&cci); } void start()//绘制墙/绘制启动画面以及隔墙 { int i,j,z; for(i=0;i<25;i++) { cout<<" "; } c(14);//调成红色 for(z=0;z<20;z++) { if(z>=0) { gotoxy(12,z); cout<<" ~--______-~ ~-___-~\" "; } if(z>=1) { gotoxy(12,z-1); cout<<" ~-_ _-~ ~-_ _-~ "; } if(z>=2) { gotoxy(12,z-2); cout<<" \\ ~-____-~ _-~ ~-_ ~-_-~ / "; } if(z>=3) { gotoxy(12,z-3); cout<<" ( ( _-~ _--_ ~-_ _/ | "; } if(z>=4) { gotoxy(12,z-4); cout<<" / / _-~ ~-_ | | "; } if(z>=5) { gotoxy(12,z-5); cout<<" / / _----_ \\ \\ "; } if(z>=6) { gotoxy(12,z-6); cout<<" / / \\ \\ "; } if(z>=7) { gotoxy(12,z-7); cout<<" / / \\\\ "; } if(z>=8) { gotoxy(12,z-8); cout<<" / / \\\\ "; } if(z>=9) { gotoxy(12,z-9); cout<<" / / \\ "; } if(z>=10) { gotoxy(12,z-10); cout<<" | | \\ "; } if(z>=11) { gotoxy(12,z-11); cout<<" \\ \\ "; } if(z>=12) { gotoxy(12,z-12); cout<<" \\_______ \\ "; } if(z>=13) { gotoxy(12,z-13); cout<<" \\____|__________/ \\ "; } if(z>=14) { gotoxy(12,z-14); cout<<"\\/ /~ \\_/ \\ "; } if(z>=15) { gotoxy(12,z-15); cout<<" _|__| O| "; } for(int k=15;k<z;k++) { gotoxy(12,k-15); cout<<" "; } Sleep(30); } Sleep(2000); c(0);//调成黑底色 gotoxy(0,0); for(i=0;i<25;i++) { cout<<" "; } c(252);//调整输出颜色 for(i=0,j=60;i<60;i++,j--)//if是为了异步输出 { if(j>20) { gotoxy(2*(j-21),0); cout<<"▉";//输出第一行 } if(i<40) { gotoxy(2*i,23); cout<<"▉";// 输出最下面一行 } if(j>22&&j<45) { gotoxy(78,j-22); cout<<"▇";//输出最右边列 } if(j>22&&j<45) { gotoxy(0,i-15); cout<<"▇";//输出第一列 } if(i>37&&i<60) { gotoxy(54,i-37); Sleep(10); cout<<"▇";//输出中间那列 } Sleep(30); } gotoxy(56,11); cout<<"▉▉▉▉▉▉▉▉▉▉▉"; //56 gotoxy(19,0); c(14);//调整输出颜色 cout<<"| | |贪 吃 蛇| | |";//输出标题 gotoxy(56,2); cout<<"已用时间:"; gotoxy(75,2); cout<<"秒"; gotoxy(56,4); cout<<"生命值:"; gotoxy(56,6); cout<<"当前长度:"; gotoxy(56,8); cout<<"已吃食物:"; gotoxy(56,10); cout<<"第 关"; gotoxy(64,12); cout<<"提示:"; gotoxy(56,13); cout<<"向上:↑ 向上:←"; gotoxy(56,14); cout<<"向下:↓ 向右:→"; gotoxy(56,15); cout<<"暂停/开始:确定键 "; gotoxy(56,16); cout<<"重新选关 :Esc键"; gotoxy(64,18); cout<<"注意!"; gotoxy(56,19); cout<<"1:撞到障碍物或者墙生命"; gotoxy(56,20); cout<<" 值减一 "; gotoxy(56,21); cout<<"2:吃到小星星生命值加一"; } void guanka()//用来选择关卡并根据关卡设置蛇的移动速度 { ycgb(1);//显示光标 n=4;//n用来记录蛇身长度,初始为3节 HP=6;//记录蛇的生命值,初始化为6 p[0].x=6; // p[0].y=10; // p[0].direction=RIGHT; // p[1].x=4; // p[1].y=10; // 初始化蛇所在位置和移动方向 p[1].direction=RIGHT; // p[2].x=2; // p[2].y=10; // p[2].direction=RIGHT; // p[3].x=4;//////////////// p[3].y=4;///////////////记录蛇尾的信息 p[3].direction=RIGHT;//// while(1) { gotoxy(15,3); cout<<"请输入关数(1-6):"; cin>>guan; cin.get(); if(guan==0) //判断是否作弊 { gotoxy(15,3); c(12);//变成红色 cout<<" 作弊有害智商,需谨慎"; gotoxy(15,5); c(14);//变成黄色 cout<<"请输入你想要的蛇的生命值:"; cin>>HP; cin.get(); gotoxy(15,3); cout<<" "; gotoxy(15,5); cout<<" "; continue;//返回选关处 } if(guan<7&&guan>0) break;//判断关数是否溢出 gotoxy(15,5); cout<<"输入错误!"; gotoxy(32,3); cout<<" "; } gotoxy(15,3); cout<<" "; switch (guan) { case 1:{T=600;break;}// case 2:{T=400;break;}// case 3:{T=200;break;}// 根据关数来设定蛇的移动速度 case 4:{T=150;break;}// case 5:{T=100;break;}// case 6:{T=60;break;}// } qp();//清除屏幕 } void data()//用来记录和判断游戏的各种状态数据 { gotoxy(66,2); c(12);//调成红色 cout<<t1;//程序已用时间 switch (guan) { case 1: gotoxy(59,10); c(12);//调成红色 cout<<"1"; c(14);//调成黄色 cout<<" 2 3 4 5 6"; break; case 2: gotoxy(59,10); c(14);//调成黄色 cout<<"1 "; c(12);//调成红色 cout<<"2"; c(14);//调成黄色 cout<<" 3 4 5 6 "; break; case 3: gotoxy(59,10); c(14);//调成黄色 cout<<"1 2 "; c(12);//调成红色 cout<<"3"; c(14);//调成黄色 cout<<" 4 5 6 "; break; case 4: gotoxy(59,10); c(14);//调成黄色 cout<<"1 2 3 "; c(12);//调成红色 cout<<"4"; c(14);//调成黄色 cout<<" 5 6 "; break; case 5: gotoxy(59,10); c(14);//调成黄色 cout<<"1 2 3 4 "; c(12);//调成红色 cout<<"5"; c(14);//调成黄色 cout<<" 6 "; break; case 6: gotoxy(59,10); c(14);//调成黄色 cout<<"1 2 3 4 5 "; c(12);//调成红色 cout<<"6"; break; } switch (HP) { case 1: gotoxy(65,4); c(10);//调成绿色 cout<<"▁"; c(12);//调成红色 cout<<"▂▃▅▆▇"; break; case 2: gotoxy(65,4); c(10);//调成绿色 cout<<"▁▂"; c(12);//调成红色 cout<<"▃▅▆▇"; break; case 3: gotoxy(65,4); c(10);//调成绿色 cout<<"▁▂▃"; c(12);//调成红色 cout<<"▅▆▇"; break; case 4: gotoxy(65,4); c(10);//调成绿色 cout<<"▁▂▃▅"; c(12);//调成红色 cout<<"▆▇"; break; case 5: gotoxy(65,4); c(10);//调成绿色 cout<<"▁▂▃▅▆"; c(12);//调成红色 cout<<"▇"; break; case 6: gotoxy(65,4); c(10);//调成绿色 cout<<"▁▂▃▅▆▇"; break; default: gotoxy(65,4); c(10);//调成红色 cout<<"!超级模式 !"; break; } gotoxy(66,6); c(12);//调成红色 cout<<n-1;//输出蛇的当前长度 gotoxy(66,8); cout<<food;//输出蛇当前已经吃到食物 } void qp()//用来清除屏幕 { for(int i=1;i<23;i++) { gotoxy(2,i); cout<<" "; } map[x][y].food=0;//将食物清空 map[x][y].barrier=0;//将障碍物清除 map[x][y].star=0;//将星星清除 } void show()//用来随机产生障碍物以及食物和生命药水以及用来判断游戏的各种参数 { int a,b,e,f; //a,b用来表示小星星的坐标 c,d代表障碍物坐标 if(map[x][y].food==0)//判断食物是不是被吃掉 { while(1) { x=random()%26;//产生随机横坐标 y=random()%22;//产生随机纵坐标 if(map[x][y].barrier==0&&map[x][y].star==0) break;//当此处无其他元素是才生效 } map[x][y].food=1;//随机出现食物 gotoxy(2*(x+1),y+1);//定位到食物出现的位置 c(11);//调成黄色 cout<<"●";//打印出食物 } 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) { while(1) { e=random()%26;//产生随机横坐标 f=random()%22;//产生随机纵坐标 if(map[e][f].food==0&&map[e][f].star==0) break;//当此处无其他元素是才生效 } gotoxy(2*(e+1),f+1);//定位到障碍物出现的位置 map[e][f].barrier=1;//随机出现障碍物 c(12);//调成黄色 cout<<"▇";//打印出障碍物 t3=t1;//以免产生多个障碍物 if(HP<7) { gotoxy(18,24); c(15);//调成白色 cout<<"温馨提示:在选关的时候输入0可以开启作弊模式"; } } 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)//减少星星出现的几率 { while(1) { a=random()%26;//产生随机横坐标 b=random()%22;//产生随机纵坐标 if(map[a][b].barrier==0&&map[a][b].food==0) break;//当此处无其他元素是才生效 } map[a][b].star=1;//随机出现小星星(吃到星星长度减1) gotoxy(2*(a+1),b+1);//定位到星星出现的位置(吃到星星长度减1) c(14);//调成黄色 cout<<"☆";//打印出星星(吃到星星长度减1) t3=t1;//以免产生多个障碍物 if(HP<7) { gotoxy(18,24); cout<<" "; } } for(int i=0;i<n;i++) { if(map[(p[i].x-1)/2][p[i].y-1].food==1)//判断蛇是否吃到食物 { ++n;//让蛇长度加1 food++;//将食物数加1 map[(p[i].x-1)/2][p[i].y-1].food=0;//让食物标示归零 break; } } if(map[(p[0].x-1)/2][p[0].y-1].star==1)//判断蛇是否吃到星星 { map[(p[0].x-1)/2][p[0].y-1].star=0;//让星星标示归零 if(HP<6) ++HP;//将生命值加1 } t1=time()-t2;//刷新游戏运行时间 } void key()//用户是否操作键盘 { if(kbhit())//判断是否按键 { int ch=getch(); if(ch==224)//判断按的是不是方向键 { ch=getch(); if((ch==72||ch==75||ch==80||ch==77)&&(ch+p[0].direction!=152)&&ch!=p[0].direction) //判断按键是否是方向键,并且是不是蛇移动方向的反方向 p[0].direction=ch;//如果不是就改变蛇头方向 else rewind(stdin); } else if(ch==13)//判断用户是否暂停 { clock_t a,b; a=time();//记录当前程序已用时间 gotoxy(20,1); c(15);//调成白色 cout<<"已暂停,按确定键开始"; while(1) { if(kbhit()&&getch()==13)////判断是否按键且是否解除暂停 { gotoxy(20,1); cout<<" ";//清除"已暂停,按确定键开始"这行字 break; } } b=time();//记录当前程序已用时间 t2+=(b-a);//将暂停加到t2上供t1减去 } else if(ch==27)//判断是否重新选关 { guanka();//用来选择关卡并根据关卡设置蛇的移动速度 game();//开始游戏 } else rewind(stdin); } } int game() { int i; int ch=RIGHT;//向右 t2=time();//记录当前程序已用时间 while(1) { t1=time()-t2;//刷新游戏运行时间 data();//用来记录游戏的各种状态数据 gotoxy(p[0].x,p[0].y);//转到蛇头位置 c(12);//改成红色 cout<<"◆";//打印蛇头 for(i=1;i<n-1;i++) { gotoxy(p[i].x,p[i].y);//转到当前蛇身位置 c(14);//改成黄色 cout<<"●";//打印蛇身 } gotoxy(p[n-2].x,p[n-2].y);//转到当前蛇尾位置 c(12);//改成红色 cout<<"●";//打印蛇尾 Sleep(T);//控制蛇的移动速度 t1=time()-t2;//刷新游戏运行时间 gotoxy(p[n-2].x,p[n-2].y);//移到蛇尾所在地 cout<<" ";//清除上个循环的蛇尾 for(i=n-1;i>0;i--) p[i]=p[i-1];//移动蛇 key();//用户是否操作键盘 switch (p[0].direction) { case UP:{p[0].y-=1;break;}//改变蛇头坐标,移动蛇头 case DOWN:{p[0].y+=1;break;}//改变蛇头坐标,移动蛇头 case LEFT:{p[0].x-=2;break;}//改变蛇头坐标,移动蛇头 case RIGHT:{p[0].x+=2;break;}//改变蛇头坐标,移动蛇头 } if(p[0].x==0)//当蛇撞到左墙时 { cout<<"\a"; --HP;//将生命值减一 p[0].x=52;//将其穿墙 } if(p[0].x==54)//当蛇撞到右墙时 { cout<<"\a"; --HP;//将生命值减一 p[0].x=2;//将其穿墙 } if(p[0].y==0)//当蛇撞到上墙时 { cout<<"\a"; --HP;//将生命值减一 p[0].y=22;//将其穿墙 } if(p[0].y==23)//当蛇撞到下墙时 { cout<<"\a"; --HP;//将生命值减一 p[0].y=1;//将其穿墙 } for(i=1;i<n-1;i++) { if(p[0].x==p[i].x&&p[0].y==p[i].y) i=n+1;//判断蛇是否撞到自 } if(i>=n)//当蛇撞到自己 { cout<<"\a"; HP=0;//将蛇死亡 } if(map[(p[0].x-1)/2][p[0].y-1].barrier==1)//当蛇障碍物时 { cout<<"\a"; --HP;//将生命值减一 map[(p[0].x-1)/2][p[0].y-1].barrier=0; } if(HP==0) { gotoxy(25,5); c(15);//调成白色 cout<<"\a\a\a游戏结束!!!"; Sleep(3000);//延时 return 1; break; } if(n==81) { gotoxy(25,5); c(15);//调成白色 cout<<"\a\a\a恭喜你过关!!!"; Sleep(3000);//延时 return 1; break; } show();//用来随机产生障碍物以及食物和生命药水以及用来判断游戏的各种参数(小星星是否吃到,是否撞墙) } return 0; } 显示代码
下面是c#版的,完全是从c++版的移植过来的,也就改了改界面颜色而
下面看图:
其他就没有什么变化了,下面是代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input; using System.Threading; using System.Runtime.InteropServices; namespace ConsoleApplication3 { class Game { public struct Snake { public int x;//蛇身所在横坐标 public int y;//蛇身所在纵坐标 public ConsoleKey direction;//行走方向 } public struct Map { public int food;//此map[x][y]处是否有食物有的话food为1 public int star;//此map[x][y]处是否有星星的话值为1 public int barrier;//此map[x][y]处是否有障碍物有的话值为1 } Thread readKeyThread; Snake[] p = new Snake[81]; Map[,] map = new Map[26, 22]; const ConsoleKey UP = ConsoleKey.UpArrow;//上 const ConsoleKey DOWN = ConsoleKey.DownArrow;//下 const ConsoleKey LEFT = ConsoleKey.LeftArrow;//左 const ConsoleKey RIGHT = ConsoleKey.RightArrow;//右 int n = 4;//n用来记录蛇身长度,初始为2节 int guan;//用来记录关卡 int T;//用来给记录蛇的移动速度 int t1 = 0, t2 = 0, t3 = 0;//用来记录以用时间 int HP = 5;//记录蛇的生命值,初始化为6 int food = 0;//用来记录所吃到的食物数 int x = 12, y = 12;//记录食物所在地 bool pause = false;//记录是否暂停; public void c(ConsoleColor k)//改变输出字体的颜色 { Console.ForegroundColor = k; } public int time()//用来计时 { DateTime dt = System.DateTime.Now;//记录当前程序已用时间 return dt.Second; } public void gotoxy(int x, int y) //移动坐标 { Console.SetCursorPosition(x, y); } public int random()//用来输出随机值 { Random rd = new Random(); return rd.Next();//返回随机数 } public void ycgb(bool k)//隐藏光标 { Console.CursorVisible = k; //隐藏光标 } public void Sleep(int s) { System.Threading.Thread.Sleep(s); } public void start()//绘制墙/绘制启动画面以及隔墙 { readKeyThread = new Thread(new ThreadStart(key)); c(ConsoleColor.Yellow);//改成黄色 int i, j, z; for (i = 0; i < 25; i++) { Console.Write(" "); } for (z = 0; z < 20; z++) { if (z >= 0) { gotoxy(12, z); Console.Write(" ~--______-~ ~-___-~\" "); } if (z >= 1) { gotoxy(12, z - 1); Console.Write(" ~-_ _-~ ~-_ _-~ "); } if (z >= 2) { gotoxy(12, z - 2); Console.Write(" \\ ~-____-~ _-~ ~-_ ~-_-~ / "); } if (z >= 3) { gotoxy(12, z - 3); Console.Write(" ( ( _-~ _--_ ~-_ _/ | "); } if (z >= 4) { gotoxy(12, z - 4); Console.Write(" / / _-~ ~-_ | | "); } if (z >= 5) { gotoxy(12, z - 5); Console.Write(" / / _----_ \\ \\ "); } if (z >= 6) { gotoxy(12, z - 6); Console.Write(" / / \\ \\ "); } if (z >= 7) { gotoxy(12, z - 7); Console.Write(" / / \\\\ "); } if (z >= 8) { gotoxy(12, z - 8); Console.Write(" / / \\\\ "); } if (z >= 9) { gotoxy(12, z - 9); Console.Write(" / / \\ "); } if (z >= 10) { gotoxy(12, z - 10); Console.Write(" | | \\ "); } if (z >= 11) { gotoxy(12, z - 11); Console.Write(" \\ \\ "); } if (z >= 12) { gotoxy(12, z - 12); Console.Write(" \\_______ \\ "); } if (z >= 13) { gotoxy(12, z - 13); Console.Write(" \\____|__________/ \\ "); } if (z >= 14) { gotoxy(12, z - 14); Console.Write("\\/ /~ \\_/ \\ "); } if (z >= 15) { gotoxy(12, z - 15); Console.Write(" _|__| O| "); } for (int k = 15; k < z; k++) { gotoxy(12, k - 15); Console.Write(" "); } Sleep(30); } Sleep(2000); c(ConsoleColor.Gray);//调成白色 gotoxy(0, 0); for (i = 0; i < 25; i++) { Console.Write(" "); } //c(252);//调整输出颜色 for (i = 0, j = 60; i < 60; i++, j--)//if是为了异步输出 { if (j > 20) { gotoxy(2 * (j - 21), 0); Console.Write("▉");//输出第一行 } if (i < 40) { gotoxy(2 * i, 23); Console.Write("▉");// 输出最下面一行 } if (j > 22 && j < 45) { gotoxy(78, j - 22); Console.Write("▇");//输出最右边列 } if (j > 22 && j < 45) { gotoxy(0, i - 15); Console.Write("▇");//输出第一列 } if (i > 37 && i < 60) { gotoxy(54, i - 37); Sleep(10); Console.Write("▇");//输出中间那列 } Sleep(30); } gotoxy(56, 11); Console.Write("▉▉▉▉▉▉▉▉▉▉▉"); //56 gotoxy(19, 0); c(ConsoleColor.Red);//调整输出颜色 Console.Write("| | |贪 吃 蛇| | |");//输出标题 gotoxy(56, 2); Console.Write("已用时间:"); gotoxy(75, 2); Console.Write("秒"); gotoxy(56, 4); Console.Write("生命值:"); gotoxy(56, 6); Console.Write("当前长度:"); gotoxy(56, 8); Console.Write("已吃食物:"); gotoxy(56, 10); Console.Write("第 关"); gotoxy(64, 12); Console.Write("提示:"); gotoxy(56, 13); Console.Write("向上:↑ 向上:←"); gotoxy(56, 14); Console.Write("向下:↓ 向右:→"); gotoxy(56, 15); Console.Write("暂停/开始:确定键 "); gotoxy(56, 16); Console.Write("重新选关 :Esc键"); gotoxy(64, 18); Console.Write("注意!"); gotoxy(56, 19); Console.Write("1:撞到障碍物或者墙生命"); gotoxy(56, 20); Console.Write(" 值减一 "); gotoxy(56, 21); Console.Write("2:吃到小星星生命值加一"); } public void guanka()//用来选择关卡并根据关卡设置蛇的移动速度 { ycgb(true);//显示光标 n = 4;//n用来记录蛇身长度,初始为3节 HP = 6;//记录蛇的生命值,初始化为6 p[0].x = 6; // p[0].y = 10; // p[0].direction = RIGHT; // p[1].x = 4; // p[1].y = 10; // 初始化蛇所在位置和移动方向 p[1].direction = RIGHT; // p[2].x = 2; // p[2].y = 10; // p[2].direction = RIGHT; // p[3].x = 4;//////////////// p[3].y = 4;///////////////记录蛇尾的信息 p[3].direction = RIGHT;//// while (true) { gotoxy(15, 3); Console.Write("请输入关数(1-6):"); guan = Console.Read() - 48; //Console.Write("关卡:{0}", guan); if (guan == 0) //判断是否作弊 { gotoxy(15, 3); c(ConsoleColor.Red);//变成红色 Console.Write(" 作弊有害智商,需谨慎"); gotoxy(15, 5); c(ConsoleColor.Yellow);//变成黄色 Console.Write("请输入你想要的蛇的生命值:"); HP = Console.Read(); ; gotoxy(15, 3); Console.Write(" "); gotoxy(15, 5); Console.Write(" "); continue;//返回选关处 } if (guan < 7 && guan > 0) break;//判断关数是否溢出 gotoxy(15, 5); Console.Write("输入错误!"); gotoxy(32, 3); Console.Write(" "); } gotoxy(15, 3); Console.Write(" "); switch (guan) { case 1: { T = 600; break; }// case 2: { T = 400; break; }// case 3: { T = 200; break; }// 根据关数来设定蛇的移动速度 case 4: { T = 150; break; }// case 5: { T = 100; break; }// case 6: { T = 60; break; }// } qp();//清除屏幕 } void data()//用来记录和判断游戏的各种状态数据 { c(ConsoleColor.Red);//调成红色 gotoxy(66, 2); Console.Write("{0}", t1);//程序已用时间 switch (guan) { case 1: gotoxy(59, 10); c(ConsoleColor.Red);//调成红色 Console.Write("1"); c(ConsoleColor.Yellow);//调成黄色 Console.Write(" 2 3 4 5 6"); break; case 2: gotoxy(59, 10); c(ConsoleColor.Yellow);//调成黄色 Console.Write("1 "); c(ConsoleColor.Red);//调成红色 Console.Write("2"); c(ConsoleColor.Yellow);//调成黄色 Console.Write(" 3 4 5 6 "); break; case 3: gotoxy(59, 10); c(ConsoleColor.Yellow);//调成黄色 Console.Write("1 2 "); c(ConsoleColor.Red);//调成红色 Console.Write("3"); c(ConsoleColor.Yellow);//调成黄色 Console.Write(" 4 5 6 "); break; case 4: gotoxy(59, 10); c(ConsoleColor.Yellow);//调成黄色 Console.Write("1 2 3 "); c(ConsoleColor.Red);//调成红色 Console.Write("4"); c(ConsoleColor.Yellow);//调成黄色 Console.Write(" 5 6 "); break; case 5: gotoxy(59, 10); c(ConsoleColor.Yellow);//调成黄色 Console.Write("1 2 3 4 "); c(ConsoleColor.Red);//调成红色 Console.Write("5"); c(ConsoleColor.Yellow);//调成黄色 Console.Write(" 6 "); break; case 6: gotoxy(59, 10); c(ConsoleColor.Yellow);//调成黄色 Console.Write("1 2 3 4 5 "); c(ConsoleColor.Red);//调成红色 Console.Write("6"); break; } switch (HP) { case 1: gotoxy(65, 4); c(ConsoleColor.Green);//调成绿色 Console.Write("▁"); c(ConsoleColor.Red);//调成红色 Console.Write("▂▃▅▆▇"); break; case 2: gotoxy(65, 4); c(ConsoleColor.Green);//调成绿色 Console.Write("▁▂"); c(ConsoleColor.Red);//调成红色 Console.Write("▃▅▆▇"); break; case 3: gotoxy(65, 4); c(ConsoleColor.Green);//调成绿色 Console.Write("▁▂▃"); c(ConsoleColor.Red);//调成红色 Console.Write("▅▆▇"); break; case 4: gotoxy(65, 4); c(ConsoleColor.Green);//调成绿色 Console.Write("▁▂▃▅"); c(ConsoleColor.Red);//调成红色 Console.Write("▆▇"); break; case 5: gotoxy(65, 4); c(ConsoleColor.Green);//调成绿色 Console.Write("▁▂▃▅▆"); c(ConsoleColor.Red);//调成红色 Console.Write("▇"); break; case 6: gotoxy(65, 4); c(ConsoleColor.Green);//调成绿色 Console.Write("▁▂▃▅▆▇"); break; default: gotoxy(65, 4); c(ConsoleColor.Red);//调成红色 Console.Write("!超级模式 !"); break; } gotoxy(66, 6); c(ConsoleColor.Red);//调成红色 Console.Write("{0}", n - 1);//输出蛇的当前长度 gotoxy(66, 8); Console.Write("{0}", food);//输出蛇当前已经吃到食物 } void qp()//用来清除屏幕 { for (int i = 1; i < 23; i++) { gotoxy(2, i); Console.Write(" "); } map[x, y].food = 0;//将食物清空 map[x, y].barrier = 0;//将障碍物清除 map[x, y].star = 0;//将星星清除 } void show()//用来随机产生障碍物以及食物和生命药水以及用来判断游戏的各种参数 { int a, b, e, f; //a,b用来表示小星星的坐标 c,d代表障碍物坐标 if (map[x, y].food == 0)//判断食物是不是被吃掉 { while (true) { x = random() % 26;//产生随机横坐标 y = random() % 22;//产生随机纵坐标 if (map[x, y].barrier == 0 && map[x, y].star == 0) break;//当此处无其他元素是才生效 } map[x, y].food = 1;//随机出现食物 gotoxy(2 * (x + 1), y + 1);//定位到食物出现的位置 c(ConsoleColor.Yellow);//调成黄色 Console.Write("●");//打印出食物 } 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) { while (true) { e = random() % 26;//产生随机横坐标 f = random() % 22;//产生随机纵坐标 if (map[e, f].food == 0 && map[e, f].star == 0) break;//当此处无其他元素是才生效 } gotoxy(2 * (e + 1), f + 1);//定位到障碍物出现的位置 map[e, f].barrier = 1;//随机出现障碍物 c(ConsoleColor.Yellow);//调成黄色 Console.Write("▇");//打印出障碍物 t3 = t1;//以免产生多个障碍物 if (HP < 7) { gotoxy(18, 24); c(ConsoleColor.White);//调成白色 Console.Write("温馨提示:在选关的时候输入0可以开启作弊模式"); } } 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)//减少星星出现的几率 { while (true) { a = random() % 26;//产生随机横坐标 b = random() % 22;//产生随机纵坐标 if (map[a, b].barrier == 0 && map[a, b].food == 0) break;//当此处无其他元素是才生效 } map[a, b].star = 1;//随机出现小星星(吃到星星长度减1) gotoxy(2 * (a + 1), b + 1);//定位到星星出现的位置(吃到星星长度减1) c(ConsoleColor.Red);//调成红色 Console.Write("☆");//打印出星星(吃到星星长度减1) t3 = t1;//以免产生多个障碍物 if (HP < 7) { gotoxy(18, 24); Console.Write(" "); } } for (int i = 0; i < n; i++) { if (map[(p[i].x - 1) / 2, p[i].y - 1].food == 1)//判断蛇是否吃到食物 { ++n;//让蛇长度加1 food++;//将食物数加1 map[(p[i].x - 1) / 2, p[i].y - 1].food = 0;//让食物标示归零 break; } } if (map[(p[0].x - 1) / 2, p[0].y - 1].star == 1)//判断蛇是否吃到星星 { map[(p[0].x - 1) / 2, p[0].y - 1].star = 0;//让星星标示归零 if (HP < 6) ++HP;//将生命值加1 } t1 = time() - t2;//刷新游戏运行时间 } void key()//用户是否操作键盘 { while (true)//判断是否按键 { ConsoleKey ch = Console.ReadKey().Key; if (ch == ConsoleKey.Enter)//判断用户是否暂停 { pause = true; int a, b; a = time();//记录当前程序已用时间 gotoxy(20, 1); c(ConsoleColor.White);//调成白色 Console.Write("已暂停,按确定键开始"); while (true) { gotoxy(0, 24);//将光标设置到最后一行,防止用户乱输入数据 ConsoleKey temp = Console.ReadKey().Key; if (temp == ConsoleKey.Enter)////判断是否按键且是否解除暂停 { pause = false; gotoxy(20, 1); Console.Write(" ");//清除"已暂停,按确定键开始"这行字 break; } else { gotoxy(Console.CursorLeft - 1, Console.CursorTop);//将位置移到用户输入的非正常数据 Console.Write(" ");//清除这个数据 } } b = time();//记录当前程序已用时间 t2 += (b - a);//将暂停加到t2上供t1减去 } else if (ch == ConsoleKey.Escape)//判断是否重新选关 { guanka();//用来选择关卡并根据关卡设置蛇的移动速度 game();//开始游戏 } 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) //判断按键是否是方向键,并且是不是蛇移动方向的反方向 p[0].direction = ch;//如果不是就改变蛇头方向 } } public bool game() { readKeyThread.Start();//启动按键获取 int i; //ConsoleKey ch = RIGHT;//向右 t2 = time();//记录当前程序已用时间 while (true) { if (pause) continue;//如果暂停了 t1 = time() - t2;//刷新游戏运行时间 data();//用来记录游戏的各种状态数据 gotoxy(p[0].x, p[0].y);//转到蛇头位置 c(ConsoleColor.Yellow);//改成黄色 Console.Write("◆");//打印蛇头 for (i = 1; i < n - 1; i++) { gotoxy(p[i].x, p[i].y);//转到当前蛇身位置 c(ConsoleColor.Red);//改成红色 Console.Write("●");//打印蛇身 } gotoxy(p[n - 2].x, p[n - 2].y);//转到当前蛇尾位置 c(ConsoleColor.Yellow);//改成红色 Console.Write("●");//打印蛇尾 Sleep(T);//控制蛇的移动速度 t1 = time() - t2;//刷新游戏运行时间 gotoxy(p[n - 2].x, p[n - 2].y);//移到蛇尾所在地 Console.Write(" ");//清除上个循环的蛇尾 for (i = n - 1; i > 0; i--) p[i] = p[i - 1];//移动蛇 switch (p[0].direction) { case UP: { p[0].y -= 1; break; }//改变蛇头坐标,移动蛇头 case DOWN: { p[0].y += 1; break; }//改变蛇头坐标,移动蛇头 case LEFT: { p[0].x -= 2; break; }//改变蛇头坐标,移动蛇头 case RIGHT: { p[0].x += 2; break; }//改变蛇头坐标,移动蛇头 } if (p[0].x == 0)//当蛇撞到左墙时 { Console.Write("\a"); --HP;//将生命值减一 p[0].x = 52;//将其穿墙 } if (p[0].x == 54)//当蛇撞到右墙时 { Console.Write("\a"); --HP;//将生命值减一 p[0].x = 2;//将其穿墙 } if (p[0].y == 0)//当蛇撞到上墙时 { Console.Write("\a"); --HP;//将生命值减一 p[0].y = 22;//将其穿墙 } if (p[0].y == 23)//当蛇撞到下墙时 { Console.Write("\a"); --HP;//将生命值减一 p[0].y = 1;//将其穿墙 } for (i = 1; i < n - 1; i++) { if (p[0].x == p[i].x && p[0].y == p[i].y) i = n + 1;//判断蛇是否撞到自 } if (i >= n)//当蛇撞到自己 { Console.Write("\a"); HP = 0;//将蛇死亡 } if (map[(p[0].x - 1) / 2, p[0].y - 1].barrier == 1)//当蛇障碍物时 { Console.Write("\a"); --HP;//将生命值减一 map[(p[0].x - 1) / 2, p[0].y - 1].barrier = 0; } if (HP == 0) { readKeyThread.Abort();//停止按键检测 gotoxy(25, 5); c(ConsoleColor.White);//调成白色 Console.Write("\a\a\a游戏结束!!!"); Sleep(3000);//延时 return true; } if (n == 81) { readKeyThread.Abort();//停止按键检测 gotoxy(25, 5); c(ConsoleColor.White);//调成白色 Console.Write("\a\a\a恭喜你过关!!!"); Sleep(3000);//延时 return true; } show();//用来随机产生障碍物以及食物和生命药水以及用来判断游戏的各种参数(小星星是否吃到,是否撞墙) } } } class Program { static void Main(string[] args) { Game game = new Game(); game.ycgb(false);//隐藏光标 game.start();//绘制启动画面以及隔墙 while (true) { game.guanka();//用来选择关卡并根据关卡设置蛇的移动速度 game.ycgb(false);//隐藏光标 if (!game.game()) break;//游戏运行 } } } }