控制台小游戏-贪吃蛇,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素材准备 首先在开发之前应该准备一些素材,已备用,我主要找了一个图片以 ...
随机推荐
- Flask之flask-script模块使用
Flask Script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的脚本,cronjobs,及其他运行在web应用之外的命令行任 ...
- Get started on your own KD 8 custom colorway
The 2009 Summer time Nike Basketball revealed the Cheap KD 8 and revealed three MVP-inspired colors ...
- POI 导出文件 报空指针异常 --Docker 中
应用导出文件时 报空指针异常 莫名的地方Docker 使用的是轻量级的 jdk 需要更换 jdkDockerfile 中修改配置- registry-docker.zhaopin.com.cn/too ...
- let 与 var
前言let与var最大的区别就是var会变量提升.var会被覆盖.var变量没有块级作用域,而let都将弥补这些bug.传统语言都不会有‘变量提升.重复声明被覆盖.变量没有块级作用’这些问题,这是js ...
- CSS中定义a:link、a:visited、a:hover、a:active顺序
a :link.a:hover.a:visited这几个元素,定义CSS时候的顺序不同,也会直接导致链接显示的效果不同. eg:让未访问链接颜色为red,活动链接为yellow,已访问链接为green ...
- python中的引用传递,可变对象,不可变对象,list注意点
python中的引用传递 首先必须理解的是,python中一切的传递都是引用(地址),无论是赋值还是函数调用,不存在值传递. 可变对象和不可变对象 python变量保存的是对象的引用,这个引用指向堆内 ...
- Spring MVC 复习笔记03
1. @RequestMapping 1). url映射 定义controller方法对应的url,进行处理器映射使用. 2). 窄化请求映射 3). 限制http请求方法 出于安全性考虑,对htt ...
- .NET Core + EF 报nuget包不兼容
错误信息如下: 严重性 代码 说明 项目 文件 行 禁止显示状态错误 NU1107 Microsoft.EntityFrameworkCore 中检测到版本冲突.直接安装/引用 Microsoft.E ...
- Java-Minor GC、Major GC、Full GC
Minor GC: 回收年轻代(Young)空间,包括Eden区.Survivor区. JVM无法为一个新对象分配空间时,比如eden区满了,就会触发Minor GC. Major GC: 清理永久代 ...
- unsigned short A = 10; printf("~A = %u\n", ~A); char c=128; printf("c=%d\n",c); 输出多少?
这是题目给出的答案:第一题,-A =0xfffffff5,int值 为-11,但输出的是uint.所以输出4294967285 第二题,c=0x10,输出的是int,最高位为1,是负数,所以它的值就是 ...