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

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)清楚便于對(duì)照運(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ǔ)知識(shí)點(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)在左上角列向右增長行向下增長。方塊相對(duì)坐標(biāo)也用同一套規(guī)則這樣合并到棋盤時(shí)不需要轉(zhuǎn)換。public class Shape { private int[][] cells; // 每行是一個(gè)格子的相對(duì)坐標(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存的是相對(duì)坐標(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)公式只改相對(duì)坐標(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ù)列需要對(duì)整組坐標(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è)格子把相對(duì)坐標(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ò)亂的頭號(hào)原因。用clone()是這里最省事的深拷貝雖然性能一般但對(duì) 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對(duì)于“Java 俄羅斯方塊”這個(gè)標(biāo)題多數(shù)場景是課程作業(yè)或面試手寫選 Swing 是成本最低的方案。Swing 在 JDK 8 里自帶不用額外安裝插件JavaFX 從 JDK 11 開始和 JDK 分離要單獨(dú)引入依賴對(duì)一個(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)“找不到符號(hào)”先檢查 import 和包名再檢查目錄層級(jí)這是新手最常見的兩個(gè)編譯錯(cuò)誤。對(duì)比一下 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 沒有寫插件版本號(hào)Maven 會(huì)用倉庫里的默認(rèn)版本。等你執(zhí)行mvn clean packagetarget 目錄里會(huì)生成一個(gè)可運(yùn)行的 jar。如果你需要測試再加 JUnit 依賴版本號(hào)按你本地 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。對(duì)俄羅斯方塊來說它保證所有 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)后圖形瞬移修改了絕對(duì)坐標(biāo)現(xiàn)象按上箭頭后方塊不但旋轉(zhuǎn)了還跳到棋盤最左邊或最下面。原因在rotateClockwise里把旋轉(zhuǎn)后的坐標(biāo)直接加上了x、y導(dǎo)致相對(duì)坐標(biāo)和絕對(duì)坐標(biāo)混在一起。解決旋轉(zhuǎn)方法只改相對(duì)坐標(biāo)cells旋轉(zhuǎn)后調(diào)用tryRotate判斷碰撞。如果碰撞再用 wall kick 左右平移x。絕對(duì)坐標(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 組件。對(duì)俄羅斯方塊來說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 分”階梯加分配合等級(jí)加速。我個(gè)人的血淚教訓(xùn)是永遠(yuǎn)先把消行測試寫了再去調(diào)顏色、加音效否則改一次難度消行 bug 就回來一次。這個(gè)項(xiàng)目做下來你收獲的不只是一個(gè)能玩的游戲還有一套“拆類、測邏輯、再調(diào)界面”的做事順序。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久久人妻精品| 九九亚洲色在线观看| 精品熟女一区=区三区| 大香蕉乱级| 变态乱伦伪娘灌肠一区二区| 超碰碰激情97+久| 婷婷五月在线视频| 69精品久久久久中文字幕| 91色狼| s片在线观看| 99丝袜福利在线播放| 精品人妻一区二区视频| 91丨九色丨大屁股| 亚洲第91页 | 大香蕉综合网| 亚洲色悠悠久久88| 一区二区三| 综合色久欲| 亚洲人精| 亚洲欧美激情另类色图| 欧美高清91| 精品999日本| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 少妇久久久| 日韩欧美丝袜诱惑| 不卡九肏| 色婷婷狠狠| 91高潮喷水美女| 玖玖视频在线资源一区二区三区| 中日韩熟女| 超碰久热| 亚洲第一精品在线视频| 高潮毛片无遮挡高清免费| 啊啊啊不要好疼视频| 少妇熟女1区2区3区| 亚洲欧美精品一区天堂久久 | 九九av| 久久久久9| 欧美伊人久久综合网| 51一区二区三区| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 中文久久一区| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 日本欧美亚洲高清在线看| 久区视频| 狠狠躁日日躁夜夜躁A| 欧美最婬乱婬爆婬性视频| 少妇高潮99p| 人人爱人人操人人性| 人妻一区视频| 国产精品嫩草久久久久| 91干熟女| 婷婷五月av| 国产精品久久久鸭无码的功能| 岛国毛片手机在线观看| 成人av免费观看| 免费一级欧美片片线观看| 日本一区二区三区午夜观看| 超碰97人妻| 欧美牲| 精品人妻一区二区三区免费视频| 91欧美性| 美国三级日本三级久久99| 欲香欲色综合天天伊人| 日本中文熟女视频| 中文字幕亚韩| 丁香五月天堂网| 九九玖玖精品| 久久男人| 超碰国产在线| 大香蕉在线86| 欧美亚洲首页| 久久久久久久精| 日本不卡一区二区| 乱伦3P视频| 亚洲综合色男人网| 射丝袜大香蕉| 久久久久亚洲| 亚洲综合色婷婷| 欧美色图亚州激情| 小草av不卡亚洲二区| 99蜜月精品久久| 色路综合| 91人妻做a观看视频| 国产在线激情视频| 九九久久九九久久| 97亚洲色图| 伊人丁香五月婷婷| 国内精品999| 国产偷仑| 麻豆色99999| 精品99999| 18禁免费视频| 综合色色婷婷| x97av| 国产农村妇女毛片精品久久| 强奸乱伦 亚洲一区| 男人高清无码一区二区| 久久日本熟女精品一区| 亚洲精品97p| 九九热久久99精品re| 精品一区二区亚洲国产| 久草男人天堂| 乱论91| 国精品一区二区三| 91老熟女91老女人| 啪啪啪东京| 亚洲精品一区二区精品| 综合色图区| 久久超碰免费的| 人妻少妇精品| 久久亚洲国产成人| 天堂а√在线最新版在线| 熟妇高潮二区三区| 中文字幕少妇色| 91成人无码| 精品v日韩欧美国产| 蜜臀精品1区2区| 国产精品农村妇女| 破处bbq| 国产高清成人免费视频| 日韩人妻播放| 亚洲高清在线se| 日韩久久.一级黄色片| 嗯嗯啊啊操死我| 97在线免费看视频| 逼逼逼逼操操操操操操操操操午夜剧场 | 日本精品一区二区中文字幕| 一区二三区四区视频大全套| 九t超碰| 性色av婷婷久久一区二区点复制| 精品人妻一区二区三区四区| 久久久久成人蜜桃精品| 人妻性爱一区二区| 激情久久久| 91综合天天| 九九热精品| 91第一页| 欧美激情总合网| 人人澡人人干| 很很很很操| 无码最新| 欧美组图日韩亚洲中文字幕| 极品白嫩福利在线| 在线欧美亚洲| 中文字幕少妇色 | 大香蕉手机视频| 九九av| 精品人妻一区二区三区四区不卡在| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 成人免费福利网站国产| 中国特猛少妇色xxx| 嗯嗯嗯好爽| 日韩一级久久毛片| 欧美翘臀视频网站一区二区三区| 熟妇一区二区三区| 久久一二三四五六七八九区区区| 九九久久国产精品怡红院| 老外又粗又长一晚做五次| 99爱爱| 色99视频| 乱伦3P视频| 97综合在线| 欧美日韩少妇色情| 亚洲国产高清福利视频| 欧美色图20p| 国产美脚女优尤物在线观看| 色色操| 日本熟女不卡视频| 亚洲影视第一页| 口爆综合网| 琪琪精品免费一区二区三区| 国产精品一区在线播放| 午夜啪啪片| 免费观看日本操逼视频| 国产精品探花视频| 久久超碰av在线| 9久热| 亚洲精品国产专区在线观看| 日产操逼| 天天日熟妇| 欧美永久激情一区二区| 青草青青久久久久久国产| 午夜亚洲国产理论秋霞| 青青久久艹| 欧美激情亚洲情色| 久干网| 日本91白丝| 欧美在线干| 日本一二三免费久久| 躁躁日曰躁2020| 99色婷婷| 色婷婷影院| 久久性爱免费送| ,成人免费啪啪视频| 亚洲 欧美 日本 国内 首页| 色男人色天堂东京热| 人夜夜精品网站香蕉嫩草| 5278欧美一区二区三区| 日韩欧美成人午夜福利| 91色婷婷综合久久中文字幕二区| 尤物视频新赏网鲜网色诱网| 嗯嗯啊啊的视频| 九九英色视频| 在线播放中文字幕| 国产极品美女高潮无套在线观看| 精品成人无码| 亚洲一区操| 欧美超碰97| 久久久久久久97| 久久精品女同亚洲女同13| 少妇色综合| 麻豆AV96熟妇人妻| 天天爽夜夜欢视| 熟妇熟女一区二三区| 夂久色| 婷婷五月激情综合| 久久国产三区| AV天天在线观看| 色九区| 欧美1727免费观看视频| 国产av尤物| 人妻AV在线| 国产人妖视频一区在线观看| 亚洲成人久久一区二区| 国产做?爰片久久毛片?片美国| 国产黄片在线免费观看| 最新亚洲风情电影| 国产精品午夜成人福利| 久久黄片国产一区二区| 操淫穴亚洲五月丁香| 青青青青草av在线观看| 青青草手机在线免费观看| 色婷婷成人综合| 用力操死我| 日韩 欧美 校园一区| 美欧老女人97| 亚洲色天堂九9| 一本色道久久综合亚洲二区三区| 亚洲第二页| 91殴美| 人人贴人人摸| 狠狠激情综合狠狠操中文字幕| 午夜福利视频在线一区| 国产原创自拍| 二级久久网| 蜜桃网熟妇| 特色a在线上| 爱妃国产亚洲视频中文字幕| 伊人五月天激情| 久久婷婷精品| 伊蕉97蜜桃97狠狠综合干| 爽 好舒服 无码刺激久久| 亚洲欧美成人在线| 天天香香欲综合| 国产人妻精品一区二区三区秋霞| 久久久偷拍| 偷拍 欧美 日韩| 欧色网址| 91在线超高颜值国产| 91欧美性| 91无码西班牙视频在线| 天天色,天天干,天天干| 人妻少妇精品一区二区三区| 黄色不卡视频| 婷婷丁香激情| 日本欧美国内在线| 九九九九九精品十六| 欧成人精品一区二区三区| heyZO天然素人无码AⅤ专区| 婷婷综合网站| 神马影院午夜福利久久久| 午夜福利 成人 91| 温婉少妇玩3p| 国产自产91区13区| 欧美人妻少妇| 日韩AV一起草| 久操影视| 伊人一区二区在线播放| 久悠悠av| 嗯嗯啊啊操死我| 热G综合热G中文| 精品国产人成在线| 丝袜综合| 91在线免费精品视频| 日韩欧美经典在线观看| 天堂网 主播 亚洲| 6080YYY午夜理论片在线观看| 丁香六月婷婷| 欧美情色亚洲| 亚洲综合激情五月久久| 欧美黑人168页欧美黑人167| 熟女人妇一区二区三区| 九九九草| 久久精品国产72国产精品福利| 欧美大香蕉在线观看| 友优传媒精品在线一区二区| 另类小色呦| 精品九九九九九九九九九| 久久精品国产精品一区| 超碰调教97| 精品日日人妻| 丁香五月激情婷婷| 9久9久9久9久视频网站| 少妇滛荡视频| 99久久久无码国产精品性啊聊| 日本超碰在线国产一区| 极品销魂美女一区二区| 久久久精品日本一道| 91bbbbbb| 久久久 国产精品| 激情四射婷婷六月天| HEYZO高无码国产精品227| 91久久久老司机| 中文字幕精品一区二区精| ai欧美亚洲小说| 亚洲无码一二三区| 嗯嗯啊啊的视频| 国产福利精品最新在线 | 日本不卡中文| 欧美色偷拍 | 亚洲成人激情小说视频| 91红杏| 干我久操| 男人的天堂com| caoni国产亚洲av| 9I1性色影院| 久久久精品网| 日本一天色道久久久精品视频| 亚洲导航深夜福利| 亚洲第一页色| 人人摸.人人色| 激情黄色五月天| 3p国产色噜噜一区| 天天噜| 久久人人妻| 久久国产熟女影院| 理论久久婷婷网8| 天堂九九九九九九九九九| 精品无码久久久久久久杏吧| 少妇丝袜在线观看AV| 免费亚洲黄色视频在线观看| 超碰人妻97| 人妻一区久久二区三区色播| 综合婷婷| 伊人久久综合精品欧美| 亚洲 欧美 第一页| 亚洲精品天天影视综合网 | 极品色www影院| 国产精品乱码久久| 国产中文字幕在线| 六月丁操逼| 国产成人自拍视频在线| 蜜桃视频一区二区三区在线观看| 99热免费| 欧亚在线视频| 八戒午夜福利理论片| 草B在线| 人妻美腿丝袜制服诱惑综合天堂-| 深夜国产一区二区三区在线看| 中文字幕乱妇免费视频| 夜夜免费视频| 欧洲精品在线播放| 中文啪啪视频| 99综合网| 精品v日韩欧美国产| 天天噜| 亚洲最大的黄色电影网站。| 免费人成在线观看网站品爱网| 狠狠色噜噜狠狠狠狠狠色综合久久 | 国产欧美在线观看免费观看| 天天色怡春院| 97综合日韩| 99久久久99久久91熟女| 久干9操| 亚洲欧美日韩免费观看| 国产激情在线| 美女91网| 亚洲男人天堂视频| 日本不卡免费二区| 精品无人区麻豆乱码1区2区图片| 久草在| 亚洲国产剧情少妇激情| 18一区二区三区| 亚洲无码99| 丁香五月影院| 亚洲色啪| 91黑丝在线播放| 色婷婷九月| 国产综合网站在线播放 | 日本一级不卡一二区| m欧洲一级午老| 东京热一区二区三区四区五区六区| 九九无码| 亚州宗合另类| 77777亚洲蜜臀精品久久综合蜜臀| 91精品国产麻豆国产自产在| 中国亚洲呦女专区| 天天综合日韩网| 超碰97精品在线| 国产欧美伊人| 加勒比日本在线| 久久人妻四季| 日韩99神马视频播放| 九热大香蕉| 日韩超碰精品综合| 精品乱码在线观看| 久久精品国产久精国产| 欧美综合亚洲| 人人妻人人爱人人玩| 欧美日韩中文视频播放| 中文人妻av高清一区| 成人26uuu| 九月丁香婷婷色| h无码动漫在线观看| 日逼国产| 国产欧美一区二区| 色在线69堂| 亚洲综人网| 天天日夜干| 一区二区高清视频| 欧美精品一区二区少妇免费A片| 国岛片视频| 亚洲男人天堂手机版| 欧洲精品一级二级精品综合视频综合| 99无码狠狠久久| 国产一级137片内射麻豆| 久久肏大逼| 玖玖综合.com| 青草园大香蕉| 亚洲色图91| 波多野42部无码喷潮在线观看 | 91chinese在线| 99久久九九| 人妻少妇精品一区二区三区| 密臀AV在线| 日本不卡中文| 亚洲蜜乳av| 国产日逼视频| 99国产精品人妻人伦| 男人天堂综合| 久久久久久9| 人人操人人操人人操人人操人人操人人人11.CM | 欧美色图99| 超碰97人人cao| 伊人久久大香线蕉无码| 久久久久骚| 日韩有码免费视频| 久久久久七视频| 欧美成人9797| 久久久少妇诱惑精品视频| 免费操逼91| 日操粉逼逼| 亚洲色图欧美色图制服丝袜| 欧美综合中文| 成人在线视频网| 日韩性爱小视频| 乱伦系列一区二区| 亚洲 欧美 小说| 嗯嗯啊好爽| 国产人妻天天干精品| 五月激情视频| 九九九九亚洲| 激情五月天色色| 99热日| 久久久一区二区三区三州| 成人看片网站| 久久久111| 天天插夜夜操| 日韩人妻精品中文字幕| 欧美性爱日韩高清| 一区麻豆 高清中文字幕| 天天干18禁| 太久视频| 91女色| 天天色综合天天操| 翘臀vidoes| 啊啊啊啊操死我| 围产精品一区二区三区视频播放| 久久久∴| 在线一道啪| 日本男人插女人的逼黄色| 久久专区| 久久久草成人网站久久久草成人久久久草久久久| 国产日韩精品一区二区三区| 美女91av| 人妻99p| 91网站在线播放| 中文字幕精品一区二区精| 无码视频一区二区| 盗摄女人妻在线| 97在线欧| 六月婷婷色综合| 色综合天天爱去电影网| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 天天看高清麻豆| 熟妇xxxxx性春色| 超碰97男人| av在线观看不卡网站| 一区二区三区色综合| 性色av蜜臀av色欲aV| 狠狠亚洲| 黄色毛片A片| 精品无码少妇| 欧美日韩资源在线| 中文字幕精品日韩中文字幕| 日韩精品作爱导航| 天天日少妇逼AV| 富女玩鸭子一级毛片| 好好的日:com久久九九| 亚洲最新a在线观看| 亚洲欧美97√| 欧美伦乱爱| 欧美精品99久久久| a男人的天堂久久一级A毛片| 国产热av| 天天看天天综合成人网| 日韩午夜精品一区二区三区电影| 亚洲a色| 在线视频五十市| 俺去俺来也在线www| 亚洲欧美伦综合| 亚州中文字幕超碰97| 国产亚洲禁久一区二区 | 破苞ⅩXXX性无码动漫无码| 91 综合网| 妇女视频网站| 色色无码| 在线观看黄色电话| 日熟女| 黑人性欧美| 亚洲中文字幕乱码无码一区二区| 日韩精品永久在线观看| 国产强奸91| 91综合熟女| 狠狠躁日日躁夜夜躁A| 亚洲春色激情小说| 中国国国产一级特黄毛片| 中国AAAAAA黄色片| 天天久久| 精品女同一区| 超碰538| 久久性爱视频| 国产福利精品最新在线| 色五天伊人| 国产女人视频三四五区| 超碰 欧美| 色综合99999| 99精品网站| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 色偷偷2020免费视频播放| 一区二区不卡| 91在线限制级| 又大又黄国产| 蜜臀久久99精品久久久老,,| 国产乱码精品一区二区三区四川| 欧美综合娱乐久久| www.伪伪| 欧美性爱18观看| 午夜啪| 国产精品另类一区大香蕉| 亚洲一区亚洲天堂| 亚洲一二三| 丝袜无码a片| 精品人妻一区二区三区-国产精品 一个人在线看的黄色电影网站 | 国产精品又黄又猛又粗| 亚洲97综| 一区二区三区美女超清| 日韩性爱一级片| 91春色| 综合夜夜| 超碰午夜| 97在线视频观看网站| 亚川综合视频| 日韩精品在线视频在线观看 | 日本一片一区| 欧美久久婷婷| 二三四区精品| 中文字幕午夜精品久久久| 久久久78| 欧美啪啪色吧在线| 清纯唯美亚洲综合| 91天堂网| 丝袜 中出 制服 人妻 美腿 中文字幕| 青青草大香蕉视频| 97免费在线| 亚洲日本男人天堂网 | 亚欧免费观看视频| 激情 欧美 亚洲 小说| 一级@啪啪视频| 日本色色视频网站| 免费综合亚洲中文| 激情综合97| 亚洲色图20p| 精品美女久久一二三| 久久人妻一区二区三区高清| av天堂加勒比| 热思思免费视频| 少妇一级无码精品| 天天精品| 日韩美女久久一区二区三区| AV男人天堂网| 天天综合97| 亚洲国产一区二区入口| 免费A V在线| 91丝袜美女国产| 天天天天天天天天综合| 亚洲资源吧| 欧美影院一区二区三区| 成人亚欧免费视频| 91 丝袜在线| 941超碰| 亚洲日韩天堂| 蜜乳AV一区二区三区四| 99热这里只有精| 亚洲91综合| 久久九色| 热99这里只有精品| 97免费视频网| 久久专区| 国产精品秘 福利姬在线观看| 日本91白丝| 伊人久久蜜月| 玖玖爱在线视频免费观看| 亚洲精品成人激情在线| 美女毛片999| 精品国产乱码久久久久久蜜臀| 九九综合久久中文字幕| 九一屌逼| 亚洲综合小说另类图欧美视频激情小说色五月天 | 中出20p| 看免费的黄片| 青青草吊丝| 97亚洲色图| 天天综合网日韩7799| 大香蕉在线视频15| 69一区二区| 午夜男女爽爽爽在线视频| 欧美一区二区传媒| 超碰免费97| 国产免费一区二区在线A片视频| 二级毛片| 精品中文字幕一区二区l - 百度| 五月天伊人| 香蕉人欧美综合| 综合网欧美在线| 老熟女阿 国产91| 日韩av不卡在线观看| 日产中文字幕2020| 夜色综合| 久久9精品视频| 天天综合亚洲综合| 久久午夜伦| 怡红院成人视频| 青青草日韩无码| 美欧色综合| 无码少妇精品一区二区60岁老人| 伊人视频| 一区操逼日比视频| 天堂综合| 播播亚洲小说亚洲| 欧美综合色综合| 国产精品久久久久久 百度| 久久久精| 九九热超碰| 天天综合官网| 97中文超碰| 影音先锋每日最新资源在线观看| 日韩熟女精品无码专区一区二区| 26uuu久久| 天天天乱色综合全| 在线可观看的黄色网址| 国产夫妻性生活视频| 乱老女人一区二区视频| 91无码精品| 欧美日韩黄色片一区二区三区四区人与兽做爱| 麻豆国产97在线| 五月天色电影| 乱伦av.com| 日韩人妻精品中文字幕| 91干熟女| 久久春色| 日本一天色道久久久精品视频| 色色色日本| 秋霞鲁丝午夜无码一区二区三| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 天天操天天舔| 国产精品欧美在线观看| AND人妻系列| 久久精品国产72国产精品福利| 99re99在线视频| 99久久com免费视频′| 人妻偷拍一区二区三区| 国产精品69久久久久久久 | 日本精品九九九| 色九区| 国产精品久久久啊| 久草资源欧美在线视频| 台湾成人无码AV| 丝袜加勒比| 日本 免费 一区二区三区 久久香蕉| 日韩无码a片| 久久久久久性爱免费视频| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 偷拍欧美激情| 久久精品三级影视| 韩国免费播放一级毛片| 熟女熟妇伦久久影院毛片一区二区| 激情六月天| 加勒比久久综合网高清| 国产无码成人无码| 亚洲另类色综合网站| 澳门人妻久久| 长长久久88视频| 欧美不卡二区| 黑人娇小av在线播放| 日本三级韩国三级美三级91| 日日干日日操五月天伦理视频| 日韩一级免费性爱| 日韩成人在线性爱视频| 69一区二区三区| 四虎精品永久在线观看| 久9久精品视频| 小草三级久久观看| 国产成人+综合亚洲+天堂| 51一区二区三区| 人妻9117c| 狠狠爱大香蕉| 日韩综合第八区国产精品| 天天综合网1| 欧美日韩人人精品| 色婷婷在线视频| 怡红院一区二区熟女人妻| 亚洲无码?第一页| 久久草草亚洲蜜桃臀| 亚洲欧美在线丝袜| 久草综合网| 91美女精品| 日韩欧美蜜桃精品久久中文字幕久久| 69人妻精品丰满熟女区| 18一区二区三区| 精品人妻1237| 99自拍B亚洲 | 97国产精品一区| a啊啊啊啊啊啊啊啊一区二区| 久久一区二区加油站| a人欧美综合天堂麻豆| 国产a级精品| 1区2区3区中文字幕日韩| 78综合网| 91在线美女| 青青操97| 99青青草国产视频| 久久超碰98| 北条麻妃性愛视频| 操啊国产| 国产精品一区av在线| 国产精品无码久久久久2025| 热久久国产| 亚洲精品一区二区三区在线播放| 久久亚洲AV无码专区国产精品| 美女视频尤物网在线看| 天天草夜夜草高潮片| 亚洲高清无码在线桃色| 国产成人精品日本视频| 一区二区三区激情在线观看| 一区三区啪啪| 久久久久精| 爱欲AV| 黄资源| 爱爱动态试试看6 0秒| 久久久男人的天堂| 91精品少妇搡搡搡| 噜噜瑟| 91色综合| 中文字幕一区二区三区字幕| 国产日韩在线播放av| 亚洲蜜乳av| 国内外色色色色色成人视频| 99热亚洲天堂| 精品国产一区二区三区久久久蜜臀 | 五月婷婷六月色| 亚洲天堂第一页| 色悠久久久av| 大香蕉中文201| 亚洲**2021在线观看| 无码聚合| 国产人妻精品久久久一区二区三区 | 色色色999| 久久综合久久综合人久久夜精品| 久久久∴| 射久久| 精品成人无码| 亚洲无码色| 天堂亚洲精品久久老牛| 久久春色| 中文字幕日韩人妻视频一区二区三区| 狠狠操综合| 天堂伊人久久| 中文字幕制服诱惑| 国产精品麻豆视频网站| 成人午夜无码视频| 国产偷仑| 国产精品熟女一区二区三区| 天天操天天干一区二区 | 99久久久99久久91熟女| 欧美伦乱爱| 久久超碰网| 在线精品福利免费播放| 久插不卡| 天天欧美| 中文字幕一区电影在线观看| 日韩中文字幕二区| 粉嫩久久久久| 久久成年片色大黄全免费网站| 首页中文字幕中文字幕免费| 操B久久| 91另类| 中字乱伦AV| 国产亚洲日本| 久久性爱精品一区| 大稥蕉免费视频这里只有精品| 久湿久久 | 一区二区三区黄片免费观看| 九色 人妻 大香蕉| 午夜精品久久久久久久久久久久久| 亚欧成人综合影院| 人妻精品一区二区全免费| 91精品人妻一品二品三品| 亚洲熟女中文字幕在线| 超碰天天操你比| 波多野结衣之双飞调教在线播放| 欧美极品女人的天堂| 久久久啊啊啊| 亚洲女毛多水多21P| 97爱欧美| 思思视频免费看网站| 青青草原人妻| 亚洲人妻久久| 岛国小电影| 男人天堂网站| 久久欧美按摩999| 性夜影院爽黄A爽免费动漫| 亚洲精品亚洲人成人网| 少妇蹲下买菜露大唇0| 亚洲欧洲精品视频发布| 高清不卡 中文 人妻| 亚洲蜜乳av| 新精精品久久精品| 强奸乱伦动态污图免费 | 国产后入内射| 性爱1区| 久久精品日韩专区免费观看| 丁香五月综合| 91狠狠综合久久| 婷婷五月天激情小说| 青青草一区二区高清无码视频 | 色情婷婷久久五月天| 97人妻免费中文字幕| 色拍偷亚洲| 婷婷久热| 日韩有码专区| 亚洲有码 欧美精品| 射久久| 精品一区二区三区最新| 黄色免费网| oumeizonghese,www| 人人操人人摸人 | 欧美v亚洲v日韩v最新在线二区| 精品女同一区| 九九天堂| 人人操人人操人人人操| 97jingpin| 国产精品成人福利在线| 欧美碰碰综合色| 1区2区3区在线视频| www.99色| 蜜桃臀av一区二区| 超碰日本97美女人妻人人玩人人爱 | 熟女熟妇一区二区三四区 | 国产风韵犹存熟妇三区| 五月激情综合网| 免费一级a毛片久久久久久鸭绿欲| 亚洲图片在线| 色欧美天天| 操逼啊啊啊91| 国产精品久久久久久久久久久久久久吹| 玖玖97综合 | 天天舔九色婷婷| 六十路日本| 亚洲本色精品一区二区久久| 欧美高清在线| 极品色社| 国产精品久久久无码AV网站| 欧美色就是色| 99999精品成人| 偷看洗澡一二三区美女| 亚洲国产精品成人久久蜜臀| 99在线视频播放| 欧美熟爽综合| 欧美视频一区二区在线| 96久久久| 72av视频| 新视频sss国产| 婷婷亚洲中文字幕在线| 精品性爱无码在线播放| 亚洲国产精品V?在线播放| 精品国产乱码久久久影院| 中出789在线视频| 激情开心五月天| 2021久久国产综合精品青草| 欧美操人视频| 欧美日韩久久精品爱爱| 亚洲欧美在线综合| 欧美97在线观看| 欧美成人都市人妻| 美中日韩无码| 日日操丁香五月天| V A在线| 少妇淫妇久久久久久久| 日日玩天天干| 人妻少妇色综合| 精品熟女一区=区三区| 夜夜操二区| 免费毛片在线播放| 小视频玖玖| 九月丁香婷婷色| 人人弄人人摸| 欧美国产婷婷久久| 欧美日韩制服| 久久婷婷苹果| 青青草日韩免费观看高清在线| 99RE在线视频精品,这里只有精品| 国产刺激视频| 色婷婷狠狠| 人妻少妇色综合| 蜜桃无码AV一区二区| 日本性爱网址| 丁香婷婷九月| 男人的天堂一区三区| 97色伦97色伦国产欧美| 秋霞操逼片| 欧美成人免费在线观看| 性欧美| 亚洲精品欧洲色| 91丝袜人妻| 亚洲欧美校园| 91久| 97这里有精品| 放黄片放3级黄片没穿衣服| 黄页av| 热99这里有精品综合久久| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 竹菊影视国产一区二区| 人妻-91porn| 久久久久国产无av| 99无码视频| 啪啪91| 91九色丨国产丨爆乳| 在线天堂999| 狠色婷婷久久一区二区三区_| 97一区二区三区视频| 刺激性视频黄页| 97色妞| 久久精品中文字幕女同| 综合色欧美| 日韩有码专区| 国产粉嫩蜜臀av一区二区三区| 中国AV美女| 美女操逼福利视频| 欧美日韩操逼嗦吊| 日韩国产品视频中文字| 欧美一二在线| 狠狠操狠狠燥| 91亚洲网| 男女性感激情网站| 香蕉综合网| 国产精品小视频一区二区三区| 亚洲影院小综合| 日日干夜夜欢| 亚洲丝袜少妇在线| 99久久久久久亚洲精品不卡| 夜色AV无码手机在线影院| 天天日少妇逼AV| 成人A片男人的天堂| 国产99999久久精品| AV色女综合| 久久精品久久九九精品| 亚洲欧美精品福利在线| 亚洲国产欧美日韩人妻日中文| 日本一久是| 亚洲丝袜诱惑| 欧美日韩性爱无码| 插入综合网| 美女毛片999| 国内伊人久久久久久网站视频| 欧美特大AA级黄片| 精品久久久亚洲AV成人网站| 色婷婷综合久久中文字幕雪峰| 亚州国产成人精品女人久久| 欧美天天干| 一级特黄aaa大片在线观看成人一级片在线观看 | 一区二区三区亚洲| 九九热免费视频| 欧美亚洲se91| 69视频入口| 香蕉综合网| 日韩国产九九精品一区二区三区毛片| 蜜臀久久99精品久久久久久无删减 | 9+1视频网址| 青青三级视频| 婷婷操视频| 国模精品一区二区三区苹果色戒| 怡春苑东京热| 97欧美在线| 激情综合五| 天天操天天7| 男女啪啪啪18禁网站| 99性爱| 久久九九精品一区二区| 亚洲第一狼人丝袜美女另类| 少妇高潮99p| 91熟女视频网| 欧美性爱一级操| 熟女天天干| 欧美特大AA级黄片| 久久人妻丝袜一区二区三| 91女优在线观看| 99在线啪| 狠日操| 99re这里| 国产精品第一区第一页| 夜夜一区二区| 91狠狠综合网| 国产精品色| 久久久久久久| 日本久久99| 亚洲人精品久久久| 国产18精品亚洲精品| 成人熟女区| 蜜乳AV一区| 我中文字幕6区| 国产操操日韩三级黄| 久草热制服丝袜在线观看| 中文字幕精品免费一区二区| 日韩精品人妻系列无码天堂| 天天综合网日韩| 老熟女区| 超清福利精品视频在线| 蜜臀精品1区2区| 黄色香蕉视频网站一区| 91精品人妻一区二区三区蜜桃臀| 中日韩一区二区三区欧美| 天堂蜜桃无码视频一区二区| 日韩十八禁| 亚洲情色五月天| 少妇久久久久久| 精品人妻二区三区| 日韩人妻丝袜中文字幕| www.97在线| 超碰精品日韩欧美国产| 欧日韩在线观看| 男女真人网18| 东方亚洲在线操逼天堂| 女人高潮抽搐喷水视频网站| 蜜臀99久久精品| 嗯啊不要在线| 香港澳门日本三级网站| 久久熟女久| 99精品成人免费看| 色亚州人久干视频在线观看免费版| 国产a级午夜毛片| 欧美日韩色| 嗯嗯,好大,好爽,好骚| 久操网视频| 免费在线视频97| 中文字幕视频2区| 亚欧无码线免费观看视频| 综合网久久| 亚洲砖码砖专无区2023| 天美传媒婬乱| 青青草啪啪网| 色婷婷综合网| 欧美一二三级精品在线| 天美久久久久| 亚洲图片欧美91N| 日本操逼视频导航| 97综合激情| 躁躁日曰躁2020| 九九色色| 国产亚洲精品无码三区| 亚洲av资源| 一区| 欧美|91色综合| 久久亚洲AV无码专区首页| 大香蕉中文在线| 久久久久网站-538在线视频-欧美永久乱码 | 一区二区三区免费视频入口| 97爱碰| 九九综合久久| av无码av无码专区| 69一区二区三区| 精品人妻一区二区蜜桃视频| 九九热免费国产视频婷婷伊人五月 | 久久草在线综合视频| 强上我不卡卡| 99re这里只有精品2| av在线一区二区三区| 丝袜夫妻自拍| 久艹日日日| 伊人成人中文字幕久久网| 四季av一区二区凹凸精品小说| 五月婷婷六月丁香网址| 97精品网| 亚洲人妻一区二区三区| 亚洲欧美清纯| 婷婷五月成人| 亚洲图片第一页| 97爱免费插| 国产呦精品系列在线观看| 91九久| 日本操逼aaaaa| 97一本大道亚洲一区| www亚洲免费| 大肉棒导航| 亚洲综合中文字幕有码| 少妇蹲下买菜露大唇0| 婷婷久月| 秋霞一级鲁丝片A片| 亚洲欧洲精品成人| 国产真实野战在线视频| 久久精品日韩专区免费观看| 久久久久9999| 久草在线| 精品久操| 99自拍B亚洲| 最新国产亚洲精品精品国产亚洲综合| 中国和日本人色哪个不下载能放| 久久98| 在线视频免费播放一区| 国产精品国产精品国产| 伊人伊人LD| 91久久久久久久久18| 超碰国产精品无码| 丝袜狂射91| 欧美少妇性乱| 2001天天操| 天天做天天爽| 国产人妖视频一区在线观看| 一二三四区电影| 欧美日韩国产人人| 抽插爽| 九九久久99| 久久香蕉国产传媒一区剧情天美| 91艹B视频| www.99色| 欧美A片中文字幕| 亚洲欧美日韩偷拍色图| 久久久啊啊啊| 78操B|