久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

C++/Qt俄羅斯方塊課程設(shè)計(jì):從數(shù)據(jù)結(jié)構(gòu)到高分答辯全攻略

C++/Qt俄羅斯方塊課程設(shè)計(jì):從數(shù)據(jù)結(jié)構(gòu)到高分答辯全攻略 簡介面向C課程設(shè)計(jì)、期末大作業(yè)與畢業(yè)設(shè)計(jì)場景的高分項(xiàng)目資源基于C與Qt實(shí)現(xiàn)經(jīng)典俄羅斯方塊游戲。代碼注釋完整、模塊劃分清晰包含可運(yùn)行的Qt工程與項(xiàng)目文檔下載解壓并配置Qt環(huán)境后即可運(yùn)行適合直接提交或在此基礎(chǔ)上二次開發(fā)。資源共42個(gè)文件涵蓋頭文件與源文件、Qt界面相關(guān)的ui與json配置、動(dòng)態(tài)鏈接庫與靜態(tài)庫以及docx項(xiàng)目手冊和txt說明壓縮包約11.87MB。文件層次覆蓋游戲邏輯、界面繪制、構(gòu)建配置與文檔說明其中ui與json負(fù)責(zé)界面及配置lib、dll等支撐編譯運(yùn)行docx手冊用于快速了解設(shè)計(jì)與提交說明。已有316人學(xué)習(xí)或下載。該項(xiàng)目的突出價(jià)值在于以98分獲導(dǎo)師認(rèn)可完整展示了俄羅斯方塊從游戲狀態(tài)管理、方塊生成與旋轉(zhuǎn)、碰撞檢測、消行計(jì)分到界面繪制的全過程。關(guān)鍵函數(shù)與算法均配有注釋新手也能跟著代碼梳理實(shí)現(xiàn)思路項(xiàng)目文檔則補(bǔ)充設(shè)計(jì)說明與運(yùn)行方式為答辯和匯報(bào)提供支撐。源碼目錄和文檔命名清晰便于按需查閱對應(yīng)模塊既可作為學(xué)習(xí)C與Qt協(xié)同開發(fā)的脫手范例也是課程設(shè)計(jì)或畢業(yè)設(shè)計(jì)可快速上手的高分參考模板。1. 選俄羅斯方塊作為 C/QT 大作業(yè)為什么它是高分題庫里的常青樹俄羅斯方塊在 C 課程大作業(yè)里屬于“看著不新鮮、做完不虧”的類型規(guī)則全世界都知道但要把七種方塊、旋轉(zhuǎn)、碰撞、消行、計(jì)分、等級(jí)加速這些要素寫干凈恰好覆蓋了類設(shè)計(jì)、數(shù)組與內(nèi)存管理、QT 的信號(hào)槽與事件機(jī)制。比學(xué)生管理系統(tǒng)多一層實(shí)時(shí)交互比射擊游戲少一堆素材和物理計(jì)算工作量通常兩周內(nèi)可控代碼量能控制在 1500 行左右評(píng)閱老師也容易看出你的設(shè)計(jì)思路。這個(gè)選題適合既要保成績又想沖優(yōu)的同學(xué)代碼不難但設(shè)計(jì)空間足夠撐起一份高分項(xiàng)目的課程文檔。下面按我自己的落地順序講先數(shù)據(jù)結(jié)構(gòu)再界面渲染再游戲邏輯最后把文檔和答辯一起收尾。2. 先把數(shù)據(jù)結(jié)構(gòu)立住方塊表示、旋轉(zhuǎn)矩陣與碰撞檢測怎么寫2.1 三個(gè)類拆清楚Tetromino、Board、GameController 各自只干一件事寫俄羅斯方塊最容易翻車的寫法是把所有變量和函數(shù)全部塞進(jìn) MainWindow界面邏輯和游戲邏輯揉成一團(tuán)。課程設(shè)計(jì)階段我一般會(huì)拆三個(gè)純邏輯類加一個(gè)界面類分工如下Tetromino描述當(dāng)前方塊的形狀、朝向和棋盤坐標(biāo)提供旋轉(zhuǎn)和取格子的接口。Board負(fù)責(zé)棋盤內(nèi)部用一個(gè)二維數(shù)組 grid[ROW][COL] 記錄已落定方塊的顏色編號(hào)提供碰撞檢測、落定合并和消行接口。GameController持有 Board、當(dāng)前方塊、下一塊、分?jǐn)?shù)和等級(jí)實(shí)現(xiàn)下落、左右移動(dòng)、旋轉(zhuǎn)、硬降和游戲狀態(tài)切換。這個(gè)拆分在評(píng)閱時(shí)非常加分因?yàn)槔蠋煄缀醣貑枴叭绻乙右环N五格方塊你要改哪些地方”答案是只改 TetrominoBoard 和 GameController 都不動(dòng)。這就是分層設(shè)計(jì)的現(xiàn)場演示比答辯時(shí)背概念管用得多。先看 Tetromino 的頭文件// tetromino.h —— 七種方塊統(tǒng)一用 4x4 模板存儲(chǔ) #ifndef TETROMINO_H #define TETROMINO_H #include QVector #include QPoint class Tetromino { public: enum Shape { NONE, I, O, T, S, Z, J, L }; explicit Tetromino(Shape s); void rotate(); // 順時(shí)針旋轉(zhuǎn) 90 度 void setPos(int x, int y); // 方塊左上角在棋盤上的坐標(biāo) QPoint pos() const { return m_pos; } QVectorQPoint cells() const; // 返回模板中非空格子的相對坐標(biāo) Shape shape() const { return m_shape; } private: Shape m_shape; int m_matrix[4][4]; // 1 表示該格有方塊 QPoint m_pos; }; #endif這里用 QVector 和 QPoint 是因?yàn)楹竺嬉苯影堰@些坐標(biāo)映射到 QPainter 繪制省一次轉(zhuǎn)換。如果你想讓文檔更偏“純 C”換成 std::arraystd::arrayint,4,4 和自帶的坐標(biāo)結(jié)構(gòu)也一樣不影響其他類。構(gòu)造時(shí)每種形狀自己填充 m_matrix比如 T 字塊在模板中的形態(tài)是 (1,0)、(0,1)、(1,1)、(2,1) 四個(gè)格子為 1。用 4x4 而不是直接存坐標(biāo)數(shù)組是為了把旋轉(zhuǎn)變成純矩陣運(yùn)算不引入額外算法。2.2 用 4×4 模板表示七種方塊旋轉(zhuǎn)就是“轉(zhuǎn)置 水平翻轉(zhuǎn)”矩陣旋轉(zhuǎn)是這里最值得寫在文檔里的細(xì)節(jié)。順時(shí)針旋轉(zhuǎn) 90 度等價(jià)于先對矩陣做轉(zhuǎn)置再把每一行左右翻轉(zhuǎn)寫成代碼只有四行// tetromino.cpp —— 旋轉(zhuǎn)矩陣的核心邏輯 #include tetromino.h #include cstring void Tetromino::rotate() { if (m_shape O) return; // 正方形的 O 方塊旋轉(zhuǎn)后不變直接跳過 int temp[4][4]; std::memset(temp, 0, sizeof(temp)); for (int i 0; i 4; i) { for (int j 0; j 4; j) { temp[i][3 - j] m_matrix[j][i]; // 轉(zhuǎn)置后水平翻轉(zhuǎn) } } std::memcpy(m_matrix, temp, sizeof(m_matrix)); }新手最容易寫錯(cuò)的是下標(biāo)寫成 temp[3 - i][j] 或者 temp[j][i] 不帶翻轉(zhuǎn)結(jié)果旋轉(zhuǎn)幾次后圖形發(fā)生漂移。驗(yàn)證方法很簡單拿一個(gè) I 方塊在紙上畫一遍旋轉(zhuǎn)后應(yīng)該是橫躺狀態(tài)而且旋轉(zhuǎn)中心不偏移。這也是用 4x4 而不是 3x3 的原因3x3 矩陣放不下水平的 I 方塊4 格強(qiáng)行表示會(huì)造成旋轉(zhuǎn)中心偏移S、Z 方塊轉(zhuǎn)起來也會(huì)有錯(cuò)位感。O 方塊在構(gòu)造函數(shù)里就把矩陣填成 2x2 的田字放在 4x4 的左上角旋轉(zhuǎn)時(shí)直接 return避免無意義的矩陣拷貝。文檔里寫清楚這個(gè)特判評(píng)閱老師會(huì)認(rèn)為你考慮過邊界情況。2.3 碰撞檢測的“先放后查”策略為什么比逐格判斷更不容易出 bug碰撞檢測是整個(gè)游戲正確性的地基。我見過不少實(shí)現(xiàn)給每個(gè)方塊維護(hù)四條邊移動(dòng)時(shí)逐邊判斷是否出界旋轉(zhuǎn)后再重新計(jì)算邊界表。這個(gè)思路的問題是方塊狀態(tài)一變邊界數(shù)據(jù)就要同步多維護(hù)一份狀態(tài)就多一個(gè)翻車點(diǎn)。在 10 列 20 行的固定棋盤上最簡單可靠的是“先放后查”把方塊挪到目標(biāo)位置然后統(tǒng)一檢查越界和重疊。// board.cpp —— 碰撞檢測先嘗試放置沖突則拒絕該動(dòng)作 bool Board::canPlace(const Tetromino t, int newX, int newY) const { const QVectorQPoint cells t.cells(); for (const QPoint c : cells) { int x newX c.x(); int y newY c.y(); if (x 0 || x COLS) return false; // 超出左右邊界 if (y ROWS) return false; // 超出底部 if (y 0 m_grid[y][x] ! 0) return false; // 與已固定方塊重疊 // 注意y 0 時(shí)允許存在 } return true; }m_grid 的行索引是 y列索引是 x存的不是布爾值而是顏色編號(hào)這樣后面繪制和消行都能復(fù)用。canPlace 只做查詢不修改數(shù)據(jù)左移、右移、下落、旋轉(zhuǎn)、硬降全部調(diào)它判定邏輯只有一份。y 0 放行是關(guān)鍵細(xì)節(jié)方塊生成時(shí)有一部分可能還在棋盤上方之外如果把 y 0 也判成碰撞開局第一塊就放不下來。這個(gè)細(xì)節(jié)容易被忽略我在測試時(shí)踩過屏幕上方明明還有空間方塊卻卡在半空。有了 canPlace 之后落定和合并的邏輯就順了。GameController 的 tick 是整個(gè)游戲的主循環(huán)核心// gamecontroller.cpp —— 每次定時(shí)器觸發(fā)執(zhí)行一次下落 void GameController::tick() { if (m_state ! PLAYING) return; if (canMove(0, 1)) { m_current.setPos(m_current.pos().x(), m_current.pos().y() 1); } else { merge(); // 當(dāng)前方塊寫入棋盤 int n board.clearLines(); if (n 0) linesCleared(n); spawnNext(); // 從預(yù)覽隊(duì)列取出下一塊 if (!canPlace(m_current, m_current.pos().x(), m_current.pos().y())) gameOver(); // 新方塊放不下判負(fù) } }canMove 內(nèi)部就是調(diào) board.canPlace而 spawnNext 里同樣用 canPlace 判斷游戲是否結(jié)束也就是“生成時(shí)預(yù)判”的結(jié)束方式。這樣整個(gè)下落流程的所有動(dòng)作都收口到同一個(gè)碰撞函數(shù)邏輯只有一條路徑排查問題時(shí)只需要看 canPlace 一個(gè)函數(shù)。3. 用 QT Widgets 把棋盤畫出來QPainter、QTimer 與鍵盤事件三步走3.1 工程文件與源碼清單一個(gè) QWidget 項(xiàng)目需要哪幾個(gè)文件界面層我用 QMainWindow 作為主窗口中央放一個(gè)自繪的 GameWidget右側(cè)放信息面板。新建項(xiàng)目時(shí)在 Qt Creator 里直接選 QWidget Application會(huì)自動(dòng)生成 .pro 或 CMakeLists。這里建議裝 Qt 5.15.2 LTS而不是追最新版原因很現(xiàn)實(shí)老師機(jī)器上的 QT 版本大概率是 5.x網(wǎng)上能搜到的答案也集中在 5.15遇到問題好查。課程設(shè)計(jì)不推薦用 VSCode 配置 C 環(huán)境來寫 QTCMake 加套件配置會(huì)吃掉你一大半時(shí)間老老實(shí)實(shí)用 Qt Creator 帶 qmake 的模板五分鐘就能把空項(xiàng)目跑起來。源碼文件清單大致如下文件職責(zé)關(guān)鍵成員main.cpp創(chuàng)建 QApplication 和主窗口無gamewidget.h/.cpp繪制棋盤、接收按鍵、驅(qū)動(dòng)定時(shí)器paintEvent、keyPressEvent、QTimerboard.h/.cpp棋盤數(shù)據(jù)、碰撞檢測、消行g(shù)rid、canPlace、clearLinestetromino.h/.cpp方塊形狀與旋轉(zhuǎn)matrix、rotate、cellsgamecontroller.h/.cpp游戲規(guī)則、分?jǐn)?shù)、等級(jí)、狀態(tài)tick、move、rotate、hardDropGameWidget 頭文件的骨架長這樣// gamewidget.h —— 界面層只做三件事繪制、收按鍵、驅(qū)動(dòng)定時(shí)器 #ifndef GAMEWIDGET_H #define GAMEWIDGET_H #include QWidget #include QTimer #include gamecontroller.h class GameWidget : public QWidget { Q_OBJECT public: explicit GameWidget(QWidget *parent nullptr); void start(); // 開始游戲并啟動(dòng)定時(shí)器 protected: void paintEvent(QPaintEvent *e) override; void keyPressEvent(QKeyEvent *e) override; private: GameController m_game; QTimer m_timer; }; #endif注意 m_timer 這里作為成員對象而不是指針省去手動(dòng) delete。QTimer 的 timeout 信號(hào)用 lambda 槽連接可以少在頭文件里聲明一個(gè)槽函數(shù)課程代碼也更緊湊。3.2 paintEvent 繪制棋盤與方塊像素坐標(biāo)換算的 CELL_SIZE 參數(shù)繪制只寫在 paintEvent 里這是 QT 的規(guī)矩不要在別的地方直接畫。每次游戲狀態(tài)變化后調(diào)用 update()QT 會(huì)合并重繪請求并在合適的時(shí)機(jī)觸發(fā) paintEvent。繪制順序是背景、已固定方塊、當(dāng)前活動(dòng)方塊一層層往上疊。// gamewidget.cpp —— paintEvent 是唯一繪制入口 void GameWidget::paintEvent(QPaintEvent *) { QPainter painter(this); const int CELL 30; // 每格 30x30 像素 const int ROWS 20, COLS 10; // 1. 畫背景 painter.fillRect(0, 0, COLS * CELL, ROWS * CELL, QColor(0x1e, 0x1e, 0x1e)); // 2. 畫已固定方塊 for (int r 0; r ROWS; r) { for (int c 0; c COLS; c) { int id m_game.board().cell(r, c); if (id ! 0) { painter.fillRect(c * CELL, r * CELL, CELL - 1, CELL - 1, m_game.colorOf(id)); } } } // 3. 畫當(dāng)前活動(dòng)方塊 Tetromino cur m_game.current(); QColor clr m_game.colorOf(cur.shape()); for (const QPoint p : cur.cells()) { int px (cur.pos().x() p.x()) * CELL; int py (cur.pos().y() p.y()) * CELL; if (py 0) // 頂部以上的部分不畫 painter.fillRect(px, py, CELL - 1, CELL - 1, clr); } }CELL_SIZE 的選取是個(gè)體驗(yàn)問題10 列 20 行的棋盤用 30 像素畫布就是 300x600右側(cè)再留 150 像素放信息和下一個(gè)方塊預(yù)覽主窗口固定成 480x640 比較協(xié)調(diào)。用 24 會(huì)讓窗口顯得局促演示時(shí)分?jǐn)?shù)看不清用 40 又太大筆記本屏幕上放不下。格子填充減 1 像素是為了自然露出背景色當(dāng)格線不額外畫線的省力做法比 drawLine 畫 11 條豎線簡單且不會(huì)出現(xiàn) 1 像素錯(cuò)位。3.3 QTimer 驅(qū)動(dòng)下落與 keyPressEvent 響應(yīng)按鍵主循環(huán)怎么寫游戲主循環(huán)不用 while(true)那會(huì)卡死 QT 的事件循環(huán)。正確姿勢是 QTimer 周期性觸發(fā)每次觸發(fā)做一次下落邏輯然后調(diào)用 update() 請求重繪。// gamewidget.cpp —— 啟動(dòng)游戲、連接定時(shí)器和鍵盤 void GameWidget::start() { setFocusPolicy(Qt::StrongFocus); // 必須設(shè)置否則鍵盤事件進(jìn)不來 connect(m_timer, QTimer::timeout, this, [this]() { m_game.tick(); update(); }); m_timer.start(m_game.interval()); // interval 由等級(jí)計(jì)算得出 } void GameWidget::keyPressEvent(QKeyEvent *e) { switch (e-key()) { case Qt::Key_Left: m_game.move(-1); break; case Qt::Key_Right: m_game.move(1); break; case Qt::Key_Down: m_game.move(0, 1); break; case Qt::Key_Up: m_game.rotate(); break; case Qt::Key_Space: m_game.hardDrop(); break; case Qt::Key_P: m_game.togglePause(); break; default: QWidget::keyPressEvent(e); return; } update(); // 每次按鍵后立即重繪 }兩個(gè)細(xì)節(jié)容易踩坑。第一setFocusPolicy 不寫的話鍵盤事件永遠(yuǎn)進(jìn)不了這個(gè)控件程序跑起來鼠標(biāo)點(diǎn)哪都沒反應(yīng)這是 QT 新手最常見的黑匣子之一。第二每次按鍵后都要調(diào)用 update()否則邏輯已經(jīng)變了但畫面還停在上一幀。定時(shí)器那邊也一樣tick 之后緊跟 update()缺了它你會(huì)看到方塊只在消行那一瞬間跳變其他操作都像沒響應(yīng)。QTimer 的 interval 可以在運(yùn)行中修改等級(jí)上升后直接 m_timer.start(newInterval) 就會(huì)重設(shè)定時(shí)周期。不要在 tick 里用 QThread::sleep 或 std::this_thread::sleep_for 模擬減速那是把整個(gè)界面線程睡死窗口拖動(dòng)都會(huì)卡成幻燈片。3.4 右側(cè)信息面板與預(yù)覽區(qū)布局代碼比 Qt Designer 拖拽更快信息面板只有三個(gè)標(biāo)簽加一個(gè)預(yù)覽畫布用代碼布局比開 Qt Designer 來回拖快也更好控制。預(yù)覽區(qū)可以復(fù)用 GameWidget 的繪制思路單獨(dú)做一個(gè) PreviewWidget只畫下一塊// previewwidget.cpp —— 只畫一個(gè)方塊的迷你畫布 void PreviewWidget::paintEvent(QPaintEvent *) { QPainter painter(this); painter.fillRect(rect(), QColor(0x12, 0x12, 0x12)); Tetromino next m_game.next(); QColor clr m_game.colorOf(next.shape()); for (const QPoint p : next.cells()) { int px (p.x() 1) * 20; // 4x4 模板在 4*20 的畫布上居中 int py (p.y() 1) * 20; painter.fillRect(px, py, 18, 18, clr); } }PreviewWidget 同樣要暴露一個(gè) updatePreview() 接口在 GameController 的 spawnNext 之后由外部調(diào)用。這個(gè)類看起來多余但它把“預(yù)覽下一塊”從主繪制里拆了出去新增一個(gè)“未來五塊預(yù)覽”時(shí)不用動(dòng) GameWidget。主窗口的布局用 QHBoxLayout 放 GameWidget 和右側(cè) QVBoxLayout右側(cè)依次放分?jǐn)?shù)標(biāo)簽、等級(jí)標(biāo)簽、PreviewWidget最后 addStretch 把控件頂?shù)缴戏?。窗?setFixedSize 禁止拉伸免得用戶把窗口拉變形后棋盤比例失調(diào)。4. 游戲邏輯細(xì)節(jié)消行判定、計(jì)分規(guī)則與等級(jí)加速的聯(lián)動(dòng)4.1 從底部逐行掃描消行memcpy 整行下移的寫法和 y 陷阱消行邏輯寫在 Board 里常見做法是每次方塊落定后從最后一行往上掃遇到滿行就把它上面的所有行整體下移一行。代碼本身很短坑都在循環(huán)下標(biāo)上// board.cpp —— 消行并返回消掉的函數(shù) int Board::clearLines() { int lines 0; for (int y ROWS - 1; y 0; --y) { bool full true; for (int x 0; x COLS; x) { if (m_grid[y][x] 0) { full false; break; } } if (!full) continue; // 當(dāng)前行滿上方所有行下移一行頂部補(bǔ)空行 for (int yy y; yy 0; --yy) { std::memcpy(m_grid[yy], m_grid[yy - 1], sizeof(m_grid[0])); } std::memset(m_grid[0], 0, sizeof(m_grid[0])); y; // 下移后當(dāng)前行換成了新內(nèi)容需要重新檢查 lines; } return lines; }那個(gè) y 是容易看漏的細(xì)節(jié)。整行下移后原來的 y 行現(xiàn)在裝的是 y-1 行的內(nèi)容這一行可能也是滿的所以循環(huán)要回退一格重新檢查。漏掉 y 的后果是連續(xù)兩行同時(shí)滿時(shí)只消掉下面的那一行上面的滿行殘留測試同學(xué)常把這當(dāng)成“消行 bug”其實(shí)是循環(huán)下標(biāo)沒回退。從底部往上掃比從頂部往底部掃省事因?yàn)橄舻仔泻笊戏降男形恢貌蛔儾恍枰~外處理。用 memcpy 整行拷貝比自己寫 for 循環(huán)逐列賦值快而且代碼少但要注意 sizeof(m_grid[0]) 必須等于一行數(shù)組的字節(jié)數(shù)這里因?yàn)?m_grid 是 int grid[ROWS][COLS]sizeof(m_grid[0]) 是 COLS 個(gè) int 的大小正好對應(yīng)。4.2 計(jì)分與等級(jí)行列數(shù)與下落速度 interval 怎么聯(lián)動(dòng)計(jì)分規(guī)則直接參照經(jīng)典任天堂規(guī)則寫在文檔里既規(guī)范又好編碼。規(guī)則如下消行數(shù)基礎(chǔ)分倍率1100當(dāng)前等級(jí)2300當(dāng)前等級(jí)3500當(dāng)前等級(jí)4800當(dāng)前等級(jí)也就是單次消兩行得 300 乘以當(dāng)前等級(jí)而不是 100 加 100這個(gè)區(qū)分讓玩家更愿意堆四行一起消也是答辯時(shí)可以講的一個(gè)設(shè)計(jì)點(diǎn)。等級(jí)按總消行數(shù)每 10 行升一級(jí)下落間隔從 500 毫秒起步每級(jí)減 30 毫秒最低 80 毫秒防止后期快到人眼跟不上// gamecontroller.cpp —— 計(jì)分和等級(jí)聯(lián)動(dòng) void GameController::linesCleared(int n) { static const int scoreTable[5] {0, 100, 300, 500, 800}; m_score scoreTable[n] * m_level; m_lines n; if (m_lines / 10 m_level - 1) { m_level; m_interval std::max(80, 500 - (m_level - 1) * 30); emit intervalChanged(m_interval); // 通知界面層重設(shè)定時(shí)器 } }等級(jí)變化后GameWidget 要響應(yīng) intervalChanged 信號(hào)并重新 m_timer.start。用信號(hào)而不是界面層輪詢 m_game.interval()是為了讓邏輯層不感知界面保持分層。很多同學(xué)在這里犯的錯(cuò)是把 interval 寫死等級(jí)升了速度不變答辯被問“加速在哪”時(shí)答不上來。4.3 下一個(gè)方塊預(yù)覽用簡單成員還是隊(duì)列兩種寫法的取舍預(yù)告下一塊是俄羅斯方塊的標(biāo)配實(shí)現(xiàn)上有兩種常見做法。一是 GameController 持有一個(gè) Tetromino m_next落定后 current m_nextm_next 再隨機(jī)生成新形狀。二是維護(hù)一個(gè) QQueue 每次從隊(duì)頭取一塊隊(duì)尾補(bǔ)新塊。課程設(shè)計(jì)階段我推薦第一種理由有三個(gè)代碼少一半不需要處理隊(duì)列為空的情況隨機(jī)性對一個(gè)課設(shè)來說完全夠用。只有當(dāng)你計(jì)劃做“7-bag”隨機(jī)算法把七種方塊各放一次打亂依次出塊時(shí)才需要第二種配合一個(gè)固定大小的數(shù)組。生成隨機(jī)形狀時(shí)用 QT 的 QRandomGenerator::global()-bounded(7) 或者 C11 的 std::mt19937這兩種都是正經(jīng)的均勻分布隨機(jī)數(shù)能寫進(jìn)文檔。退一步用 rand() % 7 雖然也能跑但答辯被問到隨機(jī)數(shù)質(zhì)量時(shí)不太好解釋。spawnNext 的代碼// gamecontroller.cpp —— 從預(yù)覽區(qū)取出新方塊 void GameController::spawnNext() { m_current m_next; m_next Tetromino(static_castTetromino::Shape( QRandomGenerator::global()-bounded(7) 1)); m_current.setPos(SPAWN_X, SPAWN_Y); // 例如 (3, 0)居中偏上 }SPAWN_X 取 (COLS - 4) / 2 附近讓方塊大致居中SPAWN_Y 取 0 或 -1 都可以如果取 -1方塊會(huì)從棋盤頂部上方一格滑下來視覺上更順滑且恰好利用 canPlace 對 y 0 放行的特性。4.4 游戲結(jié)束判定放在哪兩個(gè)時(shí)機(jī)生成時(shí)預(yù)判還是落定后檢查游戲結(jié)束的判定時(shí)機(jī)有兩個(gè)選擇。一個(gè)是在落定合并后看棋盤是否超出頂部另一個(gè)是在生成新方塊時(shí)看初始位置是否放得下。我推薦后者也就是 spawnNext 之后立刻檢查// gamecontroller.cpp —— 新方塊無法落位則結(jié)束 void GameController::spawnNext() { // ... 設(shè)置 m_current 和 m_next ... if (!board.canPlace(m_current, m_current.pos().x(), m_current.pos().y())) { m_state OVER; emit gameOver(m_score); } }這比落定后再檢查更早暴露問題而且不需要額外維護(hù)“最高行溢出”這種狀態(tài)。界面層收到 gameOver 信號(hào)后彈一個(gè) QMessageBox顯示分?jǐn)?shù)并詢問是否重開。注意 gameOver 信號(hào)發(fā)出后定時(shí)器要 stop否則 tick 還會(huì)繼續(xù)跑在 OVER 狀態(tài)下雖然 tick 里有一層防護(hù)但停止定時(shí)器能省 CPU 也讓邏輯更干凈。忘記停止定時(shí)器你會(huì)看到結(jié)束后方塊還在往下落這是很多人忽略的收尾細(xì)節(jié)。5. 高分項(xiàng)目避坑指南QT 環(huán)境、焦點(diǎn)事件與重繪卡頓的經(jīng)典事故5.1 平臺(tái)插件報(bào)錯(cuò)qt.qpa.plugin 找不到 windows 或 linuxfb 平臺(tái)插件現(xiàn)象程序編譯通過雙擊 exe 或命令行運(yùn)行時(shí)直接崩潰終端輸出一行類似 qt.qpa.plugin: Could not find the Qt platform plugin windows in 的報(bào)錯(cuò)后面還跟著“已終止”或段錯(cuò)誤。原因QT 程序運(yùn)行時(shí)需要從 plugins 目錄加載平臺(tái)插件可執(zhí)行文件拷到別的路徑后找不到同目錄下的 platforms 文件夾或者系統(tǒng) PATH 里指向的 QT 安裝路徑和編譯時(shí)用的不是同一個(gè)。解決課程設(shè)計(jì)階段在 Qt Creator 里直接運(yùn)行就行不要折騰綠色版。需要提交獨(dú)立可執(zhí)行文件時(shí)用 QT 自帶的 windeployqt 工具把依賴 DLL 和 plugins 目錄拷到 exe 旁邊一句命令搞定。Linux 下如果報(bào)的是 linuxfb 找不到多半是嵌入式交叉編譯環(huán)境的QT_QPA_PLATFORM設(shè)了不被支持的平臺(tái)檢查環(huán)境變量即可。成熟的老師看課設(shè)都在你筆記本上跑不用追求單文件綠色版那反而容易翻車。5.2 版本混用報(bào)錯(cuò)cannot mix incompatible qt library (version ex50601)現(xiàn)象編譯鏈接全過運(yùn)行時(shí)彈窗或終端報(bào) Fatal: cannot mix incompatible Qt library (version 0x50601) with this library version 0x50a01程序直接退出。這種報(bào)錯(cuò)在裝了多個(gè) QT 版本的機(jī)器上非常常見。原因鏈接器找到的是 5.6.1 的頭文件和庫而運(yùn)行時(shí)加載的 DLL 是 5.10.1 的版本對不上。通常是系統(tǒng)的 QT 路徑、Qt Creator 配置的 Kit、以及編譯器的鏈接搜索路徑三者不一致導(dǎo)致的比如你之前手動(dòng)裝過某個(gè)舊版 QT環(huán)境變量里殘留 qmake 路徑VSCode 配置 C 環(huán)境時(shí)又指到了另一邊。解決打開 Qt Creator 的“工具 - 選項(xiàng) - Kits - Qt Versions”把用不到的版本路徑全部移除只保留 5.15.2 的 qmake。項(xiàng)目構(gòu)建目錄建議刪掉重新 qmake 一次避免 Makefile 里殘留舊路徑。如果你確實(shí)在 VSCode 里配過 C 環(huán)境那個(gè) QT 路徑和 Qt Creator 通常不是同一套兩者不要交叉使用。我的習(xí)慣是課程設(shè)計(jì)期間只開 Qt Creator見到這個(gè)報(bào)錯(cuò)第一時(shí)間查 Kit而不是去重裝 QT。5.3 按鍵沒反應(yīng)setFocusPolicy 與焦點(diǎn)丟失的那點(diǎn)事現(xiàn)象界面能正常顯示鼠標(biāo)點(diǎn)按鈕有響應(yīng)方向鍵、空格鍵怎么按都沒反應(yīng)游戲像死了一樣。原因QWidget 默認(rèn)不接受鍵盤焦點(diǎn)keyPressEvent 只有在控件獲得焦點(diǎn)時(shí)才會(huì)被調(diào)用。窗口剛顯示時(shí)焦點(diǎn)可能落在某個(gè)按鈕或者沒有焦點(diǎn)控件上按鍵事件被分發(fā)給焦點(diǎn)對象而不是你的 GameWidget。解決在 GameWidget 構(gòu)造函數(shù)里加一行 setFocusPolicy(Qt::StrongFocus)讓這個(gè)控件可以用鍵盤和 Tab 獲取焦點(diǎn)。如果界面上有 QPushButton 或 QLineEdit點(diǎn)擊它們之后焦點(diǎn)會(huì)轉(zhuǎn)移此時(shí)繼續(xù)按方向鍵就失靈。處理辦法是對按鈕調(diào)用 setFocusPolicy(Qt::NoFocus)或者重寫整個(gè)主窗口的 eventFilter 統(tǒng)一攔截鍵盤事件再轉(zhuǎn)給 GameWidget后者更徹底但課設(shè)代碼里用 NoFocus 就夠。這個(gè)坑一流出現(xiàn)查代碼半小時(shí)查不出來其實(shí)就是少寫了一行。5.4 界面閃爍與掉幀別在 timer 里 new QPainter統(tǒng)一用 update()現(xiàn)象方塊移動(dòng)時(shí)窗口閃爍或者移動(dòng)一頓一頓不跟手消行瞬間尤其明顯。原因把繪制代碼寫在了定時(shí)器回調(diào)或者按鍵處理函數(shù)里在事件循環(huán)外直接往窗口上畫東西系統(tǒng)在下一幀重繪時(shí)又把你的繪制覆蓋掉造成閃爍。另一種情況是邏輯層用了 sleep 或大量拷貝導(dǎo)致事件循環(huán)卡頓update() 延遲到很晚才合并觸發(fā)。解決所有繪制統(tǒng)一收進(jìn) paintEvent邏輯變化只調(diào) update()。QT 會(huì)合并同一次事件循環(huán)里的多個(gè) update()所以按鍵加定時(shí)器連續(xù)觸發(fā) update 不會(huì)造成額外開銷不用擔(dān)心性能。不要在 tick 里做耗時(shí)的全棋盤掃描消行時(shí)只處理有變化的部分或至少把 clearLines 的實(shí)現(xiàn)保持為 O(ROWS*COLS)這個(gè)量級(jí)完全扛得住。如果 QPainter 開了抗鋸齒后覺得卡把 painter.setRenderHint(QPainter::Antialiasing) 關(guān)掉這里畫的是矩形抗鋸齒不僅沒用還拖慢速度。5.5 崩潰在 delete 上QT 父子對象機(jī)制與棧對象不要混用現(xiàn)象游戲正常運(yùn)行退出程序時(shí)崩潰報(bào) double free 或析構(gòu)相關(guān)斷言有時(shí)候是 CtrlC 結(jié)束沒反應(yīng)關(guān)窗口才炸。原因QT 的 QObject 父子機(jī)制規(guī)定父對象析構(gòu)時(shí)會(huì)自動(dòng)銷毀所有子對象。你把一個(gè)控件 new 出來并且傳了 parent之后又手動(dòng) delete 它就造成二次釋放。反過來在棧上創(chuàng)建了 QWidget 還給別人當(dāng)了 parent棧對象析構(gòu)時(shí)父對象可能已經(jīng)先析構(gòu)了觸發(fā)懸垂指針。解決凡是構(gòu)造函數(shù)里傳了 parent 的對象一律不手動(dòng) delete交給父對象統(tǒng)一管理。如果需要提前銷毀用 deleteLater()它會(huì)在事件循環(huán)安全點(diǎn)執(zhí)行刪除。GameWidget 里的 QTimer m_timer 是成員對象不是 new 出來的析構(gòu)時(shí)隨 GameWidget 一起銷毀不涉及這個(gè)問題。這一條寫進(jìn)文檔的“遇到的問題”章節(jié)算是展示你理解 QT 內(nèi)存管理比抄一段智能指針的八股答得實(shí)在。6. 項(xiàng)目文檔與答辯把“高分項(xiàng)目”的分?jǐn)?shù)落在紙面上6.1 一份課程設(shè)計(jì)文檔的骨架需求分析、概要設(shè)計(jì)、測試記錄怎么寫源代碼寫得再好文檔拿不出手還是會(huì)被扣分。課程設(shè)計(jì)文檔的標(biāo)準(zhǔn)結(jié)構(gòu)是需求分析、概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)、測試報(bào)告、心得五部分其中概要設(shè)計(jì)和測試報(bào)告占的分?jǐn)?shù)最多。概要設(shè)計(jì)里放一張手繪的類圖就夠畫出 Tetromino、Board、GameController、GameWidget 四個(gè)類的關(guān)系標(biāo)注關(guān)鍵的 public 接口比復(fù)制十頁代碼有用。測試報(bào)告別只寫“測試通過”把幾個(gè)典型場景列出來方塊到邊界能否停止、旋轉(zhuǎn)后碰墻能否拒絕、連續(xù)消四行得分是否正確、游戲結(jié)束后按鍵是否無響應(yīng)每條配一張運(yùn)行截圖。截圖記得把分?jǐn)?shù)和等級(jí)一起截進(jìn)去評(píng)閱老師會(huì)看分?jǐn)?shù)是否和消行數(shù)對得上。6.2 答辯講這三個(gè)亮點(diǎn)分層架構(gòu)、碰撞收口、擴(kuò)展性答辯時(shí)不用面面俱到講三個(gè)點(diǎn)足夠。第一講分層界面類不碰游戲數(shù)據(jù)控制器不碰繪制代碼老師問“加功能要改哪里”時(shí)你能明確指出改哪個(gè)類。第二講碰撞檢測收口到 canPlace 的取舍所有移動(dòng)、旋轉(zhuǎn)、硬降共用同一個(gè)判定函數(shù)而不是每個(gè)動(dòng)作各寫一堆邊界判斷。第三講擴(kuò)展性加新方塊只改 Tetromino加 7-bag 隨機(jī)只用動(dòng) spawnNext加存檔只要在 GameController 里序列化分?jǐn)?shù)和棋盤。這三句話比背概念更能讓老師相信項(xiàng)目是你自己寫的。我當(dāng)年做這個(gè)題翻車就翻在 update() 上邏輯全對但界面紋絲不動(dòng)查了整整一個(gè)晚上最后發(fā)現(xiàn)只是忘了在按鍵后請求重繪?!案拇a不如先懷疑重繪沒觸發(fā)”這道坎邁過去之后我對 QT 的繪圖機(jī)制算是徹底通了。這個(gè)項(xiàng)目的完整實(shí)現(xiàn)值得你親手敲一遍別直接抄源碼自己把 canPlace 和 clearLines 寫對一次收獲比跑通十遍別人的代碼都大。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美性生活综合| 99re3这里只有精品| 殴美色网| 打av高清| 99热99色| 岛国大片国产| 久久久四区| 亚洲情色在线| 97日本超碰综合| 国产精品一区二区a| 亚洲成人色情五月天丁香花| 丁香五月激情五月| 欧美日本一区二区a人| 2017大香蕉| 男人天堂网手机版婷婷| 亚洲资源网| 1024亚洲中文字幕久在线看片你懂的 | 欧美 传媒 麻豆 日韩 偷拍| 久热大香蕉| 探花精品 一区二区| 欧美高潮| 歐美性天天| 精品人妻一区二区三区-国产精品 一个人在线看的黄色电影网站 | 麻豆国产av网| 婷婷五月色| 国产激情av女片自拍| 亚洲精品九九九| 97超碰伊人| 黄资源| 丰满少妇一区二区三区四区观看| 大奶啊啊好爽 | 久久九九综合| 国产综合网站在线播放 | 成人综合视频久久| 男人下部插入女人下部| 欧美精品成人亚洲| 色五月婷婷中文字幕| 啪一啪免费视频| 无码直播久久久| 粉嫩AV一区二区夜夜| 1204av韩国| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 最近2018中文字幕在线高清第一页| 日韩国产九九精品一区二区三区毛片 | 欧美性天天影院| 九热大香蕉| 青娱乐 成人娱乐在线| 亚洲第一综合| 精品国产一区二区三区av在线资源| 国产精品婬乱一级毛片彝族| 乱伦Av网| 久久久精品成人国产| 人妻中文字幕日韩电影| 日本国产亚洲一区在线观看| 午夜男女爽爽爽影院视频| 久久草草亚洲蜜桃臀| a级免费在线观看| 91综合中文字幕| 污色区网站| 视频不卡中文字幕| 超碰人人操97碰| 小日子操bb在线看| 国产精品岛国片在线观看| 岛国毛片在线观看免费| 国产AV毛片| 亚洲欧美精品福利在线| 天天综合色| 丝袜熟女2P| 天天看人人操屄犊摸阴| 亚州欧美综合| 好爽要喷了| 大香蕉草草| 91亚洲欧美激情| 9Ⅰ老熟女| 伊人国产成人av网站| 亚欧成人综合影院| 亚洲日本韩国在线| 中国黑人三级片网站上区| 爱爱动态试试看6 0秒| 一区二区三区色综合| 亚州精品人妻一二三区| 12一15性XXXX粉嫩国产| 韩国成人精品久久久免费看| 99色| 日韩av情韩国爱禁区av一区二区| 亚洲情色综合| 欧美日本一区二区a人| 懂色综合久久久| 老熟女区| 欧美色97| 亚洲欧洲日韩国产自在线| 亚洲欧美精品一区天堂久久| 久久视频少妇美女| 黄片视频观看| 操碰97| 在线天堂999| 啊啊啊啊啊在线观看网址| 国产美女激情| 九九碰九九爱97超碰| 亚洲色 国产 欧美 日韩| 丁香婷婷久久 | 精品国产乱码久久久久久影片| 91网18| julia国产在线 | 亚洲精品蜜桃久久久| 99无码狠狠久久| A片三级无码| 欧美三级不卡| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 91老熟女| 日本三级韩三级99久久| 伦理弟一页| 中文?日韩?免费?精品| 一区二区娱乐网站| 拍拍拍拍大尺度黄色三级片拍拍拍拍拍照| 中文字幕蜜乳av| 东北丰满熟女国产一区| 欧美视频在线视频免费va| 色情五月丁香| 综合伊人激情| 亚洲综合色男人网| 婷婷午夜成人色中色| 天天日日舔舔| 中文字幕加勒比海高清无码免费视频 | 被男人添B超爽视频| 亚码激情| 日韩大香蕉| 国产精品99精品视频网站| 人妻人人澡人人爽人人| 欧美AAAA黄片| 男人的天堂在线2| 中韩中文字幕在线观看| 日韩欧美中文| 大香蕉青青9| 九九香蕉网| 99热大香蕉伊在线| 看黄片视频免费| 999狠狠综合| 久久久不卡| 91久久99久久91熟女精品| 曰本特级特黄特色黄色A级网站高清在线免费看| 日韩簧片免费看| 午夜欧美J进J出白浆流出久久久| 久久伊人亚洲AV无码网站| 麻豆久久久久久久久丝袜| 国产精品一区二区a| 亚洲色图激情小说| 在线日韩精品一区二区三区| 动漫片子网站3黄| 最新av网站在线观看| 欧美亚洲AN| 无码天天操| 本道在线| 口爆综合网| 亚洲在线网站| 肉丝无码中文高清| 狠狠干婷婷| 麻豆国产精品午夜视频| 自拍丝袜美腿人妻| 久久免费精品视频免一| 男人的天堂1024| AV天天综合| 久久久久久亚洲Av无码| 亚洲欲| 五月天婷婷基地| 人妻激情视频| 人妻一区二区三区| 丝袜美腿制服人妻二区中文字幕| 极品色综合| 天天综合有色网| 91在线精品| 青草成人免费视频一COm| 97色97好| 日韩女模中文造逼| 性爱精品一区| 91在线视频国产网站| 热久久精品| 黄色小视频日本txt| 久草这里只有精品| 亚洲色人妻综合| 91精品久久久| 后入式福利| 人妻AV 中文字幕的| 91P0RNY大屁股人妻| 欧美大片天天看| 丁香五月AV| 91粉嫩萝控精品福利网站_精品影音先锋国| 亚洲九九视频| 亚洲限制级| 熟女突然公开看18禁影片| 香蕉99秘 一区精品蜜桃臀| 成人AV素股で擦久久| 亚洲黄色网址视频| 一区二区三区黄色片a| 极品肉射| 久操免费观看| 绑缚麻绳人妻寝取完整版| 性爱视频久久| 精品一二三区久久AAA片| 91大学精品激情戏| 日本 情色 1区2区3区| 国产小u女在线观看| 12一15性XXXX粉嫩国产| 99在线精品观看视频中文| 欧美精品 - 91爱爱| 丁香五月自拍| 日美免费黄片| 大香蕉五月天| 国产伦乱91| 操一操摸一摸| 久久春色| 国产美女高潮| 亚洲天天综合| 很很操在线| 欧美宗合色| 操逼无毒无码免费视频| 亚洲精品国产精品乱码不卡| 香港成人一级视频在线青青草| 久久香蕉网| 成人性爱电影网| 肏逼福利网站| 极品销魂美女一区二区| 中国91AV| 国产伦精品| 欧美高清91| 超碰精品97| 中文字幕乱妇免费视频| 丰满人妻一区二区三区免费| 日本成人免费一区二区三区| 亚洲精品毛片在线观看| 黄色区免费观看中文字幕| 91精品人妻偷情| 亚洲伊人成综合成人网| 97超碰磁| 看一级特黄a大一片| 在线一道啪| av在线免费一区二区| 无码黑人精品一区二区三区三| 久久五月天婷婷丁香中文字幕| 精品人妻一区二区视频| 人妻日日干| 99视频自拍| 又黄又爽在线观看视频| 少妇蜜汁| 东京热,男人的天堂| 日韩91网站| 亚洲有码视频二区| 九九九精品| 久久精品导航| 伊人网青青| 波多野结衣AV无码一区| 91久久久久久久| 99re6久热只有精品6在线直播 | 干少妇视频| 久久性爱视频99| 色婷婷视频| 色狠狠综合| 人人妻人人操人人乐| 熟女欧美日韩综合婷婷| 天天澡天天爽日日AV| 91综合色| 成人八戒网站| 91精品国久久久久久无码| 久久久久久99999国产精品| 97在线视频免费看| 国产野战露脸在线播放| 色五月激情网| 久久爱超碰网| 九九碰九九爱97超| 激情啪啪拍91| 青青青国产| 国产精品动态一区二区三区四四| 国产精品内射婷婷一级二| 操逼操逼逼操操逼91 | AAAAAAAAA黄片| 97超碰国产精品| 日本不卡三级网在线播放| 日产123区精品免费观看| 精品人妻一区二区三区在线视频不卡| 青娱乐国产剧情av一区| 五月天婷婷欧美三区| 男人的天堂日韩| 内射小黄片| 久久精彩视频| 久久精品女同亚洲女同13| 日韩成人私密一级精品av| 91啪啪视频| 最新加勒比丝袜在线| 熟女一区二区三区| 久久精品国产亚洲AV高清演员表| 午夜精品久久久久久久男人的天堂 | 天天色粽合合合合合合合| 精品人妻一区春色| 亚瑟国产精品久久无码| 韩国女主播青草在线| 中文字幕蜜乳av| 九九色色| 欧美亚洲激情| 韩国一区二区精品亚洲| 老鸭窝成人免费毛片视频| 亚洲黄色a级片| 欧美亚洲一区二区久久久婷精品大包诱| 男人的天堂无码| 夜夜操青青草| 日本久操视频| 国产一区二区三区白丝| 日韩一级二级在线| 色在线亚洲视频www| 六月婷婷综合| 日本熟妇浓毛hdsex| 91美女中出| 超碰久超碰久| 校园春色之综合网| 人人操欧美风骚| 无码99| 精品熟女呻吟久久91| 韩日精品四区| 久久久久亚洲Av无码专区老牛影视 | 欧美制服另类丝袜| 日本一道在线播放高清| 欧美色66| 操逼日韩无码 | 看一级黄色视频| 国产精品色约约| 成人免费不卡在线视频| 好吊色综合| 99自拍B亚洲| 日韩精品字幕| 久久天堂网| 久久综合九九| 麻豆美女丝袜人妻中文| 99精品热| 黄片无码在线制服| 无码78| 亚洲综合另类欧美久久久| 国产传媒午夜理伦精品| 最新9久久久9免费视频| 日本综合久久| 免费日韩黄片| …中文字幕亚洲乱,97人妻无码费视…| 成年人三级黄色片视频| 91久久国产精品| 国产少妇与亚洲av| 91快色色色色色| 天天夜夜rb| 热天堂一区二区| 日本成人电影资源网| 亚洲中文字幕av | 成年男人的天堂| 欧美色性爱| 欧美日韩亚洲天堂| 中文字幕av丝袜| 亚洲精品aa久久伊人 | 免费黄色A片| 亚洲成a人v欧美综合天堂下载| 欧美 青青草| 国产精品老师| 成人精品一区二区91毛片不卡| 一区二区播放| 久久仑合| 中文字幕精品人妻丝袜| 香蕉人人操tv| 欧美不卡五十路| 午夜福利合集| 伊人四虎综合| 色爽爽文学| 国产一区二区欧美日本| 偷拍亚洲熟女视频播放| 九九无码| 青青青在线高清视频在线一二三四区| 极品色电影院| 97人肏| 久久人人爽人人爽人人片Ⅴ| 欧美1区二区三区公司| 国产精品96久久久久久| 97久久久久久久久久| 在线视频一区二区传媒| 日本色色的视频| 亚洲天堂五月天国产| 日韩欧美女求操每天更新| 校园春色家庭伦理欧美激情| 午夜天堂精品久久| 99九九久久| 欧美激情视频一区二区三区不卡| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 又大又大又大又粗爽高潮观看| 神马久久久久久久久| 国产AV人人夜夜澡人人爽麻豆| 久久精品一区| 在线视频五十市| 亚洲、日韩、综合、另类| 五月香婷婷| 五月天综合在线| 国产精品无码av在线| 顶级少妇BT天堂| 亚洲人妻一区二区三区| 九色视频91| 日本色色色视频| 欧美顶级黄色大片免费| 日韩中文字幕人妻视频| 操逼逼中文字幕| 久久久久久久国产视频| 全球成人中文在线| 91麻豆va国产精品| 偷拍 精品另类 凸凹了四区| 九九久久九九久久| 亚洲综合码| 国产男女无套97| 精品美女久久一二三| 国产精品熟女九九九| 色综合天天爱去电影网| 天美传媒婬乱在| 另类天堂| 一个色导综合| 宅男影院久久久,99| 午夜精品五区| 国产激情综合| 伊人伊人LD| 亚洲男人的天堂网| 伊人久久AV诱惑悠悠| 躁躁躁日日躁2020| 国产精品嫩草影院免费| 色色色色电影网| 青青草视频在线观看一区二区| 五月天伊人| 性色高清..……| 久久在肏| 日本亚洲熟女视频| 啪啪啪综合网| 伊人991| 欧洲一区二区| 人人操人人干xxx| 国产女性无套 免费观看| 天天天天操| 综合久久99亚洲人妻中文在线| 日韩色图 一区二区| 无码人妻精品酒店| 国产欧美日韩一区二区三区| 亚洲国产第一页综合视频| 鸥美精品一区二区久久婷婷| 久久久久久人| 精品国产91av一区二区三区 | 人妻激情在线视频| 亚欧色图在线激情| 抽插无码高清一区| 色婷婷久久综合超碰| www.久久超碰| 97人妻免费中文字幕| 久久香蕉影院| 青青草AV色| 一级片在线观看高清无码| 美女尤物福利视频| 久久熟女精品不卡一区| 人摸人人操人| 欧美久久婷| 丰满人妻aA一区二区三区| 国产熟女精品一区二区| 久久性爱免费送| 啊啊啊好大好湿| 国产日本一区二区三区蜜臀在线观看| 99热91| 夜夜免费视频| 欧美黄片欧美黄片xxx| 中文字幕在在线观看网站| 蜜臀99久久国产| 久久久麻豆精品| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 无码 有码 国产18p| 97伪v| 神马九九| 东京热一区二区三区四区五区六区| 欧美久久人体| 撸撸成人在线视频| 欧美精品久久96人妻无码| 无码免费一区二区三区啪啪| 五十路熟女在线不卡观看一区二区| 日韩激情中文字幕有码| 日韩三级性| 日韩亚洲中文字幕在线| 人妻少妇久久中文| 国产精品极品美女视频| 久久久一区二区| 国产宅男宅女在线观看| 亚洲日本天堂| 一起草精品人妻| 偷偷人人精品女女久久| 日本国产成人亚洲精品无码| 东京太热男人的天堂久久久| 国产精品老师| 七月丁香婷婷| 爱爱动态120秒| 亚洲九九九九| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 欧美日韩青操| 精品一啪| 精品国产乱码久久久久久蜜臀| 日韩欧美中文日韩欧美色| asc国产精品| 任你爽视频| 校园激情狠狠四射| 欧美日韩亚洲天堂网| 亚洲 欧美 制服 另类 自拍| 91精品婷婷国产综合久久| 亚洲精品国产精品乱码不99| 91视频综合网| 蜜桃视频一区二区三区 | 白丝1区2区3区| 日韩99精品视频综合区| 久久女女| 亚洲中文制服诱惑| 日韩色| 欧美后入式| 天天操女人| 中文字幕人成乱码熟女香港| 96超碰网| 欧美美女啪啪视频| 欧美成人四级在线播放| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 厕所偷拍在线| 96久久精品一二三区色欲| 欧美三四五区| 久久久久密臀视频| 丁香六月婷婷久久综合| 九九干| 美欧色综合| 99re这里| 蜜桃在线观看一区二区三区 | 免费视频a级毛片免费视频| 黄色免费一级在线毛片| 骚逼自拍99| 色女99一级片在线观看| 午夜福利成人免费视频| www亚洲免费| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 欧美天堂超碰97| 激情五月综合网| 黄片免费久久久久久久| 欧成人精品H无码| 蜜臀在线看片| 麻豆AV短剧| 亚洲国产精品久久久久婷婷青年| 韩国一级AAA| 国产婷婷综合在线观看| 亚洲影院成人| 女性91网站| 久久久久久亚洲Av无码| 久久精品无码一区二区三区| 91少妇香蕉久久精品| 激情综合97| 欧美久热| 欧美综合区| 久久久国产亚洲精品系列| 伊人天天久久动态图| 日本在线伊人啪啪| 熟妇人妻精品一区二区| 91老熟女91老女人| 久久精品成人一区二区三区蜜臀| 激情文学欧美| 成人A片男人的天堂| 香蕉在线一区二区三区| 屌逼麻豆| 精品妇女一区二区三区| yirendaxiangjiashipin| 国产精品一区人妻精品阁在线| 91人妻尻屄视频| 熟女六十路| 韩国一级做A片免费的| 久久一级无码精品毛片6| 1769国内精品视频| 日韩av不卡在线看| 国产精品蜜臀久久久久无码AV| 人人操 欧美| 综合伊人激情| 国产精品日韩在线一区| 午夜激情成人在线观看| 天天色,天天干,天天干| 韩国三级理论在线| 亚洲欧美精品福利在线| 日本曲间由美性生活片| 干B视频伊人网| 自拍二页| 精品美女少妇一区二区| 婷婷国产精品一区二区| 色99999| 欧美成熟性爱精品| 人摸人人操人| 中文字幕一区日韩精| 天天摸,夜夜摸| 亚洲丝袜天堂| 操逼999| 激情在线青青操| 超碰在线一区二区三区| 日本狂喷奶水在线播放212| 国产精品久久久久无码A√| 五月天玖玖资源站| 亚洲精品第一| 天堂av2019| 亚洲欧洲日产国产综合网| 在线情色电影 91大| av优播| 一起草欧美| 多乙久久久久久| 久久久久久久久久久久黄色 | 亚洲日韩天堂| 亚洲熟女一区| 久久久久无码| 五月丁香综合激情| 日本日日色视频| 熟女熟妇伦久久影院毛片一区二区| 精品久久无码午夜福利 | 欧美一二三| 超碰偷拍| 97美日韩视频| 欧美999| 夜夜操狠狠操| 国内三级自拍小视频在线观看| 91欧美综合| 人人妻人人爱人人玩| 高清无码久操视频| 中文啪啪视频| 日韩乱码Av| 国产肏逼网站| 日逼97| 亚洲揄拍网| 国产精品久久久久久片| 国产丝袜欧美在线视频| 夫妻AV网站| 丰满搜索结果 -第18页- 久久高清无码 | 91精品婷婷国产综合久久竹菊| 日韩丨制服丨中文|在线| 国产精品熟女一区二区三区| 久久丁香五月天| 超碰九九| 性感女人网页在线观看视频| 亚洲国产精品久久久男人的天堂| 91在线一起| 国产av强奸美女| 东京热不卡视频| 人人摸人人叼| 色情婷婷久久五月天| 91亚洲不卡一区| 久久免费精品视频免一| 欧美色图综合| 99热这里只有精品1| 精品综合久久久久久97| 欧美日韩性爱无码| 少妇啪啪自拍| 国语av狠狠色丁香婷婷综合激情| 亚洲女人毛茸茸91| 99RE在线视频精品,这里只有精品| 婷婷91| 日韩一级特黄av毛片| 国产精品福利资源在线尤物| 国际精品久久久| 欧美美逼| 中文字幕av片| 国产综合久| 校园春色家庭伦理欧美激情| 欧美熟女丝袜| 日韩中文字幕宗合在线| 夜夜操一区二区| 男人的天堂,欧美亚洲另类国产日韩,日本高清一区二区 | 青青欧洲黑| 性爱AV天堂| 麻豆精品三区视频| 九七人妻在线| 91综合天天看| 久久αⅴ| 日韩欧美福利视频看看| 在线综合 亚洲 欧美中文字幕| 奇米四色网| 91九色蝌蚪在线观看| 啊啊啊草死我| 国产主播福利| 人人干人人搞人人摸| 国产成人自拍视频在线| 久久久内射良家| 美女啊啊啊啊啊啊| 麻豆区久久久久亚| 91在线免费精品视频| 久久男人精品| 国产亚州日韩欧美看片| www激情| 97人人爱人人做人人乐| 日韩av情韩国爱禁区av一区二区| 超碰色综合| 亚洲欧美在线综合| 超碰久超碰久| 久超碰这里只有精品| 亚洲色电影在线| 9丨久久九九九| 欧美大香蕉同搞| 精品久久久av| 天天操福利视频综合网站| 一级片视频啪啪| 91一起操| 国产丁香精品露脸视频| 成人无码在线视频网站| 国产精品黄色三级av| 日本三级日本三级99| 天天激色| 国产精品一区二区校花| 99re在线观看| 精品无码久久久久久久久果冻糖心| 久久性爱大全| 日韩精品国模| a v网站在线播放| 图色综合网| 欧美人人曰人人操人人射射| 东北夫妻性偷拍| 青春草莓视频在线观看网址| 日韩人妻资源在线看| 国产97免费视频| 亚洲第一页色| 精品成人无码| 男人亚洲91首页在线| 污电影在线观看| 综合婷婷| 欧美亚洲国产91在线| 美性中文综合网| 亚洲欧美在线观看免费| 日韩二区三四区五区六区在线看| 久久久久婷婷| www国产无码| 久久m| 在线观看黄色电话| 97极品无码| 粘花网06av视频| 中文字幕亚韩| 不卡在线观看视频| 国产视频一区二区三区久久亚洲天堂| 美女视频尤物网在线看| 欧美少妇高潮视频| 色av中文字| 国产亚洲中文不卡二区| 丰满人妻区一区二区三| 亚洲色图美腿丝袜| 夜色五月天| a一区二区三区乱码在线| 国产日韩中文字幕欧美| 九月AV| 美女极品一区二区三区| 人人模人人看| 亚洲综合有码| 加勒比av中文| 亚洲人妻熟妇三十三区| 六月激情婷婷| 久久AV无码网址| 亚洲 欧美 日韩 国产一区二区| 久肏视频字幕| 日韩欧亚中文在线| 人妻在线臀日韩| 天天爽天天操| 国产一区二区三区精品观看啪| 一区二区三区视频| 久久丝袜| 精品人妻一区二区三区四区不卡在| 天天日熟妇| 亚洲精品国产熟女久久久| 青青草视频导航官网| 欧美色九九九| 2001天天操| 深夜激情无码| 黑人精品XXX一区一二区| 日韩成人人妻网站| 精品一区99999| 成人久久精品| 97视频www| 97欧美久久久久久久| 久久机热| 超碰精品人妻狠狠干| 亚洲做性| 干超碰碰熟女| 精品国产91av一区二区三区| 亚洲欧美日韩激情不卡| 人妻夜夜爽天天爽三区麻豆AV网站| 人人妻人人爽| av天堂精品久久| 天堂中文资源在线bt| 人妻少妇一区二区| 精品一区二区三区四区女| 加勒比av官网在线| 淫淫综合网| 天天操人人操狠狠插| 先锋精品av色鲁| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 日本日日色视频| 狠狠爱AV| 久久专区| 久久一级无码精品毛片6| 狠狠操夜夜操蜜桃视频三区| 亚洲区限制级| 超碰97综合| 99精品国产户外露出| h无码动漫在线观看| 中文字幕在线观看二区三区| 五月婷婷久久综合| 天综合网欧美| 日本成人A片免费看| 久久人妻丝袜一区二区三| 亚洲男人的天堂在线看| 天堂亚洲精品| 青娱乐亚洲自拍| 人妻精品4K4K4K4K4| 色图综合网| 丁香六月婷婷| 韩日男人的天堂| 十八禁啪啪视频| 国产女人高潮视频| 新怡红院| 伊人色综合网电影| 天天舔九色婷婷| 高清无码在线播放网站| 欧洲Au麻豆| 五十路六十路素人熟女| 亚洲色久| 乱伦强奸区日韩| 久久久久密| 国产精品亚洲色婷婷久久久| 嗯啊不要啊啊在线观看视频| 亚洲第一成人影院色播| SS久久| 乱伦av麻豆| yazhouzaixian| 婷婷成人久久久精品| 97精品视频| 熟女AV一区| 日本日皮视频逼| 精…码一二三区| 色婷婷综合久久久久中文一区二区| 国产美女在线精品免费看| 亚洲男人天堂2016| 丁香六月天| 性爱网站一区二区| 日产成人久久| 九九视品黄色| 精品久久人妻成人网| 亚洲97在线观看| 亚洲怡春院| av婷婷色网| 亚洲综合婷婷| 人人干黄色| 试看60秒 爽| 人妻丝袜肏逼| 亚洲熟女乱熟乱熟妇综合网二区| 亚洲精品天天影视综合网| 校园春色综合| 91精品国产91久久福利| 久久欧洲| 强奸乱伦av电影| 欧美 日韩 亚洲 春色| 亚洲超碰97| 久久精品国产精品一区| 加勒比伊人综合| 欧美专利1区2区3区4区5区免费| 操比国产| 亚洲,日韩,欧美,成人播放| 欧美96精品在线| 欧美综合自拍亚洲综合图| 啊啊啊啊操死我了| 久久av色| 人妻精品一区二区全免费| 中文字幕 人妻不满 在线视频| 亚洲高潮少妇| 2017,超碰| 色综合五月天| 国产精品片| 麻豆伊人网| 久久九操在线观看| 激情久久日韩精品中文字幕麻豆| 日韩美女高潮喷水视频| 国产亚洲色婷婷99精品91| 超碰这里只有精品| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 多乙久久久久久| 96久久精品一二三区色欲| 超碰碰碰碰| 婷婷伊人綜合中文字幕| 欧美性爱无码一区二区三区| 中文字幕乱码人妻二区三区| 99久久精品无码一区二区| 欧美性爱视频免费一区一A | 日本 情色 1区2区3区| 麻豆人妻少妇在线免费观看| 欧美成人国产精品| 91精品导航| 成人毛片免费| 国产午夜无码片在线观看影视 | 亚洲欲色| 少妇一级婬片免费放一级a性色.| 久草网站免费在线观看| 丁香五月性| 91超碰人人操| 少妇与黑人高潮在线| 97在线视频观看免费| 超碰99在线| 做爱A级亚欧| 97色在线观看| 干b网| 欧美精品日韩久久久九| 欧美一级久久久丰满| 性生活久久久久久久久久| 超碰九九| 一个人免费HD91视频| 久久精品国产99国产精品亚洲| 欧美日韩亚洲天堂| 黄视频免费| 一区二区首页| 亚洲欧美另类激情小说| 一级黄色影片| 亚洲熟妇A V黑人| 午夜视频好爽啊| 中文字幕人妻色偷偷久久皮| 丝袜美腿av女优在线| 日韩啪啪啪啪啪| 国产精品不卡少妇白| 综合色啪| 青青在线视频免费| 射 色综合| 日本操逼无码| 九九热超碰97亚洲最新香蕉| 91福利网在线观看| 色久桃花影院在线观看| 亚洲国产福利视频| 五月天色综合| 91欧美大片| 91高跟美女在线播放| 国产毛片片精品天天看视频| 97超碰逼| 男人的天堂一区三区| 就去色综合| 麻豆精品久久久久久久| 午夜超碰| 99最新日韩偷拍视频| 亚洲麻豆精品二区三区| 国产操逼视频在线观看| 欧美性五月| 国产九九久久久精品| 国产又操| 超碰97人妻| 色拍偷亚洲| 九九视品黄色| 强奸乱伦αv片| 亚洲性爱成人| 欧洲色综合| 狠狠操夜夜操蜜桃视频三区| 人人操人人爽人人操人人| 国产三级中文字幕粉嫩| 91大胆欧美| 午夜一区二区三区国产| 日韩精品人妻| 免费国产视频| 久久超碰大香蕉| 黄页大片在线观看| 色久综合| 色婷婷视频| 免费人成?大片在线播放| 精品九九国产无码| 人妻三级在线中文字幕| 极品销魂美女一区二区| 欧美一级二级三级| 四虎精品亚洲| 九九人妻| 中文字幕一二三av| 破处bbq| 欧美综合自拍亚洲综合图| 狠狠穞A片一區二區三區| 国产精品不卡一区二区三区av| 曰韩人妻中文字幕在线| 亚洲色婷婷久久91| 日韩本不卡视频在线观看| 久久啊啊| 国产精品人妻无码久久久老鸭窝| 国产400孕妇孕交群| 97精品一区二区三区免费| 日韩欧美天堂| 哈哈操电影| 日韩在线地址一| 精品高潮| 岛国AB视频| 志村玲子视频一区二区| 欧美性爱五月天| 丝袜内射| 91色伦| 亚洲天堂一区二区| 日韩大香蕉| 影视综合无码少妇| 久久久久久AⅤ无码免费肉站| 三男一女不戴套的A片| 日本精品无码三级网站| 婷婷色中文字幕| 91九九九逼| 9999亚洲电影| 九99久久| 大香蕉日韩欧美| 亚洲āv网址在线观看| 国产一级舔足在线观看| 十八禁成人网站在线观看| 国产刺激视频| 超碰97欧美在线| 大香蕉伊然在亚洲91| 亚洲巨爆乳一区二区三区四季网| 日韩中文字幕在线视频观看| www.四虎在线| 9Ⅰ超碰| 天天爽夜夜操| 亚洲 欧美 另类 日韩 人妻一区| 尤物av网站| 新视频sss国产| 久久精品女同亚洲女同13| 日韩熟女操逼| 日本视频一区二区三区| 综合久久少妇中文字幕| 高清无码国产亚洲| 久久久久斤小| AA级电影三区| 黑丝91视频| 国产无码精品久久久久久| 久99| 白丝AV| 色综合加勒比四四季| 无码精品久久久久久亚洲| 午夜福利av电影在线| 欧美美女在线高潮999| 999久久久| 丝袜无码a片| 午夜激情成人在线观看| 中文字幕在线24| 伊人久久亚洲中文字幕不卡| 人妻啪| 丝袜夫妻自拍| 亚洲欧洲综合成人av一区| 亚洲欧洲小说图片视频| AV一起草在线| 好爽要喷了| 骚货| 国产精品久久久无码AV网站| 情色五月天就去干| 黄片无码在线制服| 99av| 超碰午夜| 91扒丝袜综合在线| 欧美日韩国产中文精品字幕自在自线| 亚洲日韩资源| 成功精品影院| 日本人妻最新在线中| 久久国产精品熟女人妻| 制服乱伦| 强奸国产精品视频| 亚洲熟女av中文字幕| 99精品高潮| 欧美 亚洲 大香| 996热| 欧美亚洲日本视频久久久 | 亚洲久久久| 97超碰色屌| 伊人影院中文字幕| aaa一级黄片| 国产91乱伦| 二男一女成人A片| 久久久久女教师免费一区| 国产后入内射| 99热这里是精品| 国产精品白领在线观看| 爱爱动态试试看6 0秒| 欧美 亚洲 制服 精品| 99色热| 久久99综合| 欧美日韩夜夜| 人妻少妇视频在线播放| 日韩人妻一区二区精品| 国产97视频免费观看| 亚欧性爱无码| 人人操人人摸人| 亚欧国产无码精品在线| 亚洲综合婷婷| 天天天天干| 国产不卡精品91| 日本一二三高清| 搞中出视频在线观看| 久久婷婷苹果| 99久久99久久免费精品蜜臀| 欧美性爽xyxOOOO| 色综合V| 国产专区第一页| 色九九综合| 一区二区三区四区五区高清无码永久视频 | 草莓精品视频在线免费观看| 99老司机精品视频在线观看| 亚洲AV秘 精品久久老牛影视| 天天视频黄| 日本五十路熟女一区二区| 乱色视频中文字幕| 亚洲综合网图| 91网站18在线观看| 亚洲 另类 丝袜 自拍 动漫| 蜜桃AV天堂| 天天影视色香欲综合网小说| 欧美日本中字另类在线| 高清不卡国产| 久久成人东京热人妻| 被男人吃奶很爽的毛片| 91超碰人人操| 国产五码丝袜屁眼| 国产日本一区二区三区蜜臀在线观看| 综合久久久久久久久91| 日韩精品中文字幕一| www.四虎在线| 国产精品另类一区大香蕉| 精品国模无码| 天天干天天爽| 91嫩草欧美| 囯产精品久久久久久久久久梁医生 | 狠狠躁AV| 欧美宗合网| 91精品人| 欧美三级一级| 婷婷在线视频在线观看| 在线观看AV不卡| 国产操逼网站亚洲一级黄色| 青草草免费网站av| 人人操人人爽人人操人人| 欧美最大综合网| 国产一区二区三三视频| 久久綜合很很很| 欧美亚洲中文字幕| 久久婷婷综合国际产色怕| 九九九精品一区二区无码| 视频在线观看免费一区二区三区| 亚洲av热热色| 夜夜夜爽www精品视频| 亚洲精品久久久久久久久豆丁网| 久久久555| 亚洲激情色片| 一区二区视频在线播放| 日韩欧美女求操每天更新| 天天摸,夜夜摸| 94色色电影网| 亚洲自拍欧美国产首页网曝| 亚洲AV麻豆Aⅴ无码电影一| 欧美亚洲涩涩| 色婷婷综合视频| 富女玩鸭子一级毛片| 久久久久久久少妇| 91精品伊人久久久大香线蕉91| 欧美丝袜91| 一区| 婷婷久久大香蕉| 国产家庭乱伦表演| 中文字幕二区| 亚射在线| 99这里有精品视频| 亚洲一区二区三区AV无码| 国产精品suv一区| 性爱乱伦网址| 青娱乐老司机视频| 亚洲熟女诱惑| 啊嗯嗯啊好大好爽| 久久精品老司| 999日韩中文精品观看视频。|