亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

MFC掃雷游戲開發(fā)實(shí)戰(zhàn):從消息映射到算法實(shí)現(xiàn)的完整指南

MFC掃雷游戲開發(fā)實(shí)戰(zhàn):從消息映射到算法實(shí)現(xiàn)的完整指南 簡(jiǎn)介基于MFC開發(fā)的掃雷游戲完整工程屬于可直接運(yùn)行與二次學(xué)習(xí)的完整源碼包適合Windows C初學(xué)者和希望深入理解MFC界面編程的開發(fā)者。項(xiàng)目復(fù)刻了經(jīng)典掃雷的雷區(qū)隨機(jī)生成、左右鍵標(biāo)記、計(jì)時(shí)與勝負(fù)判斷等核心玩法源碼中包含自定義對(duì)話框類與按鈕類通過(guò)消息映射處理用戶交互可幫助學(xué)習(xí)GUI布局、事件響應(yīng)與游戲邏輯設(shè)計(jì)工程結(jié)構(gòu)清晰涵蓋框架、視圖、文檔、排序及成績(jī)記錄等模塊。壓縮包共71個(gè)文件約2.7MB主要由C源文件與頭文件、26個(gè)位圖及圖標(biāo)等資源文件、工程配置文件、MFC運(yùn)行所需DLL和exe調(diào)試版本構(gòu)成便于對(duì)照運(yùn)行結(jié)果理解源碼。已有475人學(xué)習(xí)瀏覽是課程設(shè)計(jì)、畢業(yè)設(shè)計(jì)參考或MFC項(xiàng)目實(shí)戰(zhàn)練手的實(shí)用素材也可在此基礎(chǔ)上擴(kuò)展難度、音效和存檔功能。1. 用 MFC 寫的掃雷到底難在哪又值不值得做「用MFC開發(fā)的掃雷游戲程序(含源碼)」表面上看是又一個(gè)練手小游戲但真把它拆開你會(huì)發(fā)現(xiàn)掃雷幾乎覆蓋了 MFC 桌面開發(fā)里最完整的「麻雀樣本」窗口繪制、鼠標(biāo)左右鍵消息、定時(shí)器、狀態(tài)欄刷新、游戲狀態(tài)機(jī)還牽扯到布雷算法和泛洪展開。難點(diǎn)不在邏輯本身——核心算法幾百行內(nèi)就能寫完——而在于用 MFC 的 CView、CDC 和消息映射把這套邏輯正確地粘到 Windows 窗口上去。很多人在 VS 里新建 MFC 工程很快真正卡住的是第一次點(diǎn)擊就炸、格子刷新閃爍、狀態(tài)欄怎么都不動(dòng)這些和消息循環(huán)、刷新時(shí)機(jī)有關(guān)的血淚坑。這篇筆記寫給兩類人剛學(xué)完 C 想用真實(shí)窗口程序練手的人以及手里有舊 MFC 工程、想照著改造一個(gè)可靠小游戲的人。2. 選型與工程骨架為什么用 MFC 寫掃雷以及一個(gè)合格源碼工程該長(zhǎng)什么樣2.1 掃雷是 MFC 里最典型的「全套件練手項(xiàng)目」桌面小游戲選項(xiàng)其實(shí)很多控制臺(tái)五子棋、Qt 連連看、Win32 API 彈球。但掃雷在 MFC 里幾乎把框架的每個(gè)關(guān)鍵機(jī)制都覆蓋到了棋盤要響應(yīng)左鍵和右鍵這是消息映射的核心應(yīng)用游戲計(jì)時(shí)要掛定時(shí)器翻格子、畫數(shù)字、描雷要操作設(shè)備上下文CDC雷數(shù)和秒數(shù)要推到狀態(tài)欄。一套做下來(lái)你對(duì) MFC 的消息循環(huán)和刷新模型的理解會(huì)比看十遍教程都扎實(shí)。很多人會(huì)糾結(jié)「桌面軟件開發(fā)用 MFC 還是 Qt」。如果目標(biāo)是快速做現(xiàn)代感界面、跨平臺(tái)分發(fā)Qt 確實(shí)更省心但如果你面對(duì)的是工業(yè)軟件、軍工、醫(yī)療設(shè)備里那些存量 MFC 代碼或者你只是想用最小成本把一個(gè) C 算法跑在 Windows 窗口上MFC 的存量?jī)r(jià)值和輕量程度依然不可替代。掃雷這種小工程用 MFC 寫一周能出成品用 Qt 也不見得快多少反而要在信號(hào)槽和樣式表上多繞一圈。對(duì)于練手和工程課設(shè)MFC 是性價(jià)比很高的選擇。對(duì)比維度MFCQt學(xué)習(xí)曲線消息映射和 DC 繪制偏底層上手痛信號(hào)槽和布局系統(tǒng)更現(xiàn)代文檔全依賴體積運(yùn)行庫(kù)隨 Windows 帶發(fā)布小需要帶 Qt 運(yùn)行庫(kù)DLL 較多適合場(chǎng)景存量工程維護(hù)、Windows 專用工具跨平臺(tái)應(yīng)用、界面復(fù)雜度高的產(chǎn)品掃雷這類小游戲足夠且最能練到框架本質(zhì)可以做但多少有點(diǎn)大材小用2.2 源碼工程的文件劃分拿到手先讀哪幾個(gè)文件一個(gè)標(biāo)準(zhǔn)的 MFC 單文檔SDI掃雷工程文件結(jié)構(gòu)是有規(guī)律的。你在 VS 里新建「MFC 應(yīng)用程序」時(shí)選「單個(gè)文檔」、文檔/視圖架構(gòu)生成的基礎(chǔ)骨架會(huì)包含幾類文件應(yīng)用類負(fù)責(zé)程序入口文檔類負(fù)責(zé)數(shù)據(jù)序列化掃雷里可以不管它視圖類負(fù)責(zé)繪制和消息響應(yīng)資源文件.rc保存菜單、圖標(biāo)、對(duì)話框模板。但我見過(guò)很多掃雷源碼工程把棋盤數(shù)組和繪制代碼全懟在 CView 里整個(gè)文件上千行想改個(gè)難度都找不到地方下手。一個(gè)合格的源碼工程應(yīng)該把游戲核心邏輯單獨(dú)抽出來(lái)做成一個(gè)不依賴 MFC 的純 C 類比如叫 CSweepGame。它只管理三維數(shù)據(jù)棋盤格狀態(tài)、顯示狀態(tài)、雷數(shù)、翻開數(shù)、游戲狀態(tài)完全不碰 CDC 和 HWND。視圖類只負(fù)責(zé)兩件事把鼠標(biāo)坐標(biāo)換算成格子坐標(biāo)調(diào)進(jìn) CSweepGame然后讓窗口重繪。這樣拆分的好處是第一核心邏輯可以在控制臺(tái)里單測(cè)不用每次點(diǎn)開圖形界面驗(yàn)證第二如果你想把這個(gè)掃雷邏輯改造成服務(wù)端算法演示或者加個(gè) AI 自動(dòng)求解器純邏輯類直接搬走就能編譯。拿到源碼工程后先讀 CSweepGame 的頭文件再看視圖類的消息映射表最后再看 OnDraw這個(gè)閱讀順序半天就能把工程吃透。2.3 格子坐標(biāo)與像素坐標(biāo)的換算界面層的第一道坎掃雷界面看起來(lái)是一個(gè)二維格子數(shù)組但鼠標(biāo)消息給到你的只有 CPoint 像素坐標(biāo)。格子坐標(biāo)用行 row 和列 col 表示從 0 開始像素坐標(biāo)從窗口客戶區(qū)左上角開始單位是像素。兩者之間差一個(gè)「棋盤繪制起點(diǎn)」和「格子邊長(zhǎng)」。這個(gè)換算做不對(duì)點(diǎn)擊和繪制就會(huì)錯(cuò)位半個(gè)格子翻車現(xiàn)場(chǎng)極其詭異。const int CELL_SIZE 24; // 每個(gè)格子的像素邊長(zhǎng) const int BOARD_LEFT 12; // 棋盤左邊距 const int BOARD_TOP 12; // 棋盤頂邊距 BOOL CSweepMinesView::GetCellFromPoint(CPoint pt, int row, int col) { if (pt.x BOARD_LEFT || pt.y BOARD_TOP) return FALSE; col (pt.x - BOARD_LEFT) / CELL_SIZE; row (pt.y - BOARD_TOP) / CELL_SIZE; if (row m_game.GetRows() || col m_game.GetCols()) return FALSE; return TRUE; }這里有兩個(gè)關(guān)鍵參數(shù)要解釋清楚。CELL_SIZE 如果取得太小比如小于 16手指或鼠標(biāo)操作很容易誤點(diǎn)相鄰格子取太大大于 40又會(huì)占滿屏幕30x16 的高級(jí)棋盤根本顯示不下。我一般固定在 20 到 28 之間配合窗口尺寸動(dòng)態(tài)調(diào)整。BOARD_LEFT 和 BOARD_TOP 的 12 像素邊距是為了給棋盤留出呼吸空間也讓點(diǎn)擊不到邊界處時(shí)能被上面的邊界判斷直接攔掉。注意 GetCellFromPoint 是先減邊距再除格子邊長(zhǎng)順序反了起點(diǎn)偏移會(huì)導(dǎo)致第一列格子死活點(diǎn)不中。3. 掃雷核心算法布雷、數(shù)字統(tǒng)計(jì)與泛洪展開3.1 布雷第一次點(diǎn)擊必須「安全」周圍一圈不能有雷掃雷程序在算法層最容易犯的錯(cuò)誤是在初始化時(shí)就布好雷然后讓玩家去點(diǎn)。這么做第一次點(diǎn)擊有七分之一概率直接踩雷玩家體驗(yàn)極差。行業(yè)慣例是「延時(shí)布雷」第一次鼠標(biāo)落下之前棋盤上只有空白第一次點(diǎn)擊落在一個(gè)格子 (firstRow, firstCol) 之后再布雷并且這個(gè)格子和它周圍 3x3 的格子全部要排除在雷點(diǎn)之外。void CSweepGame::InitMines(int safeRow, int safeCol) { std::mt19937 rng(std::random_device{}()); int need m_nMines; while (need 0) { int r (int)(rng() % m_nRows); int c (int)(rng() % m_nCols); if (m_board[r][c] MINE) // 已經(jīng)是雷跳過(guò) continue; if (abs(r - safeRow) 1 abs(c - safeCol) 1) continue; // 第一次點(diǎn)擊的 3x3 區(qū)域全部留白 m_board[r][c] MINE; --need; } }這段代碼里有三個(gè)參數(shù)值得展開說(shuō)。m_nMines 是總雷數(shù)經(jīng)典配置是初級(jí) 9x9 放 10 顆、中級(jí) 16x16 放 40 顆、高級(jí) 30x16 放 99 顆這也是 Windows 掃雷沿用多年的平衡參數(shù)。abs(r - safeRow) 1 的判斷把安全區(qū)限定在 3x3 范圍不是只排除點(diǎn)擊的那一個(gè)格子因?yàn)槿绻皇侵行狞c(diǎn)安全旁邊八個(gè)格子仍可能被數(shù)字「鎖死」玩家依然會(huì)覺(jué)得開局很憋屈。隨機(jī)源我傾向用 std::mt19937配合隨機(jī)種子設(shè)備而不是老的 rand()因?yàn)?rand() 在 VS 里的低位隨機(jī)性不好可能出現(xiàn)雷集中在某條對(duì)角線上的情況給玩家的「玄學(xué)」體驗(yàn)很差。3.2 數(shù)字統(tǒng)計(jì)與 BFS 泛洪展開為什么不能用遞歸布雷完成之后要給每個(gè)非雷格子填上 0 到 8 的數(shù)字表示它周圍九宮格里有多少顆雷。最直接的做法是布雷時(shí)每放一顆雷就把周圍八個(gè)格子的數(shù)字加一順手完成統(tǒng)計(jì)不需要二次掃描。展開是掃雷最核心的算法動(dòng)作當(dāng)你點(diǎn)開一個(gè)數(shù)字為 0 的空白格時(shí)要把與之相連的一大片空白區(qū)全部翻開。很多人第一反應(yīng)是遞歸深度優(yōu)先展開比如 while 里自己調(diào)自己代碼確實(shí)短但在 30x16 的高級(jí)棋盤上一片大空?qǐng)隹赡芤淮握归_幾百個(gè)格子遞歸深度在最壞情況下可能逼近棋盤尺寸。MFC 默認(rèn)線程棧只有 1MB深遞歸很容易直接崩掉程序表現(xiàn)就是點(diǎn)開空?qǐng)鰰r(shí)窗口無(wú)響應(yīng)或瞬間退出。我一般用隊(duì)列做 BFS顯式管理待展開隊(duì)列棧上只保存一個(gè)循環(huán)。void CSweepGame::FloodOpen(int startRow, int startCol) { std::queuestd::pairint, int q; q.push({startRow, startCol}); while (!q.empty()) { auto [r, c] q.front(); q.pop(); if (r 0 || r m_nRows || c 0 || c m_nCols) continue; if (m_board[r][c] MINE) continue; if (m_show[r][c] ! COVERED) // 已翻開或已插旗不進(jìn)隊(duì) continue; m_show[r][c] OPENED; m_openedCount; if (m_board[r][c] 0) { // 只有空格繼續(xù)擴(kuò)散有數(shù)字的格子自動(dòng)停 for (int dr -1; dr 1; dr) for (int dc -1; dc 1; dc) if (dr ! 0 || dc ! 0) q.push({r dr, c dc}); } } }參數(shù)和條件要特別說(shuō)清楚。m_show[r][c] ! COVERED 這個(gè)判斷過(guò)濾掉了已經(jīng)翻開的格子和插了旗的格子避免同一個(gè)格子反復(fù)入隊(duì)造成死循環(huán)。m_board[r][c] 0 才繼續(xù)擴(kuò)展邊界這是掃雷「點(diǎn)空格連片翻開」規(guī)則的精髓數(shù)字格是擴(kuò)展的自然邊界不用人為設(shè)深度限制。隊(duì)列用 std::pair 存坐標(biāo)如果有性能潔癖可以用兩個(gè) int 拼成一個(gè) 64 位整數(shù)再壓隊(duì)列省去 pair 的構(gòu)造開銷但初級(jí)棋盤幾萬(wàn)個(gè)格子根本測(cè)不出差別可讀性優(yōu)先。3.3 勝利判定與剩余雷數(shù)把狀態(tài)機(jī)收口勝利的條件不是「把所有雷找出來(lái)」而是「把所有非雷格子都翻開」。這個(gè)邏輯要反過(guò)來(lái)寫才不容易漏判棋盤總格子數(shù)減去雷數(shù)就是安全格總數(shù)m_openedCount 每翻開一個(gè)安全格就自增當(dāng)它等于安全格總數(shù)時(shí)判定勝利。bool CSweepGame::IsWin() const { return m_openedCount m_nRows * m_nCols - m_nMines; } int CSweepGame::GetMineLeft() const { int flagged 0; for (int r 0; r m_nRows; r) for (int c 0; c m_nCols; c) if (m_show[r][c] FLAGGED) flagged; return m_nMines - flagged; }這里有個(gè)實(shí)際開發(fā)中容易忽略的細(xì)節(jié)GetMineLeft 返回的「剩余雷數(shù)」在玩家亂插旗時(shí)可能變成負(fù)數(shù)。因?yàn)椴迤熘皇峭婕业臉?biāo)記行為不代表真的插對(duì)了位置。狀態(tài)欄如果直接顯示負(fù)數(shù)會(huì)顯得很傻所以顯示層要對(duì)小于零的值做截?cái)嗷蛘吒纱嘀伙@示 max(0, m_nMines - flagged)。這個(gè)函數(shù)我故意沒(méi)有把統(tǒng)計(jì)值緩存成成員變量因?yàn)槠灞P一共就幾百個(gè)格子每次狀態(tài)欄刷新時(shí)現(xiàn)算 900 次循環(huán)在毫秒級(jí)緩存反而要額外管理「什么時(shí)候失效」的邊界問(wèn)題。勝利判定要放在每次成功翻開格子之后立刻執(zhí)行而不能放在 OnDraw 里判斷否則會(huì)出現(xiàn)「明明贏了但界面沒(méi)有任何反應(yīng)」的詭異現(xiàn)象——因?yàn)槔L制不會(huì)主動(dòng)觸發(fā)業(yè)務(wù)邏輯。4. 把算法粘到窗口上OnDraw、鼠標(biāo)消息與狀態(tài)欄4.1 OnDraw 雙緩沖繪制畫格子、畫數(shù)字、畫地雷視圖類的 OnDraw 是 MFC 里所有繪制的總?cè)肟谄聊簧厦看伟l(fā)生變化框架都會(huì)通過(guò) Invalidate 機(jī)制觸發(fā)它重畫。掃雷的繪制邏輯其實(shí)就三層先鋪棋盤底色再對(duì)每個(gè)格子按顯示狀態(tài)畫翻開或未翻開的樣式最后在翻開的格子上寫字或畫雷。直接在每個(gè) WM_PAINT 里調(diào)用 CDC 的畫矩形和 TextOut 函數(shù)在高分屏或者程序頻繁刷新時(shí)會(huì)閃屏閃到懷疑人生。閃屏的根因是系統(tǒng)先擦背景再畫前景中間一幀露出了窗口底色。解法是雙緩沖先在內(nèi)存里建一個(gè)兼容位圖把整幀棋盤畫到內(nèi)存 DC 上再一次 BitBlt 拷貝到窗口 DC。void CSweepMinesView::OnDraw(CDC* pDC) { CRect rcClient; GetClientRect(rcClient); CDC memDC; memDC.CreateCompatibleDC(pDC); CBitmap bmp; bmp.CreateCompatibleBitmap(pDC, rcClient.Width(), rcClient.Height()); CBitmap* pOldBmp memDC.SelectObject(bmp); memDC.FillSolidRect(rcClient, RGB(200, 200, 200)); for (int r 0; r m_game.GetRows(); r) { for (int c 0; c m_game.GetCols(); c) { CRect cell(BOARD_LEFT c * CELL_SIZE, BOARD_TOP r * CELL_SIZE, BOARD_LEFT (c 1) * CELL_SIZE, BOARD_TOP (r 1) * CELL_SIZE); DrawCell(memDC, r, c, cell); } } pDC-BitBlt(0, 0, rcClient.Width(), rcClient.Height(), memDC, 0, 0, SRCCOPY); memDC.SelectObject(pOldBmp); }這段代碼里 CreateCompatibleBitmap 創(chuàng)建的位圖大小是客戶區(qū)尺寸棋盤如果只有 9x9客戶區(qū)更大也無(wú)所謂空余部分會(huì)被 FillSolidRect 的灰色填充。DrawCell 是自行封裝的按格子狀態(tài)繪制的函數(shù)未翻開畫凸起效果的矩形翻開畫淺色底數(shù)字用 TextOut 按顏色映射輸出地雷用 LoadIcon 拖出來(lái)的 HICON 配合 DrawIcon 畫。雙緩沖的唯一代價(jià)是每幀多一次整圖 BitBlt但對(duì)于幾百個(gè)格子的棋盤完全可以忽略。注意 memDC 和 bmp 的生命周期必須在函數(shù)內(nèi)結(jié)束離開作用域后 GDI 對(duì)象要釋放否則反復(fù)重繪會(huì)導(dǎo)致 GDI 句柄泄漏程序跑一小時(shí)之后繪制開始花屏。4.2 鼠標(biāo)消息左鍵翻開、右鍵插旗、左右鍵連點(diǎn)判斷鼠標(biāo)消息是掃雷交互的核心。左鍵在未翻開格子上按下并松開會(huì)翻開該格右鍵循環(huán)切換 插旗 → 問(wèn)號(hào) → 取消標(biāo)記左右鍵同時(shí)在數(shù)字格上按下松開時(shí)會(huì)翻開周圍八格快速翻面前提是周圍旗子數(shù)剛好等于該格數(shù)字。MFC 里左右鍵同時(shí)按的檢測(cè)要小心因?yàn)?Windows 默認(rèn)不區(qū)分左右鍵的特殊組合狀態(tài)必須自己在成員變量里記錄左鍵是否處于按下狀態(tài)。void CSweepMinesView::OnLButtonDown(UINT nFlags, CPoint point) { int row, col; if (!GetCellFromPoint(point, row, col)) return; if (m_game.IsGameOver()) return; if (!m_game.IsStarted()) { m_game.InitMines(row, col); // 第一次點(diǎn)擊延時(shí)布雷 m_game.Start(); SetTimer(TIMER_ID, 1000, nullptr); } m_leftDown TRUE; m_leftRow row; m_leftCol col; m_game.LeftPress(row, col); } void CSweepMinesView::OnLButtonUp(UINT nFlags, CPoint point) { m_leftDown FALSE; if (m_game.IsChording(m_leftRow, m_leftCol, GetKeyState(VK_RBUTTON) 0)) { m_game.ChordOpen(m_leftRow, m_leftCol); } else { m_game.Open(m_leftRow, m_leftCol); } Invalidate(TRUE); }OnLButtonUp 里的判斷邏輯是掃雷手感的關(guān)鍵。m_leftDown 成員變量用來(lái)記錄左鍵按下狀態(tài)因?yàn)?OnLButtonUp 觸發(fā)時(shí) nFlags 已經(jīng)不包含左鍵狀態(tài)了如果不記錄右鍵按下時(shí)再松開左鍵程序會(huì)誤判為「單純右鍵事件」。GetKeyState(VK_RBUTTON) 判斷右鍵是否處于按下狀態(tài)左右鍵都在按下時(shí)松開左鍵就執(zhí)行連點(diǎn)翻開。m_game.Open 里要區(qū)分三種情況點(diǎn)到雷直接游戲結(jié)束并翻開所有雷點(diǎn)到數(shù)字只翻這一格點(diǎn)到空格調(diào)用 FloodOpen 整片展開。插旗邏輯放在 OnRButtonDown 里循環(huán)切換三種顯示狀態(tài)后 Invalidate(TRUE) 只重繪棋盤區(qū)域不用整窗刷新。4.3 狀態(tài)欄顯示用時(shí)和剩余雷數(shù)MFC 狀態(tài)欄怎么顯示才能一次成功掃雷界面上雷數(shù)和秒數(shù)一般顯示在狀態(tài)欄右側(cè)而狀態(tài)欄在 MFC 里是很多人看了教程還是寫不出來(lái)的「黑匣子」。原因多半是指示器Indicator數(shù)組和資源 ID 的對(duì)應(yīng)關(guān)系搞錯(cuò)。狀態(tài)欄要顯示一段動(dòng)態(tài)文本核心步驟是三步在資源文件里定義一個(gè) ID 常量把它加進(jìn)視圖類的 indicators 數(shù)組再用 SetPaneText 往對(duì)應(yīng)的索引位置寫字符串。static UINT indicators[] { ID_SEPARATOR, // 0 號(hào)窗格默認(rèn)提示區(qū) ID_INDICATOR_TIME, // 1 號(hào)窗格顯示已用時(shí)間 ID_INDICATOR_MINE // 2 號(hào)窗格顯示剩余雷數(shù) }; void CSweepMinesView::UpdateStatusBar() { CString str; str.Format(_T(時(shí)間 %d 秒), m_seconds); m_wndStatusBar.SetPaneText(1, str); str.Format(_T(剩余雷數(shù) %d), max(0, m_game.GetMineLeft())); m_wndStatusBar.SetPaneText(2, str); }這里的坑集中在 SetPaneText 的下標(biāo)上。indicators 數(shù)組的第一個(gè)元素 ID_SEPARATOR 是標(biāo)準(zhǔn)的「提示信息窗格」它占 0 號(hào)位如果你把 ID_INDICATOR_TIME 放在數(shù)組第一個(gè)位置狀態(tài)欄第一格就會(huì)縮成一小條文本要么顯示不全要么直接消失。另一個(gè)常見問(wèn)題是只在 SetTimer 的 WM_TIMER 處理里刷新狀態(tài)欄導(dǎo)致玩家不點(diǎn)棋盤時(shí)秒數(shù)不動(dòng)——正確做法是讓 UpdateStatusBar 成為統(tǒng)一的刷新出口定時(shí)器、插旗、翻開格子都調(diào)它。狀態(tài)欄窗格的寬度默認(rèn)很小需要在 CMainFrame::OnCreate 里調(diào) SetPaneInfo 把 1 號(hào)窗格的寬度拉大到 90 像素否則「時(shí)間 999 秒」這類長(zhǎng)文本會(huì)被截?cái)唷?. 掃雷 MFC 程序最常踩的 5 個(gè)坑現(xiàn)象、原因、解決辦法5.1 坑一第一次點(diǎn)擊必然炸開雷或被判定為踩雷現(xiàn)象玩家第一次點(diǎn)格子還沒(méi)看到數(shù)字棋盤直接翻開一堆雷游戲結(jié)束?;蛘呤堑谝淮吸c(diǎn)擊那一格不炸但它周圍一圈必定有雷開局必死。原因布雷發(fā)生在初始化階段而不是第一次點(diǎn)擊之后。安全區(qū)只排除了點(diǎn)擊的那一格沒(méi)有排除周圍 3x3。這種實(shí)現(xiàn)等于沒(méi)做延時(shí)布雷玩家沒(méi)有任何操作空間。解決把 InitMines 移到第一次 OnLButtonDown 里調(diào)用傳入 (row, col)安全判斷用 abs(r - safeRow) 1 abs(c - safeCol) 1把周圍 8 格全部排除。之后再啟動(dòng)定時(shí)器開始計(jì)時(shí)計(jì)時(shí)起點(diǎn)也要從這時(shí)算不能從窗口創(chuàng)建時(shí)算。5.2 坑二翻開大空白區(qū)時(shí)程序卡死或直接崩潰現(xiàn)象點(diǎn)到一個(gè)空格周圍連片翻開棋盤大范圍變白但緊接著窗口無(wú)響應(yīng)幾秒后提示程序已停止工作。用調(diào)試模式跑斷點(diǎn)會(huì)停在一個(gè)很深很深的位置。原因泛洪展開用了遞歸且遞歸函數(shù)在每次展開時(shí)又把 8 個(gè)方向全部遞歸進(jìn)去。高級(jí)棋盤 30x16 的空白連片可能一次性展開 200 格以上遞歸深度會(huì)被疊到幾百層MFC 默認(rèn)線程??覆蛔≈苯?stack overflow。更隱蔽的是遞歸實(shí)現(xiàn)如果沒(méi)做「已翻開判斷」兩個(gè)相鄰空格會(huì)互相遞歸到天荒地老。解決改用隊(duì)列 BFS。每次從隊(duì)列里取出一個(gè)坐標(biāo)先做四道過(guò)濾——越界、踩雷、已翻開、插旗全部通過(guò)后才執(zhí)行翻開動(dòng)作??崭癫虐燕従尤腙?duì)數(shù)字格自動(dòng)終止擴(kuò)散。這個(gè)改法還能順帶解決空格帶數(shù)字邊界的展開順序問(wèn)題數(shù)字格會(huì)在空格之后逐個(gè)被翻開效果和遞歸版一致但絕不會(huì)爆棧。5.3 坑三每秒刷新秒數(shù)時(shí)整個(gè)棋盤瘋狂閃爍現(xiàn)象把定時(shí)器設(shè)成 1000 毫秒刷新狀態(tài)欄但結(jié)果發(fā)現(xiàn)不光是狀態(tài)欄在動(dòng)整個(gè)棋盤每秒鐘閃一次拖拽窗口時(shí)閃爍更嚴(yán)重。原因定時(shí)器處理函數(shù)里直接調(diào)用了 Invalidate(FALSE)觸發(fā)整窗重繪。OnDraw 里又沒(méi)用雙緩沖每個(gè)格子的矩形繪制之間系統(tǒng)反復(fù)擦背景、畫格子、擦背景、畫格子視覺(jué)上就是高頻閃爍。狀態(tài)欄變化根本不需要重畫棋盤這是典型的「刷新范圍過(guò)大」問(wèn)題。解決兩層處理。第一狀態(tài)欄刷新只調(diào) SetPaneText絕不調(diào)用 Invalidate棋盤內(nèi)容變化時(shí)才用 InvalidateRect 只圈出變化的格子區(qū)域比如翻開一個(gè)格子就只刷新那個(gè)格子的矩形。第二把 OnDraw 改成雙緩沖繪制先把整個(gè)棋盤畫進(jìn)內(nèi)存位圖再整體 BitBlt徹底消除擦除和繪制之間的空窗期。改了這兩處之后秒數(shù)走到 999 也不會(huì)閃。5.4 坑四狀態(tài)欄文本顯示不出來(lái)或者顯示位置和大窗格擠在一起現(xiàn)象程序跑起來(lái)了狀態(tài)欄也有但 SetPaneText 寫進(jìn)去的「秒數(shù)」「雷數(shù)」怎么都不顯示偶爾顯示了卻和左側(cè)的提示文字?jǐn)D在一塊。原因indicators 數(shù)組里的 ID 順序和資源文件里 ID 的定義順序不一致SetPaneText 下標(biāo)對(duì)不上位另一個(gè)常見原因是狀態(tài)欄窗格寬度沒(méi)有被 SetPaneInfo 拉開文本畫在了不可見的區(qū)域里。ID_SEPARATOR 放在數(shù)組第一個(gè)元素但資源文件里 ID_INDICATOR_TIME 排在它前面消息映射就把索引搞亂了。解決先確認(rèn) indicators 數(shù)組里第一個(gè)元素必須是 ID_SEPARATOR它占 0 號(hào)動(dòng)態(tài)文本從 1 號(hào)開始。然后在 CMainFrame::OnCreate 里對(duì)每個(gè)要顯示動(dòng)態(tài)文本的窗格調(diào) SetPaneInfo(1, ID_INDICATOR_TIME, SBPS_NORMAL, 90)第四參數(shù)是寬度像素值。最后用 Spy 或臨時(shí)寫死字符串驗(yàn)證 SetPaneText 的第一個(gè)參數(shù)索引排錯(cuò)時(shí)先把文本寫死成「測(cè)試」確認(rèn)顯示鏈路通再換成動(dòng)態(tài)變量。這個(gè)排錯(cuò)順序能省下大量排查時(shí)間。5.5 坑五左右鍵同時(shí)點(diǎn)的「快速翻開」經(jīng)常誤觸或者根本觸發(fā)不了現(xiàn)象按住右鍵后再點(diǎn)左鍵左鍵那一下直接觸發(fā)了單人翻格快速翻面沒(méi)有生效或者反過(guò)來(lái)左鍵按著去點(diǎn)右鍵反而炸開了一片雷。原因Windows 的鼠標(biāo)消息里OnLButtonDown 和 OnRButtonDown 是兩個(gè)獨(dú)立事件系統(tǒng)不給你「左右鍵組合」的現(xiàn)成通知。如果不在按下時(shí)記錄狀態(tài)松開時(shí)就去查另一端是否還按著大概率已經(jīng)查不到。比如你先按下左鍵系統(tǒng)立刻觸發(fā)了 OnLButtonDown 里的 Open 邏輯還沒(méi)等你按右鍵格子已經(jīng)被翻開了。解決把「翻開」動(dòng)作從 OnLButtonDown 挪到 OnLButtonUp 里執(zhí)行。按下時(shí)只記錄坐標(biāo)和左鍵狀態(tài)松開時(shí)才判斷如果此時(shí)右鍵也處于按下狀態(tài)執(zhí)行連點(diǎn)翻開周圍八格否則執(zhí)行普通翻開。同樣右鍵按下時(shí)也不要立刻插旗等 OnRButtonUp 再執(zhí)行。這樣左右鍵無(wú)論按下順序如何組合邏輯都只發(fā)生在松開的那一顆。注意連點(diǎn)翻開的判定條件還要帶上 m_game.IsChording周圍旗子數(shù)必須等于該格數(shù)字否則就算左右鍵同時(shí)按也無(wú)法強(qiáng)制翻開這是掃雷的規(guī)則邊界。6. 裝一個(gè)自動(dòng)驗(yàn)證腳本2000 局幫你找出算法死角掃雷邏輯寫完后最怕的是「手動(dòng)玩了幾盤看起來(lái)正常但雷總數(shù)不對(duì)、數(shù)字越界、勝利判定不觸發(fā)」這類隱蔽問(wèn)題。我自己的習(xí)慣是把 CSweepGame 做成純 C 類之后立刻寫一個(gè)不依賴 MFC 的控制臺(tái)驗(yàn)證程序批量模擬點(diǎn)擊把算法死角全部炸出來(lái)。這個(gè)驗(yàn)證腳本成本很低但對(duì)「拿到源碼后想改造成課設(shè)或加功能」來(lái)說(shuō)是判斷這套代碼值不值得繼續(xù)投入的關(guān)鍵。驗(yàn)證程序要模擬三類操作隨機(jī)點(diǎn)擊未翻開的格子、對(duì)已翻開的數(shù)字格做左右鍵連點(diǎn)、在雷密集區(qū)域隨機(jī)插旗。核心校驗(yàn)點(diǎn)有三個(gè)布雷數(shù)量必須嚴(yán)格等于設(shè)定值所有翻開的格子數(shù)字必須和周圍實(shí)際雷數(shù)一致2000 局里不能出現(xiàn)一次崩潰或死循環(huán)。下面是一段最小驗(yàn)證框架int main() { std::mt19937 rng(42); int winCount 0; const int TRIALS 2000; for (int t 0; t TRIALS; t) { CSweepGame game(16, 16, 40); game.InitMines(-1, -1); // 不設(shè)安全區(qū)跑純算法正確性 int guard 0; while (!game.IsGameOver() guard 10000) { int r (int)(rng() % game.GetRows()); int c (int)(rng() % game.GetCols()); game.Open(r, c); guard; if (guard 5000) break; // 防止隨機(jī)策略把局面拖死 } if (game.IsWin()) winCount; // 校驗(yàn)雷數(shù) int mineSum 0; for (int r 0; r game.GetRows(); r) for (int c 0; c game.GetCols(); c) if (game.GetCell(r, c) MINE) mineSum; assert(mineSum 40); } printf(勝利局?jǐn)?shù): %d / %d\n, winCount, TRIALS); return 0; }這段腳本里 InitMines(-1, -1) 故意傳非法坐標(biāo)讓布雷邏輯跳過(guò)安全區(qū)過(guò)濾專門測(cè)試算法在極端情況下的穩(wěn)定性。guard 變量是防死循環(huán)的保險(xiǎn)絲因?yàn)榧冸S機(jī)策略可能永遠(yuǎn)點(diǎn)不完安全格超過(guò) 5000 步就主動(dòng)切下一局。assert 雷數(shù)校驗(yàn)?zāi)茉?Debug 模式下第一時(shí)間暴露布雷漏雷或重復(fù)布雷的問(wèn)題。跑完之后勝率高低不重要——隨機(jī)點(diǎn)擊策略本來(lái)就不聰明——重要的是它不崩潰、不掛起、雷數(shù)恒定、數(shù)字無(wú)越界。這四點(diǎn)過(guò)了你才可以放心把邏輯接回界面層繼續(xù)做交互優(yōu)化。我的血淚經(jīng)驗(yàn)是MFC 界面代碼的問(wèn)題往往一眼能看出來(lái)而算法層的問(wèn)題會(huì)偽裝成「偶爾閃退」「某局判輸錯(cuò)誤」這種玄學(xué) bug。把核心邏輯拆出去做無(wú)頭測(cè)試是給自己的后悔藥。掃雷這種工程量級(jí)的項(xiàng)目驗(yàn)證腳本半小時(shí)就能寫完但它能在你發(fā)布源碼之前把最掉鏈子的角落全部兜住。希望這套從選型、骨架、算法到排錯(cuò)的完整鏈路能幫你把「用 MFC 開發(fā)的掃雷游戲程序」真正做成一個(gè)拿得出手、敢給別人看的工程。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日操粉逼逼| 精品久久97| 日本精品网站在线中文| 国产亚洲福利第一页丝袜| 精品性爱久久视频| 一区二区三区四区五区高清无码永久视频 | 清柠毛片| 人人天天干干| 国精精品无码一二三区水多多| 亚洲国产97在线精品一区| 亚洲AV无码久久精品蜜桃小说| 丁香五月婷婷色| 免费自拍三级综合| 麻豆天美91| 日韩有码中文字幕女同性恋| 日本 情色 1区2区3区| 成人五月天色网| 男人的天堂,欧美亚洲另类国产日韩,日本高清一区二区 | 岛国AB视频| 久久一二三四| 精品福利| 日产欧美电影一区二区三区| 欧美日韩色综合网| 欧美天天干| 操逼逼一区视频| 97在线观看| 亚洲色交| 深夜福利黄片| 涩综合导航| 激情文学88| 酒色综合网| 色网亚洲人| 亚洲九九九| 26uuu成人影片| 夫妻日逼| 色欧美亚洲| 啪啪啪男女亚洲中文字幕99| chaopen97久久| 婷婷五月天色网| 国产精品69久久久久孕妇欧美| 91伊人久久在线| 啊啊啊啊啊啊啊啊要喷了| 国产精品天干天干综合网麻豆 | 躁躁日曰躁2020| 成人无码专区精品视频| 美女十八禁| 91天天看| 日本免费中文字幕在线| 欧美日韩香蕉| 五月天综合网| 国产夫妻一区二区| 中出在线视频| 91国模| www国产无码| 亚洲性爱乱操x| 影音先锋日本一区二区| 亚洲四虎熟女精品| 日韩欧美成人大香蕉| 大香伊人在线一区| 久久久久久久久久久久欧美日| 国产情色第一第二页在线观看| 新怡红院| 最新av网站在线观看| 欧美久久伊人| 91天天爱| 天天看天天日| 亚洲国产日韩欧美熟妇在线| 六六久久日韩不卡| 久久久久9999妇女| 欧美九九九| 日韩国产不卡在线视频| 99激情视频| 中文字幕国产精品1区| 任我爽视频在线观看| 国产乱子伦一区二区三区免看| av橘色网站| 人人摸人人入| 黄aaaaaaaaaaaaaaaaaa色网站| 99热在线观看| 欧美丰满熟妇XXXX性ppX人交| 欧美国产日韩清纯唯美| 久久动漫精品视频这里只有精品| 伊人麻豆传媒| 黄色区免费观看中文字幕| 久热九九| 亚洲国产亚洲天堂| 欧美大香蕉久| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 国产精品乱码久久久久久久久| 日韩一级性爱无码| 97久久超碰| 美欧老女人97| 精品在线观看视频在线| 97色视频在线| 亚洲欧洲网站免费观看| 亚洲区限制级| 亚洲无码 国产无码| 无遮挡猛进视频免费无限观看| 色综合中文字幕不卡| 欧美色蜜桃97| 色综合尤物| 久草精品视频| 中国乱伦一区二区| daxiangjiao你懂的| 日产操逼| 极品粉嫩一区二区| 欧美特大AA级黄片| 亚洲综合影视| 天天射天天| 泰国AV在线观看| 97在线播放| 欧美日韩香蕉| 日日嗷| 搡老人老9丨女老熟人| 婷婷五月天无码 | 亚洲乱色视频一区、二区在线| 一卡二卡三卡| 婷婷五月天_亚洲小说欧美激情另类_精品久久国产字幕 | 亚洲综合九九| 久久久久久中文字幕中文字幕最新| 亚洲操操操无码| 97啪啪| 欧美色91| 台湾佬激情综合| 色综合加勒比| 色天堂在线观看| 日本免费专区| 秋霞Av理论一级在线| 日本青青草在线| 欧美一级美片在线观看免费| 欧美变态激情网| 国产av波波国产精品| 操淫穴亚洲五月丁香| 激情视屏国产乱伦强奸| 九九九九热只有精品| 色区久久| 天天看天天日天天操| 九九九久千久久激情蜜桃在线看| 亚洲囯产精品女人久久久| 久久久91福利姬| 欧美在线播放aaaa| 亚洲不卡三级手机播放| 偷拍新久久| Julia在线播放亚洲久久| 欧美激情综合网| 久久久久久91香蕉国产| 五月综合久久| 一级人妻性爱视频| 97资源站国产精品| 综合 青草 伊久久 影院 综合| 精品久久久高清无码| 噜噜瑟| 天天摸夜夜摸| 天堂精品小草| 在线啊v一区| 日本不卡一区| 大香交| 国产少妇与亚洲av| 中文字幕狠狠玩| 中文字幕三四区| 亚洲综合性网址| 午夜男人一级A片7777| 91丨人妻丨国产丨丝袜| 精品综合久久久久久97| 亚洲熟妇丝袜在线观看| 91一起操| 美国一区二区免费视频| 国产兽交视频在线播放| 欧洲精品二区| 亚洲欧美综合网站| 97一区二区三区视频| 77777亚洲蜜臀精品久久综合蜜臀| 亚洲第一狼人丝袜美女另类 | 韩国久久97| 大香网站| 日韩一级特黄av毛片| 久久精品久| 天天综合站| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 色情婷婷久久五月天| 日韩99999色| 亚洲激情综合| 91丨九色丨国产打屁股| 一个人在线看的黄色电影网站| 伊人久久大香大香线蕉中文| 韩国一级AAA| 色欲三区| 人人贴人人摸| 亚洲欧洲中文日韩女优乱码| 国产白丝精品在线观看| 天天影视色香欲综合网小说| 91综合网在线| 日韩无码一区二区三区| 丝袜美腿操av| 色网亚洲人| 韩日自拍| 人妻少妇久久| 亚州欧美色图| 天天干人人看综合| 久久精品国产亚洲AV片多多| 综合操逼| 97国产成人精品免费视频| 国产精品久久久久无码A√| 国产版a级片直播在线| 国产精品久久久久久照片| 国产高清亚洲日韩一区| 黑人娇小av在线播放| 午夜毛片亚洲精品片国产久久久| 福利视频香蕉免费一区二区在线| 国产一级高清免费观看| 视频国产欧美在线播放| 无码操逼网| 国产高清MV操逼视频| 人妻 丝袜美腿 中文字幕| 亚洲自拍天堂| 亚洲欧洲国产综合av| 成人性爱电影一区二区| 精品无码一区二区| 九九英色视频| 国产精品一区二区麻豆| 美女91AV| 精品国产三级av韩国在线| 2017人人操,人人摸| 国产亚洲精品激情| 丰满少妇乱子伦精品无| 99激情视频| 超碰资源亚洲97| caopeng97人妻| 亚洲美女 晚间男人天堂 | 国产9 9在线 | 亚洲| 日本成人A片网站| 乱伦AVxx| 亚洲 中文 女同| 亚洲激情天堂网| 欧美色老汉| 精品91| 超碰无码加勒比| 久操不卡视频| 99热精品国产| 久久午夜神马| 国产精品久久久久综合| 中文字幕在线观看AV| 久久久男人的天堂| 亚洲欧洲av影音| 操逼不卡中文字幕| 男人天堂婷婷五月天校园春色| 国产夫妻一区二区| 91麻豆天美国产欧美高潮| 男人天堂2017| 亚洲黄网在哪免费看| 五月天激情网图片| 后入式视频国产自| 高清国产精品福利网站| 欧美顶级黄片AAAAA在线免费看| 91粉芽高清在线一区二区| www.91欧美| 人人操超碰在线| 天天看精品动漫视频一区| 日韩精品视频在线观看一卡二卡| 亚洲熟妇无码一区二区三区| 亚洲综合色图欧美| 欧美国产伊人久久久久| 人妻熟女一区二区三区在线| 亚洲91色| 久7色| 色约约一区=区三区| 日韩中文字幕人妻视频| 夜夜操天天肏| 襙一襙| 久久怡红院| 久久成人精品| 白嫩国模丰满一二三区| 九九九九九用不成了| 亚洲无线观看久久| 国产日本熟女顶级一区二区三区视频| 日韩欧美中文字幕搭讪巨乳美人妻视频| av在线免费一区二区| 亚州成人a∨| 91色拍| 日韩本不卡视频在线观看 | 国产精品九九| 成人女人国产| 亚洲春色一区二区三区| 96精品在线| 9 1果冻精品视频| 丝袜色综合| 嫩草 我啊~嗯~在线| 国产精品探花色| 日韩熟女精品无码专区一区二区| 啊啊啊免费| 婷婷大香蕉| 日韩成人小视频| 精品久久久亚洲AV成人网站| 精品二区三四区五电影 | 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 日韩少妇无吗| 亚洲日韩美女中文字幕乱| 欧美 日韩 婷婷 五月| 久操凹凸视频| 91熟女视频网| 97亚洲国产影视| 国产辣妈在线视频福利| 91强在线播放| 伊人色综合网电影| 免费视频97| 久久欧美1卡2卡3| 干我久操| 97伊人超碰| 日韩一区二区精品视频| 欧美一区二区三区互相| 伊人国产视频| 亚洲天堂 视频你懂的| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 97在线精品观看视频| 欧美熟女丝袜| 婷婷综合| 欧美一区二区福利在线| 黄页网站成人免费| 嗯阿好爽好紧| 国产CHASE男男GAYGA 毛多色婷婷| 国产熟码AV| 久都青青视频| 天天色综亚洲91污| 中国人高清www色视频免费| 精品无人区麻豆乱码久久久| 精品少妇一区二区三区在线视频| 秋霞午夜成人福利片片| 色偷偷超碰亚洲| 久热99| 国产强奸91| 久99在线免费观看视频| 欧美美女啪啪视频| 亚洲av无线观看| 91老女人| 人乳av| 欧美激情总合网| 天天摸夜夜添无码小视频| 后入人妻无码| 好舒服视频| 天美麻豆精品视频99| 狠狠色狠狠色狠狠五月| 大学生美女口爆| 国产精品九九| 精品久久久久黄少妇| 久热91| 欧美色视频在线| 国内伊人久久久久久网站视频| 99re热| www.久久99| 91日本在线观看| 97久久精品亚洲| 啪啪视频亚洲第一| 精品九九九九九| 91精产一区二区三区| 91黑丝在线播放| 在线综合色| 久久久新亚洲AV| 精品少妇人妻一区二区三区| 黑人中出21连凳花野真衣| 妺妺跟我一起洗澡没忍住| 岛国黄片网站| 精品久久久av无码免费| 精品国产乱码久久久| 欧美人妻中出| 大香蕉宅男伊人| 手机不卡视频不卡在线一二三区| 97色色网| 婷婷香蕉欧美在线一区二区三区| 五月天精品| 麻豆国产96在线| 黄色电影观看久久9| 欧美日韩电影成人在线| 天天插夜夜操| 伊人丁香五月婷婷| 五月丁香六月综合缴清无码 | 91天美传媒精品| 亚洲熟妇极品| 东京热男人的天堂网| 新版天堂中文资源8在线| 国产一级高跟丝袜| 国产强上视频在线观看| 熟女人妇一区二区三区| 久久鲁干| 色噜噜狠狠色综无码久久合欧美| 久青草影院| 丁香六月婷婷| 99热99re超碰精品| 天天综合有色网| 亚州色图狠狠干| 久久精品夜色国产亚洲AV| 九九九久久久久| 中文字幕精品久久久久人妻红杏ⅰ| 久久中文色图| 日本精品一区二区三| 超碰在线综合97| 天天影视综合色| 天天干夜夜鈤| 国产精品日韩在线一区| 亚洲强奸乱伦影视网| 99热这里只有精品地址| 加勒比大香蕉视频在线| 亚洲精品色| 久偷拍| 加勒比伊人综合| 尤物AV免费网站| 麻豆天美在线| 国产AAAAAABBBBB| 精品国产一区二区三区香蕉欧美| 操逼逼无码| 久久久久久大| 亚洲欧美日韩电影网站一区| 丝袜加勒比| 黑人综合网| 中文字幕五月婷婷免费| 六十路日本| 天天综合亚在线| 亚州综合AⅤ| 国产精品午夜精品| 成人精品无码| 国产精品久久伊人| 91色图片| 91狠狠综| 欧美性爱精品一区二区| 二对二中文字幕。| 伊色久人大在线| 日韩免费福利在线观看| 亚洲精品99| 欧美少妇性乱| 天天干人人看综合| 丁香婷婷啪啪| 中文字幕色AV| 免费αⅴ在线观看| 久久美女国产| 少妇69中文| 超碰 欧美| 100啪啪视频大全| 超碰99热中文字幕| 五月天伊人| 亚州高清色综合| 97色综合中文网| 国产亚洲日韩在线三区黑人| 炮色五月| 亚洲有码视频二区| 色婷婷久久| 玖玖超碰熟| 亚洲av国产av综合av卡| 欧美极品女人的天堂| julia ann久久| 在线人成亚洲视频免费观看| 日韩在线视频1234| 91青青草| 精品.99999| 91 丝袜在线播放| 久久综合九九| 精品国产乱码久久久久久久久久毛片| 亚洲无码免费看| 99国产在线绯色一区| 久久久久久久9999| 看一级黄色视频| 操老熟女AV| 乱伦av国产| 诱惑人妻欧美一区在线播放| AVE乱伦| 精品女人999| 亚洲黄色电影| 色噜噜狠狠色综无码久久合欧美| 欧美春色| 无码精品一区二区三区潘金莲| 诱惑人妻欧美一区在线播放| 一类无码操逼视频| 是还免费视频1727我| 人人操人人插人www| 北京美女一区二区| 91社区拍啪人妻| 呦女网站| 九九色色| 免费人成毛片乱码| 91美女在线视频| 亚洲视频1区| 欧美变态激情网| 操逼片中文| 亚洲精品蜜桃久久久| 九色婷婷| 日本性爱视频一级| 欧美亚洲中文| 97激情97激情| 老司机深夜影院18未满| 欧美色图99| 蜜桃成人1区2区3区| 日本不卡一区| 日韩噜噜69| 伊人色综合网电影| 欧美精品精品一区二区| 国产视频小说| 99热在线播放| 日韩成人精品| 土豪酒店各种姿势玩弄极品幼稚| www色色色com| 欧美人人曰人人操人人射射| 国产成人啪一区二区| 亚州宗合另类| 26uuu国产日韩综合在线观看| 超碰在线综合97| 男人的天堂2018东京热啪啪啪| 人妻二区| 四虎影视欧美| 欧美天堂亚洲电影院一区在线播放| 国产伦精品一区二区三区在线观| 精品久久久久久中文字幕视频免费| 人人妻人人色| 色97| 俺去俺来也在线www| se..亚洲欧美| 亚洲色图 综合| 大奶啊啊好爽| 综合五月婷婷亚洲一区| 久久超碰网| 日韩人妻丝袜美腿中文| 国产乱婷婷精品二区三区| 黑丝自慰喷水网站| 欧美呦呦性爱| 亚洲欧美高清| AV中文字幕三四五| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 99性视频| 岛国AB视频| 成人毛片免费| 激情小说激情视频| 狠狠做深爱婷婷久久二区| 国产成人资源| 99热啪啪| 99热这里只有精品地址| 911av网站免费观看| 欧美日本成人一区二区| 亚洲九九爱| 69超碰综合| 日韩人妻无码专区| 午夜影美女日鸡鸡天天视频国产| 91福利网在线观看| 大香蕉综合网| 国产97亚洲| 九九九九一区| 国内精品久9| 黄色一区三区| 亚洲伊人久久精品影院| 超碰97资源大奶| 欧美日韩m| 久久国产视频性吧| 五月丁香婷婷综合| 久久激情网| 国产1769在线| 国产自偷自拍一区| 日本国产成人亚洲精品无码| 国产亲戚伦亲在线| 国产三级日产三级韩国三级| 另类 日韩 熟女| 精品亚洲国产成人精品| 欧美αv.com| 俄罗斯一区二区视频在线观看 | 亭亭丁香激情| 日本伦理一区二区| 精品一久久久| 天天拍天| 91美女视频直播| 国产9l 大屁股| 男人的天堂com| 啊v在线观看视频| 中文字幕后石码三区四区| 搡老熟女免费视频 | 国产乱码精品久久久久久 | 精品人妻一区二区视频| 性开放中文AV高清无码免费看| 婷婷久草一区二区三区| 六月丁丁香| 日本不卡三级网在线播放| 成人老鸭窝人人在线视频| 美女毛片999| 久久精品电影| 易易A毛视频| JIZZJIZZ亚洲女人被躁| 亚洲国产成人福利在线观看| av凤凰久久久| 国产不卡片| 性色av一区二区| 白嫩妹子国产骚| 9久久久久| 国产AAAAAABBBBB| 唐山老熟妇露脸啪啪叫| 亚洲有码 视频一区| 97精品综合久久网| 99热销国产这里有精品| 亚洲黄色视频在线观看视频| 天天做日日爱夜夜爽| 天天爽爽爽爽| 色爽——AV| 男人午夜天堂| 激情视屏国产乱伦强奸| 精品国产网站| 欧美最婬乱婬爆婬牲视频| 天天看天天日天天操| 密乳无码| 中文字幕 一区二区 亚洲无码| 韩日精品福利视频一区不卡在线免| 精品国产乱码久久久影院| 欧美一级AAAAAAA| 激情综合五月丁香| 韩日精品福利视频一区不卡在线免 | 欧美资源| 亚洲蜜桃V妇女| 精品一区96| av天堂加勒比| 激情小说成人日本无码一| 五月天丁香欧洲日韩| 中文字幕在线第二页| 久久夜夜| 午夜免费视频1000| 亚洲欧美内射| 超碰成人公开| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 亚洲少妇色| 男女性扦B| 亚洲97成人在线观看| 色色99| 在线色资源| 亚洲最大成人a毛毛片| 亚欧美天堂在线| 亚洲欧美黄| 综合五月婷婷| 国产后入式在线观看| 久久av成人无码免费| m欧洲一级午老| 欧美一级黄色免费专区| 亚洲一区深夜| 欧美翘臀视频网站一区二区三区| 亚洲美女自拍偷拍视频| 一本一首道人妻少妇免费久久| 亚洲图片激情小说| 亚洲1区| 亚洲欧美综合图片| 色999五月色| 99re在线视频国产| 精品高清一区二区三区三州| 国产婷婷综合在线观看| 国产高清午夜成人在线观看| 国产午夜福利电影免费在线观看| 国产精品欧美日韩久久| 性九九九九九九| 亚洲免费在线探花| 伊人久久蜜月| 超碰成人最新最好看| 在线情色电影 91大| 亚洲一级性爱视频免费看| 色天堂综合| 狠日操| 五月天加勒比啪| 亚洲αv一区二区三区| 欧美玖玖爱免费玖玖| 亚洲精品中文字幕一区在线视频| 91网站18+| 亚洲中文字幕三级在线| 久久啊啊| 亚洲、日韩、综合、另类| 天天视频黄| 亚洲大色堂| 精品视频免费在线一区| 一区超碰一区| 屌逼麻豆| 热久久国产| 青青草导航在线视频| 超碰国产在线| 日本韩国国产精品一区| 啊啊啊不要嗯嗯在线观看| 亚洲色图欧美视频| 亚洲丝袜诱惑| 大香网伊人久久综合网eew| 伊人影院综合是一个与深夜成人在线| 97人人夜| 亚洲熟妇熟在线电影视频| 国产极品美女高潮无套在线观看| 久草毛片| 亚洲伊人久久精品狠狠在线| 日韩 欧美 视频 在线 一区| 亚洲资源一区| 亚洲第一二区另类图| 日韩不卡av一二三| 欧美超碰在线| 亚洲蜜臀视频精品久久| 艹我哪美一区无码| 中文字幕91页| 欧美性爱一区二区| 亚洲综合九| 亚州精品一区二区三区香中文字幕在线| 久久超碰国产一区二区三区| 亚洲,欧美,综合网| 性色高清在线| 五月天久久久| 日本成人A片免费看| 91美| 土豪酒店各种姿势玩弄极品幼稚| 亚洲精品一区二区三区新线路| 国产自产自拍| 人人性爱视频免费| 久久内射| 四虎影视 亚洲无码| 蜜臀AV成人精品蜜臀AV久久| 伊人久久艹| 青青伊人这里只有精品| 人人操人人色网| 四虎精品永久在线观看| 亚洲成人妻日韩在线| 亚洲……91| 综合色播| 日韩免费看黄片| 国产第12页| 超碰色综合| 强乱老妇中文字幕| 午夜精品久久久99热蜜桃的功能特点| 欧美18禁91| 又大又长又爽| 激情第四色| 免费看欧美美女黄色大片| 在线看的av| 日韩 国产 欧美自拍| 加勒比伊人| 中文字幕在线免费观看| 国内毛片四区| 蜜臀99久久精品| 久久视频,这里只有精品 | 熟妇高潮一区二区免费视频| 婷婷综合五月天| 不卡免费av在线播放| 国语国产操逼伊人AV网| 国产女人和拘做爰视频 | 丁香五月婷婷基地| 丁香婷婷久久| 激情综合五月丁香| 色婷婷综合网站| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 亚洲AV免费在线观看| 亚洲欧洲偷拍一区| 夜夜爽爽爽| 天天看综合网| 亚洲AV无码| 少妇同性| 97超碰久| 九九热男人天堂| 欧美久久伊人| 精品人妻一区二区免费看| 少妇色欲综合网2| 亚州欧美在线| 日本506070| 九九综合九九综合| 亚欧高清| 手机在线中文字幕国产| 国产女人操逼视频| 青娱乐日韩无码| 大香蕉九九| 久久久草成人网站久久久草成人久久久草久久久| 99精品网| 日韩精品人妻系列无码天堂| 日韩精品99久久久久久中文字幕| 日韩78m视频| 亚洲精品久久一区二区三区蜜桃臀| 国产欧洲精品亚洲午夜拍精品| 熟女熟妇伦久久影院毛片一区二区 | 蜜乳AV一区| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 热久久国产| 韩国三级理论在线| 国产毛片精品一区二区色欲黄A片| 67914亚洲精品| 亚洲色图加勒比| 天天操美美| 97超级久久| 日本操逼aaaaa| 福利伊人玖玖国产| 国产少妇肉丝在线观看| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 国产内射爽爽大片| 亚洲天堂人妻熟妇视频| 水野优香在线观看| 久久久久亚洲一区女同性恋中文字幕| 国产2.3.4区| 亚洲日韩人妻中文字幕一区| AV免费在线播放一区| 久久久蜜桃一区二区三区| 欧美日韩国产男人| 躁躁躁日日躁2020| blacked精品一区国产| 蜜臀av一区二区三区免费观看| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚 | 色婷婷一区二区三区久久| 小视频玖玖| 无码99| 欧美桃色网| 成 人片 黄色大片| 欧美日韩m| 夜夜嗨一区| 国产女人和拘做爰视频| 啊啊啊com| 新怡红院| 欧美日本一区二区a人| 亚洲中文字幕乱码无码一区二区| av2014 日韩在线中文字幕| 最新av网站在线观看| 熟妇一区,二区,三区。| 久久αⅴ| 激情欧美日韩女同久久| 国产AV高清AV无码| 久艹日日日| 成人精品久久久午夜福利| 亚洲国产奇米影视久久| 天天干天天日天天射黄色| 久久久久久免费电影| 欧美日韩色综合网| 中文字幕在线观看第二页| 欧美同性恋 的搜索结果 - 91n| 成人av在线播放| 一本色道综合久久欧美日韩精品| 久久一二三四五六七八九区| 大香蕉 222| 中文 人妻 制服| 国产呦精品一区二区三区下载| 久久亚洲熟妇在线视频| 韩国免费播放一级毛片| 97国产色综合| 97超碰欧美| 亚洲日韩AV视色| 天天日夜干| 啊啊啊操一区| 亚洲色电影在线| 99热色精品| 亚洲天堂加勒比| 九九伊人网| 淫淫综合网| 五月激情综合网| 美女网站91| 大香蕉碰| 9色国产精品一区粉嫩 | 色制服丝袜夫妻av一区| 亚洲国产ⅴ高清在线观看| 伊人丝袜美腿高跟在线观看高清 | 精品.99999| 岛国1区2区3区在线观看| 少妇与黑人高潮在线| 亚瑟国产精品久久无码| 91/欧美| 亚洲一区二区三区播放在线| 伊人亚洲综合| 亚洲操人| 熟女人妻一区二区三区| 宅男午夜在线视频| 国产一区自拍欧美日韩| 久久综合av| 999岛国大片| 国产精品扒开腿做爽爽爽视频| 久久大香蕉手机高清| 亚洲av无码国产精品字幕| 超碰在线97国产| 黄色高清无码无码破解免费暗网| 久久久女人| 蜜臀AV一区二区三区激情综合| 国产精品嫩草影院午夜两性| 香蕉色网| 2020视频1区2区3区| 成人蜜乳小视频网站| 欧美A√综合网| 亚洲精品日韩国产欧美| 亚洲图片欧美| 性爱AV天堂| www.五月天| 激情 欧美 亚洲 小说| 无码人妻毛片丰满熟妇精品区| 五月婷婷六月激情| 韩国手机不卡无码三级视频| 欧美骚少妇| 奸色色 男人天堂 天天射| 日韩成人精品| 国产免费小视频| 青青草视频导航官网| 欧美亚洲日本激情在线| 国产精品久久久久久久久久久久| 秋霞午夜视频一区二区| 五月丁香激情综合网| 午夜视频久久久久一区| 97资源站国产精品| 久久香蕉超碰97国产精品| 99九九精品| 老司机天天操| 亚洲自拍97| 国产和美国毛片| 一区二区三区国产精产| 自拍偷拍2025在线观看| 人妻偷拍一区二区三区| 加勒比综合88| 婷婷久草| 亚洲永久永久永久永久一级一级一级精品 | 精品国产91内射久久| 亚洲精品蜜桃久久久| 在线黄色污污网站| 国产日本熟女顶级一区二区三区视频| 婷婷中文网| 成人av毛片在线观看| 日韩在线观看AV| 91精品人妻一区二区三区蜜桃臀 | 搡老女人老熟女91| 99re99在线视频| 久久精品中文字幕女同| 中文字幕二区日韩天堂| 免费看一级a性色生活片久久无| 五月天久久综合网| 91色综合| 国产深喉视频一区二区| 大茄子熟女AV导航| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 日韩欧美亚欧在线视频| 欧美天天综合网版| 午夜美女诱惑电源网| 四虎影视永久在线观看精品免费网站| 九X超碰| 日本中文字幕高跟| 大香蕉伊人网WWWn0n| 美女超碰978| 欧美1727免费观看视频| 成人电影一区| 婷婷综合网| 九九99久久| 久久婷五月| 国产18精品亚洲精品| xxx0国产在线播放| 精品成人动漫一区二区| 隔壁邻居波多野结衣中文字幕 | 久久丁香五月天| 日韩中文字幕二区| 秋霞欧美性爰视频| 女人爽到高潮潮喷18禁网站| 小情侣高清国产在线视频| 自拍偷拍 日韩无码| 一区二区视频在线播放| 东亚亚洲无码高清| av凤凰久久久| 色色激情五月天| 超碰人人妻| 看看小穴| 蜜臀人妻少妇久久在线观看| 97干天天| 欧美天天综合站| 欧美爱国产综合、| 欧美亚州综合网图片| 亚洲色图欧洲| 免费岛国一级片| 日韩在线地址一| 熟女五十路一区二区三| 天天做日日做天天欢。| 久久久夜夜嗨免费视频| 五月综合视频| 久久嫩草国产成人一区| 大香蕉啪啪啪啪在线| 日韩精品一区,二区 九九...老司机| 精彩久久中文| 搡老女人老妇女AAA一VU麻豆 | 在线观看午夜婷婷久久久久清性观看| 久久妇| 78精品| 中文字幕日韩专区精品系列| 操高情无码| 婷色五月天| 欧美熟妇操操视频| 国产精品粉嫩福利在线| 熟妇女伦乱视频| 午夜.DJ高清在线观看免费7| 在线性黄高清免费视频| 一二三四日本视频高清| 伊人精品视频| 色区97| 99视频这有这里有精品| 国产伦精品一区二区三区在线观| 天天影视综合网欧美精品| 性生活无遮挡纯毛片在线看| 新91视频.cmp| 影音先锋日本一区二区| 日本 欧美 国产一区| 一个人在线看的黄色电影网站| 国产精品国产| 东北毛片| 人看人人摸人人操| 久久e6只有精品| 欧美日本视频一区| 亚洲一区二区三区在线激情| 久久6热视频免费观看| 天天看少妇| 欧美久久人体| 久艾草在线精品视频在线观看| 立川理惠无码一区二区| 蜜桃久久久久久久| 插插综合网天天影视网| 99这里只有精品国产| 日日操天天操| 91日日夜夜| 国产家庭乱伦表演| 丁香婷婷色五月| 97干综合网| 91人精品妻入口| 天天综合亚在线| 91在线丝袜| 欧美日韩另类在线| 97色在线观看| 欧美色另类| av天堂手机版追回 | 激情五月天插| 精品国产网站| 无码人妻一区二区三区四区老鸭窝| 国产精品干干干| 久久熟妇五十路一区| 欧美天天综合网| 91碰碰| av天堂加勒比| 日韩性爱电影一区| 是还免费视频1727我| 国产 亚洲 一二三四| 内射日韩大臀美女| 亚洲欧美999| 久久精品国产精品亚洲艾通辽熟妇 | **一级毛片国产| 97人人色| 天天干夜夜操一区二区| 亚洲精品一区二区精品| 人人乐大香蕉| 男人的天堂com| 日欧操屄视频| 欧美人妻熟女在线| 国产亲戚伦亲在线| 成人一区二区三区四区| 91丨九色丨国产丨人妻在线 | 欧美激情亚洲色图| 免费试看60秒| 亚码激情| 麻豆美女丝袜人妻中文| 久久精品一区二区三区不卡| 91色夜| 99色| 久久久久亚洲| 欧美亚性天堂| 国产成人在线观看综合| 亚洲第一免费视频| 夜夜免费视频| 97亚洲综合电影| 99操碰| 色香色欲天天综合网天天来吧| 91w欧美| 国产丝袜啪啪| 中文字幕视频二区| 夜夜高潮夜夜爽高清视频一 | 约操熟妇| 精品人妻伦一区二区三区久久| 顶级丝袜熟女一区二区三区 | 久久 国产 无码| 夜草欧美| 日韩不卡毛片Av免费高清| 超碰天天去日穴| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 国产无码精品无码| 久干网| 日日碰狠狠添天天爽超| 啊啊啊好大好深| AND人妻系列| 三级色综合| 亚洲干B| 中文字幕视频一区视频二区| 成人日韩3| 97在线观看免费| 又黑又大又粗| 日韩精品碰碰| 国产区在线| 亚洲91网。| 女同性恋久久| 91在线视频国产网站| 婷婷15月天青娱乐| 99色在线观看| 极品综合| 竹菊一区二区三区AV线| 欧美日日夜夜| 亚洲欧美中文日韩视频中国语| 欧美在线91| 97视频在线视频| 精品少妇后入一区二区三区四区人妻巨乳| 91视频伊人| 亚洲色图日韩精品| 亚洲无码?第一页| 性色av一区二区| 欧美丰满熟妇XXXX性ppX人交| 蜜臀久久99精品久久久久| 精国久久一区二区三区98| 亚洲婷婷五月天| 无码天天操| 少妇综合| 99re这里只有精品2| 久久久久久波多野吉衣高潮| 天天做天天爽| 男女激情黄色网址| 亚洲欧美日韩制服另类| 一二三四区电影| 五月天婷婷社区| 亚洲高清色综合| 精品一二三区四视频| 少妇二级| 8050无码八戒| 九月激情婷婷| 夜夜爽夜夜| 999国产精品999久久久久久| 久草综合视频| 国产久久久9999| 五月丁香大香蕉| h无码动漫在线观看| 自拍内地三级在线观看| 78精品| 天操天操夜操夜月操月年年操操| 蜜臀AV成人精品蜜臀AV久久| 日韩人妻资源在线看| 亚洲精品亚洲人成在线麻豆| 中文字幕人成乱码熟女香港| 超碰97网站| 少妇激情一区二区三区视频| 韩国嫰模上门援交视频| 欧美另类自拍 | A久久| 在线国产探花| 蜜桃av综合网发布| 国产乱码精品一区二区三区四川| 第四色奇米影视777| 国内毛片热久久思思热| 国产成人在线观看网址| 久久无码精品| 98久久超碰| 性色aV一区二区三区噜噜| 99999久久精| 青青青在线高清视频在线一二三四区 | 草草草视频在线免费看| 97天堂| av网站在线看| 亚洲在线网站| 日韩黄片影院| 亚洲欧美在线观看无码| 高潮的A片激情扒开一区| 蜜乳AV.COM| 先锋色眉乱伦资源| 国产中文精品一区二区在线观看| 夜夜天天噜狠狠爱2021| 国产成人手机视频激情| 国产AV毛片| 男人的天堂一区三区| 国产精品一区二区黄片| 天天爽天天操| 91人妻人人妻| 四季AV综合网址| 亚州日韩97| 懂色av中文字幕| 992视频一区| 99久久久无码国产精品性啊聊| 精品国产三级av韩国在线|