代码拉取完成,页面将自动刷新
// message.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<Windows.h>
int RandomInt(int _min, int _max); //获取一个随机int
int CheckValide(int curPosX, int curPosY, BOOL bCurTeris[4][4]); //给定一个矩阵,查看是否合法
int selectDiffculty(HWND hWnd, int dif);
int selectLayOut(HWND hWnd, int layout);
//常量声明
const int BORDER_X = 10;
const int BORDER_Y = 10;
const int SCREEN_LEFT_X = 300 + BORDER_X;
const int SCREEN_Y = 600 + BORDER_Y;
const int SCREEN_RIGHT_X = 180 + BORDER_X * 2;
const int SCREEN_X = SCREEN_LEFT_X + SCREEN_RIGHT_X;
const BOOL state_teris[][4][4] =
{
{ { 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
{ { 0,1,1,0 },{ 0,1,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
{ { 0,1,1,1 },{ 0,0,0,1 },{ 0,0,0,0 },{ 0,0,0,0 } },
{ { 0,1,1,0 },{ 0,0,1,1 },{ 0,0,0,0 },{ 0,0,0,0 } },
{ { 0,1,0,0 },{ 1,1,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
{ { 0,1,1,1 },{ 0,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
{ { 0,1,1,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } }
};
#define IDS_APP_TITLE 103
#define IDR_MAINFRAME 128
#define IDD_TETRIS_DIALOG 102
#define IDD_ABOUTBOX 103
#define IDM_ABOUT 104
#define IDM_EXIT 105
#define IDM_START 116
#define IDM_END 117
#define IDM_DIFF 106
#define ID_dif1 111
#define ID_dif2 112
#define ID_dif3 113
#define ID_LAYOUT1 114
#define ID_LAYOUT2 115
#define IDI_TETRIS 107
#define IDI_SMALL 108
#define IDC_TETRIS 109
#define IDC_MYICON 2
#ifndef IDC_STATIC
#define IDC_STATIC -1
#endif
#define MAX_LOADSTRING 100
// 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);//窗口注册函数
BOOL InitInstance(HINSTANCE, int);//在启动时初始化应用程序
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//窗口过程处理函数
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
// 全局变量:
HINSTANCE hInst; // 当前实例
WCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
HMENU diff;//难度菜单句柄的定义
HMENU lay;//布局菜单句柄的定义
HMENU start;
HMENU end;
bool g_hasBlocked[50][50];
RECT rc_left, rc_right, rc_right_top, rc_right_bottom, rc_main;
int g_speed = 300;
int t_speed = 300;
BOOL bCurTeris[4][4];
BOOL bNextCurTeris[4][4];
int curPosX, curPosY;
int rd_seed = 1995421;
int tPre = 0, tCur;
int GAME_STATE = 0;
int GAME_SCORE = 0;
int GAME_DIFF = 1;
int NUM_X = 10;
int NUM_Y = 20;
int BLOCK_SIZE = 30;
void setRandomT();
void init_game()
{
GAME_SCORE = 0;
setRandomT();//随机生成一个方块用作下一次掉落
curPosX = (NUM_X - 4) >> 1;//设置初始坐标
curPosY = 0;
//memset,是计算机语言中的函数。起功能是将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,最后行清零
memset(g_hasBlocked, 0, sizeof(g_hasBlocked));
rc_left.left = 0;
rc_left.right = SCREEN_LEFT_X;
rc_left.top = 0;
rc_left.bottom = SCREEN_Y;
rc_right.left = rc_left.right + BORDER_X;
rc_right.right = 180 + rc_right.left;
rc_right.top = 0;
rc_right.bottom = SCREEN_Y;
rc_main.left = 0;
rc_main.right = SCREEN_X;
rc_main.top = 0;
rc_main.bottom = SCREEN_Y;
rc_right_top.left = rc_right.left;
rc_right_top.top = rc_right.top;
rc_right_top.right = rc_right.right;
rc_right_top.bottom = (rc_right.bottom) / 2;
rc_right_bottom.left = rc_right.left;
rc_right_bottom.top = rc_right_top.bottom + BORDER_Y;
rc_right_bottom.right = rc_right.right;
rc_right_bottom.bottom = rc_right.bottom;
g_speed = t_speed = 1000 - GAME_DIFF * 280;
}
void fillBlock()//到达底部后填充矩阵
{
int i, j;
for (i = 0; i<4; i++)
{
for (j = 0; j<4; j++)
{
if (bCurTeris[i][j])
{
g_hasBlocked[curPosY + i][curPosX + j] = 1;
}
}
}
}
void setRandomT()
{
int rd_start = RandomInt(0, sizeof(state_teris) / sizeof(state_teris[0]));
int rd_next = RandomInt(0, sizeof(state_teris) / sizeof(state_teris[0]));
//outPutBoxInt(rd_start);
//outPutBoxInt(rd_next);
//outPutBoxInt(rd_start);
if (GAME_STATE == 0)
{
GAME_STATE = GAME_STATE | 0x0001;
//outPutBoxInt(GAME_STATE);
memcpy(bCurTeris, state_teris[rd_start], sizeof(state_teris[rd_start]));
memcpy(bNextCurTeris, state_teris[rd_next], sizeof(state_teris[rd_next]));
}
else
{
memcpy(bCurTeris, bNextCurTeris, sizeof(bNextCurTeris));
memcpy(bNextCurTeris, state_teris[rd_next], sizeof(state_teris[rd_next]));
}
}
void drawCompleteParticle(int line)
{
HWND hWnd = GetActiveWindow();
HDC hdc = GetDC(hWnd);
HBRUSH hBrush = (HBRUSH)GetStockObject(GRAY_BRUSH);
HPEN hPen = (HPEN)CreatePen(PS_DOT, 1, RGB(255, 255, 0));
SelectObject(hdc, hBrush);
SelectObject(hdc, hPen);
Rectangle(hdc, BORDER_X,
BORDER_Y + line*BLOCK_SIZE,
BORDER_X + NUM_X*BLOCK_SIZE,
BORDER_Y + BLOCK_SIZE*(1 + line));
DeleteObject(hBrush);
DeleteObject(hPen);
}
void checkComplite()//查看一行是否能消去
{
int i, j, k, count = 0;
for (i = 0; i<NUM_Y; i++)
{
bool flag = true;
for (j = 0; j<NUM_X; j++)
{
if (!g_hasBlocked[i][j])
{
flag = false;//有一个为空时,不能消去
}
}
if (flag)
{
count++;
for (j = i; j >= 1; j--)//从上往下把每行下移
{
for (k = 0; k<NUM_X; k++)
{
g_hasBlocked[j][k] = g_hasBlocked[j - 1][k];
}
}
drawCompleteParticle(i);//在消去的那行画一行空白做出消去的效果
Sleep(300);//暂停300ms
PlaySound(_T("coin.wav"), NULL, SND_FILENAME | SND_ASYNC);//消去一行时播放系统自带提示音
}
}
GAME_SCORE += int(count*1.5);//单行+1分,两行+3分,三行+4分,四行6分,以此类推
}
int APIENTRY wWinMain(HINSTANCE hInstance,//应用程序当前实例句柄
HINSTANCE hPrevInstance,//应用程序其他实例句柄
LPWSTR lpCmdLine,//指向程序命令行参数的指针
int nCmdShow)//应用程序开始执行时窗口显示方式的整数值标识
{
init_game();//初始化游戏
UNREFERENCED_PARAMETER(hPrevInstance);//展开传递的参数或表达式
UNREFERENCED_PARAMETER(lpCmdLine);//避免编译器关于未引用参数的警告
// TODO: 在此放置代码。
// 初始化全局字符串
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadStringW(hInstance, IDC_TETRIS, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);//注册窗口类,用于兼容
// 执行应用程序初始化:
if (!InitInstance(hInstance, nCmdShow))
{
return FALSE;
}
HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TETRIS));//加载加速器
MSG msg;
// 主消息循环:
while (1)
{
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))//消息检查线程消息队列
{
TranslateMessage(&msg);//将消息的虚拟键转化字符消息
DispatchMessage(&msg);//将消息传送到指定窗口函数
if (msg.message == WM_QUIT)//若消息是退出,则终止
{
break;
}
}
else
{
if ((GAME_STATE & 2) != 0)
{
tCur = GetTickCount();//返回(retrieve)从操作系统启动所经过(elapsed)的毫秒数
if (tCur - tPre>g_speed)//超过反应时间时
{
int flag = CheckValide(curPosX, curPosY + 1, bCurTeris);//判断下一行的情况,返回给flag
if (flag == 1)//正常下降一行
{
curPosY++;//方块坐标y加1
tPre = tCur;//重新计算反应时间
HWND hWnd = GetActiveWindow();
//这里两次调用实现了双缓冲的作用,改善了视觉效果
InvalidateRect(hWnd, &rc_left, FALSE);//向指定的窗体更新区域添加一个矩形,然后窗口客户区域的这一部分将被重新绘制
InvalidateRect(hWnd, &rc_right_top, FALSE);//系统不会像窗口发送WM_PAINT消息,来重绘
}
else if (flag == -2)//方块到底时
{
g_speed = t_speed;//重置速度
fillBlock();//将方块填充给矩形
checkComplite(); //查看能否消去这行
setRandomT();//随机产生新的方块
curPosX = (NUM_X - 4) >> 1;//重新设置方块的坐标x
curPosY = 0;//重新设置方块的坐标y
HWND hWnd = GetActiveWindow();//获得与调用线程的消息队列相关的活动窗口的窗口句柄
InvalidateRect(hWnd, &rc_main, FALSE);//刷新矩形区域
}
else if (flag == -3)//放不下下一个方块(游戏输了)时
{
HWND hWnd = GetActiveWindow();//获得与调用线程的消息队列相关的活动窗口的窗口句柄
if (MessageBox(hWnd, L"胜败乃兵家常事,菜鸡请重新来过", L":时光机", MB_YESNO) == IDYES)//消息提示,游戏失败
{
init_game();//重新开始游戏
}
else
{
break;//退出了消息循环,结束程序
}
}
}
}
}
}
return (int)msg.wParam;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。