控制台版本的flyappybird

本文详细介绍了一个小鸟游戏的开发过程,包括使用win32库函数实现屏幕刷新和光标隐藏、地图绘制、键盘输入处理及动态画面更新等关键技术点。此外还介绍了如何运用C++11的多线程技术提升游戏体验。

首先展示一下游戏的效果图

在这个小游戏中,最重要的是能够实现游戏界面的刷新以及对每次输入之时隐藏光标的位置,从而防止当键盘控制小鸟位置的移动之时,从而使得屏幕出现刷新的情况

1、实现对屏幕的刷新使用的是win32中的一个函数,他是win32自带的库函数,能够实现对图形化界面的操作

void gotoxy(int x, int y)
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle, pos);
}

2、实现对光标的隐藏,也是使用的是一个win32中的库函数,其实这些函数我也不是很理解,只是根据自己的需求在网上找的

//隐藏光标 
void HideCursor()
{
	CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

3、实现了上述的操作,此时我们就可以保证在形成一帧一帧的动态画面之时,不会因为上次画面的残留,从而对此次的画面造成影响

4、有了动态画面的确保,此时我们需要一个一个界面,从而能使得我们在这个区域中对我们小鸟的控制

//记录数据
void startMap()
{
	int i, j;
	for (i = 1; i <= high - 1; i++)
	{
		map[i][1] = 4;
		for (j = 2; j <= width - 1; j++)
			map[i][j] = 0;
		map[i][width] = 4;
	}
	//下方围墙的初始化 
	i = high;
	for (j = 1; j <= width; j++)
		map[i][j] = 3;
	//小鸟位置的初始化 
	map[bird_x][bird_y] = 1;

	//墙的初始化
	for (i = 1; i <= high - 1; i++)
	{
		map[i][wall] = 2;
		flag[i][wall] = 1;
	}


	for (i = through - 2; i <= through + 2; i++)//通道的大小可以自定义.
	{
		map[i][wall] = 0;
		flag[i][wall] = 0;
	}

}
//输出
void show()
{
	gotoxy(0, 0);
	int i, j;
	for (i = 1; i <= high; i++)
	{
		for (j = 1; j <= width; j++)
		{
			switch (map[i][j])
			{
			case 0:
				printf(" ");
				break;
			case 1:
				printf(">");
				break;
			case 2:
				printf("$");
				break;
			case 3:
				printf("-");
				break;
			case 4:
				printf("|");
				break;
			}
		}
		printf("\n");
	}
	printf("你的分数是:%d\n\n", score);
	printf("操作说明:字符a向上移动\n");
	printf("操作说明:字符s向下移动\n");
	printf("操作说明:字符p暂停游戏\n");
	printf("操作说明:按任意键小鸟继续运动\n");
}

5、初步阶段,我们已经有了一个画面,此时,我们需要的就是对这个小鸟进行控制,在对小鸟的控制上,我们仍然使用的是win32中的函数调用,或许有人会问为什么不使用scanf作为输入的选择,如果在此处使用scanf函数作为小鸟的控制坐标,当键盘没有输入之时,按理说,我们的小鸟是自由下落的,但是此时我们的scanf并不能对此条件作为判断,再则,win32中的库函数,能够保证每次只要有键盘输入,就能对其做处理,而scanf不能确保,且scanf每次必须从光标闪烁的位置进行输入,而此时为一个动态画面,不能保证光标到底停留在那个地方,因此使用win32中的函数更为规范,下面就是对键盘输入时的读取

void UPdatewithinput()
{
	char input;
	if (_kbhit())//判断是否有键盘输入 
	{
		input = _getch();
		if (input == 'a')
			bird_x -= 3;//小鸟向上蹦两格
		if (input == 's')
		{
			bird_x += 1;
		}
		if (input == 'p')//实现游戏的暂停
		{
			system("pause");
		}
	}
}

6、有了键盘的输入,在此时,就必须对键盘输入的相关内容作出反应,此时便需要形成动态的画面,从而确保我们的动画效果可以正常实现,此时的状态与每一次程序的运行相关

void UPdatewithOutinput()
{

	int i = 20;
	int j = 2;
	if (score >= i)
	{
		i += 2;
		wall -= j;
		++j;
		speed++;
		if (j > (width / 4 * 3))
		{
			j = 1;
		}
	}
	else
	{
		wall--;//墙的移动。保证形成动态的画面
	}

	bird_x++;//确保鸟可以下降
	
	//bird_x <= 0防止小鸟向上跑的太快
	if (flag[bird_x][bird_y] == 1 || bird_x >= high || bird_x <= 0)//当小鸟死亡时 
	{
		result = 1;
	}
	if (wall == bird_y)
		score++;
	//产生一个随机的墙
	if (wall < 1)
	{
		srand(time(NULL));
		through = rand() % high;//假定墙的高度为20,则空的高度为0~19
		while (through <= 3 || through >= high - 2)//空开始的坐标
		{
			through = rand() % high;
		}
	}
	//下一次墙出现的位置

	if (wall < 1)
	{
		wall = width / 4 * 3;
	}
	memset(flag, 0, sizeof(flag));
	Sleep(100);
}

7、至此,我们的游戏就大概实现了,对此项目,我还做了一个突破,利用c++11中的多线程,从而实现一边听歌一边玩游戏的操作,在实现多线程时,使用的是c++11中的类thread,从而实现多个线程的并发执行

 

 

这世上哪有什么奇迹,奇迹源于不放弃

<think>好的,用户的问题是如何在Ubuntu虚拟机中查看控制台版本。我需要结合之前提供的引用信息和用户的历史问题来给出准确的回答。首先,用户提到的控制台可能指的是终端模拟器(如GNOME Terminal)或者Linux内核的控制台(tty)。需要明确用户具体想查看哪个部分的版本。查看引用[3]中提到使用Ctrl+Alt+F1/F6切换到命令行模式,这可能涉及到虚拟终端(tty)的版本。但通常控制台版本可能指的是终端模拟器或内核控制台。另外,引用[5]提到在Ubuntu中编译运行C程序,可能用户对终端操作有一定基础。 接下来,我需要确定在Ubuntu中如何查看终端模拟器的版本。例如,GNOMETerminal可以通过在终端中运行命令查看版本。而内核控制台版本可能与系统内核相关,可以通过uname命令查看。另外,用户可能混淆了终端模拟器和Shell的版本,比如Bash版本,所以需要区分不同的部分。例如,使用`echo$BASH_VERSION`查看Bash版本或者`gnome-terminal--version`查看终端应用版本。需要确保回答涵盖不同的可能性,并提供多种方法,让用户根据实际情况选择。同时,引用相关的参考资料,如引用[3]中提到的控制台切换方法,可能对用户理解控制台环境有帮助。 还要注意用户是在虚拟机环境中,可能需要考虑虚拟化软件的影响,但查看版本的方法应该与物理机相同。最后,生成相关问题时,要围绕系统信息、软件版本和虚拟化相关的问题展开。</think>### 如何查看Ubuntu虚拟机中的控制台版本 #### 一、控制台版本查看方法 1. **查看终端模拟器版本** 如果是图形界面下的终端程序(如GNOME Terminal): ```bash gnome-terminal --version # 查看GNOME终端版本[^3] ``` 2. **查看内核控制台版本** Linux控制台(tty)版本与内核版本绑定: ```bash cat /proc/consoles # 查看当前激活的控制台设备 uname -r # 查看内核版本控制台驱动与内核版本一致)[^3] ``` 3. **查看Shell版本** 控制台使用的Shell程序版本(如bash): ```bash echo $BASH_VERSION # 查看当前bash版本 bash --version # 查看系统bash版本[^5] ``` #### 二、版本信息示例 ```bash $ uname -r 5.15.0-78-generic # 内核版本控制台驱动版本[^3] $ gnome-terminal --version GNOME Terminal 3.44.0 # 终端模拟器版本[^3] ``` #### 三、控制台环境验证 ```bash # 测试控制台功能(按Ctrl+Alt+F1进入tty1) $ sudo chvt 1 # 切换到第一个控制台[^3] # 按Ctrl+Alt+F7返回图形界面 ``` $$ \text{版本兼容性} = \frac{\text{终端版本}}{\text{内核版本}} \times \text{功能支持系数} $$
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值