WIN32API实现的2048无尽版小游戏

#include <windows.h>
#include <tchar.h>
#include <cstring>
#include <stdlib.h>
#include <time.h> 

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg,WPARAM wParam,LPARAM lParam);

const TCHAR szWindowClass[] = L"第一个窗口";
const TCHAR szWindowTitle[] = L"2048";

int data[4][4] = {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
int dis[4][2] ={{0,1},{1,0},{0,-1},{-1,0}};//四个方向,用来判断是否游戏结束的
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPTSTR lpCmdLine, int nCmdShow)
{
	srand( (unsigned)time( NULL ));//获取随机种子
	int k = 0;
	while(k < 2)
	{
		int t = rand()%2;
		int x = rand()%4;
		int y = rand()%4;
		if(!data[x][y])
		{
			if(t == 0)
			{
				data[x][y] = 4;
			}
			else
			{
				data[x][y] = 2;
			}
			k++;
		}
	}
#pragma region 定义并注册窗口
	WNDCLASSEX wcex = {0};
	wcex.cbSize = sizeof(WNDCLASSEX);
	wcex.hInstance = hInstance;
	wcex.lpfnWndProc = (WNDPROC)WndProc;
	wcex.lpszClassName = szWindowClass;
	wcex.style = CS_HREDRAW | CS_VREDRAW;
	wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	RegisterClassEx(&wcex);
#pragma endregion

#pragma region 生成并显示窗口
	HWND hWnd = CreateWindow(szWindowClass,szWindowTitle,WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,HWND_DESKTOP,NULL,hInstance,NULL);
	if (!hWnd) return FALSE;

	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);
#pragma endregion

#pragma region 消息循环
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
#pragma endregion
}

void Printf(HWND hWnd)
{
	TCHAR str[20];
	PAINTSTRUCT ps;
	HDC hdc = BeginPaint(hWnd, &ps);
	for(int i = 0; i < 4;i++)
	{
		for(int j = 0; j < 4; j++)
		{
			if(data[i][j] != 0)
			{
				_itot(data[i][j], str, 10);//将整型data[i][j]转换为字符类型
				RECT r;
				GetClientRect(hWnd, &r);
				HBRUSH newBrush = CreateSolidBrush(RGB((data[i][j]*8)%256,(data[i][j]*80)%256,0));
				HBRUSH oldBrush = (HBRUSH)SelectObject(hdc, newBrush);
				Rectangle(hdc,350+j*100 ,50 + i*100,450+j*100,150 + i*100);//画矩形
				//设置字体参数
				LOGFONT logfont;
				ZeroMemory(&logfont, sizeof(LOGFONT));
				wcscpy(logfont.lfFaceName, _T("华文细黑"));//拷贝字体类型
				/*logfont.lfCharSet = GB2312_CHARSET;*///编程时,若将字体设置成“黑体、宋体、仿宋—GB2312、楷体—GB2312、隶书、幼圆”中的某一字体时,
				//需将lfCharSet设置成GB2312—CHARSET才使设置的字体有效
				logfont.lfHeight = -40; //设置字体的大小
				HFONT hFont = CreateFontIndirect(&logfont);
				SetTextColor(hdc, RGB(255, 255, 255));//设置字体颜色
				SetBkMode(hdc, TRANSPARENT);//可以设置背景模式为TRANSPARENT(透明的),即让输出的字符串或图形的背景色不可见
				SelectObject(hdc, hFont);//替换原来的字体类型
				int len = _tcslen(str);
				TextOut(hdc,385 + j*100 - (len-1)*10,80+i*100,str,_tcslen(str));//打印框格
				SelectObject(hdc, oldBrush);
				DeleteObject(newBrush);
			}
			else
			{
				HBRUSH newBrush = CreateSolidBrush(RGB(235,255,0));
				HBRUSH oldBrush = (HBRUSH)SelectObject(hdc, newBrush);
				Rectangle(hdc,350+j*100 ,50 + i*100,450+j*100,150 + i*100);
				SelectObject(hdc, oldBrush);
				DeleteObject(newBrush);
			}
		}
	}
	EndPaint(hWnd, &ps);
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
	switch (msg)
	{
	case WM_PAINT:
		{
			Printf(hWnd);//打印窗口
			return 0;
		}
	case WM_KEYDOWN:
		{
			switch(wParam)
			{
			case VK_LEFT: 
				{
#pragma region 左方向
					int a[4],p;
					for(int i = 0; i < 4;i++)
					{
						p = 0;
						for(int j = 0; j < 4;j++)
						{
							if(data[i][j])
							{
								a[p++] = data[i][j];
								data[i][j] = 0;
							}
						}
						for(int j =0; j < p; j++)
						{
							data[i][j] = a[j];
						}
					}
					for(int i = 0; i < 4;i++)
					{
						if(data[i][0] == data[i][1])
						{
							data[i][0] += data[i][1];
							if(data[i][2] == data[i][3])
							{
								data[i][1] = data[i][2] + data[i][3];
								data[i][3] =  data[i][2] = 0;
							}
							else
							{
								data[i][1] = data[i][2];
								data[i][2] = data[i][3];
								data[i][3] = 0;
							}
						}
						else if(data[i][1] == data[i][2])
						{
							data[i][1] += data[i][2];
							data[i][2] = data[i][3];
							data[i][3] = 0;
						}
						else if(data[i][2] == data[i][3])
						{
							data[i][2] += data[i][3];
							data[i][3] = 0;
						}
					}
					bool flag1 = false,flag2 = false;
					for(int i = 0; i< 4; i++)
					{
						for(int j = 0; j< 4; j++)
						{
							if(!data[i][j])
							{
								flag1 = true;
							}
							for(int k = 0;k< 4; k++)
							{
								int x = i + dis[k][0];
								int y = j + dis[k][1];
								if(x < 0 || x > 3 || y < 0 || y > 3)continue;
								if(data[i][j] == data[x][y])
								{
									flag2 = true;
								}
							}
						}
					}
					while(flag1)
					{
						int t = rand()%2;
						int x = rand()%4;
						int y = rand()%4;
						if(!data[x][y])
						{
							if(t == 0)
							{
								data[x][y] = 4;
							}
							else
							{
								data[x][y] = 2;
							}
							break;
						}
					}
					Printf(hWnd);
					if(!flag2 && !flag1)
					{
						MessageBox(hWnd, TEXT("你挂掉了"), TEXT("提示"), MB_OK);//消息框,MB_OK表示一个确定选项
						SendMessage(hWnd,WM_DESTROY,0,0);//发送破坏窗口的消息
					}
#pragma endregion
				}break;
			case VK_RIGHT:
				{
#pragma region 右方向
					int a[4],p;
					for(int i = 0; i < 4;i++)
					{
						p = 0;
						for(int j = 3; j >= 0;j--)
						{
							if(data[i][j])
							{
								a[p++] = data[i][j];
								data[i][j] = 0;
							}
						}
						for(int j =0; j < p; j++)
						{
							data[i][3 - j] = a[j];
						}
					}
					for(int i = 3; i >= 0;i--)
					{
						if(data[i][3] == data[i][2])
						{
							data[i][3] += data[i][2];
							if(data[i][1] == data[i][0])
							{
								data[i][2] = data[i][1] + data[i][0];
								data[i][0] = data[i][1] = 0;
							}
							else
							{
								data[i][2] = data[i][1];
								data[i][1] = data[i][0];
								data[i][0] = 0;
							}
						}
						else if(data[i][1] == data[i][2])
						{
							data[i][2] += data[i][1];
							data[i][1] = data[i][0];
							data[i][0] =0;
						}
						else if(data[i][1] == data[i][0])
						{
							data[i][1] += data[i][0];
							data[i][0] = 0;
						}
					}
					bool flag1 = false,flag2 = false;
					for(int i = 0; i< 4; i++)
					{
						for(int j = 0; j< 4; j++)
						{
							if(!data[i][j])
							{
								flag1 = true;
							}
							for(int k = 0;k< 4; k++)
							{
								int x = i + dis[k][0];
								int y = j + dis[k][1];
								if((x < 0 || x > 3) || (y < 0 || y > 3))continue;
								if(data[i][j] == data[x][y])
								{
									flag2 = true;
								}
							}
						}
					}
					while(flag1)
					{
						int t = rand()%2;
						int x = rand()%4;
						int y = rand()%4;
						if(!data[x][y])
						{
							if(t == 0)
							{
								data[x][y] = 4;
							}
							else
							{
								data[x][y] = 2;
							}
							break;
						}
					}
					Printf(hWnd);
					if(!flag2 && !flag1)
					{
						MessageBox(hWnd, TEXT("你挂掉了"), TEXT("提示"), MB_OK);
						SendMessage(hWnd,WM_DESTROY,0,0);
					}
#pragma endregion
				}break;
			case VK_UP:
				{
#pragma region 上方向
					int a[4],p;
					for(int i = 0; i < 4;i++)
					{
						p = 0;
						for(int j = 0; j < 4;j++)
						{
							if(data[j][i])
							{
								a[p++] = data[j][i];
								data[j][i] = 0;
							}
						}
						for(int j = 0; j < p; j++)
						{
							data[j][i] = a[j];
						}
					}
					for(int i = 0; i < 4;i++)
					{
						if(data[0][i] == data[1][i])
						{
							data[0][i] += data[1][i];
							if(data[2][i] == data[3][i])
							{
								data[1][i] = data[2][i] + data[3][i];
								data[2][i] = data[3][i] = 0;
							}
							else
							{
								data[1][i] = data[2][i];
								data[2][i] = data[3][i];
								data[3][i] = 0;
							}
						}
						else if(data[1][i] == data[2][i])
						{
							data[1][i] += data[2][i];
							data[2][i] = data[3][i];
							data[3][i] = 0;
						}
						else if(data[2][i] == data[3][i])
						{
							data[2][i] += data[3][i];
							data[3][i] = 0;
						}
					}
					bool flag1 = false,flag2 = false;
					for(int i = 0; i< 4; i++)
					{
						for(int j = 0; j< 4; j++)
						{
							if(!data[i][j])
							{
								flag1 = true;
							}
							for(int k = 0;k< 4; k++)
							{
								int x = i + dis[k][0];
								int y = j + dis[k][1];
								if((x < 0 || x > 3) || (y < 0 || y > 3))continue;
								if(data[i][j] == data[x][y])
								{
									flag2 = true;
								}
							}
						}
					}
					while(flag1)
					{
						int t = rand()%2;
						int x = rand()%4;
						int y = rand()%4;
						if(!data[x][y])
						{
							if(t == 0)
							{
								data[x][y] = 4;
							}
							else
							{
								data[x][y] = 2;
							}
							break;
						}
					}
					Printf(hWnd);
					if(!flag2 && !flag1)
					{
						MessageBox(hWnd, TEXT("你挂掉了"), TEXT("提示"), MB_OK);
						SendMessage(hWnd,WM_DESTROY,0, 0);
					}
#pragma endregion 
				}break;
			case VK_DOWN:
				{
#pragma region 下方向
					int a[4],p;
					for(int i = 0; i < 4;i++)
					{
						p = 0;
						for(int j = 3; j >= 0;j--)
						{
							if(data[j][i])
							{
								a[p++] = data[j][i];
								data[j][i] = 0;
							}
						}
						for(int j = 0; j < p; j++)
						{
							data[3 - j][i] = a[j];
						}
					}
					for(int i = 0; i < 4;i++)
					{
						if(data[3][i] == data[2][i])
						{
							data[3][i] += data[2][i];
							if(data[1][i] == data[0][i])
							{
								data[2][i] = data[1][i] + data[0][i];
								data[1][i] = data[0][i] = 0;
							}
							else
							{
								data[2][i] = data[1][i];
								data[1][i] = data[0][i];
								data[0][i] = 0;
							}
						}
						else if(data[2][i] == data[1][i])
						{
							data[2][i] += data[1][i];
							data[1][i] = data[0][i];
							data[0][i] = 0;
						}
						else if(data[1][i] == data[0][i])
						{
							data[1][i] += data[0][i];
							data[0][i] = 0;
						}
					}
					bool flag1 = false,flag2 = false;
					for(int i = 0; i< 4; i++)
					{
						for(int j = 0; j< 4; j++)
						{
							if(!data[i][j])
							{
								flag1 = true;
							}
							for(int k = 0;k< 4; k++)
							{
								int x = i + dis[k][0];
								int y = j + dis[k][1];
								if(x < 0 || x > 3 || y < 0 || y > 3)continue;
								if(data[i][j] == data[x][y])
								{
									flag2 = true;
								}
							}
						}
					}
					while(flag1)
					{
						int t = rand()%2;
						int x = rand()%4;
						int y = rand()%4;
						if(!data[x][y])
						{
							if(t == 0)
							{
								data[x][y] = 4;
							}
							else
							{
								data[x][y] = 2;
							}
							break;
						}
					}
					Printf(hWnd);
					if(!flag2  && !flag1)
					{
						MessageBox(hWnd, TEXT("你挂掉了"), TEXT("提示"), MB_OK);
						SendMessage(hWnd,WM_DESTROY,0, 0);
					}
#pragma endregion
				}break;
			default:
				break;
			}
			InvalidateRect(hWnd,NULL,TRUE);
			return 0;
		}
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	default:
		return DefWindowProc(hWnd, msg, wParam, lParam);
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值