以3.0.0为例
我们需要一个函数来采集用户按下的按键以便我们执行相应的代码,不能有回显(输入的字符会显示在控制台程序上),不用回车也可以读取到
输入的类型为char,可以一次读一个字符,有回显,需要回车
一次读一个字符,能采集用户按下的按键但有回显,且字符需要回车enter才能从缓冲区读取到,先pass(排除)掉
一次读一行,后面检测会有点麻烦,有回显,也需要回车才能从缓冲区读取到字符,也pass掉
常用的采集用户输入的字符的函数基本用完了,难道真的没有吗?
一次读一个字符,没有回显,也不需要回车也能读取,但不是标准函数,移植性相对来说有点差,但能用就行,还要什么自行车,头文件:conio.h
但是,他们都是阻塞函数,为了让游戏运行起来,我还用了conio.h库里的另一个函数kbhit(),如果当前有键盘输入它会返回一个非0值,否则返回0,是一个非阻塞函数,不过建议使用遵循C命名规则的 _kbhit(),他们都是同一个函数。
输出我用cout,printf不会用,换行endl或者\n
清屏这里我用了windows.h库的system()函数,他的参数是一个const char*,既然如此,我们填什么进去呢?众所周知,windows操作系统有一个程序叫命令提示符,命令提示符里的命令大部分填进system()函数里都能用,既然命令提示符里的清屏命令为 cls ,我就试了一下,真行!(注意,文章中所有命令填进system()函数里时一定要打" ")
system("cls");
窗口大小也是和清屏一样,命令为 mode con cols=H lines=L 其中H为你计划的窗口宽度,L为你计划的窗口高度,都是十进制数。(补充:一般窗口一个英文字符长8像素高18像素,除非你动了窗口的属性)
system("mode con cols=50 lines=25");
窗口标题用 title 你的窗口名称
system("title 跑酷游戏");
有的人可能不知道,为什么要移除快速编辑模式和插入模式,因为如果开启快速编辑模式或和插入模式当鼠标点击窗口时会导致程序阻塞或卡死。关闭的原理可以自行到网上搜,我只是学到算法,这些歪门邪道还没学
void sb_ycksbj() //别误会,鼠标的首字母缩写
{
HANDLE hStdin=GetStdHandle(STD_INPUT_HANDLE);
DWORD mode;
GetConsoleMode(hStdin,&mode);
mode&=~ENABLE_QUICK_EDIT_MODE; //移除快速编辑模式
mode&=~ENABLE_INSERT_MODE; //移除插入模式
mode&=~ENABLE_MOUSE_INPUT;
SetConsoleMode(hStdin, mode);
}
纯属让页面更好看,不让会看到光标满天飞的壮观画面
不会做动态图片,请原谅!
原理也是自行到网上搜,原理讲解臣妾做不到啊!!!
我只是一个算法都没学完的小学生!!!
void sb_yc() //别误会,鼠标的首字母缩写,我也不知道当时为什么不用光标的首字母缩写
{
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(handle,&CursorInfo);//获取控制台光标信息
CursorInfo.bVisible=false; //隐藏控制台光标
SetConsoleCursorInfo(handle,&CursorInfo);//设置控制台光标状态
}
暂时还没加,本来也想用system()命令的,一看颜色太少了,从网上找了颜色更多的函数,打了注释应该能看懂
void gq_ys(int x)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x); //x代表的是第几号颜色 前面的GetStdHandle(STD_OUTPUT_HANDLE)是获取当前窗口权柄,简单来说就是让这个颜色加在这个页面
return;
}
附颜色表一张,纯黑是0,纯白是255
首先,我们的上左右箭头不管那个都会有两个键值,他们第一个键值都为224,第二个分别为
上:72
左:75
右:77
下:80
人物移动不打算用刷屏,太闪了,对于我这种近视300度的人来说非常不友好!!!改成了覆盖大法
就是把光标移动到人物当前位置,用一个空格覆盖掉人物,在移动光标到对应位置输出人物,看起来就像人物移动到了那个位置
往上跳的话最多四格
void gq_yx(int x,int y,char z,int l) //x y为人物出身点坐标,z为人物字符,l为当前关卡数(0到5,一共六关)
{
int x1=x,yy1=y,ax;
sb_yd(x1,yy1);
cout<
由于没有用户主动向下移动,所以没写
当玩家正下方为空或为终点时以一定速度往下落,期间玩家可以左右移动但不能跳起来(如果可以的话直接撞到天花板上游戏崩溃,没法解决)
void gq_yx(int x,int y,char z,int l) //x y为人物出身点坐标,z为人物字符,l为当前关卡数(0到5,一共六关)
{
int x1=x,yy1=y,ax;
sb_yd(x1,yy1);
cout<
当玩家正下方为蹦床'='时且上方无障碍物时会往上蹦8格
void gq_yx(int x,int y,char z,int l) //x y为人物出身点坐标,z为人物字符,l为当前关卡数(0到5,一共六关)
{
int x1=x,yy1=y,ax;
sb_yd(x1,yy1);
cout<
如果玩家当前坐标在地图上等于终点'$'时,暂停一小会儿让玩家看清楚到达终点,进行清屏并提示返回
void gq_yx(int x,int y,char z,int l) //x y为人物出身点坐标,z为人物字符,l为当前关卡数(0到5,一共六关)
{
int x1=x,yy1=y,ax;
sb_yd(x1,yy1);
cout<
当玩家正下方为上刺'^'或右边为左刺'<'或左边为右刺'>'或玩家掉到窗口底部时,把人物送回开始点重新开始(跳的代码里我没有设置检测刺的代码,要不然有些关卡我都没法通关)
void gq_yx(int x,int y,char z,int l) //x y为人物出身点坐标,z为人物字符,l为当前关卡数(0到5,一共六关)
{
int x1=x,yy1=y,ax;
sb_yd(x1,yy1);
cout<')
{
sb_yd(x1,yy1);
cout<<" ";
x1=x;
yy1=y;
sb_yd(x1,yy1);
cout<')
{
sb_yd(x1,yy1);
cout<<" ";
x1=x;
yy1=y;
sb_yd(x1,yy1);
cout<')
{
sb_yd(x1,yy1);
cout<<" ";
x1=x;
yy1=y;
sb_yd(x1,yy1);
cout<
当按下z键时重新打印关卡地图和人物字符,重新设置窗口大小,重新设置窗口名称,重新隐藏光标,重新关闭快速编辑模式和插入模式
其它界面不会重新打印关卡地图和人物字符
函数:
void gq_sx(int x,int y,char z,int l,bool pd)
{
if(pd)//判断pd是否为真,可以写成if(pd==1)
{
system("cls");
cout<<"刷新中...";
sb_ycksbj();
sb_yc();
system("title 跑酷游戏");
system("mode con cols=50 lines=25");
sb_yd(0,0);
system("cls");
for(int i=0;i<24;i++)
{
cout<
当按下x键时弹出暂停界面,有退出,返回,存档,退出游戏四个选项
在其它界面里只有返回选项
int gq_zt(bool pd)
{
if(pd)
{
system("cls");
cout<<"\n\n\n\n\n\n";
cout<<" 暂停中\n\n\n";
cout<<" 1.退出\n\n\n";
cout<<" 2.返回\n\n\n";
cout<<" 3.存档\n\n\n";
cout<<" 4.退出游戏";
a=0;
a=getch()-'0';
switch(a)
{
case 1 :
{
system("cls");
return a;
break;
}
case 2 :
{
system("cls");
return a;
break;
}
case 3 :
{
system("cls");
return a;
break;
}
case 4 :
{
system("cls");
cout<
就是你们看到的游戏运行函数了
void gq_yx(int x,int y,char z,int l)
{
int x1=x,yy1=y,ax;
sb_yd(x1,yy1);
cout<')
{
sb_yd(x1,yy1);
cout<<" ";
x1=x;
yy1=y;
sb_yd(x1,yy1);
cout<')
{
sb_yd(x1,yy1);
cout<<" ";
x1=x;
yy1=y;
sb_yd(x1,yy1);
cout<')
{
sb_yd(x1,yy1);
cout<<" ";
x1=x;
yy1=y;
sb_yd(x1,yy1);
cout<