当前位置 博文首页 > Scissors_初夏的博客:初夏小谈:经典游戏之别踩白块小游戏---小

    Scissors_初夏的博客:初夏小谈:经典游戏之别踩白块小游戏---小

    作者:[db:作者] 时间:2021-08-28 13:13

    ? ? ? ?对于一个酷玩游戏和更喜欢设计游戏的人来说,能够自己编写一款比较有意义的经典游戏是一件多么爽的事情,在编程的行业里,最大的成就感莫过于全球大部分人都超级热爱自己的团队设计的软件并且爱不释手。这个目标真是过于远大,但还是要有的,万一实现了呢呵呵。

    ? ? ? 对于一个热爱玩游戏的我却更倾向于去打造一款具有创新性和健康积极的游戏。从小接触穿越火线就越发地认为游戏行业定会火爆与90后的年轻一代们以及后面的新生代。但还是说一句游戏只是生活的一种调味剂,切记不要过于沉溺,伤人伤己。

    ? ? ?别踩白块游戏相信大家都玩过吧,今天通过C语言来实现这个游戏。

    在实现此游戏时需要定义和以往不一样的主函数即WinMian 这个函数即为GUI窗口应用程序函数,WINAPI则是此函数的调用约定。在这个函数中有四个参数分别是HINSTANCE hInstance 是当前应用程序的实力句柄,HINSTANCE hPreInstance 是当前应用程序的前一个实例也就会这个应用可能‘被打开多份,而这个实例就是当前打开的上一个。LPSTR lpDCmdLine 是命令行参数? int nCmdShow 是窗口显示方式,让其最大化还是最小化。

    其次在这个主函数中需要实现一个窗口,通过调用相关接口来实现,接着就是注册这个窗口,就像你如果创业想开一家公司,那么就必须去工商局注册一样。注册完窗口后,就创建一个窗口实例,注意此时还不能显示出来,就必须调用显示的接口,由于在实现这个游戏时是要不断更新的所以要实现更新窗口,最后实现消息循环,来不断获取鼠标信息。

    窗口处理函数如下:

    //窗口处理函数
    LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	PAINTSTRUCT ps;
    
    	//绘图句柄  DC 设备上下文---微软提供一套库,封装好与各种显示器兼容相关接口
    	HDC hDC;
    	//每个屏幕有四个黑色方块
    	static int bw[4];
    	//矩形区域
    	RECT rect;
    
    	//画刷句柄
    	HBRUSH hBrush;
    
    	//鼠标点击
    	POINT point;
    
    	//踩了的格子数
    	static int n = 0;
    
    	//所耗时间
    	static int tm = 0;
    
    	TCHAR szMsg[200];
    	switch (uMsg)
    	{
    	case WM_CREATE:
    	{
    		srand((unsigned int)time(NULL));
    		for (int i = 0; i < 4; i++)
    		{
    			bw[i] = rand() % 4;
    		}
    		//开启定时器
    		SetTimer(hWnd, 1, 10, NULL);
    	}
    	break;
    
    	//定时器
    	case WM_TIMER:
    		tm++;
    		break;
    		//窗口绘图消息
    	case WM_PAINT:
    		hDC = BeginPaint(hWnd, &ps);
    
    		//画图
    		for (int i = 0; i < 5; i++)
    		{
    			水平
    			//MoveToEx(hDC, 0, i*BLOCK, NULL);
    			//LineTo(hDC, 4*BLOCK, i*BLOCK);
    
    			竖直
    			//MoveToEx(hDC, i*BLOCK,0,NULL);
    			//LineTo(hDC, i*BLOCK, 4 * BLOCK);
    			//水平
    			//起点
    			MoveToEx(hDC, 0, 1.5 * i * BLOCK, NULL);
    			//终点
    			LineTo(hDC, 4 * BLOCK, 1.5 * i * BLOCK);
    
    			//竖直
    			MoveToEx(hDC, i * BLOCK, 0, NULL);
    			LineTo(hDC, i * BLOCK, 6 * BLOCK);
    		}
    		//画黑色方块
    		for (int i = 0; i < 4; i++)
    		{
    			SetRect(&rect, bw[i] * BLOCK, 1.5 * i * BLOCK, bw[i] * BLOCK + 100, 1.5 * i * BLOCK + 150);
    			//设置黑刷子
    			hBrush = CreateSolidBrush(RGB(0, 0, 0));
    			//用黑刷子刷对应方块
    			SelectObject(hDC, hBrush);
    			Rectangle(hDC, rect.left, rect.top, rect.right, rect.bottom);
    
    			//释放资源
    			DeleteObject(hBrush);
    		}
    
    		EndPaint(hWnd, &ps);
    		break;
    		//鼠标左键点击信息
    	case WM_LBUTTONDOWN:
    	{
    		point.x = LOWORD(lParam);
    		point.y = HIWORD(lParam);
    
    		if (point.y / (BLOCK * 1.5) >= 3)
    		{
    			if (point.x / BLOCK != bw[3])
    			{
    				wsprintf(szMsg, (LPCSTR)"您输了!!!  用时:%d.%d 秒  块数:%d个", tm / 100, tm - (tm / 100) * 100, n);
    				MessageBox(hWnd, szMsg, (LPCSTR)"温馨提示:", MB_OK);
    				//退出
    				PostQuitMessage(0);
    			}
    			//每按一次要往下走一个
    			for (int i = 3; i > 0; i--)
    			{
    				bw[i] = bw[i - 1];
    			}
    			bw[0] = rand() % 4;
    			n++;
    			//滚动窗口
    			ScrollWindow(hWnd, 0, 1.5 * BLOCK, NULL, NULL);
    		}
    	}
    	break;
    	//窗口关闭消息,关闭只是把窗口最小化,还可以恢复
    	case WM_CLOSE:
    		DestroyWindow(hWnd);//销毁窗口,不可以恢复了
    		break;
    		//窗口销毁消息
    	case WM_DESTROY:
    		PostQuitMessage(0);//退出进程
    		break;
    	}
    	return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

    该程序运行显示:

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

    开始游戏:当踩错时显示:

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 珍&源码

    cs