99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

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

Java Swing高仿QQ連連看:雙拐點算法與地圖生成源碼解析

Java Swing高仿QQ連連看:雙拐點算法與地圖生成源碼解析 簡介這份基于Java實現(xiàn)的QQ連連看單機版V1.0高仿設(shè)計源碼面向Java學習者、游戲開發(fā)入門者及需要完整課設(shè)或畢設(shè)案例的開發(fā)者可用于理解經(jīng)典消除類游戲的完整實現(xiàn)流程。資源包共98個文件大小3.98MB包含5個Java核心源碼、64張PNG圖片、13個地圖文件、7個WAV音效及2個MID背景音樂另有界面貼圖、項目配置與說明文檔覆蓋從游戲邏輯、界面渲染到資源管理的各環(huán)節(jié)。已有402人學習/下載。通過項目目錄可清晰看到src代碼、resource資源、out編譯輸出及說明文檔的分層組織方式地圖與音效獨立配置便于二次開發(fā)適合作為模仿QQ連連看玩法、練習Java Swing界面與事件處理、學習資源集成的實戰(zhàn)參考。項目還包含Kotlin模塊定義文件可觀察到Java項目中的跨語言配置方式readme與地圖文件組合也為關(guān)卡編輯和規(guī)則設(shè)計提供了直觀樣例。1. 為什么一個高仿QQ連連看的Java單機版至今還是練手源碼里的優(yōu)選項目基于Java實現(xiàn)的QQ連連看單機版V1.0高仿設(shè)計源碼聽起來像十年前的課程設(shè)計存貨但真去復刻一遍你就會發(fā)現(xiàn)它把地圖生成、可解性校驗、雙拐點尋路、Swing線程模型、序列化存檔五個完整模塊壓進了一個“小游戲”的殼里。很多Java學習者抱著“這有什么難的”心態(tài)打開源碼結(jié)果不是死在死局判定上就是被圖片資源路徑整得懷疑人生。這個項目適合三類人要交Java課程設(shè)計又不想做管理系統(tǒng)的人、面試前想把Swing和基礎(chǔ)算法撿起來的人、想搞懂“一個單機游戲從代碼到可雙擊jar包”全流程的人。高仿的價值不在畫面有多像而在于它逼著你把規(guī)則、界面、數(shù)據(jù)、資源分開設(shè)計恰好是工作中最需要的那套習慣。2. 高仿QQ連連看的玩法內(nèi)核地圖生成、消除規(guī)則與雙拐點連通算法2.1 先談規(guī)則QQ連連看里的“能連”到底指什么連連看的消除規(guī)則用一句話說兩個相同圖塊之間存在一條不經(jīng)過其他圖塊的路徑且路徑的拐彎次數(shù)不超過2次。這個定義看著簡單但落地時有一個最容易漏掉的關(guān)鍵點——路徑可以走出棋盤邊界再繞回來。原始版本里棋盤四周是封閉的但經(jīng)典QQ連連看允許路徑經(jīng)由棋盤外的“空白地帶”繞行所以很多第一次寫的人會在邊界判斷上翻車。規(guī)則判斷的順序也有講究。我一般按“先直線、再一拐、再兩拐”的順序做短路判斷直線不檢查拐點一拐只需要檢查兩個候選點兩拐才需要遍歷整行整列。這道題還在Java面試題里換個馬甲出現(xiàn)過本質(zhì)是考察你有沒有把二維數(shù)組的遍歷和剪枝想清楚。圖塊從左上角到右下角的坐標換算、為邊界外擴一圈的padding技巧都是靠這個小項目刻進肌肉記憶的。2.2 地圖生成配對洗牌與可解性校驗地圖生成不是“隨機往格子里丟圖塊”這么簡單。常見做法是先把圖塊按對兒準備好保證每種圖塊數(shù)量是偶數(shù)然后洗牌填入棋盤。但這里有個隱藏的大坑純隨機洗牌會產(chǎn)生死局——明明還有大量圖塊卻沒有任何一對能在兩次拐彎內(nèi)連通。高仿版本如果開局就死局玩家第一反應就是“這游戲是壞的”。所以生成后必須做可解性校驗跑一次全圖掃描找不到任何一對可連通圖塊就重排。我先給出最基礎(chǔ)的生成器實現(xiàn)注意里面三處關(guān)鍵參數(shù)。public class MapGenerator { private final int rows; // 棋盤行數(shù) private final int cols; // 棋盤列數(shù) private final int kinds; // 圖塊種類數(shù) private final Random random new Random(); public MapGenerator(int rows, int cols, int kinds) { this.rows rows; this.cols cols; this.kinds kinds; } public int[][] create() { if ((rows * cols) % 2 ! 0) { throw new IllegalArgumentException(rows * cols 必須是偶數(shù)); } int total rows * cols; int[] pool new int[total]; // 每種圖塊出現(xiàn)次數(shù)必須成對否則永遠消不完 for (int i 0; i total / 2; i) { int type i % kinds 1; pool[2 * i] type; pool[2 * i 1] type; } int[][] grid new int[rows][cols]; for (int attempt 0; attempt 50; attempt) { shuffle(pool, random); // Fisher-Yates 洗牌 fill(grid, pool); if (hasAnyMove(grid)) { // 全圖掃描剪枝在 PathFinder 里做 return grid; } } return grid; // 兜底外部發(fā)現(xiàn)無解后重新開一局 } private void shuffle(int[] arr, Random r) { for (int i arr.length - 1; i 0; i--) { int j r.nextInt(i 1); int tmp arr[i]; arr[i] arr[j]; arr[j] tmp; } } private void fill(int[][] grid, int[] pool) { int idx 0; for (int r 0; r rows; r) { for (int c 0; c cols; c) { grid[r][c] pool[idx]; } } } private boolean hasAnyMove(int[][] grid) { for (int r1 0; r1 rows; r1) { for (int c1 0; c1 cols; c1) { if (grid[r1][c1] 0) continue; for (int r2 r1; r2 rows; r2) { for (int c2 (r2 r1 ? c1 1 : 0); c2 cols; c2) { if (grid[r2][c2] 0 || grid[r1][c1] ! grid[r2][c2]) continue; if (PathFinder.findPath(grid, r1, c1, r2, c2) ! null) { return true; } } } } } return false; } }這里rows和cols的乘積必須是偶數(shù)否則圖塊配對數(shù)量對不上。kinds參數(shù)決定圖塊種類常見配置是8×10棋盤、5到6種圖塊圖塊太少畫面單調(diào)太多會導致相鄰同型概率下降、難度失控。洗牌用Fisher-Yates注意遍歷方向是從后往前每次交換下標是“當前下標隨機余數(shù)”寫反了會引入不均勻分布。hasAnyMove里用PathFinder做全圖掃描最壞情況是O(n^4)但50次嘗試以內(nèi)通常一次就能通過實際跑起來感知不到耗時。可解性校驗的另一個實用策略是“預留可消除對”。生成棋盤后故意保留至少一對相鄰同類型圖塊保證玩家第一步必定有棋可走。這個小技巧對新手體驗很友好高仿版本里值得加上。2.3 轉(zhuǎn)彎數(shù)不超過2雙拐點查找思路與可用實現(xiàn)雙拐點查找是連連看算法題的核心也是面試里最常被追問的部分。我習慣把棋盤外擴一圈再尋路也就是內(nèi)部維護一個(rows2)×(cols2)的數(shù)組最外圈全部置0。這樣所有越界情況都變成“空白格”直線判斷、拐點判斷不需要寫任何邊界條件代碼干凈很多。下面給出完整尋路實現(xiàn)。public class PathFinder { private final int[][] data; // 外擴一圈后的網(wǎng)格0 表示空白 private final int rows, cols; public PathFinder(int[][] grid) { this.data grid; this.rows grid.length; this.cols grid[0].length; } /** 返回路徑拐點序列null 表示不通 */ public Listint[] findPath(int sr, int sc, int er, int ec) { if (data[sr][sc] 0 || data[sr][sc] ! data[er][ec]) return null; // 0 拐同行或同列直線 if (lineClear(sr, sc, er, ec)) { return route(new int[][]{{sr, sc}, {er, ec}}); } // 1 拐拐點只可能是矩形對角線的另外兩個角 int[][] corners {{sr, ec}, {er, sc}}; for (int[] p : corners) { if (data[p[0]][p[1]] 0 lineClear(sr, sc, p[0], p[1]) lineClear(p[0], p[1], er, ec)) { return route(new int[][]{{sr, sc}, p, {er, ec}}); } } // 2 拐先沿起點豎線走到某一行再橫向走到終點所在行再豎線進入終點 for (int r 0; r rows; r) { if (r sr || r er) continue; if (data[r][sc] 0 data[r][ec] 0 lineClear(sr, sc, r, sc) lineClear(r, sc, r, ec) lineClear(r, ec, er, ec)) { return route(new int[][]{{sr, sc}, {r, sc}, {r, ec}, {er, ec}}); } } // 2 拐對稱邏輯先橫向走到某一列再縱向最后橫向進入終點 for (int c 0; c cols; c) { if (c sc || c ec) continue; if (data[sr][c] 0 data[er][c] 0 lineClear(sr, sc, sr, c) lineClear(sr, c, er, c) lineClear(er, c, er, ec)) { return route(new int[][]{{sr, sc}, {sr, c}, {er, c}, {er, ec}}); } } return null; } private boolean lineClear(int r1, int c1, int r2, int c2) { if (r1 r2) { int minC Math.min(c1, c2), maxC Math.max(c1, c2); for (int c minC 1; c maxC; c) { if (data[r1][c] ! 0) return false; } return true; } if (c1 c2) { int minR Math.min(r1, r2), maxR Math.max(r1, r2); for (int r minR 1; r maxR; r) { if (data[r][c1] ! 0) return false; } return true; } return false; } private Listint[] route(int[][] points) { return new ArrayList(Arrays.asList(points)); } }findPath返回的List里保存的是拐點坐標序列畫提示線、播放消除動畫都靠它。注意第二次遍歷的剪枝兩個拐點的中間點必須是空格所以data[r][sc]和data[r][ec]都要為0這能省掉大量無效直線判斷。lineClear是純直線障礙檢查起點和終點本身有值不影響因為它只檢查中間格。循環(huán)里跳過r sr和r er是為了不把路徑繞回起點或穿越終點所在行列否則可能出現(xiàn)“原地拐彎”的假路徑。這套實現(xiàn)還有一個隱藏優(yōu)勢外擴一圈后棋盤外的任何位置都天然可達完美還原QQ連連看里的繞邊路徑。代價是內(nèi)存多出一圈但對單機版來說可以忽略。如果后續(xù)要做“自動提示”功能直接復用findPath做全圖掃描即可不需要單獨維護一套尋路邏輯。3. 用Java Swing復刻棋盤與交互類結(jié)構(gòu)、事件調(diào)度與高仿畫面3.1 類劃分把游戲引擎與界面分開替答辯和二次開發(fā)留后路很多課程設(shè)計源碼最大的問題就是“游戲規(guī)則寫在按鈕監(jiān)聽器里”一個類一千多行改個棋盤參數(shù)都心驚膽戰(zhàn)。我建議按這套分層來拆這也是java課程設(shè)計案例里老師最認可的結(jié)構(gòu)。類名職責關(guān)鍵成員Main程序入口負責啟動界面main()GameFrame主窗口持有菜單、狀態(tài)欄和面板JFrame, BorderLayoutGamePanel棋盤繪制與鼠標事件paintComponent, MouseListenerGameData游戲狀態(tài)模型存圖塊值和分數(shù)int[][] grid, score, remainGameEngine消除判斷、得分計算、重排邏輯PathFinder, MapGeneratorPathFinder連通性判斷與路徑計算findPath()AudioPlayer音效與背景音樂播放Clip, AudioSystem拆分的核心原則是GameData和PathFinder不依賴任何Swing類可以單獨寫單元測試。我在實際項目里就是這樣做的——先把規(guī)則層用純Java寫完并跑通再花一個晚上接界面出問題的概率小很多。答辯時老師問“你怎么保證算法正確”你直接說“規(guī)則層不依賴界面寫了JUnit測試”比任何解釋都有說服力。界面層要克制GamePanel只做三件事畫棋盤、響應鼠標、把點擊坐標傳給GameEngine然后把結(jié)果畫回去。不要讓GamePanel去管存檔、算分、計時否則類之間的耦合會讓你改一個需求牽一發(fā)動全身。這也是面向?qū)ο缶幊蘪ava里最常被拿出來講的高內(nèi)聚低耦合現(xiàn)場。3.2 自定義繪制棋盤paintComponent、圖片加載與雙緩沖Swing里最穩(wěn)的做法是繼承JPanel重寫paintComponent而不是用JButton擺網(wǎng)格。JButton布局在棋盤變大時會卡頓而且選中態(tài)高亮不好控制。自定義繪制則可以在一個方法里把背景、圖塊、選中框、提示線全部畫出來。核心繪制代碼長這樣。public class GamePanel extends JPanel { private final GameData data; private final Image[] images; // 圖塊圖片下標從 1 開始 private final int cellW 40; // 單格寬 private final int cellH 52; // 單格高QQ連連看圖塊偏豎長 private final int offsetX 20; // 棋盤左邊距 private final int offsetY 20; // 棋盤上邊距 public GamePanel(GameData data) { this.data data; this.images loadImages(); setBackground(new Color(0xE8, 0xE8, 0xFF)); // 淺紫背景接近原版聊天面板色調(diào) addMouseListener(new GameMouseAdapter()); } private Image[] loadImages() { Image[] arr new Image[data.getKindCount() 1]; for (int i 1; i data.getKindCount(); i) { arr[i] new ImageIcon(getClass().getResource(/img/kind_ i .png)).getImage(); } return arr; } Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 先清背景避免殘影 for (int r 1; r data.getRows(); r) { for (int c 1; c data.getCols(); c) { int val data.get(r, c); if (val 0) continue; int x offsetX (c - 1) * cellW; int y offsetY (r - 1) * cellH; if (data.isSelected(r, c)) { g.setColor(new Color(0xFF, 0x60, 0x00)); g.drawRect(x - 2, y - 2, cellW 3, cellH 3); } g.drawImage(images[val], x, y, cellW, cellH, this); } } } }loadImages里用的是getResource而不是new File這是jar包能正常顯示圖片的關(guān)鍵。類路徑資源在IDEA和命令行下表現(xiàn)不一致getResource采用的是classpath規(guī)則打完jar后仍然有效。cellW和cellH要跟圖片原始寬高比匹配否則會出現(xiàn)拉伸變形高仿細節(jié)全靠這里。setBackground的顏色我選的是淺紫因為原版聊天主題是紫色系這個參數(shù)玩家感知很強。雙緩沖問題在Swing里默認是開啟的但如果你重寫paint而不是paintComponent或者沒有調(diào)用super.paintComponent就會出現(xiàn)閃爍和殘影。裁判方法只有一個最小化窗口再還原如果棋盤留下白色矩形或舊圖塊痕跡說明繪制路徑不對。消除動畫期間不要直接改data里的值再整塊重繪而是用一份“動畫層”疊加繪制。3.3 鼠標拾取與消除判定一次點擊事件里發(fā)生了什么鼠標事件是連連看交互的核心鏈路我把一次點擊的完整流程拆成五步換算坐標、判斷圖塊、處理選中/取消、嘗試消除、重繪。這里最容易出錯的是動畫期間沒有鎖定輸入玩家連點鼠標導致重入異常。我用一個volatile boolean字段做互斥動畫播放期間直接忽略點擊。public class GameMouseAdapter extends MouseAdapter { private int[] selected null; // 當前選中的圖塊坐標 {r, c} Override public void mousePressed(MouseEvent e) { if (engine.isAnimating()) return; // 動畫期間忽略點擊 int r (e.getY() - offsetY) / cellH 1; int c (e.getX() - offsetX) / cellW 1; if (!data.inBound(r, c)) return; int val data.get(r, c); if (val 0) return; // 點到已消除的空格 if (selected null) { selected new int[]{r, c}; data.setSelected(r, c, true); } else if (selected[0] r selected[1] c) { data.setSelected(r, c, false); // 再次點擊同一個塊取消選中 selected null; } else { Listint[] path PathFinder.findPath(data.getGrid(), selected[0], selected[1], r, c); if (path ! null) { data.removeAt(selected[0], selected[1]); data.removeAt(r, c); data.setSelected(selected[0], selected[1], false); engine.playEliminateAnimation(path); // 動畫結(jié)束后統(tǒng)一 repaint selected null; } else { data.setSelected(selected[0], selected[1], false); selected new int[]{r, c}; data.setSelected(r, c, true); } } repaint(); } }坐標換算的公式是“像素偏移量減掉棋盤邊距再除以單格尺寸”注意整型除法截斷。如果棋盤有邊框圖片offsetX和offsetY要對齊邊框內(nèi)側(cè)否則點擊越準確越難受。選中高亮我用的是drawRect畫一個橙色框真正的QQ連連看選中態(tài)是圖塊微微放大加光暈高仿版本里可以用drawImage縮放來實現(xiàn)代價是每幀都要重繪選中格性能稍降但視覺效果提升明顯。連線提示是另一個加分項消除成功時畫一條經(jīng)過所有拐點的折線顏色用半透明黃即可。這條線畫在動畫層動畫播完就清除不污染棋盤數(shù)據(jù)。注意Swing的繪制都在事件調(diào)度線程EDT不要在mousePressed里做耗時循環(huán)否則界面會“假死”這就是為什么findPath在幾十毫秒內(nèi)必須返回的原因。4. 單機版的關(guān)卡、存檔與音效讓V1.0具備完整交付感4.1 關(guān)卡參數(shù)與進度保存為什么我不用Java序列化而用XML單機版V1.0如果只有無盡模式玩家半小時就膩了。關(guān)卡系統(tǒng)的關(guān)鍵變量就五個行數(shù)、列數(shù)、種類數(shù)、限定時間、目標分。把這些參數(shù)化之后關(guān)卡只是不同的數(shù)值組合代碼一行都不用改。關(guān)卡參數(shù)表長這樣。關(guān)卡行數(shù)列數(shù)種類數(shù)限時(秒)目標分第1關(guān)66360300第2關(guān)88490500第3關(guān)8105120800第4關(guān)101061501000第5關(guān)101271801500種類數(shù)控制在3到7之間太少了視覺上全是相鄰同色太多了找對兒全靠運氣玄學難度會讓玩家覺得游戲不公平。存檔方案我強烈建議放棄Java原生序列化。ObjectOutputStream寫起來簡單但類一改字段舊存檔直接EOFException后悔藥都沒得吃。XML的好處是可讀、可手工修改、跨版本容錯。用java.beans.XMLEncoder做存檔代碼量不大效果比手寫XML解析器省事得多。public class Progress { private int level; private int score; private long timestamp; public Progress() {} // XMLEncoder 要求無參構(gòu)造器 // getter/setter 省略必須全寫 } public class SaveManager { public static void save(File file, Progress p) throws IOException { try (FileOutputStream fos new FileOutputStream(file)) { XMLEncoder encoder new XMLEncoder(fos); encoder.writeObject(p); encoder.close(); } } public static Progress load(File file) throws IOException { try (FileInputStream fis new FileInputStream(file)) { XMLDecoder decoder new XMLDecoder(fis); Progress p (Progress) decoder.readObject(); decoder.close(); return p; } } }XMLEncoder的硬性要求是目標類必須有公開無參構(gòu)造器并且所有需要保存的字段都有g(shù)etter/setter。它還要求不能有內(nèi)部類和lambda字段否則序列化會拋異常。除了玩家進度棋盤當前狀態(tài)也值得存檔這類“中途退出接著玩”的功能在單機版里很加好感。做法是把int[][]和剩余時間包進一個SaveData類整體序列化一次。加載存檔時要注意版本兼容我給存檔字段都加了默認值比如關(guān)卡默認1、分數(shù)默認0這樣舊檔缺字段也不會崩潰頂多多送玩家?guī)装俜植粫屚婕襾G進度。4.2 音效與背景音樂wav Clip 是最省心的單機方案Swing項目里做音效最省心的組合是javax.sound.sampled的Clip接口配wav文件。mp3需要引入第三方解析庫ogg格式兼容性更差而wav是Java原生支持里最穩(wěn)的。Clip適合播放短音效和循環(huán)BGM它一次性把音頻數(shù)據(jù)加載進內(nèi)存循環(huán)無縫不像SourceDataLine那樣要自己寫流。public class AudioPlayer { private Clip bgmClip; public void playLoop(String resourcePath) { try { if (bgmClip ! null bgmClip.isRunning()) { return; // 防止重復播放疊加 } AudioInputStream in AudioSystem.getAudioInputStream( getClass().getResourceAsStream(resourcePath)); bgmClip AudioSystem.getClip(); bgmClip.open(in); bgmClip.loop(Clip.LOOP_CONTINUOUSLY); } catch (Exception e) { System.err.println(BGM 加載失敗 e.getMessage()); } } public void playOnce(String resourcePath) { try { AudioInputStream in AudioSystem.getAudioInputStream( getClass().getResourceAsStream(resourcePath)); Clip clip AudioSystem.getClip(); clip.open(in); clip.start(); // 播放結(jié)束后無需手動 closeGC 會處理 } catch (Exception e) { System.err.println(音效播放失敗 e.getMessage()); } } }音頻格式的參數(shù)坑最值得提前說明Clip對采樣率不挑但轉(zhuǎn)換后的AudioInputStream可能是8位單聲道也可能保持原始16位立體聲。消除音效建議用短促的8位單聲道wav文件小、加載快、播放不卡BGM建議用44.1kHz采樣率的wav音質(zhì)能接受且不會在高仿界面里顯得廉價。還有一個容易忽略的點Clip對象數(shù)量不能無限增長。playOnce每次new一個Clip如果玩家快速連續(xù)消除幾十對會在同一時刻打開多個Clip系統(tǒng)音頻設(shè)備會出現(xiàn)打不開的IllegalStateException。解決方法是復用固定線程池或限制同時播放的Clip數(shù)量不超過4個。單機版里我用的方案是音效播放器內(nèi)部維護一個Clip數(shù)組做輪詢覆蓋新音效覆蓋最舊的那個效果最穩(wěn)定。4.3 界面“高仿”的最后一步布局、配色與重置邏輯高仿QQ連連看最直觀的就是配色和布局。頂部是一個計分面板顯示分數(shù)、剩余對數(shù)、當前關(guān)卡和計時器底部是“開始”“重排”“提示”“退出”四個按鈕。我建議主窗口用BorderLayout北邊放計分面板南邊放按鈕欄中心放棋盤。這樣窗口拉伸時棋盤可以跟隨變大不會出現(xiàn)按鈕擠壓棋盤的尷尬。重排功能要跟地圖生成器配合。玩家點擊“重排”棋盤內(nèi)剩余圖塊重新洗牌同時保證重排后可解。有一個細節(jié)很多源碼都不處理重排后如果還是死局要再次洗牌最多重試幾次再放棄。計時器用javax.swing.Timer而不是Thread.sleep因為Timer在EDT上觸發(fā)更新標簽不會觸發(fā)線程安全問題。每秒扣分或限時結(jié)束的邏輯都應該放在這個Timer的actionPerformed里而不是另起線程。高仿界面的最后一塊拼圖是窗口圖標和標題欄。用Toolkit.getDefaultToolkit().getImage加載一個16x16的圖標setTitle寫上“QQ連連看 單機版V1.0”窗口默認大小按棋盤尺寸加邊距計算居中顯示。這些細節(jié)不費多少代碼但決定了一個源碼是“能跑”還是“像回事”。5. 連連看單機版源碼落地避坑最容易翻車的5個現(xiàn)場記錄5.1 圖片全部不顯示控制臺報空指針現(xiàn)象在IDE里運行一切正常打成jar包后圖塊全部消失控制臺拋NullPointerException。原因代碼里用了new File(src/img/1.png)這類基于工作目錄的相對路徑。IDE運行時工作目錄是項目根目錄文件能找到jar包啟動時工作目錄是用戶雙擊的位置src目錄根本不存在getImage拿到null繪制時自然空指針。解決統(tǒng)一改為類路徑加載。所有圖片資源放在resources目錄或src/main/resources用getClass().getResource(/img/1.png)獲取URL。jar包內(nèi)部的文件路徑以classpath為根不再依賴外部目錄。順便復查一遍代碼里所有讀文件的IO不只圖片音效、存檔路徑也一樣處理。我的習慣是“凡是打包后要用的資源一律走getResourceAsStream”這樣從IDE到jar包都穩(wěn)定。5.2 死局明明還有大把方塊系統(tǒng)卻說沒有可消除項現(xiàn)象玩家把周圍能消的都消干凈后棋盤上還剩幾十個圖塊但全圖掃描找不到任何一對可消除項游戲卡死。原因地圖生成只做了隨機洗牌沒有做可解性校驗。連勝的玩家打到最后只剩殘局洗牌碰巧落入死局組合算法找不到路徑游戲就結(jié)束了。解決生成棋盤時全圖掃描調(diào)用findPath遍歷所有非空圖塊對。只要有一對能連通就通過否則重新洗牌。這里有個關(guān)鍵細節(jié)掃描要用“剩余圖塊”而不是“完整棋盤”因為游戲過程中隨機消除會讓棋盤狀態(tài)完全不同于開局。我在GameEngine里維護了一個“剩余圖塊列表”每次消除后更新。全圖掃描時只遍歷這個列表中的坐標對復雜度可控。另外給掃描次數(shù)加上限比如50次重排都不通過就判定為“本局無解”給玩家彈窗提示并重新開局。死局在數(shù)學上很難徹底避免但有了這個兜底玩家不會再撞上“卡死”體驗。5.3 能連接卻點不掉數(shù)組下標越界與1基0基混用現(xiàn)象兩個圖塊看起來明明能連點擊后卻沒有反應偶爾控制臺報ArrayIndexOutOfBoundsException。原因棋盤坐標在幾個類之間傳遞時有的地方從0開始計數(shù)有的地方從1開始計數(shù)。比如MapGenerator生成的是0基數(shù)組GamePanel坐標換算時又減了1PathFinder訪問時又加了1最終下標錯亂。越界讀到的可能是0碰巧等于空格就把空格當圖塊處理了。解決全項目統(tǒng)一用1基坐標棋盤數(shù)組內(nèi)部用0基存儲唯一允許轉(zhuǎn)換的地方是GamePanel的坐標換算入口。也就是數(shù)據(jù)層用0基業(yè)務層和界面層全用1基中間封裝兩層轉(zhuǎn)換方法不允許在業(yè)務代碼里到處減一加一。更穩(wěn)妥的做法是給PathFinder和GameData的接口都定義成“傳入1基坐標”內(nèi)部再統(tǒng)一減1。這樣就算哪天手滑傳錯錯誤也會集中在一兩個方法里暴露而不是分散在整個項目里變成玄學bug。5.4 消除動畫閃屏、殘影重繪順序與Timer的配合問題現(xiàn)象消除圖塊時畫面閃爍窗口最小化再恢復后出現(xiàn)上一幀的殘影動畫播放期間棋盤會“花”一下。原因Swing默認開了雙緩沖但如果你在paintComponent里沒有先調(diào)用super.paintComponent舊的繪制內(nèi)容不會被清掉殘影就留下了。另一個原因是動畫用Thread.sleep加repaint在EDT上睡線程會阻塞整個界面刷新效果就是卡頓加閃爍。解決paintComponent第一行必須是super.paintComponent(g)把背景色、棋盤底圖都交給父類清理。動畫循環(huán)用javax.swing.Timer驅(qū)動每幀之間讓出EDT控制權(quán)不要用Thread.sleep。這兩點做到后閃爍問題基本消失。還有一個小坑如果棋盤背景色是null窗口透明區(qū)域的默認行為會跟你的預期不一致。給GamePanel一個明確的setBackground顏色等于告訴重繪機制“這塊區(qū)域是我的畫布”殘影會少很多。5.5 存檔打了補丁后讀不出來直接序列化對象圖的代價現(xiàn)象玩家玩到第3關(guān)你更新版本時給GameData加了一個字段結(jié)果他加載舊存檔直接拋EOFException進度全丟。原因ObjectOutputStream寫的是整個對象圖類結(jié)構(gòu)一變反序列化就失敗。字段順序、類型、繼承關(guān)系任何一處變化都會破壞兼容性。這就是Java序列化看著方便卻讓人又愛又恨的地方版本升級后的后悔藥特別難吃。解決存檔改用XMLEncoder方案。XMLEncoder對字段順序不敏感缺失字段會保留默認值多出來的字段會被忽略。我實際測試過在一個存了Progress對象的XML文件里手工刪掉score字段加載后score就是0程序照常跑。這個容錯能力在課程設(shè)計、小版本迭代場景里足夠用。如果項目已經(jīng)用ObjectOutputStream寫了存檔又不想推倒重來可以在SaveData里額外保存一個version字段加載時檢查版本號舊檔走一次字段遷移邏輯新檔直接讀。但這是臨時方案長遠看XML或JSON才是正路。6. 向交付物靠近性能優(yōu)化、打包發(fā)布與自測清單6.1 兩個值得做的性能優(yōu)化第一先做“自動提示”的緩存。玩家的第一反應往往是全圖掃描找可消除對如果每次點擊都把整張棋盤跑一遍findPath地圖增大后會明顯卡頓。我一般維護一個可消除對列表每次消除后只增量更新受影響的行列把掃描從全圖降到局部。第二重排時控制嘗試次數(shù)。MapGenerator里重試50次還無解就直接開啟“清空重開”流程不讓玩家在死局里干等。游戲過程中重排也一樣重試幾次后給按鈕置灰避免連續(xù)點擊造成卡死。6.2 打包成可雙擊運行的jarmvn clean package java -jar target/lianliankan-1.0.jar我用maven-shade-plugin打包把資源目錄一并打進jarmanifest里指定Main-Class。注意pom.xml里resources要顯式聲明包含src/main/resources下的圖片和音頻否則IDEA里正常但打包后資源丟失。java -jar啟動后用Process Explorer觀察是否殘留進程確認窗口能正常關(guān)閉。自測清單是打包前最后一道閘我列在下面供你直接抄。檢查項驗證方法通過標準連通規(guī)則手動構(gòu)造0拐、1拐、2拐路徑各一組三種都能消除2拐以上不能消除繞邊路徑搭一條棋盤外繞行的路徑能正常消除死局兜底故意構(gòu)造死局棋盤觸發(fā)重排或提示不卡死圖片資源從jar包外雙擊運行圖塊全部顯示無空指針存檔兼容刪除score字段后加載進度保留分數(shù)歸零不崩潰動畫鎖輸入快速連點多個圖塊不重復消除、不產(chǎn)生錯亂音效疊加連續(xù)快速消除10對無異常聲音不卡死6.3 我的打包前習慣自己的一個血淚教訓是永遠在打包前手動跑一遍“快速消除10對再存檔、關(guān)窗口、重新打開、繼續(xù)玩”的流程不要只盯著算法測。Swing項目的坑大多出現(xiàn)在事件調(diào)度和資源路徑上而這兩類問題在純邏輯測試里根本暴露不出來。java學習路線里你可能會遇到無數(shù)個項目但能把一個玩具做到可交付、可存檔、可重開比泛泛刷十個小demo有用得多。希望幫到你。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色五月中文字幕| 综合 蜜月 婷婷| 97干婷婷| 5月丁香美女影院| 丁香五月精品| 五月天婷亚洲综合在线嫩草网| 黄桃AV无码免费一区二区三区| 26uuuu精品一区二区| 91九九热| 被男人添B超爽视频| 天天舔天天操| 激情美女五月天激情在线| 青青草99re| 大香蕉伊人99| 久久美女五月天| 免费日韩99| 性爱激情小说AV五月丁香花| 五月丁香久久久| 成人五月天丁香| AV五月丁香| 久久狠狠干| 亚洲蜜桃精久久久久久久久久久久 | 日韩欧美骚货| WWW,五月天| 五月丁香在线| 久久丁香五月婷婷| 日韩一级片| 99热这里只有精品在线观看| 人妻VideOssS人妻| 五月婷婷精品视频| 成人婷婷深爱综合网| 野外99热| 色综合中文综合网| 婷婷色中文字幕| 欧美激情五月| 久久婷婷丁香五月一二三| 国产精品岛国片在线观看免费| 337p大胆噜噜噜噜噜91Av| 五月天综合视频| 插插网爽妇五月丁香| 激情图片婷婷| 91超碰在线观看| 少妇熟女视频一区二区三区| 丁香五月天社区| 亚洲操人| 色色色色色网| 国产精品99久久久久久久女警| 五月天综合网| 9有码中文| 婷婷狠狠干| 婷婷五月天激情综合网| 久久99性爱| 色欲丁香久久| 99热精品9| 免費亭亭成人| 五月丁香六月综合激情网| 79精品在线视频| 色色色欧美| 超碰免费大香蕉| 日韩精品一区二区刘| 超碰cap| 国产精品成人AV在线观看春天| 九九热这里只有精品6| 久草热视频在线观看| 午夜一区| 国产又爽又猛又粗的视频A片| 婷婷五月花| 老司机伊人| 婷婷五月天激情小说| 国产精品日日躁夜夜躁| 欧美成人精品A片免费一区99| 婷婷五月色| 91人妻人人做人碰人人爽九色| 久久色五月天| 色色丁香| 在线综合91| 色射7856五月天激情四射| 91人人看| 五月天社区| 九月激情网| 色五月婷婷久久| 激情五月丁香婷婷夜夜操| 玖玖在线视频福利| 99热99热不卡| 91操人视频| 狠狠狠狠狠狠| 丁香婷婷五月人体| ay2区| 999热在线观看视频| 91丁香色五月| 激情综合网五月天天| 色婷婷欧美在线| 丁香婷婷五月基地| 亚洲男女激情| 六月大香蕉| 噜噜色天天开心| 无码一区二区三区四区五区| 五月婷婷久久激情 | 极品五月天| 婷婷五月综合网激情| 婷婷精品在线| 色五月婷激情| 99热免| 天天插插天天| 天天综合天天玩夜夜玩天天玩夜夜玩 | 五月婷婷中文| 大胆伊人久久| 九九热九九| 99r这里| 五月激情网站| 九九色情网五月天| 五月丁香在线视频观看| 精品人妻伦一二三区久| 99热 精品在线| 亚洲爱婷婷| 思思99热这里只有精品| 婷婷五月天视频免费在线观看| 91狠狠色丁香婷婷综合久久| 91疯狂操操操操| 婷婷射图| 婷婷操超碰| 中文字幕日产A片在线看| 91免费试看| 五月丁婷香| 色婷婷婷婷五月天| 伊人激情综合| 五月色婷婷亚洲| 天天爽天天摸天天爱| 丁香六月综合激情| 99成人网一区| 五月天婷婷黄色视频| 色婷婷综合网站| 99九九精品| 婷婷中文字幕| 色色色色区| 亚洲啪啪自拍| 婷婷六月激情丁香| 99视频在线精品| 丁香香蕉婷婷| 欧美激情五月综合| 激情小说五月天| 国产伦亲子伦亲子视频观看| 这里只有精品日韩精品| 亚洲乱码日产精品BD| 久久伊人大香蕉| 久久九九re热| 可以看的AV| xx色综合| 五月丁香啪综合| 丁香深五月婷婷| 婷婷五六日| 丁香五月综合| 一区视频网站| 99久久极情精品一区| 久久99这里| 超碰人人艹| 亚洲啪啪网| 五月丁香另类图片| 日韩欧美成人片| 日韩一区二区在线播放| 丁香网站| 艾小青av| 9久热在线精品| 五月天狠狠干| 久久久五月天婷婷成人网| 99视频这里只有久久精品| 成人精品视频99在线观看免费| 操一区| 色五月婷婷91| 开心丁五月| 思思久久99| 久久综合激情| 国产真人做爰视频免费| 激情综合网五月天天| 日日噜噜夜夜狠狠久久丁香六月| 久久五月天合网| 色五月AV| 色婷婷裸体色性在线| 蒲京久久无码视频| 第四色五月婷婷| 亚洲色色五月| 五月亭亭六月天| 操操啪| 五月丁香综合啪啪| 一级AV片| 任你操精品免费| 九九热99视频在线| 天天综合精品| 91午夜激情| 亚洲色图45p| 欧美日朝成人| 翔田千里无码| 超碰色婷婷| 亚洲黄色影视| 伊人五月天婷婷| 婷婷五月网图片区| 99国产精品久久久久久久久久久| 五月花综合视频| 亚洲秘 无码一区二区三区妃光/1| 久色大| 婷婷综合| 超级碰人人操人人干| 婷婷综合色图| 五月丁香激情婷婷综合| 色丁香婷婷| 大地9中文在线观看免费高清| 青草激情在线| 超碰99在线| 五月天色色无码| 五月婷婷激情综合网| 在线观看亚洲AV| 色99网站| 极品另类| 深爱激情网五月天| 日韩人妻无码一区二区| 丁香 久久| 欧美性生交XXXXX无码小说| www.minyis.com【JT】实力收量可预付QQ2101460746 | 思思热精品在线观看| 激情五月丁香六月综合AVXXXX| 99超级碰免费视频| 天天色天天| 久久亚洲精品成人无码网站导航| 七七九色| www.激情五月天.com| 播播网色播播| 婷婷天堂综合| 99热在线看片| 五月花综合视频| 五月天婷综合网站| 色婷婷丁香五月天| 97人妻碰碰碰久久香蕉| 任你干线上免费视频有3吗| 五月天婷婷基地| 五月婷婷在线综合| 五月综合影院| 狠狠色狠狠色综合日日91| 久久免费9| 六月婷婷天堂| 日韩人妻在线播放| 丁香六月天婷婷色| 成人做爰黄A片免费看直播室男男| www.五月天婷婷| 99爱视频在线免费观看| VA国产在线综合网站| 91大神操美女| 丁香五月激情棕合| www.91九色| 色色六月| 91在线看片| 欧美性生交XXXXX无码小说 | 婷婷丁香红五月91C| 日日综合网| 日本99色| 色色免费网站| 色激情五月| 色停停香蕉视频| 国产亚洲精品久久一区二区三区| 99爱在线观看视频| 日韩色五月| 五月天婷五月天综合网在线观| 97超碰人人操| 六月丁香激情综合网| 色婷婷亚洲| 丁香五月激情网| 91丨九色丨老农村| 操碰99| 久久婷婷五月天蜜桃| www.com色播五月天| 五月婷婷亚洲综合在线| 婷婷终合色图| 婷婷丁香社区网| 91久久久久久久| 免费日本aⅴ中文字幕| 99欧美热| 91人人操| 亚洲小说五月婷婷| 精品免费99| 天天日日| 久久久人人操A V| 人人看人人97| 色婷久久| www.lingjunshare.com| 九九激情| 久久久久人妻| 五月天色软件| 婷婷免费无马| 我爱大香蕉| 丁香五月香蕉在线| 丁香婷婷五月综合影院| 99性爱| 六月丁香中文字幕| 国产日产亚洲系列最新 | 日韩黄色中文字幕| 性色av大香综合| aaa久久| site:pzdcoin.com| 久久伊人五月天| 内射综合网| 日本色婷婷| 超碰人人摸人人操| 色月九九| 成年人99热| 天天日天天摸| 99亚洲天堂| 99热传媒| site:pzdcoin.com| 五月亭亭狠狠| 被男人添B超爽视频| 99久久偷拍视频| 五月婷婷狠狠干| 色五月丁香一区在线| 亚洲亚洲永久无码777777| 国产免费一区二区三州老师F1F1| 99亚洲精品综合在线 | 99精品在线观看视频| 色五月丁香总合网| 色欲影香| 伊人大香蕉毛片| 久久免费9| 丁香五月第四色88| 99久久99九九九99九他书对| 99爱免费视频| 亚洲妇女熟BBW| 香蕉大综综综合久久| 青青热久精品视频在线观看| 超碰在线观看99| 色色婷婷综合| 五月丁香亚洲校园欧美| 久久久久久人妻| 国产日韩欧美| 在线五月婷婷小电影| 激情五月六月婷婷| 激情五月天久久| 丁香五月激情棕合| 亚洲午夜一区二区| 激情久久月| 777丁香六月青青草婷婷综合久月| 六月婷婷五月丁香| 色五月,婷婷大香蕉| 日韩亚洲视频| 色综合婷婷| 色婷婷AV久久| 大地资源色婷婷视频在线| 亚洲综合激情五月久久| 婷婷的99视频网站| 午夜婷婷久久| 丁香五月网| 婷婷五月噜噜| 丁香五月婷婷五月基地| 我要射综合| 五月天激情国产综合婷婷婷| 久热这里只有精品性色AV| 久久久27操| 97在线日韩| 丁香桃色综合网| 五月婷婷在线丁香| 五月丁香亭亭| 婷婷玖玖五月天| 五月激情六月宗合| 狠干综合| 91久久五月天| 五月丁香六月婷婷啪啪| 丁香五月综合在线视频| ady狠狠入| 国产精品五月天婷婷| 黄色国久久| 精品人妻久久久| 久久五月综合| 我爱婷婷五月天综合88| 狠狠一日| 五月丁香六月激情在线| 14色综合婷婷| 天天日夜夜拍| 五月婷婷co.m| 久久精99| 色噜噜五月天| 久久综合九九| 五月天开心网| 五月情涩综合婷婷| 91碰免费视频| 日本五月天网站| 99啪在线| 五月丁香婷婷综合| 久热最新视频| 97婷婷在线| 九九热思思| 五月天色色色色色| 久久人人看| 九九99在线观看视频| 99操逼| 狠狠88综合久久久久噜噜噜| 国产人人操| 五月性色| 噜综合| 操碰色一区就去操| 色五月大| 五月激情丁香久久综合网| 天天上天天爽| 欧美日本高清视频99| 丁香婷婷激情| 乱女乱妇熟女熟妇综合网站| 热婷婷av| 色婷婷五月在线| 另类图片五月天婷婷| 黄色片久久| 99在线小视频| 激情com| 色婷婷AV在线观看| 操操碰| 密乳视频| 99久在线观看| 97五月婷| 久久xxxx| 欧州色色| 三区激情四射av| 思思热99er| 欧美日韩成人高清在线| 亚洲AAAA网| 99精品久久久久久久| 日韩另类| 99热资源在线| 欧美色欲色欲天天天www| 99热销国产这里有精品| 黄色中文字目| 婷婷五月婷婷| 婷婷色啪| 五月丁香花婷婷玉莉AV| 人人操Av| 婷婷精品免费久久| 热婷婷在线视频| 欧美在线视频99| 色综合伊人网| 久久婷婷五月天激情唯美| 人妻激情综合| 天堂色色色| 夜夜嗨一区二区三区直播内容| 99riAv1国产在线观看| 欧美婷婷五月天综合| 翔田千里 50岁 无码| 午夜微拍福利| 91九九| 夜夜操天天干| 九九色99| 这里只有精品99www| 久久久久久久8| 日曰躁夜夜躁2026| 在线理论片| 香蕉久久国产AV一区二区| 97热超碰| 日韩精品VIP| 天天综合色| 另类A片| 天天色视频| 97好吊操| 99热这里只有精品 搜| 天天爽天天爽天天爽天天爽天天爽| 丁香五月www| 变态 另类 在线 | 色婷婷五月综合激情中文字幕| 九九亚洲| 日韩色色视频| 亚洲色99| 五月天偷拍| 日本片日本片祼观看网站在线看中文版网页在线看 | 狠狠操天天干| 超碰在线国产| 天天色天天操天天射| 色优久久| 亚洲操操操| 久色欧美| 激情五月天婷婷在线网址发给我| 欧美丁香五月| 婷婷十月激情综合网| 婷婷五月天熟妇| 青青草视频福利| ss99热| 五月天伊人日日噜影片AV| 婷婷久久国产视频| 人人草人人舔| 综合狠久久| 黄色五月婷婷| 色五月综合| 色婷婷五月综合| 久久综合九九| 色婷婷综合久久| 久久免费高| Caoub青青超碰| 9|在线观看视频| 国产亚洲av片| 久操人妻| 色天天综合色| 五月丁香六月综合基地| 操逼视频一区| 202丰满熟女妇大| 国产精品久久久爽爽爽麻豆色哟哟| 成人做爰高潮A片免费视频| 国外亚洲成AV人片在线观看| 青青草婷婷五月天| 日本乱论99| 色婷婷丁香综合中文字幕| www.激情| 婷婷激情五月天在线| 婷婷丁香五月天激情| 激情久久久久久久久久久| 九九色精品| 大香蕉婷婷五月天| 五月开心播播网| 黄色成人AV在线| 激情图片婷婷| 九九热这里只有精品12| 久久aaaaa| 9久久精品视频| 亭亭色色五月天| 五月天婷婷网站| www五月天com| 久操操| 嫩草哈哈操| 免费黄色视频网址| 久狠日av| 国产这里只有精品| 性爱网六月丁香| 激情综合网五月在线播放| 99 这里只有精品| 国产精品色| 伊人激情AV一区二区三区| 色吊丝99| 丁香五月成人| 开心日韩丁香婷婷五月| 五月婷精品| 日日噜噜夜夜狠狠久久丁香五月| 日本nghangse中文字幕| 色五月婷婷狠狠撸| 丁香婷婷九月| 江苏少妇性BBB搡BBB爽爽爽| www.99在线| 激情色视频| 天天狠狠夜夜狠狠2023| 丁香久月| 日屌日日操日日色| .精品久久久麻豆国产精品| 五月天狠狠色| 天堂草在线看www| 色五月激情五月| 婷婷精品在线| 婷婷狠狠97| 影音先锋 萱萱| 婷婷丁香社区网| 99热综合网| 超PEN精品在线| 亚洲五月天色| 色婷婷狠狠| 亚洲综合网在线| 丁香五月婷婷激情小说| 亚洲视频五区| 国产成人在线不卡AV| 色婷婷视频综合| 乱岳熟女50岁| 日韩黄黄| 丁香六月激情综合| 欧洲永久精品| 夜夜干 夜夜操| 9999三级片| 久热这里| 无码A片一区二区免费| 婷婷伊人久久综合| 久久久久久久久月丁| 色色色色色色色综合| 日本99热| 五月婷婷干干干| www久| 综合99久久天天综合| 亚洲免费婷婷| 探花搜索结果 - 黄上黄| 亚洲舔观看| 婷婷色五月激情| 99精品在线观看| 丁香婷婷基地| 色婷婷影| 日韩黄黄| ri电影在线| 久久伊人大香蕉| 精品色情一区二区三区四区| 精品一二三区久久AAA片| 婷婷 久综合| 99精品热| 日本va视频| 久久九九Com| AV五月婷婷露脸| www五月天com| 综合色播| 97av在线视频| 日本色色网| 色 丁香婷婷| 日操熟女| 99毛片| 亚洲激情四射| 亚洲色婷婷激情| www九九热| 国产五月丁香在线| 婷婷丁香成人色综合| 六月丁香婷婷网| 热热色色五月天婷婷| 狠狠色综合网站久久久久| 超碰高清在线| 五月亭亭开心网| 手机AVAV天堂看网| 第四色大香蕉| 婷婷激情图片| 婷婷五月天激情五月天深爱五月天| 久久精品五月| 色五月综合| 99热这里只有精品33| 99久久婷婷五月| 天天做夜夜爽| 色五月综合婷婷久久综合婷婷久久综合婷婷久久综合婷婷久久 | 丁香五月天成人网站| 99久久婷| 91麻豆国产三级精品福利在线观看| 日本操逼九九九九58日本操逼| 97干婷婷| 欧美色一级色| 久久东京热婷婷五月| 五月婷婷亚洲天堂激情在线| 九热视频免费观看| 97色色色| 六九色综合婷婷五月天| 最新午夜理论片| 国产a视频| 丁香五月综合| 丁XX 成人| 深爱激情五月天色婷婷| 婷婷激情六月综合| 久久五月婷综合| 精品人人操| 色5月婷婷| 色色色色色色97| 久99视频在线观看| 97干在线视频精品店| 99久久9| 欧美激情五月| 五月天激情综合网站| 狠狠色九月| 高清无码网址| 久久资源网五月婷| 色99网站| 五月丁香婷庭在线| 婷婷丁香五| 国产成人综合在线| 大香久久伊人网| 国产精品久久久久久久久久| 成人视频一区| 丁香成人色情五月天| 五月激情婷婷图片基地| 嫩草视频在线观看| 久久婷婷五月综合啪| 色婷婷综合久久| 国产亚洲在线观看| 亚洲欧洲另类| 午夜激情综合| 色哟哟www| 亚洲免费婷婷| 夜夜做夜夜愛| 婷婷五月天激情影片| 激情五月开心五月在线视频| WWW·色色色·COM| 五月婷婷丁香综合,亚洲天堂| 少妇人妻丰满做爰XXX| 久久久久人妻精品| 婷婷开心激情| 五月激情啪啪| 亚洲五月花| 九月丁香亭亭| 久热久| 日韩成人av在线| 五月天婷综合| 狼人婷婷久久| 欧美精品999| 欧美99热| 久久久久这里只有精品| 色色色999| www.婷婷六月天| 天天天天干| 久久精彩视频| 色噜噜狠狠色综合日日免费| 国产裸舞福利资源在线视频| 色五月丁香一区在线| 色五月天中文字幕| 偷拍视频五月天| 婷婷日日天天| 五月天激情日色在线| 99热这里只有精品96| 麻豆123区| 丁香社区婷婷五月| 丁香五月激情婷婷婷婷在线观看| 婷婷五月免费视频| 日韩一级片| 九月激情综合| 99操| 日本欧美成人片AAAA| 久久在线视频免费观看| 色六月 婷婷| 日本三级片片| 久久网日本| 高潮毛片遮挡费高一百度| 亚洲视频色色| 天天天天爽爽天干| 开心五月色婷婷综合开心网| 这里只有精品在线视频在线观看| 亚韩在线视频| 国产毛片欧美毛片久久久| 99婷五月| 亚洲免费99| 综合五月丁香久久| 五月婷婷之美女图片| 激情久久丁香| 亚洲综合视频在线| 大地9中文在线观看免费高清| 青青久久五月| 丁香五月91| 激情小说五月天中文字幕| 中文字幕婷婷五月天在线观看| 婷婷刺激综合| 日韩丰满少妇无码内射| 日韩美女羞羞网站在线观看| 夜夜夜天天操| 久久色这里只有精品| 色六月婷婷| 久久A极片| 啪啪黄页网| 再次出发二| 开心深爱激情网| 亚洲久久激情| 成人片在线免费看| 亚洲色爽| 日本性视频| 超碰99热| 激情综合色五月六月婷婷| 高清无码视频网址| 国产免费一区二区在线A片视频| 爱iii做iiii日日| 色噜噜婷婷| 欧美激情综合五月色丁香| 五月色婷婷综合| 我想看国产大学生口爆吞精的视频| 色婷婷69| 夜夜做夜夜愛| 色五月综合在线| 九九精品婷| 色一情一乱一乱一区91| 狠色色狠网| 99综合| 激情文学第四色婷婷丁香五月| 五月丁香亚洲综合网| 五月丁香六月情| 久久99免费视频网站| 亚洲中文无码成人| 国产99久久久| 4438成人电影| 亚洲色情网站| 成人.在线日韩| 可以免费观看的av网址| 99亚洲视频| 96色婷婷| 婷婷五月六月激情| 嫩草AV久久伊人妇女超级A| 五夜婷婷| 91热99| 久9精品视频在线| 色色啊| 天天精品视频免费观看| 涩综合网| 久久久久亚洲AV无码网影音先锋| 欧美激情 日韩无码 婷婷 五月天| 99在线视频免费| 色五月色图| 金品在线视频99| 97丁香五月| 日韩五月婷婷久久| 五月婷婷网站| 1024AV视频| 五月天激情社区| 成人草榴视频| 色五月天激情| 狠狠噪| 天天透天天摸天天舔| 少妇高潮呻吟A片免费看软件| wWw色五月| 色人久久| 国产精品扒开腿做爽爽爽A片唱戏| 丁香五月中文字幕| 中文字幕在线播放视频| 色婷婷欧美| 九月婷婷综合| 激情综合五月婷| 天天天天干| 98毛片| 香蕉久久av一区二区三区| 一个色的综合| 五月丁香色欲| 丁香五月婷婷在线观看| 色99无码| 色丁香婷婷| 五月丁香亚洲校园欧美| 大香蕉久久| 天天拍久久| 丝袜熟女一区二区三区| 婷婷狠狠操| 大香蕉婷婷久久| 色五月丁香网| 五月天色婷婷av| 一本婷婷丁香久久| 囯产精品久久欠久久久久久九大| 99超级碰碰| 五月天com| 天天撸夜夜爽| 国产婷婷色综合AV蜜臀AV | 26uuu另类| 99人人干人人| 另类综合激情| 精品人妻伦| 热99玖玖99玖玖99九九| 亚洲五月天激情| 人人插9| 婷婷久久五月| 六月丁香婷婷五月| 亚洲情色一区| 99精品成人无码A片观看金桔| 激情网综合| 91人操| 99热亚洲| 五月情婷婷| 伊人超碰| 色香蕉婷婷| 色婷天天| 久热这里精品免费| 在线观看av网站| 色色色综合网| 99热这里有精品2| 人妻久热| 麻豆观看夏晴子| www.日本91| 热这里只有精| 日韩黄色电影| 免费视频WWW在线观看网站| 五日激情综合| 91热er| 玖玖五月| 天天色中文字幕女优AV| 久久性爱视频| 热久久99热欧美国产亚洲| 色婷婷XXXXX| 怎么样可以看免费的一级av| 91丨九色丨高潮丰满日本| 日本九九热| 99热销国产这里有精品| 九九在线免费观看| 五月天国产成人| 色综合中文| 婷婷五月丁香综合桃花色网| 久久97久久99久久综合欧美| 亚洲激情综合| 97碰久久| 婷婷五月花| 欧美成人网99网| 狠狠狠狠狠操| 五月丁香婷婷成人伊人网| 婷婷操逼| 天天射美女| 大香蕉伊在| 婷婷综合九色伊人| 六月丁香五月婷婷| 激情五月天色色| 99激情| 26uuu另类亚洲欧美日本一| 亚洲色精彩| 五月久久婷婷| 中文字幕,综合,91| 亚洲激情五月| 99干免费视频| 国产美女无遮挡裸体毛片A片| 中文无码婷婷| 色五月婷婷九月| 色五月av伊人| 色婷婷影院| 婷婷性爱网| 国内一级精品| av最新在线| 日韩三级视频一区二区| 婷婷伊人五月天| 激情五月婷婷| 四川BBB搡BBB搡多人乱亂| 色五月婷婷基地| 91狠狠综合久久久| 91精品丝袜久久久久久| 91色操| 99久久婷婷五月综合| 五月天亚洲综合网| 人人草开心五月天| 精品成人a v无码内射| 欧美色爱五月天| 丁香婷婷激情六月五月开心| 久久婷婷色综合| 国产成人99久久亚洲综合精品| 五月天色丁香| 国产黄大片在线观看画质优化| 综合AV网| 大香蕉娱乐| 99久在线观看| 伊人大香五月天| 国际国外精品欧洲南美洲专区无码不卡| 思思精品久久艹| www.com五月天| 成人电影在线免费试看| www.婷婷五月| 日本操B视频在线观看| 久久色吧| 狠狠综合久久| 五月综亚洲| 99色色色色| 色婷婷亚洲| 六月婷婷狠狠| 天天免费日日夜夜夜夜| 婷婷色在线视频| 午夜天堂啪啪| 国产精品 的国产| 久久久久久激情| 五月婷成人网| 99性色| 五月婷在线| 色色六月| 色婷婷色99国产综合精品| 色五月亚洲五月天| 九九热精品视频| 99热这里只有精品9| www九九免费视频| 999精品乱码77777| 色婷婷五月网| 久久与婷婷| 大香蕉220| 九九自拍网| 五月丁香好婷婷A片网 | 综合色五月天| 色无婷婷| 色色五月婷| 五月丁香婷婷三级| 五月丁香婷婷六月| 伊人影院久久网| 韩日在线熟女| 色色色热热热| 久久AAAA片一区二区| 久9免费视频| 丁香五月在线观看综合| 五月色色色| 九九综合网| 丁香综合伊人| 久热99热| 五月丁香 狠狠爱| 夜夜骑操AV| 超碰资源在线| 97超碰99热99| 五月花成人网| 激情伊人五月天| 婷婷五月激情综合啪啪| 日韩成人五月天| 99色干| 亚洲久艹| 色欲资源网| 丁香五月偷拍| 99热日韩| 婷婷刺激综合| 婷婷久久爱| 极品 少妇 内射| 婷婷丁香人妻天天爽| www.97干视频| 亚洲欧美999| 婷婷色色综合| 99热6这里只有精品6| 国产精品久久久久久白浆色欲| 免费超碰在线| 五月天社区狠狠| 国产无遮挡又黄又爽免费网站| 99热精品在线观看| 亚洲最大在线| 五月丁香婷婷成人版| 天天婷婷色六月| 色综合99无码 | 思思国产99| 综合色色五月| 欧美黑人巨大猛烈cuckold| 色播五月| 五月色婷| 综合色播| 97人妻碰碰碰久| 九色视频91疯狂| 丁香婷婷五月综合影院| 五月婷婷六月丁香五月| 99热久久日本| 久久丁香五月| 极品另类| 色综合久久88色综合天天看| 婷婷综合日本| 五月婷婷色播| 99热在线精品观看| 五月婷中文字幕| 97在线精品视频| 久久综合五月天| 大香蕉人妻| 99精品激情| 99热精品在线在线| 可以免费看av网站| 国产精品久久久久久久久久| 色 丁香婷婷| 桃色成人网| 丁香网五月天激情| 天天操天天国产三级片处女学生妹| 久久婷婷五月天亚洲欧美| 九色视频入口91| 思思热高清在线观看| 色婷在线视频| 欧美精品啪啪| 亚洲午夜精品久久久久久人妖| www久久99| 激情网站综合五月天| 五月婷婷六月激情| 丁香色五月婷婷| 伊人碰碰婷婷| 成人日韩欧美| 激情五月综合色婷婷| 久久久亚洲成人无码A片| 五月丁香六月婷婷欧美综合| 9月色婷婷| 激情第四色| 99re26视频| 国产性爱色| 日韩无码专区| 丁香六月婷婷高清| 激情五月婷婷色色| 97九色视频| 亭亭丁香久久五月| 97人碰人操| 香蕉人在线香蕉人在线 | 日本色频| 久久久久久久久月丁| 5五月综合网亚洲| 色色丁香| 伊人九热| 情色婷婷五月天| 精品无码色欲AV| 欧美婷婷色五月网| www99热| 天天爽夜夜爽夜爽精品| 精品网站:999WWW| 色婷婷成人做爰A片免费看网站| 狠狠插日日干撸| 99热99在线| 99综合色色色| 91婷婷丁香| 色婷婷五月天在线| 伊人激情啪啪| 久久免费高| 在线播放中文字幕| 五月天基地| www.久久爱| 五月丁香亭亭A片| 美女五月天| 天天插AV丝袜中| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 色婷婷狠狠| 久久色在线视频| 五月婷婷丁香网| 99噜噜噜在线播放| 婷婷六月色开 | 久久久99日本大片| 狠狠精品干练久久久无码中文字幕 | 五月天久久丁香| www.超碰| 婷婷激情综合色五月久久图片| 亚洲乱码日产精品BD| 碰碰女| 国产日韩亚洲欧美在线观看| 狠狠艹狠狠艹| www.久久爱.com| 丁香狠狠色婷婷久久无码视频| 激情婷婷六月天| 伊人五月天| 亚洲va欧美va国产综合久久久| 五月丁香六月综合情在线观看 | 啪啪六月婷婷| 好好日激情五月天| 久99久视频| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 激情五月天婷婷久久久久久久久久久| 9色在线视频精品观看| 色色亚洲| 久久久18| 亚洲成人无码网站| 婷婷情色激情| 夜夜爽日日躁| 狠狠色五月激情| 五夜婷婷| 日本色99| 草榴视频网| 丁香六月欧美| 五月天啪啪网| 精品少妇人妻AV无码专区偷人| 久久婷婷五月| 国产精品久久久久久白浆色欲| 爽天天天天天天天| 亚洲视频图片婷婷五月| 日韩精品无码99| 热久久66| 天天综合天天做天天综合| 五月天国产成人| 这里只有精品视频222| 另类激情五月| 色五月婷婷操逼| 99热热这里只精品996小说| 秋霞av不能| 91九色无码内射| 日本nghangse中文字幕| 日逼影音先锋男人资源站| 五月婷婷很很色| 夜色五月天| 九月丁香很很色| 超碰天堂网| 无码字幕中文| 97涩婷婷婷婷基地| 五月天婷婷Av| 热久久这里只有三级视频| 亚洲日本三级片| 热99.com婷婷| 久色大香蕉| 久久婷婷亚洲无码一起| 98永久精品| 久99久精品| 久久曰曰| 五月丁香久久综合| 婷婷六月综合在线| 开心五激情网| 五月花丁香婷婷| 精品无吗va视频免费观看| 色播五月天激情| 日日干天天射| 大香蕉综合在线| 办公室少妇激情呻吟A片在线观看 白人荫道BBWBBB大荫道 | 五月婷婷三级| 97亚洲色 torrent magnet| 九九家庭影院| 婷婷五月天性| 99re鈥哸鈥唙| 99在线免费视频| 99色色网| 欧美69久成人做爰视频| 久久月天堂| 日本色色网站| 狠狠搞五月天| 九九草热在线观看| 久色欧美| 亚州操操| 五月天婷婷色色| 97碰碰久久| 久操干| 久久婷婷五月国产激情综合片| 久久综合伊人综合在线| 色婷五月天激情| 婷婷六月色开| 国产精品第一国产精品| 亚洲成人无码免费| 97人妻碰碰中文无码久热丝袜| 天天草天天舔| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 一本婷婷丁香久久| 亚洲色激情| mmm1717.6dbm人人爱人人操| 天天干狠狠艹| 大香蕉九九| 日本99视频| 五月丁香婷婷综合在线| 久热最新视频| 五月丁香综合中文| 99热这里只有精品9| 日韩精品一曲二曲三曲四曲五曲| 色综合九九色综合88| 色噜噜狠狠色综合日日免费| www.99视频| 久久综合99| 99在线热视频| 涩涩五| 免费黄色AV| 九色综合网| 激情五月天视频| 五月天社区狠狠| 色五月丁香五月| 日本大逼91| 日本女va| 极品另类| 激情五月婷婷综合网| 九九操操| 婷婷色正月| 午夜大香蕉| 婷婷情色五月天| 婷婷五月天男人影院色色网| 天天爽人人综合免费7799| 色激情网| 天天激情视频| ww久久| 久久五月天丁香| 婷婷六月丁香久| AV在线大香蕉| 国产原创视频91九色| 婷婷丁香午夜综合影视| 激情床戏| 国产黄色av| 99热精品9| 人人爱操| 日本九九九九| 五月天社区| 97人人操人人拍| 大狠狠在线| 99色天堂| 九九碰九九爱97超碰| 天天爽天天| 日韩成人无码片| 九九久久99| 狠狠爱综合网| 91热久久| yellow视频在线观看91| 91在线观看www| 97色色色视频| 日韩久久成人| 欧美丁香六月在线观看视频| 婷婷丁香在线| 外国碰视频网站97| 26uuu国产| 婷婷五月开心六月AV| 婷婷基地五月色| 伊人无码高清| 就99这里只有精品| 五月婷婷综合视频| 激情色色| 色五月首页| 99ri国产在线| 在线另类视频| 五月天综合久久丁香91| 久久人妻精品| 黑人无码一区| 青青草原伊人网| www.97干视频| av在线免费网站 | 欧美大片免费观看| 99热6这里之有精品| 色婷婷99| 色国产五月| 国产XXXX搡XXXXX搡麻豆| 丁香开心深爱| 怡红院AV亚洲一区二区三区H| 婷婷亚洲五月丁香综合在线| 99热18| 五月天婷婷青青| 狠狠色丁香乆乆| 丁香婷婷在线| 日本人妻操| 丁香五月色网| 成人av免费观看| 99久久9|