YangW

无为,无我,无欲,居下,清虚,自然

同时执行两个或更多功能的方法

我留意到群里和贴吧有不少人都在问怎样同时执行两个过程,比如:

  1. 贪吃蛇游戏,怎样实现双人对抗?就是控制两条蛇移动。
  2. 俄罗斯方块游戏,要加一个时钟,怎样使时钟和游戏同时进行?
  3. 打砖块游戏,怎样实现一边让小球自由移动、一边实现玩家控制木板?

有些人会想到用多线程来解决。我这里首先要说:这个问题不要用多线程,多线程要解决是另一种问题,这里不再详述,本文只讲一下怎样实现前面说的问题。(当然不用多线程解决)

先说一个简单的程序要求:有一个变量 a,初值为 0,每秒钟增加 2,按任意键停止;还有一个变量 b,初值为 0,每秒钟增加 3。现在要求将这两个功能同时执行,该怎么做?

我相信很多人都能写出来这个简单的程序:

#include <stdio.h>
#include <conio.h>
#include <graphics.h>

void main()
{
	// 初始化 a、b 两个数据
	int a = 0;
	int b = 0;

	while(!kbhit())		// 主循环,按任意键退出
	{
		/////////////////////////////////
		// 处理数据

		// 处理 a
		a += 2;
		printf("%d, ", a);

		// 处理 b
		b += 3;
		printf("%d\n", b);

		/////////////////////////////////
		// 延时
		Sleep(1000);
	}
}

在这个程序中,a 和 b 就相当于两条独立运动的蛇,按照这种逻辑结构,可以很容易实现两个人同时控制两条蛇,程序结构如下:

	while(循环条件)		// 主循环
	{
		/////////////////////////////////
		// 获取用户控制
		(取得用户的键盘输入,例如方向键或 a s d w 等)


		/////////////////////////////////
		// 处理数据
		
		// 处理蛇 a 的移动
		(根据用户的键盘输入,将蛇 a 移动一步)

		// 处理蛇 b 的移动
		(根据用户的键盘输入,将蛇 b 移动一步)


		/////////////////////////////////
		// 延时
		Sleep(20);
	}

这样,两条蛇就可以进行同时控制了。

有些时候,要同时执行的两个过程并不一定有相同的时间延迟,比如文章开始说的第二种情况,俄罗斯方块下落的时间是 500 毫秒,时间显示的更新是 1000 毫秒。这种情况也很容易解决,只需要将时间也按照 500 毫秒更新一次就可以了,只不过时间的两次更新是一样的。如果不想让时间更新的过程多执行一次,可以加一个辅助变量来统计时间是否已经更新。

编程是需要频繁实践的,并且思路方法也不唯一,前面只是我提出的一种简单方法,希望大家不要当作公式那样用,我相信会有很多人的解决方法都比我前面写的要好。

分享到