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

c++ 小游戏 NO6 跑酷游戏 最后一章有惊喜: int ti(float a) { return ((int)(a*10+5))/10; } void Setpos(float x,float y) { COORD pos; pos.X=ti(y*4)/2; pos.Y=ti(x); SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); } void Color(int a) { if(a==0) SetConsoleTextAttribute(G. 阅读详情

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

如何使用c++制作一个跑酷游戏 跑酷游戏主要考验玩家反应速度和操作技巧,因此需要设置不同的关卡,并增加难度,让玩家体验到挑战和成就感。在跑酷游戏中,角色的状态包括站立、奔跑、跳跃、下滑等,需要在状态机中进行管理。} else if (i == obstacle.y && j == obstacle.x) { // 绘制障碍物。if (role.x == obstacle.x && role.y == obstacle.y) { // 碰撞检测。if (i == role.y && j == role.x) { // 绘制角色。 阅读详情

相关推荐

Dev-C++配置EasyX图形库完整指南:从原理到实践

图形编程是计算机科学中可视化交互的重要领域,其核心原理是通过调用底层图形接口实现像素级绘制。在Windows平台,GDI(图形设备接口)是基础的图形系统API,而EasyX库正是对GDI的高度封装,极大简化了图形编程的学习曲线。对于使用Dev-C++搭配MinGW编译器的开发者,由于EasyX官方仅支持MSVC编译器,直接集成会遇到库文件格式不兼容的技术障碍。通过适配层方案,将MSVC格式的静态库转换为MinGW可识别的.a格式,成功解决了这一跨编译器兼容性问题。本指南基于Dev-C++ 5.11和TDM-

weixin_26749245的博客 274

C++跑酷小游戏

直接上代码 #include<bits/stdc++.h> #include<windows.h> #include<stdio.h> #include<conio.h> #include<time.h> #define Nor if(B[b].x<5) B[b].x=5; #define Out1 Bx1-Bvx1<=6||Bx1-Bvx1>=28||By1-Bvy1<=7||By1-Bvy1>=27 #defin

风斯在下 6万+

Dev C++ 入门指南:从下载安装到第一个C++程序

集成开发环境(IDE)是编程学习的起点,它把代码编辑、编译和运行整合为一条完整链路。Dev C++ 作为轻量级IDE,底层基于GCC编译器中的g++,封装了预处理、编译、汇编和链接全过程,让新手无需手动配置环境变量或构建系统,即可专注C++语法本身。相比Visual Studio与VSCode,它安装包小、启动快、上手轻松,适合高校课程、算法练习和C++小游戏开发。从Hello World到猜数字程序,从编译标准配置到中文乱码排查,掌握Dev C++不仅有助于理解程序从源码到可执行文件的转换原理,也为后续迁

weixin_34357928的博客 444

c++跑酷游戏

/ 定义游戏角色的位置。// 更新游戏角色的位置。// 定义游戏窗口大小。// 初始化游戏地图。

yang21198的博客 793

DevC++贪吃蛇开发实战:从环境配置到核心代码实现

C语言作为广泛应用的基础编程语言,其学习过程中通过控制台小游戏实践能有效巩固数组、指针和结构体等核心语法。贪吃蛇是经典的控制台应用,其开发涉及游戏逻辑建模、数据结构设计以及系统接口调用等技术要点。本文将基于DevC++开发环境,从零讲解一个完整贪吃蛇项目的实现过程,涵盖环境配置、坐标定位、蛇身移动算法、方向键检测等关键环节,并针对方向键无响应、中文乱码及游戏节奏异常等高频问题给出解决思路。无论是刚学完C语言、想通过项目提升编码能力的入门者,还是需要完成课程设计的学生,都可以从中获得可直接参考的完整方案。

weixin_31509753的博客 334

DevC++贪吃蛇小游戏:C语言课设图形化项目实战指南

C语言课设中,图形界面项目往往比控制台程序更具展示价值,而贪吃蛇正是平衡实现难度与呈现效果的经典选择。这类项目依赖底层图形库(如graphics.h)完成窗口创建与元素绘制,其核心是一个由输入、更新、渲染构成的游戏循环。掌握二维数组管理蛇身、随机数生成食物、键盘事件控制方向等基础原理,既是理解大型游戏程序的敲门砖,也是锻炼C语言综合能力的理想路径。从高校课程设计到编程入门练手,一个功能完整的图形化贪吃蛇项目,能够系统串联数组、指针、循环与结构化编程思维。本文基于实际交付经验,围绕DevC++环境下的图形库配

weixin_31032799的博客 98

除了EGE,还有哪些图形库能在DevC++里用?SFML/OpenGL配置横向对比

本文详细对比了DevC++环境下五种图形库(包括SFML、SDL、OpenGL等)的配置与实战应用,帮助开发者根据项目需求选择最适合的工具。从基础教学到专业3D开发,涵盖各库的下载、安装及配置步骤,提升开发效率与图形处理能力。

看看我都干了些啥! 472

C++跑酷游戏(可运行)

C++跑酷游戏(可运行)

pxC++编辑器简介与C++ Sprites简介2025年12月15号版

你可以去和学校联系开C++课程,帮这个学校打造成信奥强校,一般来讲会打字并且认识英语字母就可以学C++了,挑些底子好的学生,从三年级左右开始学,学个4年到初中参加CSP-J/S,那么“成功”是必然的。它由QT5开发,采用简洁的界面设计,集成TDM-GCC 10.3.0 64-bit编译器,更重要的是集成了便捷易用的C++ Sprites(精灵)库,让学习者无需复杂配置,就能通过简单的代码快速实现图形绘制、交互小动画甚至趣味小游戏制作。在这里bug是一个角色的名字,而0表示颜色的色相值,即红色。

李兴球的专栏 536

c++忍者跑酷小游戏(转载)

此文件乃txt文档,下载后只需复制到dev-c++新建的cpp文件中编译运行即可

C++小游戏源码之-跑酷游戏.cpp

C++小游戏源码,可供学习及设计参考。

基于C++控制台Windows平台的植物大战僵尸小游戏代码及文档

基于C++控制台Windows平台的植物大战僵尸小游戏代码及文档 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在这个数字娱乐日益丰富的时代,开源游戏项目为爱好者们提供了无限的创意空间和学习机会。今天,我们为您推荐一款基于C++控制台(Windows平台)的植物大战僵尸小游戏。这款游戏不仅重现了经典植物大战僵尸的乐趣,还提供了完整的代码和文档,让每一位有志于游戏开发的...

gitblog_06757的博客 503

c++编写天天酷跑游戏

c++编写天天酷跑游戏图片资源

c++小游戏忍者必须死+关机

忍者必须死+关机

jinruitao的博客 758

免费获取船舶轨迹数据?手把手教你用Python处理中国海洋卫星AIS数据

本文详细介绍了如何免费获取中国海洋卫星AIS数据,并使用Python进行船舶轨迹数据的处理与分析。从数据源评估到自动化处理流水线,再到高级分析与可视化技巧,手把手教你避开常见问题,实现高效数据处理。特别适合航运数据分析、物流优化和海上安全研究等领域的研究者和开发者。

weixin_42616115的博客 320

别再只怪贴片厂了!从MLCC内部裂纹,看懂物料质量与工艺应力的博弈

本文深入分析了MLCC内部裂纹的失效原因,提供了从裂纹形态学到生产全流程的失效风险地图的完整分析框架。通过实战案例和检测技术组合,帮助工程师精准锁定MLCC失效背后的真凶,优化物料质量和工艺应力管理。

weixin_33122947的博客 293

C++精灵库十问十答(C++精灵库简介,C++精灵库下载,C++精灵库教程)

6. 拓展性强,衔接进阶:基于SDL2库开发,C++精灵库的程序可无缝融入SDL2库命令,轻松实现更高级的图形、动画功能,既能满足入门阶段的学习需求,也能衔接后续更深入的C++开发学习,形成“入门-进阶-提升”的完整学习路径,避免学习资源的浪费。同时需注意,C++精灵库是入门工具,而非“捷径”:若想深入学习C++编程,掌握其核心语法、高级功能及实际应用,后续仍需系统学习相关知识,但C++精灵库能为这份深入学习打下坚实的信心基础、激发持续的兴趣,这也是其不可替代的重要价值。

李兴球的专栏 670

STM32实战:如何用GPS信号同时同步海康摄像头和Livox Mid-360雷达(附完整接线图)

本文详细介绍了如何利用STM32实现GPS信号分频,同步海康摄像头和Livox Mid-360雷达的时间同步方案。通过硬件架构设计、STM32信号处理核心实现及设备接口规范,解决了多传感器数据融合中的时间对齐难题,适用于自动驾驶和机器人导航领域。

weixin_29182481的博客 596

大学生C语言第一课,C语言的过去与未来

C语言的历史欢迎来到C语言的世界!C语言是一种强大的专业化编程语言,深受业余和专业编程人员的欢迎。在学习之前先让我们了解和认识它!C语言的原型是A语言(ALGOL语言)。1963年,剑桥...

bigzql的博客 1万+

ABAP 里的 XML 与 JSON 处理,一套从接口落地到 Clean Core 的完整参考

ABAP 里的 XML 和 JSON 处理并不只是几段工具类调用。iXML、sXML、、XCO、、code page conversion、GZIP、对象序列化,这些能力背后对应的是不同的数据规模、访问模式、接口契约和运行时边界。小报文、复杂树结构、需要修改节点,iXML 很顺手。大报文、顺序读写、内存敏感,sXML 更可靠。ABAP 结构和 XML、JSON 之间要做标准转换,是主干。现代 JSON API、ABAP Cloud、命名转换,XCO 值得优先考虑。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 224

Python 爬虫实战:赛事分析平台构建与比赛数据抓取

在体育赛事日益丰富的今天,对比赛数据的收集与分析对于运动员、教练团队以及体育爱好者都具有重要意义。通过构建一个赛事分析平台,我们可以系统地抓取、整理和展示各类比赛数据,为用户提供全面的赛事洞察。本文将深入讲解如何利用 Python 爬虫技术实现这一平台的构建,涵盖从目标网站分析到数据可视化展示的全过程。

u014481728的博客 3180

Java/python学习之路

BackGround 背景 作为专业是计算机的学生,不会几门编程语言感觉还是比较丢人 目前大四毕业了,凭借着在学校写的C语言代码和基础的C++知识找到一份工作,在深圳。 但是总是觉得少点什么。 在学校拿着C语言写硬件,也接触过其他的比如VHDL。相应的也用过不少开发的软件,QT、quartus II,eclipse,DevC++。 都没有接触过类似于VS,IDEA类似的开发软件。还有,在学校中也写过Java的代码,写过python的代码。说个笑话,我毕设用的代码是python框架,但是编程用的是C

charles_uidx的博客 161

Open3D 进阶(22)间接平差法拟合空间曲线

空间曲线拟合在电力线三维重建中有着广泛的应用,本文利用python使用间接平差法对三维空间曲线的拟合进行代码实现。

点云侠的博客 1058

浙大翁凯C语言网课笔记自整理——C语言入门必看(持更)

编程语言 (1950)Fortran(放弃)→BCPL(简化)→B语言(改造,充分发挥性能)→C语言。在没学编程语言时也许还是看不懂。其实上述程序是在用辗转相除法,计算32和26的最大公约数。为了玩小游戏Space Travel,需要在电脑上使用小型的操作系统。与计算机交流的方式:使用计算机语言写出的程序,以程序告诉计算机步骤。我们需要借助工具将ta转化成我们能看懂的样子↓。而当时只有大型机GE-645,以及对应的。对机器指令的直接翻译,是很底层的语言。以上:计算机--程序--算法。计算机懂什么语言呢?

2401_88157873的博客 1293

2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)

2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)

王老师青少年编程 990

Linux系统安全学习手册

Linux反弹shell Linux系统应急响应 Linux服务器安全加固 Linux下的用户、组和权限 Linux中的gcc Linux中su和sudo的用法和区别 Linux系统python2与python3共存 Linux中grep工具的使用 Linux中环境变量的设置 Linux中常见的150个命令(干货) Linux中编写Shell脚本 LNMP环境搭建Wordpress博客 LAMP环境搭建一个Discuz论坛 Linux运维比较常用的一些脚本 Linux系统中安装软

谢公子的博客 7532
上一篇: devc++跑酷小游戏3.0.0
下一篇: 信息学奥赛一本通1188:菲波那契数列(2)
Jsjjsnmsk
博客等级 码龄4年 548粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值