控制台小游戏-贪吃蛇,c++和c#版
说是c++版,其实只是用到了c++的cout和cin而已。这是我做的第二个控制台游戏,基本上每一行代码都加上了注释。
游戏嘛,我觉得重要的是了解他的思想,所以后期学了面向对象之后这个游戏的代码我也没有重新封装。
下面请看图
代码如下:我是用dev c++写的
//注释。 ---星辰 #include <iostream>
#include<Windows.h>
#include<ctime>
#include<cstdlib>
#include "conio.h"//非标准输入输出库函数 using namespace std; const int UP=;//上
const int DOWN=;//下
const int LEFT=;//左
const int RIGHT=;//右 int n=;//n用来记录蛇身长度,初始为2节
int guan;//用来记录关卡
int T;//用来给记录蛇的移动速度
int t1,t2,t3=;//用来记录以用时间
int HP=;//记录蛇的生命值,初始化为6
int food=;//用来记录所吃到的食物数
int x=,y=;//记录食物所在地 struct snake
{
int x;//蛇身所在横坐标
int y;//蛇身所在纵坐标
int direction;//行走方向
}p[]; struct map
{
int food;//此map[x][y]处是否有食物有的话food为1
int star;//此map[x][y]处是否有星星的话值为1
int barrier;//此map[x][y]处是否有障碍物有的话值为1
}map[][]; 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();//隐藏光标
start();//绘制启动画面以及隔墙
while()
{
guanka();//用来选择关卡并根据关卡设置蛇的移动速度
ycgb();//隐藏光标
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=;i<;i++)
{
cout<<" ";
}
c();//调成红色
for(z=;z<;z++)
{
if(z>=)
{
gotoxy(,z);
cout<<" ~--______-~ ~-___-~\" ";
}
if(z>=)
{
gotoxy(,z-);
cout<<" ~-_ _-~ ~-_ _-~ ";
}
if(z>=)
{
gotoxy(,z-);
cout<<" \\ ~-____-~ _-~ ~-_ ~-_-~ / ";
}
if(z>=)
{
gotoxy(,z-);
cout<<" ( ( _-~ _--_ ~-_ _/ | ";
}
if(z>=)
{
gotoxy(,z-);
cout<<" / / _-~ ~-_ | | ";
}
if(z>=)
{
gotoxy(,z-);
cout<<" / / _----_ \\ \\ ";
}
if(z>=)
{
gotoxy(,z-);
cout<<" / / \\ \\ ";
}
if(z>=)
{
gotoxy(,z-);
cout<<" / / \\\\ ";
}
if(z>=)
{
gotoxy(,z-);
cout<<" / / \\\\ ";
}
if(z>=)
{
gotoxy(,z-);
cout<<" / / \\ ";
}
if(z>=)
{
gotoxy(,z-);
cout<<" | | \\ ";
}
if(z>=)
{
gotoxy(,z-);
cout<<" \\ \\ ";
}
if(z>=)
{
gotoxy(,z-);
cout<<" \\_______ \\ ";
}
if(z>=)
{
gotoxy(,z-);
cout<<" \\____|__________/ \\ ";
}
if(z>=)
{
gotoxy(,z-);
cout<<"\\/ /~ \\_/ \\ ";
}
if(z>=)
{
gotoxy(,z-);
cout<<" _|__| O| ";
}
for(int k=;k<z;k++)
{
gotoxy(,k-);
cout<<" ";
}
Sleep();
}
Sleep();
c();//调成黑底色
gotoxy(,);
for(i=;i<;i++)
{
cout<<" ";
}
c();//调整输出颜色
for(i=,j=;i<;i++,j--)//if是为了异步输出
{
if(j>)
{
gotoxy(*(j-),);
cout<<"▉";//输出第一行
}
if(i<)
{
gotoxy(*i,);
cout<<"▉";// 输出最下面一行
}
if(j>&&j<)
{
gotoxy(,j-);
cout<<"▇";//输出最右边列
}
if(j>&&j<)
{
gotoxy(,i-);
cout<<"▇";//输出第一列
}
if(i>&&i<)
{
gotoxy(,i-);
Sleep();
cout<<"▇";//输出中间那列
}
Sleep();
}
gotoxy(,);
cout<<"▉▉▉▉▉▉▉▉▉▉▉"; //56
gotoxy(,);
c();//调整输出颜色
cout<<"| | |贪 吃 蛇| | |";//输出标题 gotoxy(,);
cout<<"已用时间:";
gotoxy(,);
cout<<"秒";
gotoxy(,);
cout<<"生命值:";
gotoxy(,);
cout<<"当前长度:";
gotoxy(,);
cout<<"已吃食物:";
gotoxy(,);
cout<<"第 关";
gotoxy(,);
cout<<"提示:";
gotoxy(,);
cout<<"向上:↑ 向上:←";
gotoxy(,);
cout<<"向下:↓ 向右:→";
gotoxy(,);
cout<<"暂停/开始:确定键 ";
gotoxy(,);
cout<<"重新选关 :Esc键";
gotoxy(,);
cout<<"注意!";
gotoxy(,);
cout<<"1:撞到障碍物或者墙生命";
gotoxy(,);
cout<<" 值减一 ";
gotoxy(,);
cout<<"2:吃到小星星生命值加一";
}
void guanka()//用来选择关卡并根据关卡设置蛇的移动速度
{
ycgb();//显示光标
n=;//n用来记录蛇身长度,初始为3节
HP=;//记录蛇的生命值,初始化为6
p[].x=; //
p[].y=; //
p[].direction=RIGHT; //
p[].x=; //
p[].y=; // 初始化蛇所在位置和移动方向
p[].direction=RIGHT; //
p[].x=; //
p[].y=; //
p[].direction=RIGHT; //
p[].x=;////////////////
p[].y=;///////////////记录蛇尾的信息
p[].direction=RIGHT;////
while()
{
gotoxy(,);
cout<<"请输入关数(1-6):";
cin>>guan;
cin.get();
if(guan==) //判断是否作弊
{
gotoxy(,);
c();//变成红色
cout<<" 作弊有害智商,需谨慎";
gotoxy(,);
c();//变成黄色
cout<<"请输入你想要的蛇的生命值:";
cin>>HP;
cin.get();
gotoxy(,);
cout<<" ";
gotoxy(,);
cout<<" ";
continue;//返回选关处
}
if(guan<&&guan>) break;//判断关数是否溢出
gotoxy(,);
cout<<"输入错误!";
gotoxy(,);
cout<<" "; }
gotoxy(,);
cout<<" ";
switch (guan)
{
case :{T=;break;}//
case :{T=;break;}//
case :{T=;break;}// 根据关数来设定蛇的移动速度
case :{T=;break;}//
case :{T=;break;}//
case :{T=;break;}//
}
qp();//清除屏幕
}
void data()//用来记录和判断游戏的各种状态数据
{
gotoxy(,);
c();//调成红色
cout<<t1;//程序已用时间
switch (guan)
{
case :
gotoxy(,);
c();//调成红色
cout<<"";
c();//调成黄色
cout<<" 2 3 4 5 6";
break;
case :
gotoxy(,);
c();//调成黄色
cout<<"1 ";
c();//调成红色
cout<<"";
c();//调成黄色
cout<<" 3 4 5 6 ";
break;
case :
gotoxy(,);
c();//调成黄色
cout<<"1 2 ";
c();//调成红色
cout<<"";
c();//调成黄色
cout<<" 4 5 6 ";
break;
case :
gotoxy(,);
c();//调成黄色
cout<<"1 2 3 ";
c();//调成红色
cout<<"";
c();//调成黄色
cout<<" 5 6 ";
break;
case :
gotoxy(,);
c();//调成黄色
cout<<"1 2 3 4 ";
c();//调成红色
cout<<"";
c();//调成黄色
cout<<" 6 ";
break;
case :
gotoxy(,);
c();//调成黄色
cout<<"1 2 3 4 5 ";
c();//调成红色
cout<<"";
break;
}
switch (HP)
{
case :
gotoxy(,);
c();//调成绿色
cout<<"▁";
c();//调成红色
cout<<"▂▃▅▆▇";
break;
case :
gotoxy(,);
c();//调成绿色
cout<<"▁▂";
c();//调成红色
cout<<"▃▅▆▇";
break;
case :
gotoxy(,);
c();//调成绿色
cout<<"▁▂▃";
c();//调成红色
cout<<"▅▆▇";
break;
case :
gotoxy(,);
c();//调成绿色
cout<<"▁▂▃▅";
c();//调成红色
cout<<"▆▇";
break;
case :
gotoxy(,);
c();//调成绿色
cout<<"▁▂▃▅▆";
c();//调成红色
cout<<"▇";
break;
case :
gotoxy(,);
c();//调成绿色
cout<<"▁▂▃▅▆▇";
break;
default:
gotoxy(,);
c();//调成红色
cout<<"!超级模式 !";
break;
}
gotoxy(,);
c();//调成红色
cout<<n-;//输出蛇的当前长度
gotoxy(,);
cout<<food;//输出蛇当前已经吃到食物
}
void qp()//用来清除屏幕
{
for(int i=;i<;i++)
{
gotoxy(,i);
cout<<" ";
}
map[x][y].food=;//将食物清空
map[x][y].barrier=;//将障碍物清除
map[x][y].star=;//将星星清除
} void show()//用来随机产生障碍物以及食物和生命药水以及用来判断游戏的各种参数
{
int a,b,e,f; //a,b用来表示小星星的坐标 c,d代表障碍物坐标
if(map[x][y].food==)//判断食物是不是被吃掉
{
while()
{
x=random()%;//产生随机横坐标
y=random()%;//产生随机纵坐标
if(map[x][y].barrier==&&map[x][y].star==) break;//当此处无其他元素是才生效
}
map[x][y].food=;//随机出现食物
gotoxy(*(x+),y+);//定位到食物出现的位置
c();//调成黄色
cout<<"●";//打印出食物
}
if(t1/>&&t1%==&&t1>t3&&map[(p[].x-)/][p[].y-].food==&&map[(p[].x-)/][p[].y-].star==)
{
while()
{
e=random()%;//产生随机横坐标
f=random()%;//产生随机纵坐标
if(map[e][f].food==&&map[e][f].star==) break;//当此处无其他元素是才生效
}
gotoxy(*(e+),f+);//定位到障碍物出现的位置
map[e][f].barrier=;//随机出现障碍物
c();//调成黄色
cout<<"▇";//打印出障碍物
t3=t1;//以免产生多个障碍物
if(HP<)
{
gotoxy(,);
c();//调成白色
cout<<"温馨提示:在选关的时候输入0可以开启作弊模式";
}
}
if(t1/>&&t1%==&&t1>t3&&map[(p[].x-)/][p[].y-].food==&&map[(p[].x-)/][p[].y-].barrier==)//减少星星出现的几率
{
while()
{
a=random()%;//产生随机横坐标
b=random()%;//产生随机纵坐标
if(map[a][b].barrier==&&map[a][b].food==) break;//当此处无其他元素是才生效
}
map[a][b].star=;//随机出现小星星(吃到星星长度减1)
gotoxy(*(a+),b+);//定位到星星出现的位置(吃到星星长度减1)
c();//调成黄色
cout<<"☆";//打印出星星(吃到星星长度减1)
t3=t1;//以免产生多个障碍物
if(HP<)
{
gotoxy(,);
cout<<" ";
}
}
for(int i=;i<n;i++)
{
if(map[(p[i].x-)/][p[i].y-].food==)//判断蛇是否吃到食物
{
++n;//让蛇长度加1
food++;//将食物数加1
map[(p[i].x-)/][p[i].y-].food=;//让食物标示归零
break;
}
}
if(map[(p[].x-)/][p[].y-].star==)//判断蛇是否吃到星星
{
map[(p[].x-)/][p[].y-].star=;//让星星标示归零
if(HP<)
++HP;//将生命值加1
}
t1=time()-t2;//刷新游戏运行时间
}
void key()//用户是否操作键盘
{
if(kbhit())//判断是否按键
{
int ch=getch();
if(ch==)//判断按的是不是方向键
{
ch=getch();
if((ch==||ch==||ch==||ch==)&&(ch+p[].direction!=)&&ch!=p[].direction) //判断按键是否是方向键,并且是不是蛇移动方向的反方向
p[].direction=ch;//如果不是就改变蛇头方向
else rewind(stdin);
}
else if(ch==)//判断用户是否暂停
{
clock_t a,b;
a=time();//记录当前程序已用时间
gotoxy(,);
c();//调成白色
cout<<"已暂停,按确定键开始";
while()
{
if(kbhit()&&getch()==)////判断是否按键且是否解除暂停
{
gotoxy(,);
cout<<" ";//清除"已暂停,按确定键开始"这行字
break;
}
}
b=time();//记录当前程序已用时间
t2+=(b-a);//将暂停加到t2上供t1减去
}
else if(ch==)//判断是否重新选关
{
guanka();//用来选择关卡并根据关卡设置蛇的移动速度
game();//开始游戏
}
else rewind(stdin);
}
}
int game()
{
int i;
int ch=RIGHT;//向右
t2=time();//记录当前程序已用时间
while()
{
t1=time()-t2;//刷新游戏运行时间
data();//用来记录游戏的各种状态数据
gotoxy(p[].x,p[].y);//转到蛇头位置
c();//改成红色
cout<<"◆";//打印蛇头
for(i=;i<n-;i++)
{
gotoxy(p[i].x,p[i].y);//转到当前蛇身位置
c();//改成黄色
cout<<"●";//打印蛇身
}
gotoxy(p[n-].x,p[n-].y);//转到当前蛇尾位置
c();//改成红色
cout<<"●";//打印蛇尾
Sleep(T);//控制蛇的移动速度
t1=time()-t2;//刷新游戏运行时间
gotoxy(p[n-].x,p[n-].y);//移到蛇尾所在地
cout<<" ";//清除上个循环的蛇尾
for(i=n-;i>;i--) p[i]=p[i-];//移动蛇
key();//用户是否操作键盘
switch (p[].direction)
{
case UP:{p[].y-=;break;}//改变蛇头坐标,移动蛇头
case DOWN:{p[].y+=;break;}//改变蛇头坐标,移动蛇头
case LEFT:{p[].x-=;break;}//改变蛇头坐标,移动蛇头
case RIGHT:{p[].x+=;break;}//改变蛇头坐标,移动蛇头
}
if(p[].x==)//当蛇撞到左墙时
{
cout<<"\a";
--HP;//将生命值减一
p[].x=;//将其穿墙
}
if(p[].x==)//当蛇撞到右墙时
{
cout<<"\a";
--HP;//将生命值减一
p[].x=;//将其穿墙
}
if(p[].y==)//当蛇撞到上墙时
{
cout<<"\a";
--HP;//将生命值减一
p[].y=;//将其穿墙
}
if(p[].y==)//当蛇撞到下墙时
{
cout<<"\a";
--HP;//将生命值减一
p[].y=;//将其穿墙
}
for(i=;i<n-;i++)
{
if(p[].x==p[i].x&&p[].y==p[i].y) i=n+;//判断蛇是否撞到自
}
if(i>=n)//当蛇撞到自己
{
cout<<"\a";
HP=;//将蛇死亡
}
if(map[(p[].x-)/][p[].y-].barrier==)//当蛇障碍物时
{
cout<<"\a";
--HP;//将生命值减一
map[(p[].x-)/][p[].y-].barrier=;
}
if(HP==)
{
gotoxy(,);
c();//调成白色
cout<<"\a\a\a游戏结束!!!";
Sleep();//延时
return ;
break;
}
if(n==)
{
gotoxy(,);
c();//调成白色
cout<<"\a\a\a恭喜你过关!!!";
Sleep();//延时
return ;
break;
}
show();//用来随机产生障碍物以及食物和生命药水以及用来判断游戏的各种参数(小星星是否吃到,是否撞墙)
}
return ;
}
显示代码
下面是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[];
Map[,] map = new Map[, ]; const ConsoleKey UP = ConsoleKey.UpArrow;//上
const ConsoleKey DOWN = ConsoleKey.DownArrow;//下
const ConsoleKey LEFT = ConsoleKey.LeftArrow;//左
const ConsoleKey RIGHT = ConsoleKey.RightArrow;//右 int n = ;//n用来记录蛇身长度,初始为2节
int guan;//用来记录关卡
int T;//用来给记录蛇的移动速度
int t1 = , t2 = , t3 = ;//用来记录以用时间
int HP = ;//记录蛇的生命值,初始化为6
int food = ;//用来记录所吃到的食物数
int x = , y = ;//记录食物所在地
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 = ; i < ; i++)
{
Console.Write(" ");
}
for (z = ; z < ; z++)
{
if (z >= )
{
gotoxy(, z);
Console.Write(" ~--______-~ ~-___-~\" ");
}
if (z >= )
{
gotoxy(, z - );
Console.Write(" ~-_ _-~ ~-_ _-~ ");
}
if (z >= )
{
gotoxy(, z - );
Console.Write(" \\ ~-____-~ _-~ ~-_ ~-_-~ / ");
}
if (z >= )
{
gotoxy(, z - );
Console.Write(" ( ( _-~ _--_ ~-_ _/ | ");
}
if (z >= )
{
gotoxy(, z - );
Console.Write(" / / _-~ ~-_ | | ");
}
if (z >= )
{
gotoxy(, z - );
Console.Write(" / / _----_ \\ \\ ");
}
if (z >= )
{
gotoxy(, z - );
Console.Write(" / / \\ \\ ");
}
if (z >= )
{
gotoxy(, z - );
Console.Write(" / / \\\\ ");
}
if (z >= )
{
gotoxy(, z - );
Console.Write(" / / \\\\ ");
}
if (z >= )
{
gotoxy(, z - );
Console.Write(" / / \\ ");
}
if (z >= )
{
gotoxy(, z - );
Console.Write(" | | \\ ");
}
if (z >= )
{
gotoxy(, z - );
Console.Write(" \\ \\ ");
}
if (z >= )
{
gotoxy(, z - );
Console.Write(" \\_______ \\ ");
}
if (z >= )
{
gotoxy(, z - );
Console.Write(" \\____|__________/ \\ ");
}
if (z >= )
{
gotoxy(, z - );
Console.Write("\\/ /~ \\_/ \\ ");
}
if (z >= )
{
gotoxy(, z - );
Console.Write(" _|__| O| ");
}
for (int k = ; k < z; k++)
{
gotoxy(, k - );
Console.Write(" ");
}
Sleep();
}
Sleep();
c(ConsoleColor.Gray);//调成白色
gotoxy(, );
for (i = ; i < ; i++)
{
Console.Write(" ");
}
//c(252);//调整输出颜色
for (i = , j = ; i < ; i++, j--)//if是为了异步输出
{
if (j > )
{
gotoxy( * (j - ), );
Console.Write("▉");//输出第一行
}
if (i < )
{
gotoxy( * i, );
Console.Write("▉");// 输出最下面一行
}
if (j > && j < )
{
gotoxy(, j - );
Console.Write("▇");//输出最右边列
}
if (j > && j < )
{
gotoxy(, i - );
Console.Write("▇");//输出第一列
}
if (i > && i < )
{
gotoxy(, i - );
Sleep();
Console.Write("▇");//输出中间那列
}
Sleep();
}
gotoxy(, );
Console.Write("▉▉▉▉▉▉▉▉▉▉▉"); //56
gotoxy(, );
c(ConsoleColor.Red);//调整输出颜色
Console.Write("| | |贪 吃 蛇| | |");//输出标题 gotoxy(, );
Console.Write("已用时间:");
gotoxy(, );
Console.Write("秒");
gotoxy(, );
Console.Write("生命值:");
gotoxy(, );
Console.Write("当前长度:");
gotoxy(, );
Console.Write("已吃食物:");
gotoxy(, );
Console.Write("第 关");
gotoxy(, );
Console.Write("提示:");
gotoxy(, );
Console.Write("向上:↑ 向上:←");
gotoxy(, );
Console.Write("向下:↓ 向右:→");
gotoxy(, );
Console.Write("暂停/开始:确定键 ");
gotoxy(, );
Console.Write("重新选关 :Esc键");
gotoxy(, );
Console.Write("注意!");
gotoxy(, );
Console.Write("1:撞到障碍物或者墙生命");
gotoxy(, );
Console.Write(" 值减一 ");
gotoxy(, );
Console.Write("2:吃到小星星生命值加一");
} public void guanka()//用来选择关卡并根据关卡设置蛇的移动速度
{
ycgb(true);//显示光标
n = ;//n用来记录蛇身长度,初始为3节
HP = ;//记录蛇的生命值,初始化为6 p[].x = ; //
p[].y = ; //
p[].direction = RIGHT; //
p[].x = ; //
p[].y = ; // 初始化蛇所在位置和移动方向
p[].direction = RIGHT; //
p[].x = ; //
p[].y = ; //
p[].direction = RIGHT; //
p[].x = ;////////////////
p[].y = ;///////////////记录蛇尾的信息
p[].direction = RIGHT;////
while (true)
{
gotoxy(, );
Console.Write("请输入关数(1-6):");
guan = Console.Read() - ;
//Console.Write("关卡:{0}", guan);
if (guan == ) //判断是否作弊
{
gotoxy(, );
c(ConsoleColor.Red);//变成红色
Console.Write(" 作弊有害智商,需谨慎");
gotoxy(, );
c(ConsoleColor.Yellow);//变成黄色
Console.Write("请输入你想要的蛇的生命值:");
HP = Console.Read(); ; gotoxy(, );
Console.Write(" ");
gotoxy(, );
Console.Write(" ");
continue;//返回选关处
}
if (guan < && guan > ) break;//判断关数是否溢出
gotoxy(, );
Console.Write("输入错误!");
gotoxy(, );
Console.Write(" ");
}
gotoxy(, );
Console.Write(" ");
switch (guan)
{
case : { T = ; break; }//
case : { T = ; break; }//
case : { T = ; break; }// 根据关数来设定蛇的移动速度
case : { T = ; break; }//
case : { T = ; break; }//
case : { T = ; break; }//
}
qp();//清除屏幕
} void data()//用来记录和判断游戏的各种状态数据
{
c(ConsoleColor.Red);//调成红色
gotoxy(, );
Console.Write("{0}", t1);//程序已用时间
switch (guan)
{
case :
gotoxy(, );
c(ConsoleColor.Red);//调成红色
Console.Write("");
c(ConsoleColor.Yellow);//调成黄色
Console.Write(" 2 3 4 5 6");
break;
case :
gotoxy(, );
c(ConsoleColor.Yellow);//调成黄色
Console.Write("1 ");
c(ConsoleColor.Red);//调成红色
Console.Write("");
c(ConsoleColor.Yellow);//调成黄色
Console.Write(" 3 4 5 6 ");
break;
case :
gotoxy(, );
c(ConsoleColor.Yellow);//调成黄色
Console.Write("1 2 ");
c(ConsoleColor.Red);//调成红色
Console.Write("");
c(ConsoleColor.Yellow);//调成黄色
Console.Write(" 4 5 6 ");
break;
case :
gotoxy(, );
c(ConsoleColor.Yellow);//调成黄色
Console.Write("1 2 3 ");
c(ConsoleColor.Red);//调成红色
Console.Write("");
c(ConsoleColor.Yellow);//调成黄色
Console.Write(" 5 6 ");
break;
case :
gotoxy(, );
c(ConsoleColor.Yellow);//调成黄色
Console.Write("1 2 3 4 ");
c(ConsoleColor.Red);//调成红色
Console.Write("");
c(ConsoleColor.Yellow);//调成黄色
Console.Write(" 6 ");
break;
case :
gotoxy(, );
c(ConsoleColor.Yellow);//调成黄色
Console.Write("1 2 3 4 5 ");
c(ConsoleColor.Red);//调成红色
Console.Write("");
break;
}
switch (HP)
{
case :
gotoxy(, );
c(ConsoleColor.Green);//调成绿色
Console.Write("▁");
c(ConsoleColor.Red);//调成红色
Console.Write("▂▃▅▆▇");
break;
case :
gotoxy(, );
c(ConsoleColor.Green);//调成绿色
Console.Write("▁▂");
c(ConsoleColor.Red);//调成红色
Console.Write("▃▅▆▇");
break;
case :
gotoxy(, );
c(ConsoleColor.Green);//调成绿色
Console.Write("▁▂▃");
c(ConsoleColor.Red);//调成红色
Console.Write("▅▆▇");
break;
case :
gotoxy(, );
c(ConsoleColor.Green);//调成绿色
Console.Write("▁▂▃▅");
c(ConsoleColor.Red);//调成红色
Console.Write("▆▇");
break;
case :
gotoxy(, );
c(ConsoleColor.Green);//调成绿色
Console.Write("▁▂▃▅▆");
c(ConsoleColor.Red);//调成红色
Console.Write("▇");
break;
case :
gotoxy(, );
c(ConsoleColor.Green);//调成绿色
Console.Write("▁▂▃▅▆▇");
break;
default:
gotoxy(, );
c(ConsoleColor.Red);//调成红色
Console.Write("!超级模式 !");
break;
}
gotoxy(, );
c(ConsoleColor.Red);//调成红色
Console.Write("{0}", n - );//输出蛇的当前长度
gotoxy(, );
Console.Write("{0}", food);//输出蛇当前已经吃到食物
}
void qp()//用来清除屏幕
{
for (int i = ; i < ; i++)
{
gotoxy(, i);
Console.Write(" ");
}
map[x, y].food = ;//将食物清空
map[x, y].barrier = ;//将障碍物清除
map[x, y].star = ;//将星星清除
} void show()//用来随机产生障碍物以及食物和生命药水以及用来判断游戏的各种参数
{
int a, b, e, f; //a,b用来表示小星星的坐标 c,d代表障碍物坐标
if (map[x, y].food == )//判断食物是不是被吃掉
{
while (true)
{
x = random() % ;//产生随机横坐标
y = random() % ;//产生随机纵坐标
if (map[x, y].barrier == && map[x, y].star == ) break;//当此处无其他元素是才生效
}
map[x, y].food = ;//随机出现食物
gotoxy( * (x + ), y + );//定位到食物出现的位置
c(ConsoleColor.Yellow);//调成黄色
Console.Write("●");//打印出食物
}
if (t1 / > && t1 % == && t1 > t3 && map[(p[].x - ) / , p[].y - ].food == && map[(p[].x - ) / , p[].y - ].star == )
{
while (true)
{
e = random() % ;//产生随机横坐标
f = random() % ;//产生随机纵坐标
if (map[e, f].food == && map[e, f].star == ) break;//当此处无其他元素是才生效
}
gotoxy( * (e + ), f + );//定位到障碍物出现的位置
map[e, f].barrier = ;//随机出现障碍物
c(ConsoleColor.Yellow);//调成黄色
Console.Write("▇");//打印出障碍物
t3 = t1;//以免产生多个障碍物
if (HP < )
{
gotoxy(, );
c(ConsoleColor.White);//调成白色
Console.Write("温馨提示:在选关的时候输入0可以开启作弊模式");
}
}
if (t1 / > && t1 % == && t1 > t3 && map[(p[].x - ) / , p[].y - ].food == && map[(p[].x - ) / , p[].y - ].barrier == )//减少星星出现的几率
{
while (true)
{
a = random() % ;//产生随机横坐标
b = random() % ;//产生随机纵坐标
if (map[a, b].barrier == && map[a, b].food == ) break;//当此处无其他元素是才生效
}
map[a, b].star = ;//随机出现小星星(吃到星星长度减1)
gotoxy( * (a + ), b + );//定位到星星出现的位置(吃到星星长度减1)
c(ConsoleColor.Red);//调成红色
Console.Write("☆");//打印出星星(吃到星星长度减1)
t3 = t1;//以免产生多个障碍物
if (HP < )
{
gotoxy(, );
Console.Write(" ");
}
}
for (int i = ; i < n; i++)
{
if (map[(p[i].x - ) / , p[i].y - ].food == )//判断蛇是否吃到食物
{
++n;//让蛇长度加1
food++;//将食物数加1
map[(p[i].x - ) / , p[i].y - ].food = ;//让食物标示归零
break;
}
}
if (map[(p[].x - ) / , p[].y - ].star == )//判断蛇是否吃到星星
{
map[(p[].x - ) / , p[].y - ].star = ;//让星星标示归零
if (HP < )
++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(, );
c(ConsoleColor.White);//调成白色
Console.Write("已暂停,按确定键开始");
while (true)
{
gotoxy(, );//将光标设置到最后一行,防止用户乱输入数据
ConsoleKey temp = Console.ReadKey().Key;
if (temp == ConsoleKey.Enter)////判断是否按键且是否解除暂停
{
pause = false;
gotoxy(, );
Console.Write(" ");//清除"已暂停,按确定键开始"这行字
break;
}
else
{
gotoxy(Console.CursorLeft - , 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[].direction && (int)ch - != (int)p[].direction && (int)ch + != (int)p[].direction) //判断按键是否是方向键,并且是不是蛇移动方向的反方向
p[].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[].x, p[].y);//转到蛇头位置
c(ConsoleColor.Yellow);//改成黄色
Console.Write("◆");//打印蛇头
for (i = ; i < n - ; i++)
{
gotoxy(p[i].x, p[i].y);//转到当前蛇身位置
c(ConsoleColor.Red);//改成红色
Console.Write("●");//打印蛇身
}
gotoxy(p[n - ].x, p[n - ].y);//转到当前蛇尾位置
c(ConsoleColor.Yellow);//改成红色
Console.Write("●");//打印蛇尾
Sleep(T);//控制蛇的移动速度
t1 = time() - t2;//刷新游戏运行时间
gotoxy(p[n - ].x, p[n - ].y);//移到蛇尾所在地
Console.Write(" ");//清除上个循环的蛇尾
for (i = n - ; i > ; i--) p[i] = p[i - ];//移动蛇
switch (p[].direction)
{
case UP: { p[].y -= ; break; }//改变蛇头坐标,移动蛇头
case DOWN: { p[].y += ; break; }//改变蛇头坐标,移动蛇头
case LEFT: { p[].x -= ; break; }//改变蛇头坐标,移动蛇头
case RIGHT: { p[].x += ; break; }//改变蛇头坐标,移动蛇头
}
if (p[].x == )//当蛇撞到左墙时
{
Console.Write("\a");
--HP;//将生命值减一
p[].x = ;//将其穿墙
}
if (p[].x == )//当蛇撞到右墙时
{
Console.Write("\a");
--HP;//将生命值减一
p[].x = ;//将其穿墙
}
if (p[].y == )//当蛇撞到上墙时
{
Console.Write("\a");
--HP;//将生命值减一
p[].y = ;//将其穿墙
}
if (p[].y == )//当蛇撞到下墙时
{
Console.Write("\a");
--HP;//将生命值减一
p[].y = ;//将其穿墙
}
for (i = ; i < n - ; i++)
{
if (p[].x == p[i].x && p[].y == p[i].y) i = n + ;//判断蛇是否撞到自
}
if (i >= n)//当蛇撞到自己
{
Console.Write("\a");
HP = ;//将蛇死亡
}
if (map[(p[].x - ) / , p[].y - ].barrier == )//当蛇障碍物时
{
Console.Write("\a");
--HP;//将生命值减一
map[(p[].x - ) / , p[].y - ].barrier = ;
}
if (HP == )
{
readKeyThread.Abort();//停止按键检测
gotoxy(, );
c(ConsoleColor.White);//调成白色
Console.Write("\a\a\a游戏结束!!!");
Sleep();//延时
return true;
}
if (n == )
{
readKeyThread.Abort();//停止按键检测
gotoxy(, );
c(ConsoleColor.White);//调成白色
Console.Write("\a\a\a恭喜你过关!!!");
Sleep();//延时
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;//游戏运行
}
}
}
}
显示代码
控制台小游戏-贪吃蛇,c++和c#版的更多相关文章
- 第一个windows 小游戏 贪吃蛇
最近用dx尝试做了一个小的贪吃蛇游戏,代码放到github上面:https://github.com/nightwolf-chen/MyFreakout 说一下自己实现的过程: 首先,我把蛇这个抽象成 ...
- JavaScript面向对象编程小游戏---贪吃蛇
1 面向对象编程思想在程序项目中有着非常明显的优势: 1- 1 代码可读性高.由于继承的存在,即使改变需求,那么维护也只是在局部模块 1- 2 维护非常方便并且成本较低. 2 这个demo是采用了 ...
- python【控制台】小游戏--贪吃蛇
传统贪吃蛇相信大家都玩过,也是一款很老很经典的游戏,今天我们用python控制台实现 项目有很多bug没有解决,因为本人一时兴起写的一个小游戏,所以只是实现可玩部分功能,并没有花较多的时间和精力去维护 ...
- 用Canvas制作小游戏——贪吃蛇
今天呢,主要和小伙伴们分享一下一个贪吃蛇游戏从构思到实现的过程~因为我不是很喜欢直接PO代码,所以只copy代码的童鞋们请出门左转不谢. 按理说canvas与其应用是老生常谈了,可我在准备阶段却搜索不 ...
- 使用JavaScript实现简单的小游戏-贪吃蛇
最近初学JavaScript,在这里分享贪吃蛇小游戏的实现过程, 希望能看到的前辈们能指出这个程序的不足之处. 大致思路 首先要解决的问题 随着蛇头的前进,尾巴也要前进. 用键盘控制蛇的运动方向. 初 ...
- 手把手教学h5小游戏 - 贪吃蛇
简单的小游戏制作,代码量只有两三百行.游戏可自行扩展延申. 源码已发布至github,喜欢的点个小星星,源码入口:game-snake 游戏已发布,游戏入口:http://snake.game.yan ...
- Win32小游戏--贪吃蛇
近日里学习了关于win32编程的相关知识,利用这些知识制作了一款贪吃蛇小游戏,具体细节还是分模块来叙述 前期准备:在网上找到一些贪吃蛇的游戏素材图片,以及具体的逻辑框图 在正式写功能之前,先把一系列环 ...
- Java_GUI小游戏--贪吃蛇
贪吃蛇游戏:是一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或 ...
- Java经典小游戏——贪吃蛇简单实现(附源码)
一.使用知识 Jframe GUI 双向链表 线程 二.使用工具 IntelliJ IDEA jdk 1.8 三.开发过程 3.1素材准备 首先在开发之前应该准备一些素材,已备用,我主要找了一个图片以 ...
随机推荐
- 使用Webdriver执行JS
首先,我们使用如下方式初始化driver: WebDriver driver = new FirefoxDriver(); JavascriptExecutor jse = (JavascriptEx ...
- 安装memcached扩展
1.wget http://pecl.php.net/package/memcache 下载相对应的扩展包 2. tar -zxvf memcache-2.2.7.tgz 3. cd memcac ...
- Druid出现DruidDataSource - recyle error - recyle error java.lang.InterruptedException: null异常排查与解决
一.问题回顾 线上的代码之前运行的都很平稳,突然就出现了一个很奇怪的问题,看错误信息是第三方框架Druid报出来了,连接池回收连接时出现的问题. 2018-05-14 20:01:32.810 ERR ...
- iOS 使用markdown 实现编辑和预览文本
注意要点: 1.在iOS 可以依赖UIWebview 来实现 2.丰富的UI样式依赖 html 的样式, js 调用插入markdown内容呈现出来 3.实现markdown编辑快捷键:参考githu ...
- C# DateTime 获取时间方法,网上收集
DateTime dt = DateTime.Now; //当前时间 DateTime startWeek = dt.AddDays( - Convert.ToInt32(dt.DayOfWeek.T ...
- tomcat 连接器优化
在$CATALINA_HOME/conf/server.xml配置文件中的Connetctor节点,和连接数相关的参数配置和优化. maxThreads Tomcat使用线程来处理接收的每个请求.这个 ...
- Python笔记 #02# Inner workings of lists
源:DataCamp datacamp 的 DAILY PRACTICE + 日常收集. List of lists Subset and conquer Slicing and dicing Li ...
- 20145214 《Java程序设计》第3周学习总结
教材学习内容总结 对象(Object):存在的具体实体,具有明确的状态和行为 类(Class):具有相同属性和行为的一组对象的集合,用于组合各个对象所共有操作和属性的一种机制 从类看对象:类定义可以视 ...
- Base64编码原理
Base64编码之所以称为Base64,是因为其使用64个字符来对任意数据进行编码,同理有Base32.Base16编码.标准Base64编码使用的64个字符为: 这64个字符是各种字符编码(比如AS ...
- JasperReports实现报表调出excel
一.利用工具iReport 创建task.jrxml 模板 并生成 task.jasper 文件 二.搭建工程导入以下jar包 commons-beanutils-1.9.2.jar commons- ...