#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);
}
}
WIN32API实现的2048无尽版小游戏
最新推荐文章于 2019-07-17 22:52:00 发布