diff --git a/auto_tetris/autotetris.cpp b/auto_tetris/autotetris.cpp index 902d4a7..e4bc813 100644 --- a/auto_tetris/autotetris.cpp +++ b/auto_tetris/autotetris.cpp @@ -1,16 +1,16 @@ -// autotetris.cpp: 定义应用程序的入口点。 +// autotetris.cpp: 瀹氫箟搴旂敤绋嬪簭鐨勫叆鍙g偣銆 // #include "stdafx.h" #include "autotetris.h" #define MAX_LOADSTRING 100 -// 全局变量: -HINSTANCE hInst; // 当前实例 -WCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本 -WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名 +// 鍏ㄥ眬鍙橀噺: +HINSTANCE hInst; // 褰撳墠瀹炰緥 +WCHAR szTitle[MAX_LOADSTRING]; // 鏍囬鏍忔枃鏈 +WCHAR szWindowClass[MAX_LOADSTRING]; // 涓荤獥鍙g被鍚 -// 此代码模块中包含的函数的前向声明: +// 姝や唬鐮佹ā鍧椾腑鍖呭惈鐨勫嚱鏁扮殑鍓嶅悜澹版槑: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); @@ -24,14 +24,14 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); - // TODO: 在此放置代码。 + // TODO: 鍦ㄦ鏀剧疆浠g爜銆 - // 初始化全局字符串 + // 鍒濆鍖栧叏灞瀛楃涓 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_AUTOTETRIS, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); - // 执行应用程序初始化: + // 鎵ц搴旂敤绋嬪簭鍒濆鍖: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; @@ -41,7 +41,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, MSG msg; - // 主消息循环: + // 涓绘秷鎭惊鐜: while (GetMessage(&msg, nullptr, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) @@ -55,9 +55,9 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, } // -// 函数: MyRegisterClass() +// 鍑芥暟: MyRegisterClass() // -// 目的: 注册窗口类。 +// 鐩殑: 娉ㄥ唽绐楀彛绫汇 // ATOM MyRegisterClass(HINSTANCE hInstance) { @@ -81,18 +81,18 @@ ATOM MyRegisterClass(HINSTANCE hInstance) } // -// 函数: InitInstance(HINSTANCE, int) +// 鍑芥暟: InitInstance(HINSTANCE, int) // -// 目的: 保存实例句柄并创建主窗口 +// 鐩殑: 淇濆瓨瀹炰緥鍙ユ焺骞跺垱寤轰富绐楀彛 // -// 注释: +// 娉ㄩ噴: // -// 在此函数中,我们在全局变量中保存实例句柄并 -// 创建和显示主程序窗口。 +// 鍦ㄦ鍑芥暟涓紝鎴戜滑鍦ㄥ叏灞鍙橀噺涓繚瀛樺疄渚嬪彞鏌勫苟 +// 鍒涘缓鍜屾樉绀轰富绋嬪簭绐楀彛銆 // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { - hInst = hInstance; // 将实例句柄存储在全局变量中 + hInst = hInstance; // 灏嗗疄渚嬪彞鏌勫瓨鍌ㄥ湪鍏ㄥ眬鍙橀噺涓 HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_BORDER | WS_SYSMENU, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); @@ -107,94 +107,109 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) return TRUE; } -VOID CALLBACK TimeProc(HWND hWnd, UINT message, UINT idTimer, DWORD dwTime) -{ - // 定时器 - checkTetris(hWnd,VK_DOWN); +VOID CALLBACK TimeProc(HWND hWnd, UINT message, UINT idTimer, DWORD dwTime) { + // 瀹氭椂鍣ㄨЕ鍙戞椂锛屾ā鎷熸寜涓 VK_DOWN 閿紝浣挎柟鍧椾笅钀 + checkTetris(hWnd, VK_DOWN); + + // 妫鏌ユ柟鍧楁槸鍚﹀凡缁忓埌杈惧簳閮紝濡傛灉鏄紝鍒欏仠姝㈠畾鏃跺櫒 + if (isTetrisAtBottom()) { + KillTimer(hWnd, idTimer); + // 鍙互鍦ㄨ繖閲屾坊鍔犳父鎴忕粨鏉熺殑閫昏緫 + MessageBox(hWnd, TEXT("娓告垙缁撴潫锛"), TEXT("淇勭綏鏂柟鍧"), MB_OK); + } +} + +// 鍋囪鐨 isTetrisAtBottom 鍑芥暟锛屼綘闇瑕佹牴鎹綘鐨勬父鎴忛昏緫瀹炵幇瀹 +BOOL isTetrisAtBottom() { + // 杩欓噷鐨勯昏緫鍙栧喅浜庝綘鐨勬父鎴忕姸鎬佸拰鏂瑰潡浣嶇疆鐨勫疄鐜 + // 渚嬪锛屾鏌ユ柟鍧楃殑搴曢儴鏄惁宸茬粡鎺ヨЕ鍒颁簡娓告垙鍖哄煙鐨勫簳閮 + // 濡傛灉鏄紝杩斿洖 TRUE锛屽惁鍒欒繑鍥 FALSE + // 浠ヤ笅鏄竴涓ず渚嬫潯浠讹紝浣犻渶瑕佹牴鎹綘鐨勬父鎴忛昏緫鏉ヨ皟鏁 + return (curTetris.positions[0].y >= GAME_HEIGHT - 1); // 鍋囪 GAME_HEIGHT 鏄父鎴忓尯鍩熺殑楂樺害 } -// 函数: 启动游戏 +// 鍑芥暟锛 鍚姩娓告垙 VOID InitGame(HWND hWnd) { - // 初始化参数 + // 鍒濆鍖栧弬鏁 btCurGrid.init(PAINT_YNODE,GAME_XNODE); iInterval = AI_SWITCH ? AI_DEFAULT_INTERVAL : DEFAULT_INTERVAL; iCurDif = SIMPLE; iCurScore = 0; - // 生成首个下落图形 + // 鐢熸垚棣栦釜涓嬭惤鍥惧舰 curTetris.random(); - // 生成下一个下落图形 + // 鐢熸垚涓嬩竴涓笅钀藉浘褰 nextTetris.random(); - // 启动定时器 + // 鍚姩瀹氭椂鍣 KillTimer(hWnd, TIMER_ID); SetTimer(hWnd, TIMER_ID, iInterval, TimeProc); } -// 函数: 初始化窗体的位置和大小 +// 鍑芥暟锛 鍒濆鍖栫獥浣撶殑浣嶇疆鍜屽ぇ灏 VOID InitWndPostionSize(HWND hWnd) { RECT rect; int nWinX, nWinY, nClientX, nClientY; - //获取窗口大小 + //鑾峰彇绐楀彛澶у皬 GetWindowRect(hWnd, &rect); nWinX = rect.right - rect.left; nWinY = rect.bottom - rect.top; - //获取客户区大小 + //鑾峰彇瀹㈡埛鍖哄ぇ灏 GetClientRect(hWnd, &rect); nClientX = rect.right - rect.left; nClientY = rect.bottom - rect.top; - // 获取当前屏幕的宽高,将窗口放置中心区域 + // 鑾峰彇褰撳墠灞忓箷鐨勫楂橈紝灏嗙獥鍙f斁缃腑蹇冨尯鍩 UINT iScreenX = GetSystemMetrics(SM_CXSCREEN); UINT iScreenY = GetSystemMetrics(SM_CYSCREEN); - // 调整窗口位置与大小 + // 璋冩暣绐楀彛浣嶇疆涓庡ぇ灏 MoveWindow(hWnd, (iScreenX - PAINT_WIDTH)/2, (iScreenY - PAINT_HEIGHT)/3, PAINT_WIDTH + nWinX - nClientX, PAINT_HEIGHT + nWinY - nClientY, true); } -// 函数: 绘制背景 +// 鍑芥暟锛 缁樺埗鑳屾櫙 VOID DrawBackGround(HDC hdc) { HPEN hPenNull = (HPEN)GetStockObject(NULL_PEN); // HPEN NULL HBRUSH hBrushGray = (HBRUSH)GetStockObject(GRAY_BRUSH); // hBRUSH GRAY SelectObject(hdc,hPenNull); - SelectObject(hdc, hBrushGray); // 背景颜色 - // 游戏区域大小 (HDC,左上角X,左上角Y,右下角X,右下角Y) + SelectObject(hdc, hBrushGray); // 鑳屾櫙棰滆壊 + // 娓告垙鍖哄煙澶у皬 (HDC,宸︿笂瑙扻,宸︿笂瑙扽锛屽彸涓嬭X锛屽彸涓嬭Y) Rectangle(hdc, GAME_POSITION.iLeftX, GAME_POSITION.iLeftY, GAME_POSITION.iRightX, GAME_POSITION.iRightY); - // 信息区大小 + // 淇℃伅鍖哄ぇ灏 Rectangle(hdc, INFO_POSITION.iLeftX, INFO_POSITION.iLeftY, INFO_POSITION.iRightX, INFO_POSITION.iRightY); DeleteObject(hBrushGray); DeleteObject(hPenNull); } -// 函数: 绘制信息栏 +// 鍑芥暟锛 缁樺埗淇℃伅鏍 VOID DrawInfo(HDC hdc) { - // 下一个下落方块 + // 涓嬩竴涓笅钀芥柟鍧 RECT rect; - HFONT hFont = CreateFont(23, 0, 0, 0, FW_THIN, 0, 0, 0, UNICODE, 0, 0, 0, 0, L"微软雅黑"); + HFONT hFont = CreateFont(23, 0, 0, 0, FW_THIN, 0, 0, 0, UNICODE, 0, 0, 0, 0, L"寰蒋闆呴粦"); SelectObject(hdc, hFont); SetBkMode(hdc, TRANSPARENT); SetBkColor(hdc, RGB(255,255,0)); NEXT_FONT_POSITION.setRect(rect); - DrawText(hdc, TEXT("下一个"), _tcslen(TEXT("下一个")), &rect , 0); + DrawText(hdc, TEXT("涓嬩竴涓"), _tcslen(TEXT("涓嬩竴涓")), &rect , 0); LEVEL_FONT_POSITION.setRect(rect); TCHAR tcDif[10]; - LPCTSTR lpctDif = TEXT("难度: %d"); + LPCTSTR lpctDif = TEXT("闅惧害: %d"); wsprintf(tcDif, lpctDif , iCurDif); DrawText(hdc, tcDif, _tcslen(tcDif), &rect , 0); SCORE_FONT_POSITION.setRect(rect); TCHAR tcScore[10]; - LPCTSTR lpctScore = TEXT("得分: %d"); + LPCTSTR lpctScore = TEXT("寰楀垎: %d"); wsprintf(tcScore, lpctScore, iCurScore); DrawText(hdc, tcScore, _tcslen(tcScore), &rect , 0); DeleteObject(hFont); } -// 根据坐标获取当前节点位置 +// 鏍规嵁鍧愭爣鑾峰彇褰撳墠鑺傜偣浣嶇疆 RectPosition getRectPosition(BYTE x, BYTE y) { RectPosition rectPs; @@ -204,34 +219,34 @@ RectPosition getRectPosition(BYTE x, BYTE y) rectPs.iRightY = rectPs.iLeftY + NODE_SIZE; return rectPs; } -// 函数:绘制方块 +// 鍑芥暟锛氱粯鍒舵柟鍧 VOID DrawTetris(HDC hdc) { RectPosition ps; HPEN hPen = (HPEN)GetStockObject(NULL_PEN); SelectObject(hdc, hPen); - // 绘制Game区域 + // 缁樺埗Game鍖哄煙 for (int i =0; i< PAINT_YNODE; i++) { for (int j =0; j< GAME_XNODE; j++) { if (btCurGrid[i][j] > 0) { - // 绘制当前节点 + // 缁樺埗褰撳墠鑺傜偣 SelectObject(hdc, getHbrush(btCurGrid[i][j])); ps = getRectPosition(i, j); Rectangle(hdc, ps.iLeftX, ps.iLeftY, ps.iRightX, ps.iRightY); } } } - // 绘制正在下落图形 + // 缁樺埗姝e湪涓嬭惤鍥惧舰 SelectObject(hdc, getHbrush(curTetris.color)); for (int i =0;i < 4; i++) { ps = getRectPosition(curTetris.positions[i].x , curTetris.positions[i].y); Rectangle(hdc, ps.iLeftX, ps.iLeftY, ps.iRightX, ps.iRightY); } - // 绘制下一次下落图形 + // 缁樺埗涓嬩竴娆′笅钀藉浘褰 int move_x = 8 * NODE_SIZE + BLOCK_SIZE; int move_y = 2 * NODE_SIZE + BLOCK_SIZE; SelectObject(hdc, getHbrush(nextTetris.color)); @@ -241,14 +256,14 @@ VOID DrawTetris(HDC hdc) Rectangle(hdc, ps.iLeftX + move_x, ps.iLeftY + move_y, ps.iRightX+ move_x, ps.iRightY +move_y); } } -// 调整游戏难度 +// 璋冩暣娓告垙闅惧害 VOID setLevel(HWND hWnd) { BOOL SimpleToGeneral = iCurDif < GENERAL && iCurScore >= GENERAL_SCORE; BOOL GeneralToDifficult = iCurDif < DIFFICULT && iCurScore >= DIFFICULT_SCORE; BOOL DifficultToEst = iCurDif < DIFFICULTEST && iCurScore >= DIFFICULTEST_SCORE; - // 设置难度 + // 璁剧疆闅惧害 if (SimpleToGeneral || GeneralToDifficult || DifficultToEst) { iCurDif ++; @@ -257,25 +272,25 @@ VOID setLevel(HWND hWnd) SetTimer(hWnd , TIMER_ID, iInterval , TimeProc); } } -// 下落完成 +// 涓嬭惤瀹屾垚 VOID finishDown(HWND hWnd) { - // 更新btCurGrid当前界面数组 + // 鏇存柊btCurGrid褰撳墠鐣岄潰鏁扮粍 btCurGrid.addCurTerisToGrid(curTetris); - // 更新下落方块,重新生成nextTetris + // 鏇存柊涓嬭惤鏂瑰潡锛岄噸鏂扮敓鎴恘extTetris curTetris = nextTetris; nextTetris.random(); - // 消除 + // 娑堥櫎 iCurScore += btCurGrid.clearLine(); - // 判断生成位置是否被占用 + // 鍒ゆ柇鐢熸垚浣嶇疆鏄惁琚崰鐢 if (btCurGrid.isExist(curTetris)) { - // TODO 游戏结束 + // TODO 娓告垙缁撴潫 KillTimer(hWnd, TIMER_ID); - MessageBox(hWnd, TEXT("游戏结束"),TEXT("消息"),MB_OK); + MessageBox(hWnd, TEXT("娓告垙缁撴潫"),TEXT("娑堟伅"),MB_OK); return; } - // 调整游戏难度(ai模式不需要) + // 璋冩暣娓告垙闅惧害(ai妯″紡涓嶉渶瑕) if (!AI_SWITCH) { setLevel(hWnd); @@ -284,67 +299,67 @@ VOID finishDown(HWND hWnd) else { InvalidateRect(hWnd, NULL, TRUE); - // 如果为AI模式,继续计算 + // 濡傛灉涓篈I妯″紡锛岀户缁绠 AIHandle(hWnd); } } -// 检查图形下落是否越界/完成 / 消除 +// 妫鏌ュ浘褰笅钀芥槸鍚﹁秺鐣/瀹屾垚 / 娑堥櫎 VOID checkTetris(HWND hWnd, INT type) { int maxX , minX , maxY , minY; Tetris temp = curTetris; switch (type) { - case VK_LEFT: // 左 + case VK_LEFT: // 宸 temp.left(); break; - case VK_RIGHT: // 右 + case VK_RIGHT: // 鍙 temp.right(); break; - case VK_UP: // 上 + case VK_UP: // 涓 temp.rotate(); break; - case VK_DOWN: // 下(产生快速下降效果) + case VK_DOWN: // 涓(浜х敓蹇熶笅闄嶆晥鏋) temp.down(); break; } temp.getMaxMin(minX , maxX , minY , maxY); - // 判断是否越界 + // 鍒ゆ柇鏄惁瓒婄晫 if (maxX > 19) { - // 触碰底部,下落结束 + // 瑙︾搴曢儴锛屼笅钀界粨鏉 finishDown(hWnd); return; } if (minX < 0 || maxY > 9 || minY < 0) { - // 触碰左右边界 + // 瑙︾宸﹀彸杈圭晫 return; } - // 判断位置是否被占用 + // 鍒ゆ柇浣嶇疆鏄惁琚崰鐢 if (btCurGrid.isExist(temp)) { if (type == VK_DOWN) { - // 下落到已存在节点上方,下落结束 + // 涓嬭惤鍒板凡瀛樺湪鑺傜偣涓婃柟锛屼笅钀界粨鏉 finishDown(hWnd); } return; } - // 操作允许 + // 鎿嶄綔鍏佽 curTetris = temp; InvalidateRect(hWnd, NULL, TRUE); } // -// 函数: WndProc(HWND, UINT, WPARAM, LPARAM) +// 鍑芥暟: WndProc(HWND, UINT, WPARAM, LPARAM) // -// 目的: 处理主窗口的消息。 +// 鐩殑: 澶勭悊涓荤獥鍙g殑娑堟伅銆 // -// WM_COMMAND - 处理应用程序菜单 -// WM_PAINT - 绘制主窗口 -// WM_DESTROY - 发送退出消息并返回 +// WM_COMMAND - 澶勭悊搴旂敤绋嬪簭鑿滃崟 +// WM_PAINT - 缁樺埗涓荤獥鍙 +// WM_DESTROY - 鍙戦侀鍑烘秷鎭苟杩斿洖 // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) @@ -353,15 +368,15 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { case WM_CREATE: { - // 初始化窗体的位置和大小 + // 鍒濆鍖栫獥浣撶殑浣嶇疆鍜屽ぇ灏 InitWndPostionSize(hWnd); - // 启动游戏 + // 鍚姩娓告垙 InitGame(hWnd); } break; case WM_KEYDOWN: { - if (!AI_SWITCH) // 在自动游戏模式下 键盘不可用 + if (!AI_SWITCH) // 鍦ㄨ嚜鍔ㄦ父鎴忔ā寮忎笅 閿洏涓嶅彲鐢 { checkTetris(hWnd,wParam); } @@ -370,7 +385,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case WM_COMMAND: { int wmId = LOWORD(wParam); - // 分析菜单选择: + // 鍒嗘瀽鑿滃崟閫夋嫨: switch (wmId) { case IDM_COMMON: @@ -397,16 +412,19 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); - // 绘制背景 + // 缁樺埗鑳屾櫙 DrawBackGround(hdc); - // 绘制信息栏 + // 缁樺埗淇℃伅鏍 DrawInfo(hdc); - // 绘制图形 + // 缁樺埗鍥惧舰 DrawTetris(hdc); EndPaint(hWnd, &ps); } break; case WM_DESTROY: + // 娓呯悊瀹氭椂鍣 + KillTimer(hWnd, TIMER_ID); + KillTimer(hWnd, AI_TIMER_ID); PostQuitMessage(0); break; default: @@ -415,7 +433,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) return 0; } -// “关于”框的消息处理程序。 +// 鈥滃叧浜庘濇鐨勬秷鎭鐞嗙▼搴忋 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); @@ -435,36 +453,36 @@ INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) return (INT_PTR)FALSE; } -// 函数:启动AI模式 +// 鍑芥暟锛氬惎鍔ˋI妯″紡 VOID AIHandle(HWND hWnd) { - // Pierre Dellacherie 获取最佳落脚点 + // Pierre Dellacherie 鑾峰彇鏈浣宠惤鑴氱偣 getBestPosition(); - // 自动移动到最佳位置并结束下落 + // 鑷姩绉诲姩鍒版渶浣充綅缃苟缁撴潫涓嬭惤 aiMoveTetris(hWnd); } -// 获取最佳评分及其位置 +// 鑾峰彇鏈浣宠瘎鍒嗗強鍏朵綅缃 VOID getBestPosition() { bestScore = 0x80000000; int maxX , minX , maxY , minY; algoTetris = curTetris; Tetris temp; - //获取网格水平面 + //鑾峰彇缃戞牸姘村钩闈 getHorizonIndex(); - // 图形有四种状态 + // 鍥惧舰鏈夊洓绉嶇姸鎬 for (int i = 0 ; i < 4 ; i ++) { algoTetris.getMaxMin(minX , maxX , minY , maxY); - int num = 10 - (maxY - minY); // 每次变换产生num种情况 + int num = 10 - (maxY - minY); // 姣忔鍙樻崲浜х敓num绉嶆儏鍐 for (int j = 0 ; j < num ; j++) { - // 还原网格 + // 杩樺師缃戞牸 algoGrid = btCurGrid; temp = algoTetris; - // 将base_tetris放到algoGrid的指定位置中, 返回需要向左移动次数 + // 灏哹ase_tetris鏀惧埌algoGrid鐨勬寚瀹氫綅缃腑, 杩斿洖闇瑕佸悜宸︾Щ鍔ㄦ鏁 int moveLeft = putTetrisToGrid(j); - // 评分 + // 璇勫垎 int score = Dellacherie(); if (score > bestScore) { @@ -473,7 +491,7 @@ VOID getBestPosition() needRotate = i; needMoveLeft = moveLeft; } - // 还原 algoTetri + // 杩樺師 algoTetri algoTetris = temp; } algoTetris.rotate(); @@ -483,57 +501,57 @@ VOID CALLBACK AITimeProc(HWND hWnd, UINT message, UINT idTimer, DWORD dwTime) { if (needRotate) { - // 先变形 + // 鍏堝彉褰 needRotate--; curTetris.rotate(); } else if (needMoveLeft > 0) { - // 左移动 + // 宸︾Щ鍔 curTetris.left(); needMoveLeft--; } else if(needMoveLeft < 0) { - // 右移动 + // 鍙崇Щ鍔 curTetris.right(); needMoveLeft++; } - // 重新绘制界面 + // 閲嶆柊缁樺埗鐣岄潰 InvalidateRect(hWnd, NULL, TRUE); - // 结束定时器 + // 缁撴潫瀹氭椂鍣 if (needRotate == 0 && needMoveLeft == 0) { KillTimer(hWnd, AI_TIMER_ID); } } -// 快速测试用定时器 +// 蹇熸祴璇曠敤瀹氭椂鍣 VOID CALLBACK TESTTimeProc(HWND hWnd, UINT message, UINT idTimer, DWORD dwTime) { - // 更新btCurGrid当前界面数组 + // 鏇存柊btCurGrid褰撳墠鐣岄潰鏁扮粍 btCurGrid.addCurTerisToGrid(bestTetris); - // 更新下落方块,重新生成nextTetris + // 鏇存柊涓嬭惤鏂瑰潡锛岄噸鏂扮敓鎴恘extTetris curTetris = nextTetris; nextTetris.random(); - // 消除 + // 娑堥櫎 iCurScore += btCurGrid.clearLine(); - // 判断生成位置是否被占用 + // 鍒ゆ柇鐢熸垚浣嶇疆鏄惁琚崰鐢 if (btCurGrid.isExist(curTetris)) { - // TODO 游戏结束 + // TODO 娓告垙缁撴潫 KillTimer(hWnd, 3); - MessageBox(hWnd, TEXT("游戏结束"),TEXT("消息"),MB_OK); + MessageBox(hWnd, TEXT("娓告垙缁撴潫"),TEXT("娑堟伅"),MB_OK); return; } - // 如果为AI模式,继续计算 + // 濡傛灉涓篈I妯″紡锛岀户缁绠 AIHandle(hWnd); } -// 将方块移动到最佳位置 +// 灏嗘柟鍧楃Щ鍔ㄥ埌鏈浣充綅缃 VOID aiMoveTetris(HWND hWnd) { SetTimer(hWnd, AI_TIMER_ID, iInterval / 5 ,AITimeProc); - // SetTimer(hWnd, 3, 0 ,TESTTimeProc); // 快速测试使用 + // SetTimer(hWnd, 3, 0 ,TESTTimeProc); // 蹇熸祴璇曚娇鐢 } -// 获取网格水平线 +// 鑾峰彇缃戞牸姘村钩绾 VOID getHorizonIndex() { for (int i = 0 ; i < GAME_XNODE; i ++) @@ -555,11 +573,11 @@ VOID getHorizonIndex() } INT putTetrisToGrid(int col) { - int left_bottom_index = algoTetris.getLeftBottom(); // 获取最左下角的元素下标 + int left_bottom_index = algoTetris.getLeftBottom(); // 鑾峰彇鏈宸︿笅瑙掔殑鍏冪礌涓嬫爣 - int maxDistanceRow = horizonIndex[col] - algoTetris.positions[left_bottom_index].x; // 需要向下移动的距离 - int maxDistanceCol = algoTetris.positions[left_bottom_index].y - col; // 需要向左移动的距离 - // 调整向下移动距离 + int maxDistanceRow = horizonIndex[col] - algoTetris.positions[left_bottom_index].x; // 闇瑕佸悜涓嬬Щ鍔ㄧ殑璺濈 + int maxDistanceCol = algoTetris.positions[left_bottom_index].y - col; // 闇瑕佸悜宸︾Щ鍔ㄧ殑璺濈 + // 璋冩暣鍚戜笅绉诲姩璺濈 for (int j = 0 ; j < 4 ; j ++) { if (j != left_bottom_index) @@ -572,7 +590,7 @@ INT putTetrisToGrid(int col) } } } - // 将algoTetris移动到指定位位置 + // 灏哸lgoTetris绉诲姩鍒版寚瀹氫綅浣嶇疆 for(int j = 0 ; j < 4 ; j ++) { algoTetris.positions[j].x += maxDistanceRow; @@ -581,7 +599,7 @@ INT putTetrisToGrid(int col) } return maxDistanceCol; } -// AI评分算法 +// AI璇勫垎绠楁硶 INT Dellacherie() { INT lh_score, re_score, rt_score, ct_score, nh_score, ws_score; @@ -593,14 +611,14 @@ INT Dellacherie() ws_score = getWS(); return lh_score * LH_WEIGHT + re_score * RE_WEIGHT + rt_score * RT_WEIGHT + ct_score * CT_WEIGHT + nh_score * NH_WEIGHT + ws_score * WS_WEIGHT; } -// 高度评分 +// 楂樺害璇勫垎 INT getLH() { int maxX, minX, maxY, minY; algoTetris.getMaxMin(minX, maxX, minY, maxY); return PAINT_YNODE - maxX; } -// 消除行*贡献方块数评分 +// 娑堥櫎琛*璐$尞鏂瑰潡鏁拌瘎鍒 INT getRE() { int status , clearline = 0, cells = 0; @@ -614,9 +632,9 @@ INT getRE() } if (status == 1) { - // 满 - clearline++; // 行+1 - // 此行贡献方块数 + // 婊 + clearline++; // 琛+1 + // 姝よ璐$尞鏂瑰潡鏁 for (int j = 0 ; j < 4 ; j++) { if (algoTetris.positions[j].x == i) @@ -627,29 +645,29 @@ INT getRE() } else { - // 空 + // 绌 break; } } return clearline * cells; } -// 行变化率评分 +// 琛屽彉鍖栫巼璇勫垎 INT getRT() { - // TODO 可以优化,遇到空行,以上行直接每行+2 + // TODO 鍙互浼樺寲锛岄亣鍒扮┖琛岋紝浠ヤ笂琛岀洿鎺ユ瘡琛+2 int lineChane = 0, lastStatus; for (int i = PAINT_YNODE - 1; i >= 0; i--) { - lastStatus = 1; // 左墙壁状态为有效,当作存在图形 + lastStatus = 1; // 宸﹀澹佺姸鎬佷负鏈夋晥锛屽綋浣滃瓨鍦ㄥ浘褰 for (int j = 0;j < GAME_XNODE; j++) { - // 与上一个格子不同 + // 涓庝笂涓涓牸瀛愪笉鍚 if (!(lastStatus * algoGrid[i][j]) && lastStatus != algoGrid[i][j]) { lineChane++; lastStatus = algoGrid[i][j]; } - // 当前行最后一个节点为空 + // 褰撳墠琛屾渶鍚庝竴涓妭鐐逛负绌 if (j == (GAME_XNODE - 1) && algoGrid[i][j] == 0) { lineChane++; @@ -658,22 +676,22 @@ INT getRT() } return lineChane; } -// 列变化率评分 +// 鍒楀彉鍖栫巼璇勫垎 INT getCT() { int colChane = 0, lastStatus; for (int i = 0; i < GAME_XNODE; i++) { - lastStatus = 1; // 左墙壁状态为有效,当作存在图形 + lastStatus = 1; // 宸﹀澹佺姸鎬佷负鏈夋晥锛屽綋浣滃瓨鍦ㄥ浘褰 for (int j = 0;j < PAINT_YNODE; j++) { - // 与上一个格子不同 + // 涓庝笂涓涓牸瀛愪笉鍚 if (!(lastStatus * algoGrid[j][i]) && lastStatus != algoGrid[j][i]) { colChane++; lastStatus = algoGrid[j][i]; } - // 当前行最后一个节点为空 + // 褰撳墠琛屾渶鍚庝竴涓妭鐐逛负绌 if (j == (PAINT_YNODE - 1) && algoGrid[j][i] == 0) { colChane++; @@ -682,11 +700,11 @@ INT getCT() } return colChane; } -// 空洞数评分 +// 绌烘礊鏁拌瘎鍒 INT getNH() { int holes = 0; - bool holeFlag = false; // 是否可以开始计算空洞 + bool holeFlag = false; // 鏄惁鍙互寮濮嬭绠楃┖娲 for (int i = 0; i < GAME_XNODE; i++) { holeFlag = false; @@ -710,10 +728,10 @@ INT getNH() } return holes; } -// 井深评分 +// 浜曟繁璇勫垎 INT getWS() { - // TODO: 井深求解不精确 + // TODO: 浜曟繁姹傝В涓嶇簿纭 int wells = 0; int center, left, right; for (int i = 0; i < PAINT_YNODE; i++) @@ -738,7 +756,7 @@ INT getWS() { right = 1; } - // 是否为井 + // 鏄惁涓轰簳 if (left && right && !center) { for (int k = i; k < PAINT_YNODE;k ++)