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

MIPI CSI-2 协议解析

CSI-2标准协议前言一、Overview of CSI-2二、CSI-2 layer Definitions三、 Camera Control Interface(CCI)3.1 数据传输协议(Data Transfer Protocol)3.1.1 消息类型(Message Type)3.1.2 读写操作(Read/Write Operations)3.1.2.1 随机位置单次读3.1.2.2 当前位置单次读3.1.2.3 随机位置连续读3.1.2.4 当前位置连续读3.1.2.5 随机位置单次写3.1

Lucky 3万+

Sparse4Dv3 代码复现

打包数据集的元信息和标签,并生成所需的.pkl文件。最后还输出了很多跟踪相关的东西...然后通过K-means生成锚点。编译可变形聚合CUDA算子。安装motmetrics。

m0_60857098的博客 4487

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

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

李兴球的专栏 670

激光SLAM总结——Fast LIO / Fast LIO2 / Faster LIO

激光SLAM总结——Fast LIO / Fast LIO2 / Faster LIO 在之前的工作中有接触过LOAM,最近在工作中又接触到Faster LIO相关的工作,于是想着对Fast LIO / Fast LIO2 / Faster LIO这一系列工作进行一个简单的总结,以加深自己对激光SLAM算法的理解,之前总结过的一些和激光SLAM算法相关的博客还有,感兴趣的同学可以一起学习讨论: 激光SLAM总结——VLOAM / LIMO算法解析 激光SLAM总结——LIO-Mapping / LIOM /

weixin_44580210的博客 1万+

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

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

bigzql的博客 1万+

如何评估一颗 AI 芯片的真实性能?TOPS、FPS 与 Token/sec 全解析

AI 芯片在实际部署中,其理论峰值性能往往无法反映真实执行效率。如何科学评估一颗 AI 芯片的“真实性能”,已成为芯片选型与系统集成环节中的关键技术问题。本文从工程实战角度出发,深入拆解当前常用性能评估指标(TOPS、FPS、Token/sec)背后的定义逻辑与使用陷阱,并结合推理模型部署与执行路径,系统讲解 AI 芯片在不同场景下的性能验证方法。通过对芯片算力-功耗-调度三维关系的分析,读者将掌握评估一颗 AI 芯片是否“跑得动业务”的核心判断能力。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3393

MCGSPro动画部件实战:用文本分段实现智能报警提示(附工程文件)

本文详细介绍了在MCGSPro组态软件中,如何利用动画部件的文本分段功能,高效实现触摸屏上的智能报警提示。通过绑定整数变量作为索引,一个部件即可动态切换多种状态信息,解决了传统方法画面臃肿、维护繁琐的痛点。文章提供了从变量定义、部件配置到逻辑联动的完整实战教程,并分享了工程文件复用与性能优化技巧。

weixin_28347369的博客 167

Java/python学习之路

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

charles_uidx的博客 161

【2026最新】3分钟Windows极速部署OpenClaw,完整可复制命令+全链路避坑指南

很多新手在Windows环境部署OpenClaw时,总会遇到各种玄学问题:WSL环境配置失败、Docker镜像拉取超时、容器启动后无法访问、权限报错、数据丢失……网上大量教程要么是Linux环境的,要么是早已过时的旧版本配置,照着操作不仅没法3分钟部署,反而要花几小时踩坑填坑。

2601_94871597的博客 494

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

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

2401_88157873的博客 1293

halcon第一讲:基本操作

本文通过Blob分析提取出图片中的硬币,来熟悉halcon的基本操作。 1、读取图像,halcon读取图像有三种方式:1)、文件-&gt;读取图像;2)、通过助手;3)、代码 *打开窗口 dev_open_window (0, 0, 512, 512, 'black', WindowHandle) *读取图像 read_image (Image,'1.png') 读取的图像如下: 2...

qq_24946843的博客 3万+

把 MCP Server 直接装进 SAP ABAP:用 Unlimited Display Tools 打通 Agentic SDK 与 SAP ECC / S/4HANA 的最后一公里

摘要:AI与SAP集成的MCP解决方案 企业在AI集成中面临工具链复杂、数据对接繁琐的挑战。Model Context Protocol (MCP)通过标准化工具与数据暴露方式,将集成复杂度从N×M降至N+M。在SAP生态中,MCP Server for SAP直接部署于ABAP层,利用DDIC/CDS视图对接各类Agent SDK,避免中间件风险。 MCP核心包含三类对象: Tools:带元数据的可执行动作 Resources:结构化上下文数据 Prompts:可参数化提示模板 ABAP层实现MCP Se

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 683
上一篇: 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、付费专栏及课程。

余额充值