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

news2025/1/20 1:59:41

以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;
			}
		}
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1458116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ETL数据集成工具DataX、Kettle、ETLCloud特点对比

ETL数据集成工具 对于数据仓库&#xff0c;大数据集成类应用&#xff0c;通常会采用ETL工具辅助完成。ETL&#xff0c;是英文 Extract-Transform-Load 的缩写&#xff0c;用来描述将数据从来源端经过抽取(extract) 、交互转换(transform) 、加载(load)至的端的过程当前的很多应…

算法练习-每日气温【单调栈】(思路+流程图+代码)

难度参考 难度&#xff1a;困难 分类&#xff1a;单调栈 难度与分类由我所参与的培训课程提供&#xff0c;但需 要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0c;…

npm run dev运行出现NODE_OPTIONS=--max_old_space_size=4096 vite --mode dev --host?

问题描述 PS E:\AWorkDataease\DataEase\core\core-frontend> npm run dev dataease0.0.0 dev NODE_OPTIONS–max_old_space_size4096 vite --mode dev --host 0.0.0.0 ‘NODE_OPTIONS’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 解决方案 遇到…

【8】知识加工

一、概述 对信息抽取/知识融合后得到的“事实”进行知识推理以拓展现有知识、得到新知识。 知识加工主要包括三方面内容&#xff1a;本体构建、知识推理和质量评估。 二、本体构建 1.本体 定义&#xff1a;本体是用于描述一个领域的术语集合&#xff0c;其组织结构是层次结…

Python数据科学:线性回归

4.5线性回归 线性回归是解决回归问题的常用模型。 实例&#xff1a;简单线性回归 def skLearn13():线性回归:return:#简单的一元一次方程#斜率为a,截距为b#yaxb#创建线性数据rng np.random.RandomState(0)x 10 * rng.rand(50)y 2*x - 5 rng.randn(50)#绘制数据集plt.sca…

osqp-eigen学习

OSQP文档学习 参考博客&#xff1a; &#xff08;1&#xff09;二次规划&#xff08;QP&#xff09;与OSQP求解器 &#xff08;2&#xff09;如何使用OSQP-Eigen osqp-eigen 1 osqp-eigen接口 以下列问题的求解为例&#xff1a; s.t. 1 ≤ x 1 ≤ 1.5 1≤x_1≤1.5 1≤x1​≤…

【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),代码实现篇

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

Linux-目录I/O-004

学习重点&#xff1a; 1.目录I/O的函数接口 2.目录的遍历&#xff0c;目录的递归遍历 1.【mkdir】 1.1函数原型 【int mkdir(const char *pathname, mode_t mode);】1.2函数功能 创建目录文件1.3函数参数 1.3.1【pathname】 文件路径1.3.2【mode】 文件的权限1.4返回值 …

区块链 之 默克尔树

默克尔树简介 欢迎阅读 BTC网络 之 区块裁剪 什么是默克尔树&#xff1f; 默克尔树&#xff08;Merkle Tree&#xff09;是一种树状数据结构&#xff0c;被广泛用于比特币等区块链系统中&#xff0c;用于高效地组织和验证数据的完整性。这个树状结构由唯一的根哈希值标识&am…

matplotlib图例使用案例1.1:在不同行或列的图例上添加title

我们将图例进行行显示或者列显示后&#xff0c;只能想继续赋予不同行或者列不同的title来进行分类。比较简单的方式&#xff0c;就是通过ax.annotate方法添加标签&#xff0c;这样方法复用率比较低&#xff0c;每次使用都要微调ax.annotate的显示位置。比较方便的方法是在案例1…

PyTorch使用Tricks:Dropout,R-Dropout和Multi-Sample Dropout等 !!

文章目录 1、为什么使用Dropout&#xff1f; 2、Dropout的拓展1&#xff1a;R-Dropout 3、Dropout的拓展2&#xff1a;Multi-Sample Dropout 4、Dropout的拓展3&#xff1a;DropConnect 5、Dropout的拓展4&#xff1a;Standout 6、Dropout的拓展5&#xff1a;Gaussian Dropout …

微信小程序开发:通过wx.login()获取用户唯一标识openid和unionid

下面代码展示了 openid 的获取过程。 想获取 unionid 需要满足条件&#xff1a;小程序已绑定到微信开放平台账号下&#xff0c;不然只会返回 openid。 【相关文档】 微信小程序开发&#xff1a;appid 和 secret 的获取方法 wx.login({success (res) {if (res.code) {// 发起网…

十二:枚举与注解

文章目录 01、枚举类的使用1.1、枚举类的理解1.2、自定义枚举类1.3、使用enum关键字定义枚举类1.4、Enum类中的常用方法1.5、使用enum关键字定义的枚举类实现接口 02、注解的使用2.1、注解的理解2.3、如何自定义注解2.4、jdk中4个基本的元注解的使用12.5、jdk中4个基本的元注解…

解锁创意灵感,探索FlutterExampleApps项目的奥秘

解锁创意灵感&#xff0c;探索FlutterExampleApps项目的奥秘 项目简介 FlutterExampleApps项目是一个包含各种示例应用链接的仓库&#xff0c;旨在演示Flutter应用开发中的各种功能、特性和集成。 项目包含了以下几个部分&#xff0c;每个部分都涵盖了不同的内容和主题&…

VO、DTO、DO、BO、PO

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 VO、DTO、DO、BO1.概念阿里Java开发手册分层领域模型&#xff1a; 2. VO 和 DTO 使用场景以下是一个使用VO和DTO的典型案例&#xff1a; 3.BO和DTO的区别 案例 VO、…

分享两个版本的数字孪生技术栈,都是AI回答的,较为精准

版本一&#xff1a; 数字孪生应用到的技术栈包括但不限于&#xff1a; 3D建模&#xff1a;数字孪生需要建立虚拟的三维模型&#xff0c;因此需要使用3D建模软件如AutoCAD、SketchUp、3ds Max等。 数据采集&#xff1a;数字孪生需要采集大量实时的物理数据&#xff0c;如传感…

为什么从没有负值的数据中绘制的小提琴图(Violin Plot)会出现负值部分?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 小提琴图&#xff08;Violin Plot&#xff09; 是一种用于展示和比较数据分布的可视化工具。它结合了箱形图&#xff08;Box Plot&#xff09;和密度图&#xff08;Kernel Density Plot&#xff09;的特…

hive load data未正确读取到日期

1.源数据CSV文件日期字段值&#xff1a; 2.hive DDL语句&#xff1a; CREATE EXTERNAL TABLE test.textfile_table1(id int COMMENT ????, name string COMMENT ??, gender string COMMENT ??, birthday date COMMENT ????,.......) ROW FORMAT SERDE org.apache.…

QT中事件过滤器

Qt添加事件过滤器&#xff0c;设置拖放listWidget、TreeWidget、TableWidget控件。 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this)…

UML---活动图

活动图概述 活动图&#xff08;Activity Diagram&#xff09;是UML&#xff08;Unified Modeling Language&#xff0c;统一建模语言&#xff09;中的一种行为建模工具&#xff0c;主要用于描述系统或业务流程中的一系列活动或操作。活动图通常用于描述用例中的行为&#xff0c…