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

ARTICLE DETAIL

資訊詳情

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

Java俄羅斯方塊開發(fā)實(shí)戰(zhàn):從基礎(chǔ)語法到面試通關(guān)

Java俄羅斯方塊開發(fā)實(shí)戰(zhàn):從基礎(chǔ)語法到面試通關(guān) 簡介壓縮包內(nèi)是用 Java 編寫的俄羅斯方塊小游戲完整源碼定位為 Java 游戲開發(fā)入門資料適合初學(xué) Java、想通過經(jīng)典小游戲理解面向?qū)ο缶幊獭⑹录幚砼c游戲循環(huán)思想的學(xué)生和自學(xué)開發(fā)者。包內(nèi)僅有 6 個(gè)文件包含 5 個(gè) .java 源文件和 1 個(gè)已打包好的 .jar 可執(zhí)行程序源文件按方塊類、游戲面板、控制邏輯、時(shí)間管理、用戶接口、得分系統(tǒng)等核心模塊劃分結(jié)構(gòu)清楚便于對照運(yùn)行結(jié)果逐段閱讀。整個(gè)壓縮包只有 35KB十分輕量下載后即可解壓瀏覽。該資源已有 2049 人學(xué)習(xí)/下載在小游戲源碼學(xué)習(xí)圈中有一定熱度。借助這份源碼讀者能完整梳理方塊生成、下落、旋轉(zhuǎn)、碰撞檢測與整行消除的算法流程熟悉 Swing/AWT 界面繪制和鍵盤事件處理也能體會(huì)經(jīng)典俄羅斯方塊玩法在 Java 中的實(shí)現(xiàn)思路為后續(xù)擴(kuò)展玩法或自研小游戲打下基礎(chǔ)。1. 一個(gè)「eluosifangkuai---java.rar」壓縮包把 JAVA 俄羅斯方塊從入門到面試串起來網(wǎng)上下載的 Java 俄羅斯方塊資源包大多長這樣eluosifangkuai---java.rar解壓后可能有.java文件、.class文件甚至只給你一個(gè).jar。很多人第一反應(yīng)是找現(xiàn)成代碼運(yùn)行但真正能讓你成長的是自己把游戲從零寫出來。JAVA 俄羅斯方塊是典型的數(shù)組 面向?qū)ο? 事件驅(qū)動(dòng)練習(xí)不需要 Spring不需要數(shù)據(jù)庫卻能把二維數(shù)組、狀態(tài)管理、鍵盤監(jiān)聽、界面刷新全部過一遍。它適合剛學(xué)完 Java 基礎(chǔ)語法、想做點(diǎn)能運(yùn)行項(xiàng)目的人也適合準(zhǔn)備 Java 開發(fā)面試前用兩三個(gè)小時(shí)復(fù)習(xí)基礎(chǔ)知識點(diǎn)的人。與其在壓縮包里找答案不如把這個(gè)標(biāo)題當(dāng)成作業(yè)題動(dòng)手重寫一遍。2. 游戲模型先立住方塊數(shù)據(jù)、旋轉(zhuǎn)公式與碰撞消行的最小實(shí)現(xiàn)2.1 用坐標(biāo)點(diǎn)集代替二維數(shù)組方塊建模會(huì)清爽很多俄羅斯方塊最核心的數(shù)據(jù)是當(dāng)前方塊和棋盤。常見做法有兩種一種是用int[][]表示 0/1 矩陣另一種是用坐標(biāo)點(diǎn)集記錄每個(gè)格子的 (列, 行)。我一般選坐標(biāo)點(diǎn)集因?yàn)樾D(zhuǎn)公式非常簡單碰撞檢測也能統(tǒng)一處理。棋盤常量先定義出來寬 10 格、高 20 格這是經(jīng)典 Tetris 的尺寸。格子的坐標(biāo)我統(tǒng)一用column列和row行原點(diǎn)在左上角列向右增長行向下增長。方塊相對坐標(biāo)也用同一套規(guī)則這樣合并到棋盤時(shí)不需要轉(zhuǎn)換。public class Shape { private int[][] cells; // 每行是一個(gè)格子的相對坐標(biāo) {col, row} private int x; // 方塊左上角在棋盤上的列 private int y; // 方塊左上角在棋盤上的行 public Shape(int[][] cells, int x, int y) { this.cells cells; this.x x; this.y y; } public int[][] getCells() { return cells; } }這里cells存的是相對坐標(biāo)例如 I 形狀可以寫成{{0,0},{1,0},{2,0},{3,0}}T 形狀寫成{{0,0},{1,0},{2,0},{1,1}}。注意不是矩陣所以每個(gè)方塊的長度可能不同旋轉(zhuǎn)后也不需要重新開辟固定大小的矩形。七種方塊建議集中定義在一個(gè)工廠里否則散落在各處很難維護(hù)。用靜態(tài)數(shù)組存所有形狀的初始坐標(biāo)配合顏色字段一個(gè)Shape實(shí)例就能完整表示一個(gè)方塊。public class ShapeFactory { private static final int[][][] SHAPES { {{0,0},{1,0},{2,0},{3,0}}, // I {{0,0},{1,0},{0,1},{1,1}}, // O {{0,0},{1,0},{2,0},{2,1}}, // L {{0,0},{0,1},{1,1},{2,1}}, // J {{0,0},{1,0},{1,1},{2,1}}, // S {{1,0},{2,0},{0,1},{1,1}}, // Z {{1,0},{0,1},{1,1},{2,1}} // T }; public static Shape randomShape() { int index ThreadLocalRandom.current().nextInt(SHAPES.length); // 3 是初始列0 是初始行方便從棋盤頂部上方生成 return new Shape(SHAPES[index], 3, 0); } }randomShape里把初始列寫成了 3這是給 I 形狀留的空間其他形狀也會(huì)落在這個(gè)范圍內(nèi)。更穩(wěn)妥的寫法是拿到形狀后根據(jù)寬度計(jì)算初始列但先固定一個(gè)安全列也能跑。2.2 旋轉(zhuǎn)公式只改相對坐標(biāo)不碰方塊位置點(diǎn)集旋轉(zhuǎn)的公式很固定順時(shí)針 90 度(col, row)變成(-row, col)。因?yàn)槠灞P坐標(biāo)系中行向下為正所以這個(gè)變換不會(huì)翻轉(zhuǎn)錯(cuò)方向。變換后會(huì)出現(xiàn)負(fù)列需要對整組坐標(biāo)做一次平移讓最小列變成 0。public void rotateClockwise() { int[][] rotated new int[cells.length][2]; int minCol 0; for (int i 0; i cells.length; i) { rotated[i][0] -cells[i][1]; rotated[i][1] cells[i][0]; minCol Math.min(minCol, rotated[i][0]); } for (int i 0; i rotated.length; i) { rotated[i][0] - minCol; } cells rotated; }需要注意這里只修改了cells沒有改x和y。旋轉(zhuǎn)后再用碰撞檢測判斷是否合法合法才保留否則用“踢墻”處理。另一個(gè)需要注意的點(diǎn)是 O 方塊四個(gè)格子繞中心旋轉(zhuǎn)后圖形完全一樣但坐標(biāo)會(huì)整體漂移一格。常見做法是給 O 方塊特判旋轉(zhuǎn)時(shí)直接返回避免它在原地跳一下的視覺問題。2.3 碰撞檢測三個(gè)邊界條件缺一不可移動(dòng)或旋轉(zhuǎn)前都要做碰撞檢測。檢測方式是遍歷當(dāng)前方塊的每一個(gè)格子把相對坐標(biāo)加上dx、dy以及x、y得到目標(biāo)坐標(biāo)然后檢查它是否越界或撞到已固定方塊。public boolean collides(GameBoard board, int dx, int dy) { for (int i 0; i cells.length; i) { int col x dx cells[i][0]; int row y dy cells[i][1]; if (col 0 || col board.getCols()) return true; if (row board.getRows()) return true; if (row 0 board.isOccupied(row, col)) return true; } return false; }第一條判斷左右邊界第二條判斷下落是否觸底第三條判斷是否撞到已經(jīng)固定住的方塊。為什么單獨(dú)判斷row 0因?yàn)榉綁K生成時(shí)允許從棋盤頂部上方出現(xiàn)負(fù)行是合法的臨時(shí)狀態(tài)不該被當(dāng)成占用。這一點(diǎn)很多新手會(huì)漏導(dǎo)致第一塊方塊一出生就報(bào)碰撞。旋轉(zhuǎn)時(shí)不要直接替換坐標(biāo)要先試轉(zhuǎn)。試轉(zhuǎn)后如果不碰撞就采用如果碰撞常見的簡單做法是嘗試左右平移一格這叫 wall kick。入門項(xiàng)目左右各試一格就夠了專業(yè)版會(huì)要不同的踢墻表。public boolean tryRotate(GameBoard board) { Shape rotated cloneShape(); rotated.rotateClockwise(); if (!rotated.collides(board, 0, 0)) { cells rotated.getCells(); return true; } if (!rotated.collides(board, -1, 0)) { x--; cells rotated.getCells(); return true; } if (!rotated.collides(board, 1, 0)) { x; cells rotated.getCells(); return true; } return false; }這里cloneShape必須把cells的每一行都復(fù)制一份否則得到的 Shape 只是淺拷貝旋轉(zhuǎn)后原方塊的坐標(biāo)也會(huì)被改掉。深拷貝完成后再去試碰撞失敗時(shí)原形狀保持不變游戲邏輯才不會(huì)亂。2.4 消行數(shù)組引用和掃描順序是兩個(gè)隱藏坑消行邏輯看起來很簡單找到滿行移除該行上方所有行下降一行。但落地時(shí)容易翻車。我從底向上掃遇到滿行就removeRow(row)然后讓row再檢查一次當(dāng)前行因?yàn)樯厦娴粝聛淼囊恍锌赡苁菨M的。public int clearFullRows() { int count 0; for (int row rows - 1; row 0; row--) { if (isFull(row)) { removeRow(row); count; row; // 抵消循環(huán)里的 --繼續(xù)檢查同一索引 } } return count; } private void removeRow(int row) { for (int r row; r 0; r--) { grid[r] grid[r - 1].clone(); } grid[0] new int[cols]; }如果grid是二維數(shù)組grid[r] grid[r-1]不做clone()會(huì)導(dǎo)致上面若干行共享同一個(gè)一維數(shù)組改一行全部跟著變。這是消行后整個(gè)棋盤顏色錯(cuò)亂的頭號原因。用clone()是這里最省事的深拷貝雖然性能一般但對 10x20 的棋盤完全夠用。2.5 方塊移動(dòng)、合并和游戲結(jié)束把它們接起來移動(dòng)方法很簡單先檢測檢測通過才更新坐標(biāo)。合并方法把當(dāng)前方塊的格子寫進(jìn)棋盤注意忽略row 0的格子。public void move(int dx, int dy) { if (!collides(board, dx, dy)) { x dx; y dy; } } public void merge(GameBoard board) { for (int i 0; i cells.length; i) { int col x cells[i][0]; int row y cells[i][1]; if (row 0) { board.setCell(row, col, 1); } } }move里直接判斷碰撞所以外部不需要再寫第二遍。merge里row 0說明這個(gè)格子還在屏幕外寫進(jìn)棋盤會(huì)破壞數(shù)組下界必須跳過。合并完成后如果新方塊在初始位置就已經(jīng)碰撞說明堆到了頂部游戲該結(jié)束了。3. 用 Swing 搭一個(gè)能玩的 Java 俄羅斯方塊主循環(huán)、鍵盤事件與界面刷新3.1 為什么選 Swing 而不是 JavaFX對于“Java 俄羅斯方塊”這個(gè)標(biāo)題多數(shù)場景是課程作業(yè)或面試手寫選 Swing 是成本最低的方案。Swing 在 JDK 8 里自帶不用額外安裝插件JavaFX 從 JDK 11 開始和 JDK 分離要單獨(dú)引入依賴對一個(gè)入門項(xiàng)目環(huán)境配置就夠勸退。另外 Java 面試?yán)飭栕烂娉绦驎r(shí)Swing 的JFrame、KeyAdapter出現(xiàn)頻率遠(yuǎn)高于 JavaFX。我一般用JFrame作為主窗口里面放一個(gè)自定義JPanel畫棋盤。主窗口負(fù)責(zé)處理鍵盤和定時(shí)器畫板只負(fù)責(zé)根據(jù)棋盤數(shù)據(jù)渲染職責(zé)分開。這樣后面要換成別的 UI 框架業(yè)務(wù)邏輯不用動(dòng)。3.2 Timer 驅(qū)動(dòng)下落別再寫 while Thread.sleep很多初版代碼會(huì)寫while (true) { moveDown(); Thread.sleep(500); }原因是直覺上覺得游戲循環(huán)就該這樣。但它會(huì)卡死 Swing 的事件線程窗口無法響應(yīng)關(guān)閉和鍵盤。正確做法是用javax.swing.Timer它的事件回調(diào)也跑在 EDT 上和 repaint 天然同步。public class TetrisWindow extends JFrame { private GameBoard board new GameBoard(10, 20); private Shape current; private Timer timer; private int level 1; public TetrisWindow() { setTitle(JAVA 俄羅斯方塊); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); add(new BoardPanel(board), BorderLayout.CENTER); pack(); setVisible(true); timer new Timer(delayForLevel(level), e - gameTick()); timer.start(); current ShapeFactory.randomShape(); } private void gameTick() { if (current.collides(board, 0, 1)) { board.merge(current); int rows board.clearFullRows(); if (rows 0) { level; timer.setDelay(delayForLevel(level)); } current ShapeFactory.randomShape(); } else { current.move(0, 1); } repaint(); } private int delayForLevel(int level) { return Math.max(80, 500 - (level - 1) * 30); } }delayForLevel讓每消一輪就快一點(diǎn)Timer 的回調(diào)間隔就是方塊下落的間隔。調(diào)整它就能控制難度不需要碰業(yè)務(wù)邏輯。Timer的構(gòu)造器接收一個(gè)延時(shí)毫秒數(shù)和一個(gè)ActionListener這里用 Lambda 直接綁定gameTick簡潔且不容易丟行。3.3 鍵盤監(jiān)聽聚焦、旋轉(zhuǎn)、加速和暫停Swing 的監(jiān)聽器要加到能獲得焦點(diǎn)的組件上。JFrame.addKeyListener不是不行但必須調(diào)用setFocusable(true)和requestFocus()否則按鍵可能沒反應(yīng)。addKeyListener(new KeyAdapter() { Override public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: current.move(-1, 0); break; case KeyEvent.VK_RIGHT: current.move(1, 0); break; case KeyEvent.VK_DOWN: current.move(0, 1); break; case KeyEvent.VK_UP: current.tryRotate(board); break; case KeyEvent.VK_SPACE: timer.setDelay(50); break; case KeyEvent.VK_P: if (timer.isRunning()) timer.stop(); else timer.start(); break; } repaint(); } }); setFocusable(true); requestFocus();VK_DOWN和 Timer 每 tick 都會(huì)下落一次長按會(huì)觸發(fā)重復(fù)按鍵導(dǎo)致方塊一下掉好幾行。這個(gè)在入門階段可以被接受但如果你希望手感更穩(wěn)應(yīng)該在keyPressed里只設(shè)置方向標(biāo)志位然后在gameTick里統(tǒng)一消費(fèi)。加速鍵VK_SPACE這里直接setDelay(50)真實(shí)游戲應(yīng)該記錄原始 delay在keyReleased里恢復(fù)否則松開后還保持高速。3.4 畫板把棋盤數(shù)組畫成彩色格子BoardPanel 繼承 JPanel重寫paintComponent。繪制時(shí)遍歷棋盤和當(dāng)前方塊用fillRect畫格子。為了讓消行和移動(dòng)有視覺反饋每次 gameTick 后調(diào)repaint()Swing 會(huì)自動(dòng)合并多次請求不會(huì)閃爍到?jīng)]法看。public class BoardPanel extends JPanel { private static final int CELL_SIZE 30; Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 畫棋盤上的固定格子 for (int row 0; row board.getRows(); row) { for (int col 0; col board.getCols(); col) { if (board.getCell(row, col) ! 0) { g.setColor(Color.GRAY); g.fillRect(col * CELL_SIZE, row * CELL_SIZE, CELL_SIZE, CELL_SIZE); } } } // 畫當(dāng)前下落方塊 for (int i 0; i current.getCells().length; i) { int col current.getX() current.getCells()[i][0]; int row current.getY() current.getCells()[i][1]; if (row 0) { g.setColor(Color.BLUE); g.fillRect(col * CELL_SIZE, row * CELL_SIZE, CELL_SIZE, CELL_SIZE); } } } }CELL_SIZE取 30 是讓 10 格寬變成 300 像素窗口不會(huì)太小也不會(huì)占滿屏幕。如果你要適配高分屏可以用Graphics2D的 scale 再統(tǒng)一變換但入門階段先保持整數(shù)像素最簡單。board和current可以通過構(gòu)造器傳入或者把 BoardPanel 定義成 TetrisWindow 的內(nèi)部類兩種方式都行保持引用清晰就可以。3.5 游戲結(jié)束生成新方塊時(shí)判斷初始位置當(dāng)方塊不能再下移時(shí)它會(huì) merge 進(jìn)棋盤緊接著生成新方塊。如果新方塊的初始位置已經(jīng)和棋盤碰撞說明堆到頂部游戲結(jié)束。private void spawnNewShape() { Shape next ShapeFactory.randomShape(); if (next.collides(board, 0, 0)) { timer.stop(); JOptionPane.showMessageDialog(this, Game Over); } else { current next; } }collides(board, 0, 0)是在原地檢測不移動(dòng)任何坐標(biāo)。如果返回 true說明棋盤頂部已經(jīng)堆滿繼續(xù)玩沒有意義。用JOptionPane彈窗會(huì)阻塞 EDT但此時(shí) timer 已經(jīng)停止所以不會(huì)有下落事件擠進(jìn)來。這一章做完你已經(jīng)有一個(gè)能下落、能旋轉(zhuǎn)、能左右移動(dòng)、能消行的 Swing 版本。下一步就是整理工程結(jié)構(gòu)避免代碼越寫越亂。4. 從散文件到工程化面向?qū)ο蟛鸱?、目錄結(jié)構(gòu)和啟動(dòng)入口的安排4.1 拆類標(biāo)準(zhǔn)誰管數(shù)據(jù)、誰管界面、誰管啟動(dòng)寫過一段時(shí)間后你會(huì)發(fā)現(xiàn)把俄羅斯方塊塞進(jìn)一個(gè)Main.java也能跑但一旦想加計(jì)分、音效、方塊預(yù)覽單文件就會(huì)變得沒法維護(hù)。常見做法是拆出這幾個(gè)類類職責(zé)不負(fù)責(zé)GameBoard棋盤數(shù)組、合并、消行、邊界判斷界面繪制Shape方塊坐標(biāo)、旋轉(zhuǎn)、碰撞檢測鍵盤控制ShapeFactory隨機(jī)生成七種方塊存儲(chǔ)當(dāng)前狀態(tài)TetrisWindow主窗口、Timer、鍵盤事件游戲邏輯Main啟動(dòng)入口業(yè)務(wù)邏輯這種拆分正好命中 Java 基礎(chǔ)里“面向?qū)ο缶幊獭钡目键c(diǎn)每個(gè)類只做一件事類之間通過方法調(diào)用協(xié)作。面試官問你怎么設(shè)計(jì)俄羅斯方塊你把這五類一擺再講清楚GameBoard不引用任何 Swing 組件就是一次很加分的回答。GameBoard理想狀態(tài)下只暴露getCell、isOccupied、merge、clearFullRows這些方法內(nèi)部怎么存數(shù)據(jù)是它自己的事。這樣的好處是你后續(xù)想用命令行版、網(wǎng)頁版只要復(fù)用GameBoard和Shape界面層整體換掉即可。4.2 裸 javac 跑通不用 IDE 也能編譯運(yùn)行你拿到的eluosifangkuai---java.rar未必是 Maven 工程可能只是幾個(gè).java文件。用命令行編譯能加深印象也方便在沒有 IDE 的機(jī)器上快速驗(yàn)證。目錄結(jié)構(gòu)按包名組織java-tetris/ src/ org/example/tetris/ Main.java TetrisWindow.java GameBoard.java Shape.java ShapeFactory.java BoardPanel.java編譯和運(yùn)行命令cd java-tetris javac -encoding UTF-8 -d out -sourcepath src src/org/example/tetris/Main.java java -cp out org.example.tetris.Main-sourcepath src讓 javac 在編譯 Main 時(shí)自動(dòng)往 src 目錄找它依賴的類-d out把 class 文件輸出到 out 目錄-encoding UTF-8是為了避免 Windows 控制臺(tái)默認(rèn)編碼導(dǎo)致注釋或字符串亂碼。如果編譯時(shí)報(bào)“找不到符號”先檢查 import 和包名再檢查目錄層級這是新手最常見的兩個(gè)編譯錯(cuò)誤。對比一下 HTML JS 里直接把代碼復(fù)制進(jìn)一個(gè)tetris.html就能用瀏覽器打開Java 版多了一步編譯但這一步也是你理解 JDK、classpath、main 方法最好的入口。等哪一天你拿到別人的 rar 包第一件事應(yīng)該是看源碼而不是直接去點(diǎn).class文件。4.3 用 Maven 管理的可移植寫法如果你打算繼續(xù)往這個(gè)項(xiàng)目加 JUnit、打包 jarMaven 是更省事的選擇。一個(gè)最小的pom.xml不需要依賴也能編譯出 jar關(guān)鍵是把mainClass指定到啟動(dòng)類。project modelVersion4.0.0/modelVersion groupIdcom.example/groupId artifactIdjava-tetris/artifactId version1.0/version packagingjar/packaging properties maven.compiler.source1.8/maven.compiler.source maven.compiler.target1.8/maven.compiler.target /properties build plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-jar-plugin/artifactId configuration archive manifest mainClassorg.example.tetris.Main/mainClass /manifest /archive /configuration /plugin /plugins /build /project這個(gè) pom 沒有寫插件版本號Maven 會(huì)用倉庫里的默認(rèn)版本。等你執(zhí)行mvn clean packagetarget 目錄里會(huì)生成一個(gè)可運(yùn)行的 jar。如果你需要測試再加 JUnit 依賴版本號按你本地 Maven 倉庫里能拉到的最新穩(wěn)定版填即可。Maven 不是這個(gè)項(xiàng)目的必需品但它會(huì)強(qiáng)迫你理解“源碼目錄”和“構(gòu)建產(chǎn)物”的分離。很多人拿到一個(gè) rar 包時(shí)里面只有 class 文件就是因?yàn)樵髡邲]有把源碼放進(jìn)構(gòu)建目錄。自己用 Maven 管理后這個(gè)問題不會(huì)發(fā)生。4.4 main 入口用 SwingUtilities.invokeLater 啟動(dòng)很多入門代碼直接在main里new TetrisWindow()在大多數(shù)機(jī)器上能跑但不規(guī)范。Swing 組件不是完全線程安全的main線程和 EDT 是兩個(gè)線程直接創(chuàng)建窗口可能導(dǎo)致偶發(fā)的不穩(wěn)定。標(biāo)準(zhǔn)寫法是用SwingUtilities.invokeLater把初始化任務(wù)丟到 EDT。public class Main { public static void main(String[] args) { SwingUtilities.invokeLater(() - { new TetrisWindow(); }); } }invokeLater會(huì)等 EDT 空閑后執(zhí)行傳進(jìn)去的 Runnable。對俄羅斯方塊來說它保證所有 Swing 操作都在同一線程里發(fā)生后續(xù) repaint 和 keyPressed 就不會(huì)互相競爭。配合第 3 章的 Timer整個(gè)程序的線程模型就干凈了Timer 回調(diào)、鍵盤回調(diào)、paintComponent 都在 EDTGameBoard 在同一個(gè)線程里被讀寫不需要加鎖。工程結(jié)構(gòu)到位后你會(huì)發(fā)現(xiàn)加功能變成了“填方法”而不是“全局翻代碼”。比如想讓方塊有不同的顏色只需要在 Shape 里加一個(gè) Color 字段想統(tǒng)計(jì)分?jǐn)?shù)只需要在 TetrisWindow 里加一個(gè)成員變量。這也是面向?qū)ο筮@個(gè)熱詞在這個(gè)項(xiàng)目里最實(shí)際的體現(xiàn)。5. 避坑排查俄羅斯方塊從能編譯到能玩最容易踩的 5 個(gè)坑這一章不是講新功能而是把最常見的編譯時(shí)報(bào)錯(cuò)和運(yùn)行期翻車整理成清單。以下每條都是實(shí)際調(diào)試中反復(fù)出現(xiàn)的現(xiàn)象按“現(xiàn)象、原因、解決”的順序?qū)懩阍谧约旱拇a里照著排查就行。5.1 方塊一出生就撞墻初始坐標(biāo)算錯(cuò)現(xiàn)象程序啟動(dòng)后第一塊方塊立刻消失或者直接彈 Game Over。原因隨機(jī)生成方塊的初始坐標(biāo)是寫死的(0,0)忽略了棋盤寬度和方塊寬度或者碰撞檢測把row 0也算撞墻。解決初始坐標(biāo)設(shè)置成x COLS / 2 - shape.getCells()[0].length / 2y 0。同時(shí)按下落碰撞判斷負(fù)行只允許出現(xiàn)在頂部不判占用。如果沒有開放setCell可以用Shape的移動(dòng)方法把方塊移到安全位置再 merge。5.2 旋轉(zhuǎn)后圖形瞬移修改了絕對坐標(biāo)現(xiàn)象按上箭頭后方塊不但旋轉(zhuǎn)了還跳到棋盤最左邊或最下面。原因在rotateClockwise里把旋轉(zhuǎn)后的坐標(biāo)直接加上了x、y導(dǎo)致相對坐標(biāo)和絕對坐標(biāo)混在一起。解決旋轉(zhuǎn)方法只改相對坐標(biāo)cells旋轉(zhuǎn)后調(diào)用tryRotate判斷碰撞。如果碰撞再用 wall kick 左右平移x。絕對坐標(biāo)x,y只被移動(dòng)方法修改。檢查時(shí)你可以在旋轉(zhuǎn)前后打印x和y它們不應(yīng)該變化。5.3 消行后棋盤出現(xiàn)整列同色或數(shù)據(jù)丟失現(xiàn)象消掉一行后上面幾行的所有格子變成同一個(gè)顏色或者某些行消失。原因二維數(shù)組各行引用了同一個(gè)一維數(shù)組。比如grid[1] grid[0]沒有clone()后面修改grid[2][3]等于同時(shí)改多個(gè)行。解決removeRow里寫grid[r] grid[r - 1].clone()確保每行獨(dú)立。消行掃描從最后一行向上遇到滿行調(diào)用removeRow(row)后讓索引回退一格防止連續(xù)滿行被跳過。你可以用ThreadLocalRandom給每行填充不同數(shù)字消行后打印檢查數(shù)據(jù)錯(cuò)亂一眼就能看出來。5.4 按鍵一下跑幾格系統(tǒng)鍵盤重復(fù)和雙重移動(dòng)現(xiàn)象按一下左鍵方塊直接移到最左邊按住上鍵旋轉(zhuǎn)停不下來。原因Swing 的keyPressed會(huì)響應(yīng)系統(tǒng)鍵盤重復(fù)你按一次可能被觸發(fā)多次另外VK_DOWN和 Timer 同時(shí)下落一次 tick 里方塊移動(dòng)了兩次。解決不在keyPressed里直接改棋盤只記錄標(biāo)志位在gameTick里統(tǒng)一處理。boolean[] keyState new boolean[256]; // keyPressed 里 keyState[e.getKeyCode()] true; // keyReleased 里 keyState[e.getKeyCode()] false; // gameTick 里 if (keyState[KeyEvent.VK_LEFT]) current.move(-1, 0); if (keyState[KeyEvent.VK_RIGHT]) current.move(1, 0); if (keyState[KeyEvent.VK_UP]) current.tryRotate(board);即使系統(tǒng)連續(xù)觸發(fā)重復(fù)按鍵keyState只是被重復(fù)賦值為 truetick 里一次只移動(dòng)一格。這樣方塊的手感會(huì)更接近街機(jī)。5.5 窗口點(diǎn)關(guān)閉沒反應(yīng)CPU 占滿主線程被 while 阻塞現(xiàn)象運(yùn)行后窗口能顯示但點(diǎn)最小化和關(guān)閉都沒有響應(yīng)任務(wù)管理器顯示 Java 進(jìn)程 CPU 接近 100%。原因在main里寫了while (true) { move(); Thread.sleep(100); }。這個(gè)循環(huán)阻塞了 main 線程但 Swing 的事件分派線程也被頻繁的重繪請求堵住窗口事件得不到處理。解決把游戲循環(huán)改成javax.swing.Timer讓每個(gè) tick 在 EDT 上執(zhí)行。如果已經(jīng)寫了 while至少把它放進(jìn)單獨(dú)的Thread但仍要避免直接操作 Swing 組件。對俄羅斯方塊來說Timer 是唯一合法的下落驅(qū)動(dòng)。這五條覆蓋了坐標(biāo)、旋轉(zhuǎn)、消行、鍵盤、線程五個(gè)方向。你如果按第 2、3 章的代碼實(shí)現(xiàn)基本不會(huì)踩如果是從別人 rar 里抄來的代碼問題大多集中在這幾處。6. 進(jìn)階玩法方塊投影、七色配色、計(jì)分規(guī)則和自動(dòng)化驗(yàn)證6.1 給下落方塊加一個(gè)投影投影就是當(dāng)前方塊直接落到底部時(shí)應(yīng)該出現(xiàn)的位置通常畫成虛線輪廓。計(jì)算邏輯很簡單復(fù)制一個(gè)當(dāng)前方塊不斷下移直到碰撞得到一組坐標(biāo)。在BoardPanel.paintComponent里額外畫一遍投影用淺色邊框。private Shape getProjection(GameBoard board) { Shape p current.cloneShape(); while (!p.collides(board, 0, 1)) { p.move(0, 1); } return p; }注意cloneShape要深拷貝否則 while 里的p.move會(huì)改掉當(dāng)前方塊自身。畫投影時(shí)可以用drawRect畫空心格子和實(shí)心方塊區(qū)分開。這個(gè)技巧能明顯提升手感玩家可以提前判斷落點(diǎn)。6.2 用 JUnit 驗(yàn)證消行邏輯不再靠肉眼試錯(cuò)消行是最容易出隱蔽 bug 的部分寫一個(gè) JUnit 測試能讓你以后改難度、改計(jì)分都放心。測試?yán)飿?gòu)造一個(gè)GameBoard手動(dòng)把某一行填滿調(diào)用clearFullRows斷言返回值和上方行數(shù)據(jù)。Test public void clearFullRowsShouldShiftRowsDown() throws Exception { GameBoard board new GameBoard(10, 20); // 先放一個(gè)格子到第 5 行再填滿第 19 行 // 具體怎么塞取決于 GameBoard 是否開放 setCell int removed board.clearFullRows(); assertEquals(1, removed); // 斷言第 5 行的格子現(xiàn)在到了第 19 行 }如果GameBoard沒有setCell可以臨時(shí)加一個(gè)包內(nèi)可見的setCellForTest或者通過merge一個(gè)一字形方塊來填滿。測試跑通后游戲邏輯的回歸成本就低很多。配色和計(jì)分是讓游戲“有味道”的兩個(gè)點(diǎn)。七種方塊各自用不同顏色可以把顏色字段放進(jìn)Shape而不是寫死在畫板里計(jì)分規(guī)則一般用“消 1 行 100 分2 行 300 分3 行 500 分4 行 800 分”階梯加分配合等級加速。我個(gè)人的血淚教訓(xùn)是永遠(yuǎn)先把消行測試寫了再去調(diào)顏色、加音效否則改一次難度消行 bug 就回來一次。這個(gè)項(xiàng)目做下來你收獲的不只是一個(gè)能玩的游戲還有一套“拆類、測邏輯、再調(diào)界面”的做事順序。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
闷骚老熟女15P| 国产综合网站在线播放| 欧美传媒一区| 欧美色三级片91| 91午夜无码| 综合亚洲网| 亚洲欧美天堂在线| 欧美在线视频99| 中文字幕中文字幕一区二区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 国产乱人伦AVA麻豆软件.| 精品久久久久综合无码| 99热国产精品| 麻豆天美在线喷水AV| 国产欧美伊人| 高跟伊人julia ann| 久久国产99精品72福利 | 亚洲色图欧美色图在线播放| 久偷拍| 色婷婷成人| 国产精品宅男免费| 乱伦熟女区| 伊人久久综合精品欧美| 中文色综合| 日韩精品资源专区二区| 国产精品96| 98久久超碰| 国产精选视频| 青青草在线视频播放器| 人妻娇喘 激情视频| 青青草无码视频| 好屌色综合| 使劲用力艹少妇视频一区二区| 精品人人| 一区二区 日韩 欧美 国产 传媒| 夜夜操av亚洲一区二区| 91天美传媒精品| 亚洲综合色男人网| 艳尻美人妻| aaa淫乱视频| 欧美亚洲一区二区久久久婷精品大包诱| 女优视频第10页| 亚洲另类综合欧美| 九九热五区| 亚洲免费精品一区| 日韩中文字幕2020| 97色操| 人妻少妇精品久久久久久| 成人青青草原伊人| 无码137片内射在线影院| 亚洲欧美色图小说| 日本熟女中文| 亚洲人成网www| www.操| 久久精品老司| 超碰久久网| 大色网久久| 欧美中文综合| 国产不卡免费在线视频| 色好看av| 久久久三区二区一区| 色97干| 亚洲男人电影天堂| 美国一区二区免费视频| 99re在线观看| 亚洲图片视频小说| 激情熟女12P| A片 AV一级在线播放观看免费| 日本在线播放不卡一区| 淫骚熟女一区二区三区| 人妻夜夜爽天天爽三区麻豆AV网站| 色吧 综合| 精品偷拍13p欧美dodk视频| 日本黄 R色 成 人网站| 久久亚洲天天做| 亚洲欧美日韩国产丝袜自拍中文| 欧美精品成人一区二区在线观看| 亚洲欧美在线观看2021| 伊人97色天使| 97伊人超碰| 伊人影院日本| 在线播放成人网站| SUV一区二区在线看| 91M一社| 免费看片黄| 91九色网| 我爱搞逼综合网| 亚洲天天在线| 欧美特大黄一级片片免费| 亚洲老熟妇xxx| 青青草成人视频在线观看二区| 亚洲影视高清第一页| 69av一区二区三区| 亚洲精品欧洲精品| 天天看天天日天天操| 久久久久久AⅤ无码免费肉站| 九九久久久九九| 99999国产| 国产美女mm131爽爽爽爽| 操b网站亚洲无码| 精品人妻久久久久一区二区三区| 蜜桃视频成a人v在线| 日本 欧美 亚中文字幕| 亚洲丝袜诱惑| 久久久久骚| 成人情色综合网| 再深点灬舒服灬太大了添视频 | 人人妻人人爽| 久久久精品国产亚洲伊人| 制服丝袜第二页| 欧美成人四级在线播放| 丰满人妻一区| 久久性爱网站| 中文精品少妇天堂| 九九九九久久久| 97色操| 午夜高清成人在线视频| 97神马久久| 91GD.COM| 欧美激情精品久久久久久| 久久久精品成人国产| 美日韩一二三区| 乱伦一二三区| 五十路二区在线| 免费一级a毛片久久久久久鸭绿欲| 2020视频1区2区3区| 97超碰伊人| 亚欧国产无码精品在线| 91精品老女人| 99国产在线绯色一区| 99亚洲国产精品色一区二区三区| 国产精品熟女九九九| 啊啊啊在线观看| 91爱综合| 青青伊人这里只有精品| 中文字幕av片| 亚洲男人天堂2012| 黄色免费网页无码| 殴美性天天| 亚洲人妻一区二区三区| 人人干黄色| 国产精品久久久777| 2018天天日天天日| 四虎影视国产精品| 91色综| 天天射天天| 欧洲精品网| 黄色片大香蕉| 乱伦一二三| 亚洲青色欧美| 九九综合久久| 欧美自拍偷拍综合图片| 日韩精品一区,二区 九九...老司机| 成人八戒网站| 欧美综合网在线| 青青草国产亚洲精品久久| 国产亚洲色停停久久99精品91| 国产精品网站www| 国产18精品亚洲精品| 99精品人妻| 亚洲精品欧美专业| 激情综合五月| 一区二区三区激情在线观看| 欧洲性爱无码区| 国产久久久久影院老熟女| 国产精品青草综合久久| 免费av高清无码| 久久精品操| 1024亚洲中文字幕久在线看片你懂的| 成人午夜小视频手机在线看| 高潮精品| AV女资源| 校园春色欧美| a人欧美综合天堂麻豆| 久久露脸国产老熟女| 欧州一区二区三区四区| 午夜精品久久久久久久第一页按摩| 中文字幕日韩综合| 天天色播亚洲综合网站| 被体育老师抱着c到高潮| 级做a爱无码性色永久免费| 日本熟妇自慰性高潮一区二区三区| 亚州情色j区| 午夜欧美女人操逼| 加勒比在线观看一区二区| 亚州性色| 五月天久久人妻| 美欧老女人97| 裸体1区| 丰满翘臀美女影院视频| 国产有码一区| 无码免费一区二区三区啪啪| 亚洲另类久操网| 国产AV超爽| AV无码久久久精品| 在线a v| 色y情视频免费看| 亚洲欧美黄| 亚洲丝袜少妇在线| 超碰99re| 国产精品福利视频| 水滴偷拍| 亚洲一区日韩精品中文字幕 | 人人摸人人干人人拍97| 黄色区免费观看中文字幕| www.yeyecao| 一区在线精品中文字幕| 欧美成人免费在线观看| 日欧操屄| 午夜激情成人在线观看| 岛国毛片在线观看免费| 亚洲中文国际强奸字幕| 国产色精品午夜大片| 久久91精品国产9丨久久分亭| 秋霞一级A片黄色视频| 八戒无码国产午夜福利| 中文字幕一区二区韩| 亚洲色 国产 欧美 日韩| 91成人久久| av日韩在线观看电影| 国人欧美精品一区二区| av九九| 另类综合另类| 日韩精品9999| 97资源站久久| 69精品| www.色吧5.com| 欧美中文字幕日韩在线| av婷婷色婷婷色六月| 岛国精品视频在线观看| 久久成年精品| 清纯唯美综合亚洲| 97在线精品观看视频| 国产精品亚洲一级av第二区| 超碰人人妻| 日韩美一区| n1038 一二三区| 人妻少妇色综合| 四虎在线视频| 热久久国产| 欧美日韩国产色图在线| 97干天天| 欧美性高潮在线| 91无遮挡| 婷婷AV一区二区三区| 射 色综合| 98超碰日本| 60秒不遮不挡| 国产精品久久久久久无码红治院| 婷婷中文字幕| 一本一道久久综合久久| av爱爱爱| 久久草草欧美精品| 99这里只有精品| 视频一区二区三区精品| 我爱大香蕉| 欧美一二三区四五区| 91伊人久久在线| 久久天堂| 99色在线| 四虎免费视频| 无码精品久久久天天影视| 思思热在线视频精品| 亚洲精品国产av天美传媒| 97中文字幕九区| 日韩乱中文| 久极品在线观看| 90后后入| 日韩亚洲中文字幕在线| 嗯,啊。舔我逼| 99婷婷一区二区| 激情婷婷| 日韩精品人妻中文字幕不卡乱码| www.黄色在线| 亚洲限制级| 亚洲欧洲激情卡通另类文学四射小说网站 | 国产在线观看91精品一区| 99热自拍| 欧美人妻制服| 日日爽夜夜爽| 91中出在线| 性爱乱伦一区| 97日韩欧美亚洲| 国产探花精品在线| 亚码人妻| 十八岁啪啪视频免费看| 亚洲免费97免费| 91在线精品一区二区三区| 国产原创自拍| 一起草高清无码| 欧美黑人性猛交91| 日本福利二区视频| 欧洲站一级二级三级h| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 国产在线综合网| henhen91| 国产精品宅男免费| 97人人操人人摸人人爱| 久久午夜伦| 久久m| 骚日日av| 亚洲欧美首页| 国产精品高朝久久久久久久| 午夜后入| 欧美人妻久久精品二区三区 | 99久久这里只有精品| 综合网少妇| 激情AV| 少妇色欲综合网2| 久久99人妖视频国产| 性欧美第一页| 性色一线| 国产一级特黄大片处女| 东京热精品97综合网| 日本激情免费大片| 婷婷人妻激情| 九久9热| 久久精品国产亚洲AV高清演员表| 九九综合网| 五月婷婷综合网| 清纯唯美亚洲综合| 久久久内射良家| 五月激情影院| 国内毛片婷婷六月色| 九9精品| 激情五月激情综合网| 91麻豆天美传媒在线| 91色碰| 国产精品美女久久久久AⅤ国产馆| 欧美综合 站| 懂色AV一区二区三区| 欧美福利视频啊啊啊啊| 99re这里| 欧美久久九九| www欧美性爱| 国产一级内射高清视频| 色天堂在线观看| 六月婷婷激情| 黄色片一区二区三区四区五区| 国产精品国产| 国产乱弄免费在线视频。| 成人亚欧免费视频| 欲香欲色| 国产精品一二三| 熟女啪啪视频| 中文字幕狠狠玩| 大象AV在线| 密臀国产在线| 人妻在线大香蕉| 天天操狠狠日夜夜干超碰撸com视频在线观看| 尤物av网站免费在线播放| 青久久| 一区黄二区黄| 久久精彩免费视频| 99成人| 伊人激情五月天一区二区| 91丝袜美女视频| 蜜桃丰满熟妇av无码区不卡| 国产美脚女优尤物在线观看| www.色综合| 日韩人妻免费精品| 亚洲精品一区二区精品| 热思思免费视频| 亚洲黄色| 国产搭汕a级片| 美女91av| 色亚州人久干视频在线观看免费版| 精精夜夜| 久久9亚洲| 98一区二区精品| 国产精品久久久久久久久AV大片 | 国产精品操| 欧美成人免费在线观看| 欧美一二在线| 九九精品99| 欧美成人一级免费电影| 丰满人妻-区二区三区| 97 国产一区| 欧美中文字幕男人天堂久久精品 | 美女操逼福利视频| 日韩免费av片高清无码| 精品一区二区三区国产| 91中文字幕| 中日韓欧美高清| 久久精品导航| 天美传媒AV在线| 日韩无限资源| 美女裸体无遮挡永久免费观看网站| 亚洲成人ab| 国产97在线 | 亚洲| 91精品导航| 操熟女91| 人妻天天爽天天爽三区| 欧美激情性爱视频网站| 国产小黄片在线免费观看| 天天干夜夜一操| av资源在线播放天堂| 99在线精品观看99| 丁香五月天婷婷姐| 综合色拍| 97色冈| 久久欲| 操一区| #NAME?| 婷婷激情五月综合| 精品福利| 岛国黄| 首页中文字幕中文字幕免费| 久操综合在线| 青青草啪啪网| 欧美色91| 亚洲无码国产探花在线观看| 91人妻中文| 国产67194| 亚洲中文一区二区三区| 国产精品网站免费| 日韩偷拍色图| 久久久97| 丁香五六月啪啪| 国产三级中文有码在线视频| 国产又爽又黄| 亚洲欧美九九九| 天堂亚洲精品久久老牛| 色臀AV| 大香蕉视频一二三区| 一起草精品人妻| 懂色AV一区二区三区| 午夜福利区| 易易A毛视频| 1级午夜影院费免区| www色色com| 男人 天堂 日 亚洲| 超碰人人干天天射| 亚洲毛片一级带毛片基地| 人妻久久久久久久久久久久久久久| 超碰97玖玖爱| 日本孕妇一区二区视频操逼免费看| 91三级理论片播放器| 天堂资源欧美| 色九久| 浪人综合网| 澳门人妻久久| 亚洲 在线| 熟女视频久久| 亚洲国产中文字幕| 在线有码中文字幕| 亚洲另类久操网| 91狠狠狠| 成人福利视频网| 操一区| 国产无码成人无码| 天天射网| 无码人妻精品酒店| 国产又黄又猛又粗又爽的网站| 免费男人的天堂| 欧美一级特黄淫片在线观看| 自拍欧美| 日本人妻中文字幕| 91丝袜激情在线| 激情小说图片亚洲首页| 男人天堂站| 91这里只有精品| 青青国产精品在线| 绯色一区二区三区不卡少妇| 天天天天操| 97在线免费看视频| 五月丁香综合| 亚洲天堂精品日韩电影| 亚洲色图激情小说| 久久老女人| 综合日本女人伊人| 日韩免费在线观看不卡| 大香蕉伊在线久草麻豆天堂故事| 亚洲熟女乱色一区二区三区| 欧美五区| 国产成年免费大片黄在线观看| 欧美成人综合| 囯产乱伦一区二区三女 | 亚洲无码 国产无码| 97视频观看| 亚欧无码线免费观看视频| 日本伦理一区二区| 新久久AV| 好湿好紧视频| 欧亚乱色熟一区二区三四区| 韩日色费| 91操人| 97人妻碰碰中文无码久热丝袜| 婷婷激情丁香| 人妻日日夜夜精品| 久操com| 欧美精品亚洲精品日韩传电影| 国产日本久久免费精品| 男人天堂2030| 女人的天堂大香蕉网| 一级黄色牲爱A级片| 91精品久久久久| 四月丁香婷婷| 亚洲第2页| 黑人性欧美| 国产高清不卡视频| 国产成人精品亚洲日本| 免费a v| 少妇色综合| 综合色久| 欧美精品一区二区少妇免费A片| 91欧美丝袜| 混色激情av| 久操网线| 亚洲 暴爽 AV人人爽日日碰| 欧美国产有色电影| 久久精品国产精品亚洲艾通辽熟妇 | 九九色热| 天天操天天干一区二区 | 大香蕉日韩| 歐美性天天| 五月丁香成人网| 日韩黄色av中文字幕| 韩日欧亚a级| 国产熟妇一区二区| 亚洲天堂男人在线| 女同性恋久久| 探花一区二区三| 福利视频网站| 精品无av| 午夜无码熟妇丰满人妻| 欧美色图天堂网m| 色五月综合| 岛国AB视频| 亚洲无码 国产无码| 日韩久射综合| 大香蕉日韩欧美| 搞中出视频在线观看| 综合色图,成人综合网| www.av在线观看| 大学生口爆吞精| 青娱乐国产剧情av一区| 欧美性爱一区二区三区| 涩亚洲欧洲| 九九九精品一区二区无码| 欧洲免费一区二| h在线看免费版在线看| 日韩精品在线观看网站| 日本性爱不卡视频| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 亚洲精品 超碰| 热久久91婷婷| 91大胆欧美| 五月婷婷综合网| 99热99色| 天天拍天天操| 免费看毛片操穴| 丁香激情网| 六月丁丁香| 色婷婷五月综合| 婷婷色婷婷| 开心五月婷婷| 亚殴在线| 亚洲色图20p| 一区麻豆 高清中文字幕| 亚洲精品丝袜| 色九九九九| 日本东京热大香蕉a片| 亚洲成人色情五月天丁香花| 今日头条成人一区二区三区四虎精品| 99热导航| 大干人妻| 亚洲成成熟女人综合一区二区| 少妇天堂| 亚洲日韩人妻中文字幕一区| 涩综合导航| 婷婷亚洲综合| 久久久久久9| 日本操BAV| 色五月第四色| 97超碰中文在线| 日韩欧美俄罗斯A片| 亚洲色图欧洲| 日本一级性爱| 日韩偷拍色图| 久草精品国产蜜臀| 伊人在线大香蕉二。| 91色欧美| 五月天婷婷在线看| 黑丝自慰喷水网站| 蜜臀少妇一区二区| 超碰天天久久79| 中出后入| 日韩一级二级三级免费看完整版| 丰满人妻被猛烈进入中| 97精品熟女少妇一区| 久久久久9| 冬京热男人的天堂| 国产精品粉嫩福利在线| 免费国产视频| 成人亚欧免费视频| Julia在线播放亚洲久久| 超碰97在线 欧美 国产| 国产精品对白自产拍| 欧美日韩大香蕉| 中文字幕第二页| 国产一区自拍欧美日韩| 九九九网页| 国产亚洲精品av一区| 丁香婷婷色五月| 人人澡综合涩| 男人天堂新| 欧美日韩不卡a片| julia高潮后不停追击中出| 日韩在线97| 亚洲 欧美 色图| av在线观看不卡网站| 久久草草欧美精品| 91亚洲狠狠色| 午夜.DJ高清在线观看免费7 | 国产强奸超碰AV| 国产性感骚丝袜在线| 超碰色美女| 国产精品亚洲一级av第二区| 欧美|91色综合| 中文字幕av一区二区三区人妻少妇 | 欧美激情另类一区二区| 97视频在线免费看| AV有码在线| 精品国产乱码久久久久久口爆网站| 91精品电影18| 欧美亚洲手机在线| 婷婷在线精品| 狠狠干妹子| 又大又长又粗又爽又黄| 一区二区三区 丝袜 高跟 美腿| 中字一区| 免费一级特黄特色大片在线观看看| 蜜桃久久综合视频| 99操逼| 亚洲美女自拍偷拍视频| 欧美大片一区二区三区| 国产成人精品必看| 牛牛久久国产精品视频一二三| 日产操逼| 97超碰天天| se吧提供国产乱老熟视频胖女人| 久久不卡一区二区| 日本成熟少妇A∨网站| 国内精品不卡无毒99999| 日韩一级二级三级在线不卡观看完整| 超碰国产在线| 天天cao在线| 欧美不卡在线美女| 国产精品女aA片爽爽视频| 久久黄色网址| 思思热在线视频免费| 男人的天堂在线2| 18禁看网站一区| 情色五月天久久久| 台湾成人无码AV| Aa东京男人的天堂| 综合自拍| 男人的天堂一区| 国产蜜臀精品一区免费尤物| J?P?NESEHD熟女熟妇伦| 美女裸体麻豆天美蜜桃91| 国产日韩欧美操逼视频| 亚洲AV在线资源| 亚洲精品视频在线播放| 超碰91在线| 在线视频五十市| 亚洲最大的综合性av| 亚洲国产97在线精品一区| 激情第四色| 欧美一级黄色免费专区| 97精品久久久久中文字幕| 人妻精品一区二区在线| 伊人91| 熟女天天干| 午夜理论片在线观看免费| 999国产精品999久久久久久| 亚洲国产精品久久久久婷婷青年| 岛国片在线播放| 日本2020一区二区| 96AV久久久| 911粉嫩人妻| 亚洲欧美电影| 欧美玖玖爱免费玖玖| 国产成人网址| 乱伦a片视频| 日韩本不卡视频在线观看 | 亚洲97成人在线观看| 欧美青青草视频| 人妻加勒比东京热| 综合久久六月久久婷婷| 少妇久久久久久| 欧美影音在线| 99re这里只有精品中心播放| 精品一区二区成人| 久久男人的天堂| 亚洲另类久操网| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 天堂精品一区| 九九无码久久精品视频| 国产浮力影院第1页| 蜜桃av色偷偷av老熟女| 女上位精品在线| 亚洲一区二区三区麻豆传媒| 五月丁香激情综合| 中文字幕一二区二三区人妻专区| 欧美高清91| 裸体美女久久久| 成 人 影视 一区 二区 三区 四区| 日韩性爱免费视频在线网站| 欧美国产精品久久九九| 强乱老妇中文字幕| 九九综合网| 91黑丝美女| 嗯嗯啊啊用力视频免费| 色色色综合网| 99久久综合网| 爱av免费| 日韩不卡在线一区二区| 91丨九色丨国产丨人妻在线| 亚洲黑人在线| 亚洲天堂资源网| 97色欧洲| 欧美一区二区三熟女剧情| av72网| 色好看av| 欧美色图亚洲特色| 精品国产自在在线99| 九九热免费视频| www.99色| 五月丁香六月激情综合| 五月婷婷啪啪| 夜夜操狠狠操| 九九在线视频| 六六久久日韩不卡| 69超碰综合| 久久人人妻| 久久9精品视频| 91扒丝袜综合在线| 第四色色综合91| 三级特黄60分钟播放| av在线观看不卡网站| 亚洲自拍青操视频| 久久熟女人| 91neishe| 丝袜制服字幕在线| 欧美天天谢综合网| 69视频福利导航| 天美精品一区二区三区四区在线观看| 精品国产99| 超碰97最新人妻| 国产欧美成人精品| 亚洲极品| 天天谢天天干| 亚洲国产尤物yw在线观看| 欧美激情另类一区二区| 91人妻中文| 久久草在线综合视频| 日本久久天堂| 色av中文字| 久久一区,青青青青草视频在线播放| 亚洲综合影片| 日日干夜夜骑| 97干在线视频| 中文字幕黄片在线| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 屌妞视频久久久久久久 | 夜夜天天噜狠狠爱2021| 久久久久国产一区二| 亚洲综合激情五月久久| 嗯~啊~快点 死我视频| 99热这里只有是精品10| 欧美色97| WWW操逼| 日韩性爱小视频在线观看| 99爱视频| 青青草乱入乱欲视频在线观看| 国产不卡的视频| 美女黄网| 欧美国产伊人久久久久| 熟女人妻av在线资源,黄色的资源| 五月天综合网| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 超碰在线人妻| 欧美国产视频| 男同专区一区二区三区在线| 丰满美女一级毛片在线播放| 国产色呦呦| 嗯嗯嗯啊啊啊操的我好爽| 加勒比av网| 98人妻精品一区二区色欲| 久久精品国产亚洲AV成人直播| 99久久com免费视频′| 土豪酒店各种姿势玩弄极品幼稚| 欧美少妇色图| 国内精品伊人久久久久影院会| 强上我不卡卡| 亚洲Av诱惑| 日本操大逼| 亚洲精品蜜桃久久久一区二区三区| 91国产丝袜美女| 日韩欧美福利视频看看| 麻豆色约约| 最新岛国大片| 欧美中文字幕男人天堂久久精品| 精品美女人人干| 成人无码在线超碰网| 青青草日韩无码| 综合色久欲| 中文字幕一区二区日韩网| 国产欧美伊人| 色爱亚洲| 婷婷五月激情综合| 超碰 国产熟女精品一区| 韩三级a视频在线观看| 综合日本女人伊人| 久久丝袜| 久久98| 91痴汉| 国产黄色av大片网站| 亚洲素人网| 美国精品国产精品| 熟女中出视频| 国产精品com| 簧片免费看视频| 日韩极品无码B| 国产伊人自拍| 夜色综合| 激情自拍 校园春色| 亚洲高清91| 人妻熟女午夜精品在线| 日韩精品午夜操呦呦不卡影院| 国产精品免费美女视频| 97久久国产亚洲精品超碰热| 国产www色在线观看| 91久久堂| 无码日韩人妻av一| 久久人妻少妇| 欧美性爱一级操| 久久久96精品| 99re久久| 啊啊啊久久| 九九热免费国产视频婷婷伊人五月| 亚洲天天更新| 久久久久中出| 家庭乱伦国产| 国产成人精品一区| 久久露脸国产老熟女| 欧美成人精品欧美一级乱黄一区二…| AA丁香综合激情| 精品视频在线观看| 久久男人网| 国模不卡| 久草电影网| 久悠悠av| 精品日韩中文在线| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 99re综合伊人| 操91| 欧美爆乳精品一区二区| 亚洲成人妻日韩在线| 秋霞欧美性爰视频| 91亚洲欧洲| 99色网| 蜜桃色院一区久久 | 精品综合久久久久久97| 超碰91在线| 永久电影三级在线观看| 高潮综合网| 99久久久久| 亚欧高清| 亚欧操逼片在线观看 | 大香蕉免费3| 国产精品69久久久久孕妇欧美| 婷婷六月天| 新久久AV| 我想要 啊 啊 啊| 熟女天天干| 人妻22p| 亚洲国产一区二区日韩专区| 四虎精品永久在线观看| 蜜臀AV成人精品蜜臀AV久久| 天堂8在线新版官网| 亚洲成人激情小说视频| 插入粉嫩少妇视频| 泰国AV在线观看| 另类一区| 岛国激情视频在线观看| 欧美+日产+中文| 日本黄页视频在线观看| 九九毛片这里只有精品| 操逼网免费无码视频| 翔田千里无码一区| 日韩欧美女求操每天更新| 午夜欧美神马久久久久| 亚洲国产精品久久久久久久久久| 国产成人精品必看| 伊人加勒比| 欧美成人贴图| 成人在线午夜视频一区| 性色avv| www久| 激情干在线| 欧美激情性爱视频网站| 欧美色999| 久九九九九九九九热| 亚洲素人网| 欧美精品丝袜久久久中文字幕| 五月天婷婷基地| 国产精品久久久久久久久AV大片| 黄色av网站在线播放| 97精品| 精品少妇99| 亚洲天堂久久| 久欲AV| AV中文字幕剧情1区2区3| 国产夜夜操| 亚洲美女精品| 91丨国产丨白浆| 1024香蕉视频| 99热这里只有精品8| 激情五月天社区| 激情综合网五月婷婷五月天| 爽极品影院| 亚洲激情综合另类男同| 免费av高清无码| 一道α片欧美| 激情小说日韩无码| 国产真乱mangent| 欧美成熟性爱精品| 欧美大香蕉久| a一区二区三区乱码在线| 人人操人人插 - 百度 - 百度| 老熟女91| 亚洲日韩在线a不卡99精品| 日产操逼| 欧美日韩*字幕一区| 强奸乱伦AV一天堂网| 欧美不卡在线一区二区| 飘花国产午夜精品不卡| 51久久夜色精品国产麻豆| 欧美的性爱网站免费| 亚洲图片色图欧美另类| 国产黄片精品在线| 99精品久久久久久久婷婷| 免费A V在线播放| 天堂种子在线www网资源| 国产日比| 旡码电影特区| 四虎AV影视国产精品亚洲精品| 99国产精品免费| www. 男人天堂成人在线| 啊啊啊啊啊舒服| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 综精品久久久aaaa| 欧美精品偷拍| 土豪酒店各种姿势玩弄极品幼稚| 人妻喷水| 9Ⅰ老熟女| 黄片免费视频2019| 中国乱伦一区二区| 激情五月婷| 欧美一区二区传媒| 久湿久久| 久久这里只| 久久成人国产精品| 最新国产亚洲精品精品国产亚洲综合| 国产超碰在线| 97资源欧美| 人妻 欧美亚洲| 九九九九九九视频免费| 亚洲成aⅴ人片不卡无码| 中文字幕亚韩| 性色avv| 午夜精品人妻二区三区| 骚女天天综合网| 岛国网址国产| 日本精品一区三区| 久久日本熟女精品一区| 性欧美91| 国产亚洲精品美女久久久久久2021| 亚洲一区中文字幕一区| 欧美天天谢综合网| av2014 日韩在线中文字幕| 狠狠操,使劲操| 韩国黄色片精品久久久| 亚洲狼狼干综合1| 我要色综合网站| 精品人妻中文字幕4399| 色婷五月天| 内射卯月麻衣| 丝袜人妻av一区二区| 亚洲一区日韩| 中文字幕综合人妻| 超碰色综合| 色综合婷婷| 亚洲综合情色| 蜜乳中文字幕a在线| 婷婷五月天丁香| 国产诱惑| 99久久久无码精品国产人| 亚洲另类综合欧美| 色婷婷日韩精品一区二区三区| 亚洲无码太久| 青娱乐av在线| 亚洲性天堂| 久操不卡视频| 久久高清无码夜夜操| 九九视频黄色片| 91美女在线精品视频| 综合色欧美| 亚洲中文字幕网| 中文字幕无码不卡啪啪| 成人七区| 一牛一区二区三区久久| 在线视频亚洲无码| 国产后入精品| 久久尹人大香焦视| 色情五月丁香| 中文字幕精品三级久久久| 久久直播国产| 亚州熟妇精品| 先锋色眉乱伦资源| 97国产天堂岛| 国产一级高跟丝袜| 久久一二三四五六七八九区区| 98人妻精品一区二区色欲| 国产高清1234区| 色噜噜狠狠色综无码久久合欧美| 婷婷综合久久| 天天综合网在线91| 99操碰| 自拍六区| 麻豆久久久一区二区| 天天网综合| 超碰亚洲欧美日韩无| 亚洲本色精品一区二区久久| 青青草密桃在线播放| 91啪啪| 欧美熟女激情| 日日插夜夜| 欧美日韩亚洲电影| 久久鲁干| 色亚洲欧美| 亚洲午夜免费狠狠干| 国产精品美女| 日产中文字幕2020| 黄片免费看的| 国产中文日韩欧美一区二区三区人妻丝袜美腿| 凹凸久久人人| 青青久日| 久久午夜伦| 在线播放成人高清免费视频| 91美女在线看| 国产色呦呦| 日韩有码中文字幕女同性恋| 97久久精品亚洲| 亚洲国产成人精品999| 国产精品不卡一区二区三区| 日本成人电影资源网| 南澳成人一级片在线播放| 日韩啪啪啪啪啪| 情趣丝袜无码操逼视频| 国产欧美后入| 激情五月天网| 欧美爱三级日韩久久| 欧亚日韩综合精品国产| 色色色999| 日韩免费中文字幕视频| 久草精品一区 | 国产天天看| 亚州操逼网| 亚洲国产综合视频| 四虎在线播放| 日韩有码免费视频| 天天操天天射天天日| 婷婷8月天青娱乐| 欧洲乱码一区二区| 国产精品一区二区 尿失禁| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 成人性爱av.com| 久久久亚洲精品中文字幕人妻| 熟妇女人妻呻吟久久AV| 在线看片国产精品每日更新| 成人性生活高清视频在线播放| 啊啊好多水| 色婷婷电影网| 成全在线观看免费观看| 怡红院成人视频| 99精品丰满人妻| 91色艳| 性做久久久久久免费观看软件| 91精品人| 久久成人东京热人妻| 操操操操操操| 欧美亚性天堂| 人人爱人人操人人性| 麻豆国产精品午夜视频| 美女十八禁| www被窝色com| 性色中出| 操操AV电影| 无码抄逼网| 超碰在线香蕉| 国内偷拍精品一区二区| 欧中美三级一区二区三区| 精品久久久不卡一区二区| 91女人的网站| 狠狠干综合| 999岛国大片| A V视频日本| 日韩av免费一级电影| 99re9| 伊人九九九| 高潮9999外国| 国产九九九九九九| 日韩视频小说在线观看| 亚洲欧美九九九| 天天综合网~69| 激情婷婷| 综合久久婷婷| 曰韩av中文字幕专区| 色噜噜精品一区二区三| 久久性爱精品一区| 日韩熟女操逼| 人人搞人人插人人操| 欧洲精品一级二级精品综合视频综合| 亚洲欧美变态| 色天天野狼综合社区| 久久9精品网站| 看看日B真人视频| 九九九草| 韩日自拍| 精品白丝一区| 伊人久大| 欧美97免费| 免费视频观看60秒| 一区二区三区一亚洲中文字幕、综合区灬| 国产精品乱码久久久、久久| 成人一级二级| 日本熟妇自慰性高潮一区二区三区| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 久婷婷一区| 四虎国产成人精品免费一女五男| 国产精品久久久蜜臀| 人人色人人射人人妻| 婷婷伊人一区| 国产成自自拍在线观看| 丝袜无码a片| 亚洲和欧美裸体美女双飞视频| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 人妻丝袜无 码视频专区| 激情五月婷| 欧美乱色| 亚洲美欧999| 成人精品一区二区三区| 2017超碰| 日天天九九天堂666| 极品另类|