devc++跑酷小游戏底层讲解

以3.0.0为例

采集按键:

我们需要一个函数来采集用户按下的按键以便我们执行相应的代码,不能有回显(输入的字符会显示在控制台程序上),不用回车也可以读取到

cin,scanf:

输入的类型为char,可以一次读一个字符有回显需要回车

getchar():

一次读一个字符,能采集用户按下的按键但有回显,且字符需要回车enter才能从缓冲区读取到,先pass(排除)掉

gets():

一次读一行,后面检测会有点麻烦,有回显,也需要回车才能从缓冲区读取到字符,也pass掉

常用的采集用户输入的字符的函数基本用完了,难道真的没有吗?

getch():

一次读一个字符没有回显,也不需要回车也能读取,但不是标准函数移植性相对来说有点差,但能用就行,还要什么自行车,头文件: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<<z;
    for(;;)
	{
		if(kbhit()!=0)
		{
			ax=getch();
			if(ax==224)
			{
				ax=getch();
				if(ax==72) //上箭头
				{
					for(int j=1;j<=4;j++) //限定高度
					{
						_sleep(100);
						if(yy1!=0&&mapp1[l][yy1-1][x1]==' '||mapp1[l][yy1-1][x1]=='$') //判断是否可以跳起来,由于终点没有碰撞体积,所以也能跳上去,mapp1是我的地图数组,一个string类型的二维数组,负责存放地图,l是当前关卡,后面是人物当前的坐标
						{
							sb_yd(x1,yy1);
							cout<<" ";
							yy1--;
							sb_yd(x1,yy1);
							cout<<z;
							if(kbhit()!=0) //判断在跳到过程中有没有移动
							{
								ax=getch();
								if(ax==224)
								{
									ax=getch();
									if(ax==75)
									{
										if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$'&&) //左箭头移动判断,左边是否为空(空格)或者终点
										{
											x1--; //坐标改变
											sb_yd(x1,yy1);
											cout<<z<<" ";
										}
									}
									if(ax==77)
									{
										if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$') //右箭头移动判断
										{
											sb_yd(x1,yy1);
											cout<<" "<<z;
											x1++;
										}
									}
								}
                            }
                        }
                    }
                }
                if(ax==75) //左移动
				{
					if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$')
					{
						x1--;
						sb_yd(x1,yy1);
						cout<<z<<" ";
					}
				}
				if(ax==77) //右移动
				{
					if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$')
					{
						sb_yd(x1,yy1);
						cout<<" "<<z;
						x1++;
					}
				}
            }
        }
    }
}

由于没有用户主动向下移动,所以没写

检测掉落

当玩家正下方为空或为终点时以一定速度往下落,期间玩家可以左右移动但不能跳起来(如果可以的话直接撞到天花板上游戏崩溃,没法解决)

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<<z;
    for(;;)
	{
		if(kbhit()!=0)
		{
			ax=getch();
			if(ax==224)
			{
				ax=getch();
				if(ax==72) //上箭头
				{
					for(int j=1;j<=4;j++)
					{
						_sleep(100); //控制速度
						if(yy1!=0&&mapp1[l][yy1-1][x1]==' '||mapp1[l][yy1-1][x1]=='$') //判断是否可以跳起来,由于终点没有碰撞体积,所以也能跳上去,mapp1是我的地图数组,一个string类型的二维数组,负责存放地图,l是当前关卡,后面是人物当前的坐标
						{
							sb_yd(x1,yy1);
							cout<<" ";
							yy1--;
							sb_yd(x1,yy1);
							cout<<z;
							if(kbhit()!=0) //判断在跳到过程中有没有移动
							{
								ax=getch();
								if(ax==224)
								{
									ax=getch();
									if(ax==75)
									{
										if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$'&&) //左箭头移动判断,左边是否为空(空格)或者终点
										{
											x1--; //坐标改变
											sb_yd(x1,yy1);
											cout<<z<<" ";
										}
									}
									if(ax==77)
									{
										if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$') //右箭头移动判断
										{
											sb_yd(x1,yy1);
											cout<<" "<<z;
											x1++;
										}
									}
								}
                            }
                        }
                    }
                }
                if(ax==75) //左移动
				{
					if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$')
					{
						x1--;
						sb_yd(x1,yy1);
						cout<<z<<" ";
					}
				}
				if(ax==77) //右移动
				{
					if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$')
					{
						sb_yd(x1,yy1);
						cout<<" "<<z;
						x1++;
					}
				}
            }
        }
        while(mapp1[l][yy1+1][x1]==' '||mapp1[l][yy1+1][x1]=='$')
		{
			_sleep(100); //控制速读
	 		sb_yd(x1,yy1);
			cout<<" "; //覆盖
			yy1+=1;
	 		sb_yd(x1,yy1);
	 		cout<<z;
	 		if(kbhit()!=0)
			{
				ax=getch();
				if(ax==224) //检测左右移动
				{
					ax=getch();
					if(ax==75)
					{
						if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$')
						{
							x1--;
							sb_yd(x1,yy1);
							cout<<z<<" ";
						}
					}
					if(ax==77)
					{
						if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$')
						{
							sb_yd(x1,yy1);
							cout<<" "<<z;
							x1++;
						}
					}
				}
            }
        }
    }
}

蹦床

当玩家正下方为蹦床'='时且上方无障碍物时会往上蹦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<<z;
    for(;;)
	{
		if(kbhit()!=0)
		{
			ax=getch();
			if(ax==224)
			{
				ax=getch();
				if(ax==72) //上箭头
				{
					for(int j=1;j<=4;j++)
					{
						_sleep(100); //控制速度
						if(yy1!=0&&mapp1[l][yy1-1][x1]==' '||mapp1[l][yy1-1][x1]=='$') //判断是否可以跳起来,由于终点没有碰撞体积,所以也能跳上去,mapp1是我的地图数组,一个string类型的二维数组,负责存放地图,l是当前关卡,后面是人物当前的坐标
						{
							sb_yd(x1,yy1);
							cout<<" ";
							yy1--;
							sb_yd(x1,yy1);
							cout<<z;
							if(kbhit()!=0) //判断在跳到过程中有没有移动
							{
								ax=getch();
								if(ax==224)
								{
									ax=getch();
									if(ax==75)
									{
										if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$'&&) //左箭头移动判断,左边是否为空(空格)或者终点
										{
											x1--; //坐标改变
											sb_yd(x1,yy1);
											cout<<z<<" ";
										}
									}
									if(ax==77)
									{
										if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$') //右箭头移动判断
										{
											sb_yd(x1,yy1);
											cout<<" "<<z;
											x1++;
										}
									}
								}
                            }
                        }
                    }
                }
                if(ax==75) //左移动
				{
					if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$')
					{
						x1--;
						sb_yd(x1,yy1);
						cout<<z<<" ";
					}
				}
				if(ax==77) //右移动
				{
					if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$')
					{
						sb_yd(x1,yy1);
						cout<<" "<<z;
						x1++;
					}
				}
            }
        }
        while(mapp1[l][yy1+1][x1]==' '||mapp1[l][yy1+1][x1]=='$')
		{
			_sleep(100); //控制速读
	 		sb_yd(x1,yy1);
			cout<<" "; //覆盖
			yy1+=1;
	 		sb_yd(x1,yy1);
	 		cout<<z;
	 		if(kbhit()!=0)
			{
				ax=getch();
				if(ax==224) //检测左右移动
				{
					ax=getch();
					if(ax==75)
					{
						if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$')
						{
							x1--;
							sb_yd(x1,yy1);
							cout<<z<<" ";
						}
					}
					if(ax==77)
					{
						if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$')
						{
							sb_yd(x1,yy1);
							cout<<" "<<z;
							x1++;
						}
					}
				}
            }
        }
        if(mapp1[l][yy1+1][x1]=='=')
	 	{
			for(int j=1;j<=8;j++)
	 		{
	 			if(mapp1[l][yy1-1][x1]==' '||mapp1[l][yy1-1][x1]=='$')
	 			{
	 				_sleep(10); //速度
					sb_yd(x1,yy1);
					cout<<" ";
					yy1--;
					sb_yd(x1,yy1);
					cout<<z;
					if(kbhit()!=0)
					{
						ax=getch();
						if(ax==224)
						{
							ax=getch();
							if(ax==75)
							{
								if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$')
								{
									x1--;
									sb_yd(x1,yy1);
									cout<<z<<" ";
								}
							}
							if(ax==77)
							{
								if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$')
								{
									sb_yd(x1,yy1);
									cout<<" "<<z;
									x1++;
								}
							}
						}
                    }
                }
            }
        }
    }
}

终点检测

如果玩家当前坐标在地图上等于终点'$'时,暂停一小会儿让玩家看清楚到达终点,进行清屏并提示返回

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<<z;
    for(;;)
	{
		if(kbhit()!=0)
		{
			ax=getch();
			if(ax==224)
			{
				ax=getch();
				if(ax==72) //上箭头
				{
					for(int j=1;j<=4;j++)
					{
						_sleep(100); //控制速度
						if(yy1!=0&&mapp1[l][yy1-1][x1]==' '||mapp1[l][yy1-1][x1]=='$') //判断是否可以跳起来,由于终点没有碰撞体积,所以也能跳上去,mapp1是我的地图数组,一个string类型的二维数组,负责存放地图,l是当前关卡,后面是人物当前的坐标
						{
							sb_yd(x1,yy1);
							cout<<" ";
							yy1--;
							sb_yd(x1,yy1);
							cout<<z;
							if(kbhit()!=0) //判断在跳到过程中有没有移动
							{
								ax=getch();
								if(ax==224)
								{
									ax=getch();
									if(ax==75)
									{
										if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$'&&) //左箭头移动判断,左边是否为空(空格)或者终点
										{
											x1--; //坐标改变
											sb_yd(x1,yy1);
											cout<<z<<" ";
										}
									}
									if(ax==77)
									{
										if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$') //右箭头移动判断
										{
											sb_yd(x1,yy1);
											cout<<" "<<z;
											x1++;
										}
									}
								}
                            }
                        }
                    }
                }
                if(ax==75) //左移动
				{
					if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$')
					{
						x1--;
						sb_yd(x1,yy1);
						cout<<z<<" ";
					}
				}
				if(ax==77) //右移动
				{
					if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$')
					{
						sb_yd(x1,yy1);
						cout<<" "<<z;
						x1++;
					}
				}
            }
        }
        while(mapp1[l][yy1+1][x1]==' '||mapp1[l][yy1+1][x1]=='$')
		{
			_sleep(100); //控制速读
	 		sb_yd(x1,yy1);
			cout<<" "; //覆盖
			yy1+=1;
	 		sb_yd(x1,yy1);
	 		cout<<z;
	 		if(kbhit()!=0)
			{
				ax=getch();
				if(ax==224) //检测左右移动
				{
					ax=getch();
					if(ax==75)
					{
						if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$')
						{
							x1--;
							sb_yd(x1,yy1);
							cout<<z<<" ";
						}
					}
					if(ax==77)
					{
						if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$')
						{
							sb_yd(x1,yy1);
							cout<<" "<<z;
							x1++;
						}
					}
				}
            }
        }
        if(mapp1[l][yy1+1][x1]=='=')
	 	{
			for(int j=1;j<=8;j++)
	 		{
	 			if(mapp1[l][yy1-1][x1]==' '||mapp1[l][yy1-1][x1]=='$')
	 			{
	 				_sleep(10); //速度
					sb_yd(x1,yy1);
					cout<<" ";
					yy1--;
					sb_yd(x1,yy1);
					cout<<z;
					if(kbhit()!=0)
					{
						ax=getch();
						if(ax==224)
						{
							ax=getch();
							if(ax==75)
							{
								if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$')
								{
									x1--;
									sb_yd(x1,yy1);
									cout<<z<<" ";
								}
							}
							if(ax==77)
							{
								if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$')
								{
									sb_yd(x1,yy1);
									cout<<" "<<z;
									x1++;
								}
							}
						}
                    }
                }
            }
        }
        if(mapp1[l][yy1][x1]=='$')
		{
			_sleep(10);
			system("cls");
			sb_yd(0,0);
			cout<<"你赢了!"<<endl;
			cout<<"按空格返回。";
			if(getch()==' ')
			{
				system("cls");
				sb_yd(0,0);
				return;
			}
		}
    }
}

重新开始

当玩家正下方为上刺'^'或右边为左刺'<'或左边为右刺'>'或玩家掉到窗口底部时,把人物送回开始点重新开始(跳的代码里我没有设置检测刺的代码,要不然有些关卡我都没法通关)

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<<z;
    for(;;)
	{
		if(kbhit()!=0)
		{
			ax=getch();
			if(ax==224)
			{
				ax=getch();
				if(ax==72) //上箭头
				{
					for(int j=1;j<=4;j++)
					{
						_sleep(100); //控制速度
						if(yy1!=0&&mapp1[l][yy1-1][x1]==' '||mapp1[l][yy1-1][x1]=='$') //判断是否可以跳起来,由于终点没有碰撞体积,所以也能跳上去,mapp1是我的地图数组,一个string类型的二维数组,负责存放地图,l是当前关卡,后面是人物当前的坐标
						{
							sb_yd(x1,yy1);
							cout<<" ";
							yy1--;
							sb_yd(x1,yy1);
							cout<<z;
							if(kbhit()!=0) //判断在跳到过程中有没有移动
							{
								ax=getch();
								if(ax==224)
								{
									ax=getch();
									if(ax==75)
									{
										if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$'&&) //左箭头移动判断,左边是否为空(空格)或者终点
										{
											x1--; //坐标改变
											sb_yd(x1,yy1);
											cout<<z<<" ";
										}
									}
									if(ax==77)
									{
										if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$') //右箭头移动判断
										{
											sb_yd(x1,yy1);
											cout<<" "<<z;
											x1++;
										}
									}
								}
                            }
                        }
                    }
                }
                if(ax==75) //左移动
				{
					if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$')
					{
						x1--;
						sb_yd(x1,yy1);
						cout<<z<<" ";
					}
				}
				if(ax==77) //右移动
				{
					if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$')
					{
						sb_yd(x1,yy1);
						cout<<" "<<z;
						x1++;
					}
				}
            }
        }
        while(mapp1[l][yy1+1][x1]==' '||mapp1[l][yy1+1][x1]=='$')
		{
			_sleep(100); //控制速读
	 		sb_yd(x1,yy1);
			cout<<" "; //覆盖
			yy1+=1;
	 		sb_yd(x1,yy1);
	 		cout<<z;
	 		if(kbhit()!=0)
			{
				ax=getch();
				if(ax==224) //检测左右移动
				{
					ax=getch();
					if(ax==75)
					{
						if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$')
						{
							x1--;
							sb_yd(x1,yy1);
							cout<<z<<" ";
						}
					}
					if(ax==77)
					{
						if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$')
						{
							sb_yd(x1,yy1);
							cout<<" "<<z;
							x1++;
						}
					}
				}
            }
            if(mapp1[l][yy1+1][x1]=='^'||mapp1[l][yy1][x1+1]=='<'||mapp1[l][yy1][x1-1]=='>')
		{
			sb_yd(x1,yy1);
			cout<<" ";
			x1=x;
			yy1=y;
			sb_yd(x1,yy1);
			cout<<z;
		}
        }
        if(mapp1[l][yy1+1][x1]=='=')
	 	{
			for(int j=1;j<=8;j++)
	 		{
	 			if(mapp1[l][yy1-1][x1]==' '||mapp1[l][yy1-1][x1]=='$')
	 			{
	 				_sleep(10); //速度
					sb_yd(x1,yy1);
					cout<<" ";
					yy1--;
					sb_yd(x1,yy1);
					cout<<z;
					if(kbhit()!=0)
					{
						ax=getch();
						if(ax==224)
						{
							ax=getch();
							if(ax==75)
							{
								if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$')
								{
									x1--;
									sb_yd(x1,yy1);
									cout<<z<<" ";
								}
							}
							if(ax==77)
							{
								if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$')
								{
									sb_yd(x1,yy1);
									cout<<" "<<z;
									x1++;
								}
							}
						}
                    }
                    if(mapp1[l][yy1+1][x1]=='^'||mapp1[l][yy1][x1+1]=='<'||mapp1[l][yy1][x1-1]=='>')
		{
			sb_yd(x1,yy1);
			cout<<" ";
			x1=x;
			yy1=y;
			sb_yd(x1,yy1);
			cout<<z;
		}
                }
            }
        }
        if(mapp1[l][yy1+1][x1]=='^'||mapp1[l][yy1][x1+1]=='<'||mapp1[l][yy1][x1-1]=='>')
		{
			sb_yd(x1,yy1);
			cout<<" ";
			x1=x;
			yy1=y;
			sb_yd(x1,yy1);
			cout<<z;
		}
        if(mapp1[l][yy1][x1]=='$')
		{
			_sleep(10);
			system("cls");
			sb_yd(0,0);
			cout<<"你赢了!"<<endl;
			cout<<"按空格返回。";
			if(getch()==' ')
			{
				system("cls");
				sb_yd(0,0);
				return;
			}
		}
    }
}

功能键

刷新键:'z'

当按下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<<mapp1[l][i]<<endl;
		}
		cout<<mapp1[l][24];
		sb_yd(x,y);
		cout<<z;
	}
	else //有两个模式,上面的用于关卡内刷新,下面的用于其它界面的刷新
	{
		system("cls");
		cout<<"刷新中...";
		sb_ycksbj();
		sb_yc();
		system("title 跑酷游戏");
		system("mode con cols=50 lines=25");
		system("cls");
	}
	return;
} 
暂停键:'x'

当按下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<<endl<<endl<<"    再见!    "<<endl<<endl;
				_sleep(750);
				system("cls");
				exit(0);
				break; 
			}
			default:
			{
				break;
			}
		}
	}	
	else //两个模式,上面是关卡内暂停,下面是其它界面暂停
	{
		system("cls");
		cout<<"\n\n\n\n\n\n\n\n\n\n\n\n\n";
		cout<<"                       暂停中"<<endl;
		cout<<"                      空格返回";
		for(;;)
		{
			if(getch()==' ')
			return 0;
		}
	}
	return 0; 
} 
加入游戏运行代码中

就是你们看到的游戏运行函数了

void gq_yx(int x,int y,char z,int l)
{
	int x1=x,yy1=y,ax;
	sb_yd(x1,yy1);
	cout<<z;
	for(;;)
	{
		if(kbhit()!=0)
		{
			ax=getch();
			if(ax==224)
			{
				ax=getch();
				if(ax==72)
				{
					for(int j=1;j<=4;j++)
					{
						_sleep(100);
						if(yy1!=0&&mapp1[l][yy1-1][x1]==' '||mapp1[l][yy1-1][x1]=='$'&&mapp1[l][yy1-1][x1]!='|')
						{
							sb_yd(x1,yy1);
							cout<<" ";
							yy1--;
							sb_yd(x1,yy1);
							cout<<z;
							if(kbhit()!=0)
							{
								ax=getch();
								if(ax==224)
								{
									ax=getch();
									if(ax==75)
									{
										if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$'&&mapp1[l][yy1][x1-1]!='|')
										{
											x1--;
											sb_yd(x1,yy1);
											cout<<z<<" ";
										}
									}
									if(ax==77)
									{
										if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$'&&mapp1[l][yy1][x1+1]!='|')
										{
											sb_yd(x1,yy1);
											cout<<" "<<z;
											x1++;
										}
									}
								}
								if(ax==122||ax==90)
								{
									system("cls");
									gq_sx(x1,yy1,z,l,1);
								}
								
							} 
						}
					}
				}
				if(ax==75)
				{
					if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$'&&mapp1[l][yy1][x1-1]!='|')
					{
						x1--;
						sb_yd(x1,yy1);
						cout<<z<<" ";
					}
				}
				if(ax==77)
				{
					if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$'&&mapp1[l][yy1][x1+1]!='|')
					{
						sb_yd(x1,yy1);
						cout<<" "<<z;
						x1++;
					}
				}
			}
			if(ax==122||ax==90)
			{
				system("cls");
				gq_sx(x1,yy1,z,l,1);
			}
		}
 		while(mapp1[l][yy1+1][x1]==' '||mapp1[l][yy1+1][x1]=='$')
		{
			_sleep(100);
	 		sb_yd(x1,yy1);
			cout<<" ";
			yy1+=1;
	 		sb_yd(x1,yy1);
	 		cout<<z;
	 		if(kbhit()!=0)
			{
				ax=getch();
				if(ax==224)
				{
					ax=getch();
					if(ax==75)
					{
						if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$'&&mapp1[l][yy1][x1-1]!='|')
						{
							x1--;
							sb_yd(x1,yy1);
							cout<<z<<" ";
						}
					}
					if(ax==77)
					{
						if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$'&&mapp1[l][yy1][x1+1]!='|')
						{
							sb_yd(x1,yy1);
							cout<<" "<<z;
							x1++;
						}
					}
				}
				if(ax==122||ax==90)
				{
					system("cls");
					gq_sx(x1,yy1,z,l,1);
				}
			}
			if(mapp1[l][yy1+1][x1]=='^'||mapp1[l][yy1][x1+1]=='<'||mapp1[l][yy1][x1-1]=='>')
			{
				sb_yd(x1,yy1);
				cout<<" ";
				x1=x;
				yy1=y;
				sb_yd(x1,yy1);
				cout<<z;
			} 
		} 
		if(mapp1[l][yy1+1][x1]=='=')
	 	{
	 		int jc=1;
			for(int j=1;j<=8;j++)
	 		{
	 			if(mapp1[l][yy1-1][x1]==' ')
	 			{
	 				_sleep(10);
					sb_yd(x1,yy1);
					cout<<" ";
					yy1--;
					sb_yd(x1,yy1);
					cout<<z;
					if(kbhit()!=0)
					{
						ax=getch();
						if(ax==224)
						{
							ax=getch();
							if(ax==75)
							{
								if(x1!=0&&mapp1[l][yy1][x1-1]==' '||mapp1[l][yy1][x1-1]=='$'&&mapp1[l][yy1][x1-1]!='|')
								{
									x1--;
									sb_yd(x1,yy1);
									cout<<z<<" ";
								}
							}
							if(ax==77)
							{
								if(x1!=49&&mapp1[l][yy1][x1+1]==' '||mapp1[l][yy1][x1+1]=='$'&&mapp1[l][yy1][x1+1]!='|')
								{
									sb_yd(x1,yy1);
									cout<<" "<<z;
									x1++;
								}
							}
						}
						if(ax==122||ax==90)
						{
							system("cls");
							gq_sx(x1,yy1,z,l,1);
						}
					} 
				}
				if(mapp1[l][yy1+1][x1]=='^'||mapp1[l][yy1][x1+1]=='<'||mapp1[l][yy1][x1-1]=='>')
				{
					sb_yd(x1,yy1);
					cout<<" ";
					x1=x;
					yy1=y;
					sb_yd(x1,yy1);
					cout<<z;
				}
			} 
		}	
		if(mapp1[l][yy1+1][x1]=='^'||mapp1[l][yy1][x1+1]=='<'||mapp1[l][yy1][x1-1]=='>')
		{
			sb_yd(x1,yy1);
			cout<<" ";
			x1=x;
			yy1=y;
			sb_yd(x1,yy1);
			cout<<z;
		}
		if(ax==120||ax==88)
		{
			switch(gq_zt(1))
			{
				case 0 :
				{
					break;
				}
				case 1 :
				{
					return;
					break;
				}
				case 2 :
				{
					ax=0;
					for(int i=0;i<24;i++)
					{
						cout<<mapp1[l][i]<<endl;
					}
					cout<<mapp1[l][24];
					sb_yd(x1,yy1);
					cout<<z;
					break;
				}
				case 3 :
				{
					break;
				}
				case 4 :
				{
					system("cls");
					system("mode con cols=15 lines=5");
					cout<<endl<<endl<<"     再见!    "<<endl<<endl;
					_sleep(750);
					system("cls");
					exit(0);
					break; 
				}
			}
		}
		if(mapp1[l][yy1][x1]=='$')
		{
			_sleep(10);
			system("cls");
			sb_yd(0,0);
			cout<<"你赢了!"<<endl;
			cout<<"按空格返回。";
			if(getch()==' ')
			{
				system("cls");
				sb_yd(0,0);
				return;
			}
		}
	}
}

  • 43
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值