简单

行远必自迩,登高必自卑

见缝插针

游戏说明

使用鼠标左键点击发射针,当两个针的夹角小于一定限制时,游戏结束。

亮点

这个游戏比较创新的地方就是可以用鼠标控制一个动态的过程,在循环中使用鼠标点击,并且鼠标消息不受延时函数的影响。以前写代码的时候,由于鼠标消息的原因,所以会选择多线程,但是参考了正确处理鼠标消息这篇文章,了解了鼠标消息的正确用法后,觉得有必要试试,就写了一个见缝插针游戏。我觉得学习不仅就是把别人的东西学会,而且需要在学习之后实践。

期待

见缝插针游戏我只是写了一个大致的框架,重点是为了实践鼠标消息的处理,如果需要将这个游戏进一步开发,可以在针的转速,长短,以及在插在球上面针的数量上进行设置不同的关卡。

效果图

代码

///////////////////////////////////////////////////
// 程序名称:见缝插针
// 编译环境:Mictosoft Visual Studio 2013, EasyX_20200315(beta)
// 作  者:luoyh <2864292458@qq.com>
// 最后修改:2021-1-24
//

#include<graphics.h>
#include<conio.h>
#include<math.h>
#include<time.h>

#define PI        acos(-1.0)
#define SPEED     (PI/360)								// 针的旋转速度
#define NEEDLE_L  180									// 针的长度	

void HpSleep(int ms);									// 精确延时
void drawframe(int number);
void Move(int number, int x, int y);
void Rotate(double *R,int num);
bool Pin(double *R, int num);
void eraser(int x, int y);

int main()
{
	initgraph(480, 640);
	while (true)
	{
		setbkcolor(RGB(189, 188, 187));
		cleardevice();
		drawframe(1);
		double radian[25] = { 0 };						// 储存针的弧度
		int Needle_N = 0;								// 针的个数				
		MOUSEMSG msg;
		bool IS = false;
		while (true)
		{
			Move(Needle_N, 240, 560);					// 绘制针的位置
			Move(Needle_N + 1, 240, 600);
			Move(Needle_N + 2, 240, 640);
			Rotate(radian, Needle_N);
			while (MouseHit())							// 当有鼠标消息的时候执行
			{
				msg = GetMouseMsg();					// 获取鼠标消息
				switch (msg.uMsg)						// 根据不同的鼠标消息,执行不同的代码
				{
				case WM_LBUTTONDOWN:
					if (Pin(radian, Needle_N))
					{
						Needle_N++;
					}
					else
					{
						IS = true;
					}break;
				}
			}
			if (IS)
			{
				break;
			}
			HpSleep(10);								// 延时,降低 CPU 占用率
		}
		HWND wnd = GetHWnd();
		if (MessageBox(wnd, _T("游戏结束。\n重来一局吗?"), _T("询问"), MB_YESNO | MB_ICONQUESTION) == IDYES)
			continue;
		else
			break;
	}
	return 0;
}

void drawframe(int number)
{
	TCHAR str[25];
	_stprintf_s(str, _T("%d"), number);
	setfillcolor(RGB(70, 70, 69));
	solidcircle(240, 240, 50);
	setbkmode(TRANSPARENT);
	settextstyle(50, 0, _T("黑体"), 0, 0, FW_BLACK, false, false, false);
	settextcolor(WHITE);
	RECT r = { 190, 190, 290, 290 };
	drawtext(str, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}

void Move(int number, int x, int y)
{
	setfillcolor(RGB(70, 70, 69));
	solidcircle(x, y, 20);
	setbkmode(TRANSPARENT);
	settextstyle(15, 0, _T("黑体"));
	settextcolor(WHITE);
	RECT r = { x - 20, y - 20, x + 20, y + 20 };
	TCHAR str[25];
	_stprintf_s(str, _T("%d"), number);
	drawtext(str, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}

void Rotate(double *R, int num)
{
	int X_NEEDLE;
	int Y_NEEDLE;
	
	BeginBatchDraw();
	for (int i = 0; i < num; i++)
	{
		FlushBatchDraw();
		eraser(int(NEEDLE_L * cos(R[i]) + 240),int(NEEDLE_L * sin(R[i]) + 240));
		R[i] = R[i] + SPEED;
		if (R[i] > 2 * PI)
		{
			R[i] = R[i] - 2 * PI;
		}
		X_NEEDLE = int (NEEDLE_L * cos(R[i]) + 240); 
		Y_NEEDLE = int (NEEDLE_L * sin(R[i]) + 240);
		setlinestyle(PS_SOLID, 3);
		setlinecolor(RGB(70, 70, 69));
		line(X_NEEDLE, Y_NEEDLE, 240, 240);
		Move(i,X_NEEDLE,Y_NEEDLE);
		drawframe(1);
	}
	EndBatchDraw();
}

bool Pin(double *R, int num)
{
	int X_NEEDLE;
	int Y_NEEDLE;
	setlinestyle(PS_SOLID, 3);
	setlinecolor(RGB(70, 70, 69));
	bool T = true;
	R[num] = PI / 2;
	X_NEEDLE = int(NEEDLE_L * cos(R[num]) + 240);
	Y_NEEDLE = int(NEEDLE_L * sin(R[num]) + 240);
	line(X_NEEDLE, Y_NEEDLE, 240, 290);
	Move(num, X_NEEDLE, Y_NEEDLE);
	for (int i = 0; i < num; i++)
	{
		if (fabs(R[num] - R[i]) < (PI / 15))
		{
			T = false;
			break;								// 不需要再次进行比较了,循环跳出
		}
	}
	return T;									// 如果失败返回false;
}

void eraser(int x, int y)
{
	setfillcolor(RGB(189, 188, 187));
	solidcircle(x, y, 20);
	setlinestyle(PS_SOLID, 3);
	setlinecolor(RGB(189, 188, 187));
	line(x, y, 240, 240);
}

// 精确延时函数(可以精确到 1ms,精度 ±1ms)
// 记得加头文件 time.h
// by yangw80<yw80@qq.com>, 2011-5-4
void HpSleep(int ms)
{
	static clock_t oldclock = clock();			// 静态变量,记录上一次 tick
	oldclock += ms * CLOCKS_PER_SEC / 1000;		// 更新 tick
	if (clock() > oldclock)						// 如果已经超时,无需延时
		oldclock = clock();
	else
	while (clock() < oldclock)					// 延时
		Sleep(1);								// 释放 CPU 控制权,降低 CPU 占用率
}

作 者:简 单
Q  Q: 2864292458
邮 箱:2864292458@qq.com