免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

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

JavaSE實(shí)戰(zhàn):從零實(shí)現(xiàn)“羊了個(gè)羊”消除游戲,掌握桌面應(yīng)用開(kāi)發(fā)全流程

JavaSE實(shí)戰(zhàn):從零實(shí)現(xiàn)“羊了個(gè)羊”消除游戲,掌握桌面應(yīng)用開(kāi)發(fā)全流程 在實(shí)際 Java 學(xué)習(xí)路徑中從掌握基礎(chǔ)語(yǔ)法到完成一個(gè)能寫(xiě)在簡(jiǎn)歷上的綜合項(xiàng)目中間往往存在一個(gè)明顯的斷層。很多同學(xué)學(xué)完了 JavaSE 的核心知識(shí)卻不知道如何將這些零散的知識(shí)點(diǎn)如集合、多線程、IO、GUI串聯(lián)起來(lái)構(gòu)建一個(gè)結(jié)構(gòu)清晰、功能完整的桌面應(yīng)用程序?!把蛄藗€(gè)羊”這類消除游戲因其規(guī)則簡(jiǎn)單、邏輯明確、界面交互性強(qiáng)恰好成為了一個(gè)絕佳的練手項(xiàng)目。它不涉及復(fù)雜的網(wǎng)絡(luò)通信或龐大的第三方框架卻能全面鍛煉面向?qū)ο笤O(shè)計(jì)、事件驅(qū)動(dòng)編程和圖形界面開(kāi)發(fā)的能力。本文將帶你從零開(kāi)始使用純 JavaSE 技術(shù)棧不依賴任何游戲引擎完全通過(guò)手動(dòng)編碼來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)化版的“羊了個(gè)羊”游戲。我們將從游戲的核心數(shù)據(jù)模型設(shè)計(jì)入手逐步完成圖形窗口的繪制、鼠標(biāo)事件的響應(yīng)、游戲規(guī)則的判斷直到最終形成一個(gè)可運(yùn)行、可交互的完整項(xiàng)目。這個(gè)過(guò)程不僅是為了得到一個(gè)游戲更重要的是理解一個(gè)桌面應(yīng)用從數(shù)據(jù)到視圖再到控制器的完整開(kāi)發(fā)流程以及如何組織代碼、調(diào)試界面和解決開(kāi)發(fā)中遇到的具體問(wèn)題。完成本項(xiàng)目后你將獲得一個(gè)可用于課程設(shè)計(jì)、畢業(yè)設(shè)計(jì)或豐富個(gè)人簡(jiǎn)歷的實(shí)質(zhì)性作品并對(duì) Java 圖形界面編程有更深入的理解。1. 理解項(xiàng)目架構(gòu)與核心模型設(shè)計(jì)在動(dòng)手寫(xiě)代碼之前必須先厘清游戲的核心規(guī)則和程序的數(shù)據(jù)表示方式。一個(gè)混亂的數(shù)據(jù)模型會(huì)導(dǎo)致后續(xù)的視圖渲染和邏輯控制異常復(fù)雜。1.1 游戲規(guī)則分析與抽象我們實(shí)現(xiàn)的簡(jiǎn)化版“羊了個(gè)羊”主要包含以下規(guī)則地圖與層疊所有卡牌被分為若干層堆疊在一個(gè)有限區(qū)域內(nèi)。上層的卡牌會(huì)遮擋下層的卡牌??ㄅ祁愋陀卸喾N圖案的卡牌相同圖案的卡牌可以消除。消除規(guī)則玩家需要點(diǎn)擊選擇卡牌將其移入屏幕下方的“待消除槽”。當(dāng)槽內(nèi)出現(xiàn)三張相同圖案的卡牌時(shí)這三張卡牌會(huì)被消除騰出槽位??捎眯耘袛嘀挥刑幱谧钌蠈忧椅幢黄渌ㄅ普趽醯目ㄅ萍纯梢?jiàn)卡牌才能被點(diǎn)擊選中。游戲狀態(tài)當(dāng)所有卡牌被消除游戲勝利當(dāng)“待消除槽”被填滿且無(wú)法構(gòu)成消除時(shí)游戲失敗?;谶@些規(guī)則我們需要設(shè)計(jì)幾個(gè)核心的類模型來(lái)承載游戲狀態(tài)。1.2 核心模型類設(shè)計(jì)我們將創(chuàng)建三個(gè)核心模型類Card卡牌、Layer圖層和GameService游戲邏輯服務(wù)。Card類代表一張卡牌是游戲世界中的最小單元。屬性卡牌的唯一ID、圖案類型、坐標(biāo)位置、寬度高度、是否被選中、是否已被消除。方法判斷鼠標(biāo)點(diǎn)是否落在卡牌區(qū)域內(nèi)、繪制自身。Layer類代表一個(gè)圖層管理一組按特定布局堆疊的Card。屬性圖層名稱、圖層坐標(biāo)、行數(shù)、列數(shù)、卡牌間隔、本層所有卡牌集合。方法初始化本層卡牌設(shè)置坐標(biāo)、判斷某張卡牌在本層是否“可用”即上方無(wú)其他卡牌遮擋、繪制本層所有卡牌。GameService類游戲的大腦負(fù)責(zé)核心邏輯。屬性所有圖層的集合、待消除槽的卡牌列表、游戲狀態(tài)進(jìn)行中、勝利、失敗。方法初始化所有圖層和卡牌、處理鼠標(biāo)點(diǎn)擊事件判斷點(diǎn)擊了哪張可用卡牌、移動(dòng)卡牌到待消除槽、檢查并執(zhí)行消除、判斷游戲勝負(fù)。這個(gè)模型設(shè)計(jì)將數(shù)據(jù)卡牌狀態(tài)、組織圖層和邏輯服務(wù)分離符合面向?qū)ο蟮脑O(shè)計(jì)原則使得后續(xù)的擴(kuò)展和維護(hù)變得清晰。1.3 項(xiàng)目包結(jié)構(gòu)與依賴本項(xiàng)目?jī)H需標(biāo)準(zhǔn) JavaSE 庫(kù)無(wú)需任何外部 Jar 包。建議創(chuàng)建如下包結(jié)構(gòu)以保持代碼整潔com.yanglegeyang ├── model │ ├── Card.java │ ├── Layer.java │ └── GameService.java ├── view │ └── GameFrame.java ├── util │ └── ImageUtil.java └── AppMain.javamodel包存放上述核心模型類。view包存放游戲主窗口和繪制相關(guān)的類。util包存放工具類如圖片加載工具。AppMain.java程序入口。2. 環(huán)境準(zhǔn)備與基礎(chǔ)框架搭建在開(kāi)始實(shí)現(xiàn)模型之前我們先搭建好圖形窗口的基礎(chǔ)框架并準(zhǔn)備好資源文件。2.1 創(chuàng)建項(xiàng)目與資源準(zhǔn)備在 IDE如 IntelliJ IDEA 或 Eclipse中創(chuàng)建一個(gè)普通的 Java 項(xiàng)目。在項(xiàng)目根目錄下創(chuàng)建一個(gè)res文件夾用于存放圖片資源。你需要準(zhǔn)備以下圖片card_bg.png卡牌背面或背景圖片。card_1.png,card_2.png, ...不同圖案的卡牌正面圖片例如7種圖案。slot_bg.png待消除槽的背景圖片。win.png,fail.png游戲勝利和失敗的提示圖片。將這些圖片放入res文件夾。在代碼中我們將通過(guò)類加載器來(lái)讀取這些資源。2.2 實(shí)現(xiàn)工具類與主窗口框架首先實(shí)現(xiàn)一個(gè)簡(jiǎn)單的圖片加載工具類避免在業(yè)務(wù)代碼中重復(fù)編寫(xiě)資源加載邏輯。// util/ImageUtil.java package com.yanglegeyang.util; import javax.imageio.ImageIO; import java.awt.Image; import java.io.IOException; import java.net.URL; public class ImageUtil { public static Image getImage(String imageName) { // 從 classpath 的 res 目錄下加載圖片 URL resource ImageUtil.class.getClassLoader().getResource(res/ imageName); if (resource null) { throw new RuntimeException(圖片資源未找到: imageName); } try { return ImageIO.read(resource); } catch (IOException e) { throw new RuntimeException(圖片加載失敗: imageName, e); } } }接下來(lái)創(chuàng)建游戲的主窗口GameFrame。它繼承自JFrame并實(shí)現(xiàn)了MouseListener接口以響應(yīng)鼠標(biāo)點(diǎn)擊。// view/GameFrame.java package com.yanglegeyang.view; import com.yanglegeyang.model.GameService; import com.yanglegeyang.util.ImageUtil; import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class GameFrame extends JFrame implements MouseListener { private GameService gameService; // 游戲邏輯核心 private Image offScreenImage; // 用于雙緩沖繪制的離線圖像 // 窗口尺寸 public static final int FRAME_WIDTH 800; public static final int FRAME_HEIGHT 600; public GameFrame() { initFrame(); initGame(); // 啟動(dòng)重繪線程 new Thread(this::repaintThread).start(); } private void initFrame() { this.setTitle(羊了個(gè)羊 - Java版); this.setSize(FRAME_WIDTH, FRAME_HEIGHT); this.setLocationRelativeTo(null); // 居中顯示 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setResizable(false); this.addMouseListener(this); this.setVisible(true); } private void initGame() { // 初始化游戲服務(wù)這里先留空后續(xù)實(shí)現(xiàn)GameService后補(bǔ)充 this.gameService new GameService(); this.gameService.startGame(); } /** * 雙緩沖繪制先在離線圖像上畫(huà)再一次性畫(huà)到窗口上避免閃爍。 */ Override public void paint(Graphics g) { if (offScreenImage null) { offScreenImage this.createImage(FRAME_WIDTH, FRAME_HEIGHT); } Graphics offScreenGraphics offScreenImage.getGraphics(); // 1. 繪制背景色 offScreenGraphics.setColor(new Color(0xF5, 0xF5, 0xDC)); // 米色背景 offScreenGraphics.fillRect(0, 0, FRAME_WIDTH, FRAME_HEIGHT); // 2. 委托GameService繪制游戲元素卡牌、槽、狀態(tài) if (gameService ! null) { gameService.paint(offScreenGraphics); } // 3. 將離線圖像繪制到窗口真正的Graphics上 g.drawImage(offScreenImage, 0, 0, null); } /** * 獨(dú)立的渲染線程控制幀率。 */ private void repaintThread() { try { while (true) { Thread.sleep(30); // 約33FPS this.repaint(); // 觸發(fā)paint方法重繪 } } catch (InterruptedException e) { e.printStackTrace(); } } // 鼠標(biāo)事件處理先留空后續(xù)實(shí)現(xiàn) Override public void mouseClicked(MouseEvent e) {} Override public void mousePressed(MouseEvent e) {} Override public void mouseReleased(MouseEvent e) { // 我們主要在鼠標(biāo)釋放時(shí)處理點(diǎn)擊邏輯 if (gameService ! null) { gameService.onMouseClick(e.getX(), e.getY()); } this.repaint(); // 點(diǎn)擊后立即重繪一次 } Override public void mouseEntered(MouseEvent e) {} Override public void mouseExited(MouseEvent e) {} }最后創(chuàng)建程序入口。// AppMain.java package com.yanglegeyang; import com.yanglegeyang.view.GameFrame; public class AppMain { public static void main(String[] args) { // 使用SwingUtilities確保GUI創(chuàng)建在事件分發(fā)線程上 javax.swing.SwingUtilities.invokeLater(GameFrame::new); } }運(yùn)行AppMain此時(shí)應(yīng)該能看到一個(gè)空白窗口?;A(chǔ)框架已經(jīng)搭建完畢。3. 實(shí)現(xiàn)核心數(shù)據(jù)模型與游戲邏輯現(xiàn)在我們來(lái)填充之前設(shè)計(jì)的核心模型類。3.1 實(shí)現(xiàn) Card 類Card類除了存儲(chǔ)屬性最關(guān)鍵的方法是isPointInCard判斷點(diǎn)擊和paint繪制。// model/Card.java package com.yanglegeyang.model; import com.yanglegeyang.util.ImageUtil; import java.awt.*; public class Card { private int id; // 唯一標(biāo)識(shí) private int type; // 圖案類型如123... private int x, y; // 卡牌左上角坐標(biāo) public static final int CARD_WIDTH 60; public static final int CARD_HEIGHT 80; private boolean isSelected; // 是否被選中在槽中 private boolean isEliminated; // 是否已被消除 // 圖片資源靜態(tài)加載一次即可 private static Image cardBgImage ImageUtil.getImage(card_bg.png); private static Image[] cardFaceImages; // 卡牌正面圖案數(shù)組 static { // 假設(shè)有7種圖案 int cardTypeCount 7; cardFaceImages new Image[cardTypeCount 1]; // 索引從1開(kāi)始 for (int i 1; i cardTypeCount; i) { cardFaceImages[i] ImageUtil.getImage(card_ i .png); } } // 構(gòu)造方法、getter/setter 省略... // 重點(diǎn)實(shí)現(xiàn)以下兩個(gè)方法 /** * 判斷一個(gè)點(diǎn)(x, y)是否在當(dāng)前卡牌區(qū)域內(nèi) */ public boolean isPointInCard(int pointX, int pointY) { return pointX this.x pointX this.x CARD_WIDTH pointY this.y pointY this.y CARD_HEIGHT; } /** * 繪制卡牌 * param g 繪圖上下文 * param isTopMost 是否是頂層可用卡牌需要高亮提示 */ public void paint(Graphics g, boolean isTopMost) { if (isEliminated) { return; // 已消除的卡牌不繪制 } // 1. 繪制卡牌背景或邊框 g.drawImage(cardBgImage, x, y, CARD_WIDTH, CARD_HEIGHT, null); // 2. 如果卡牌未被選中即還在地圖上繪制正面圖案 if (!isSelected) { Image faceImg cardFaceImages[type]; if (faceImg ! null) { // 圖案比背景稍小居中繪制 int padding 5; g.drawImage(faceImg, x padding, y padding, CARD_WIDTH - 2 * padding, CARD_HEIGHT - 2 * padding, null); } } // 3. 如果是頂層可用卡牌繪制一個(gè)半透明的綠色邊框作為提示 if (isTopMost) { g.setColor(new Color(0, 255, 0, 100)); // 半透明綠色 g.fillRect(x, y, CARD_WIDTH, CARD_HEIGHT); } // 4. 如果卡牌已被選中在槽中可以繪制一個(gè)選中狀態(tài)比如紅色邊框 if (isSelected) { g.setColor(Color.RED); g.drawRect(x, y, CARD_WIDTH - 1, CARD_HEIGHT - 1); } } }3.2 實(shí)現(xiàn) Layer 類Layer類負(fù)責(zé)管理一層內(nèi)所有卡牌的布局和可用性判斷。// model/Layer.java package com.yanglegeyang.model; import java.awt.*; import java.util.ArrayList; import java.util.List; import java.util.Random; public class Layer { private String name; private int x, y; // 圖層左上角坐標(biāo) private int row; // 行數(shù) private int col; // 列數(shù) private int padding; // 卡牌間距 private ListCard cards new ArrayList(); // 本層所有卡牌 // 構(gòu)造方法、getter/setter 省略... /** * 初始化本層卡牌并設(shè)置每個(gè)卡牌的坐標(biāo)。 * param cardTypes 本層允許出現(xiàn)的卡牌類型數(shù)組 */ public void initCards(int[] cardTypes) { cards.clear(); Random random new Random(); for (int i 0; i row; i) { for (int j 0; j col; j) { Card card new Card(); card.setId(i * col j); // 隨機(jī)分配一個(gè)圖案類型 int typeIndex random.nextInt(cardTypes.length); card.setType(cardTypes[typeIndex]); // 計(jì)算坐標(biāo) card.setX(this.x j * (Card.CARD_WIDTH padding)); card.setY(this.y i * (Card.CARD_HEIGHT padding)); cards.add(card); } } } /** * 判斷指定卡牌在本層中是否是“可用”的即上方無(wú)遮擋。 * 簡(jiǎn)化算法遍歷本層所有卡牌如果存在另一張卡牌B其區(qū)域覆蓋了卡牌A的中心點(diǎn) * 且B在A的“上方”通常指列表中索引更大表示后繪制則認(rèn)為A被B遮擋。 * 這是一個(gè)簡(jiǎn)化的邏輯實(shí)際游戲可能有更復(fù)雜的層疊關(guān)系。 */ public boolean isCardAvailable(Card targetCard) { int targetCenterX targetCard.getX() Card.CARD_WIDTH / 2; int targetCenterY targetCard.getY() Card.CARD_HEIGHT / 2; for (Card otherCard : cards) { if (otherCard targetCard || otherCard.isEliminated() || otherCard.isSelected()) { continue; // 跳過(guò)自身、已消除、已選中的卡牌 } // 如果其他卡牌的區(qū)域包含了目標(biāo)卡牌的中心點(diǎn)則目標(biāo)被遮擋 if (otherCard.isPointInCard(targetCenterX, targetCenterY)) { return false; } } return true; } /** * 獲取本層所有可用的卡牌。 */ public ListCard getAvailableCards() { ListCard available new ArrayList(); for (Card card : cards) { if (!card.isEliminated() !card.isSelected() isCardAvailable(card)) { available.add(card); } } return available; } /** * 繪制本層所有卡牌。 * param g 繪圖上下文 */ public void paint(Graphics g, ListCard allTopMostCards) { for (Card card : cards) { // 判斷這張卡牌是否是全局“頂層可用卡牌”用于高亮 boolean isTopMost allTopMostCards ! null allTopMostCards.contains(card); card.paint(g, isTopMost); } } }3.3 實(shí)現(xiàn) GameService 類這是游戲邏輯的核心它串聯(lián)了所有模型并處理用戶交互。// model/GameService.java package com.yanglegeyang.model; import com.yanglegeyang.util.ImageUtil; import java.awt.*; import java.util.*; import java.util.List; public class GameService { private ListLayer layers new ArrayList(); // 所有圖層 private ListCard slotCards new ArrayList(); // 待消除槽中的卡牌最多7張 public static final int SLOT_CAPACITY 7; private GameState gameState GameState.PLAYING; private ListCard allTopMostCardsCache; // 緩存當(dāng)前所有可點(diǎn)擊的卡牌用于繪制高亮 enum GameState { PLAYING, WIN, FAIL } // 槽位繪制位置 public static final int SLOT_X 50; public static final int SLOT_Y 450; public void startGame() { initLayers(); slotCards.clear(); gameState GameState.PLAYING; refreshTopMostCardsCache(); } private void initLayers() { layers.clear(); // 示例創(chuàng)建3個(gè)圖層每個(gè)圖層圖案不同位置錯(cuò)開(kāi) Layer layer1 new Layer(Layer1, 100, 100, 3, 4, 5); layer1.initCards(new int[]{1, 2, 3}); // 第一層只有123三種圖案 layers.add(layer1); Layer layer2 new Layer(Layer2, 120, 130, 3, 4, 5); layer2.initCards(new int[]{2, 3, 4}); layers.add(layer2); Layer layer3 new Layer(Layer3, 140, 160, 2, 3, 5); layer3.initCards(new int[]{5, 6, 7}); layers.add(layer3); } /** * 刷新全局“頂層可用卡牌”緩存。 */ private void refreshTopMostCardsCache() { allTopMostCardsCache new ArrayList(); for (Layer layer : layers) { allTopMostCardsCache.addAll(layer.getAvailableCards()); } } /** * 處理鼠標(biāo)點(diǎn)擊邏輯。 * param clickX 鼠標(biāo)點(diǎn)擊X坐標(biāo) * param clickY 鼠標(biāo)點(diǎn)擊Y坐標(biāo) */ public void onMouseClick(int clickX, int clickY) { if (gameState ! GameState.PLAYING) { return; // 游戲已結(jié)束點(diǎn)擊無(wú)效 } // 1. 檢查是否點(diǎn)擊了可用的地圖卡牌 for (Card card : allTopMostCardsCache) { if (card.isPointInCard(clickX, clickY)) { // 選中這張卡牌將其移入待消除槽 moveCardToSlot(card); refreshTopMostCardsCache(); // 移動(dòng)后可用卡牌發(fā)生變化 checkGameState(); // 檢查游戲是否結(jié)束 return; } } // 2. 可選檢查是否點(diǎn)擊了槽內(nèi)卡牌進(jìn)行撤銷等操作此處略過(guò)。 } private void moveCardToSlot(Card card) { if (slotCards.size() SLOT_CAPACITY) { // 槽已滿理論上不應(yīng)發(fā)生因?yàn)橹皶?huì)判斷游戲狀態(tài) return; } card.setSelected(true); // 計(jì)算卡牌在槽中的新位置 int slotIndex slotCards.size(); card.setX(SLOT_X slotIndex * (Card.CARD_WIDTH 10)); card.setY(SLOT_Y); slotCards.add(card); // 嘗試消除 tryEliminateInSlot(); } /** * 檢查并消除槽內(nèi)滿足條件的卡牌。 */ private void tryEliminateInSlot() { // 按卡牌類型分組 MapInteger, ListCard typeMap new HashMap(); for (Card card : slotCards) { typeMap.computeIfAbsent(card.getType(), k - new ArrayList()).add(card); } // 查找是否有某種類型的卡牌數(shù)量3 for (ListCard cardList : typeMap.values()) { if (cardList.size() 3) { // 消除最早進(jìn)入槽的三張或任意三張 for (int i 0; i 3; i) { Card toRemove cardList.get(i); toRemove.setEliminated(true); slotCards.remove(toRemove); } // 消除后需要重新排列槽內(nèi)剩余卡牌的位置 rearrangeSlotCards(); // 消除后可能又產(chǎn)生新的可消除組合遞歸檢查一次簡(jiǎn)單處理 tryEliminateInSlot(); break; } } } /** * 重新排列槽內(nèi)卡牌的位置。 */ private void rearrangeSlotCards() { for (int i 0; i slotCards.size(); i) { Card card slotCards.get(i); card.setX(SLOT_X i * (Card.CARD_WIDTH 10)); card.setY(SLOT_Y); } } /** * 檢查游戲狀態(tài)勝利或失敗。 */ private void checkGameState() { // 勝利條件所有圖層中未消除且未選中的卡牌數(shù)量為0 boolean allCardsCleared true; for (Layer layer : layers) { for (Card card : layer.getCards()) { if (!card.isEliminated() !card.isSelected()) { allCardsCleared false; break; } } if (!allCardsCleared) break; } if (allCardsCleared) { gameState GameState.WIN; return; } // 失敗條件槽已滿且無(wú)法消除 if (slotCards.size() SLOT_CAPACITY) { // 檢查當(dāng)前槽內(nèi)是否有可消除的組合 MapInteger, Integer typeCount new HashMap(); for (Card card : slotCards) { typeCount.put(card.getType(), typeCount.getOrDefault(card.getType(), 0) 1); } boolean canEliminate typeCount.values().stream().anyMatch(count - count 3); if (!canEliminate) { gameState GameState.FAIL; } } } /** * 繪制整個(gè)游戲畫(huà)面。 */ public void paint(Graphics g) { // 1. 繪制所有圖層 for (Layer layer : layers) { layer.paint(g, allTopMostCardsCache); } // 2. 繪制待消除槽背景和卡牌 Image slotBg ImageUtil.getImage(slot_bg.png); g.drawImage(slotBg, SLOT_X - 10, SLOT_Y - 10, SLOT_CAPACITY * (Card.CARD_WIDTH 10) 20, Card.CARD_HEIGHT 20, null); for (Card card : slotCards) { card.paint(g, false); // 槽內(nèi)卡牌不高亮 } // 3. 繪制游戲狀態(tài)勝利/失敗 if (gameState GameState.WIN) { Image winImage ImageUtil.getImage(win.png); g.drawImage(winImage, 300, 200, null); } else if (gameState GameState.FAIL) { Image failImage ImageUtil.getImage(fail.png); g.drawImage(failImage, 300, 200, null); } // 4. 可選繪制一些提示信息如剩余卡牌數(shù)、槽位數(shù)量等 g.setColor(Color.BLACK); g.drawString(槽位: slotCards.size() / SLOT_CAPACITY, SLOT_X, SLOT_Y - 20); } }現(xiàn)在回到GameFrame類補(bǔ)全initGame方法中對(duì)GameService的初始化。// 在 GameFrame.initGame() 方法中 private void initGame() { this.gameService new GameService(); this.gameService.startGame(); }4. 運(yùn)行驗(yàn)證與交互測(cè)試完成以上代碼后運(yùn)行AppMain類游戲窗口應(yīng)該能正常顯示。4.1 預(yù)期運(yùn)行結(jié)果窗口成功彈出標(biāo)題為“羊了個(gè)羊 - Java版”。窗口內(nèi)部分為上中下三個(gè)區(qū)域上層顯示三層錯(cuò)落堆疊的卡牌部分卡牌被遮擋。最上層的可點(diǎn)擊卡牌應(yīng)有半透明綠色高亮提示。中層空白區(qū)域。下層顯示一個(gè)卡槽區(qū)域初始為空旁邊有“槽位0/7”的提示。鼠標(biāo)點(diǎn)擊高亮的卡牌該卡牌會(huì)從原位置消失并出現(xiàn)在下方的卡槽中同時(shí)原位置下方被遮擋的卡牌可能會(huì)變?yōu)楦吡量捎?。?dāng)卡槽中集齊三張相同圖案的卡牌時(shí)這三張卡牌會(huì)立即消失騰出槽位。當(dāng)所有地圖上的卡牌都被移入卡槽并消除后屏幕中央顯示勝利圖片。當(dāng)卡槽被7張無(wú)法消除的卡牌填滿時(shí)屏幕中央顯示失敗圖片。4.2 關(guān)鍵交互測(cè)試點(diǎn)測(cè)試動(dòng)作預(yù)期結(jié)果驗(yàn)證目的點(diǎn)擊非高亮被遮擋卡牌無(wú)反應(yīng)驗(yàn)證可用性判斷邏輯isCardAvailable點(diǎn)擊高亮卡牌卡牌移入槽位原位置可能釋放新卡牌驗(yàn)證onMouseClick和moveCardToSlot槽內(nèi)湊齊三張同圖案卡牌三張卡牌立即消除槽位重排驗(yàn)證tryEliminateInSlot邏輯消除后槽內(nèi)又湊齊三張?jiān)俅斡|發(fā)消除驗(yàn)證消除邏輯的遞歸或循環(huán)檢查消除所有地圖卡牌顯示勝利畫(huà)面驗(yàn)證checkGameState的勝利條件槽滿且無(wú)法消除顯示失敗畫(huà)面驗(yàn)證checkGameState的失敗條件如果測(cè)試結(jié)果與預(yù)期不符需要根據(jù)現(xiàn)象進(jìn)行排查。5. 常見(jiàn)問(wèn)題排查與調(diào)試技巧在開(kāi)發(fā)過(guò)程中你可能會(huì)遇到以下典型問(wèn)題。5.1 圖片加載失敗窗口空白或拋出異?,F(xiàn)象運(yùn)行后窗口一片空白或控制臺(tái)拋出RuntimeException: 圖片資源未找到。排查檢查res文件夾是否位于項(xiàng)目的根目錄與src同級(jí)而不是src內(nèi)部。檢查圖片文件名包括后綴是否與代碼中ImageUtil.getImage(“card_bg.png”)的字符串完全一致注意大小寫(xiě)。在 IDE 中右鍵點(diǎn)擊res文件夾確保其被標(biāo)記為Resources Root或類似資源目錄。在ImageUtil類的getImage方法開(kāi)始處添加System.out.println(“Loading: ” imageName);查看程序試圖加載的路徑。5.2 點(diǎn)擊卡牌無(wú)反應(yīng)現(xiàn)象鼠標(biāo)點(diǎn)擊卡牌但卡牌沒(méi)有移動(dòng)到槽中。排查坐標(biāo)判斷問(wèn)題在Card.isPointInCard方法中添加日志打印卡牌區(qū)域和點(diǎn)擊坐標(biāo)確認(rèn)判斷邏輯是否正確。注意AWT的坐標(biāo)系原點(diǎn)在窗口左上角??捎每ㄅ凭彺嫖锤麓_保在moveCardToSlot方法中移走卡牌后調(diào)用了refreshTopMostCardsCache()。事件未觸發(fā)在GameFrame.mouseReleased方法中打日志確認(rèn)鼠標(biāo)事件被正確捕獲并傳遞給了gameService.onMouseClick。卡牌狀態(tài)錯(cuò)誤檢查被點(diǎn)擊的卡牌isEliminated()和isSelected()狀態(tài)是否均為false。5.3 卡牌消除邏輯異?,F(xiàn)象槽內(nèi)已有三張相同卡牌但未消除或消除后卡牌位置錯(cuò)亂。排查類型匹配確認(rèn)Card的type屬性在初始化時(shí)被正確賦值并且在tryEliminateInSlot中分組邏輯正確。消除條件檢查tryEliminateInSlot方法中if (cardList.size() 3)這行代碼是否被執(zhí)行。列表修改異常在tryEliminateInSlot中直接從slotCards列表中remove元素可能會(huì)導(dǎo)致ConcurrentModificationException或遍歷錯(cuò)亂。我們的代碼通過(guò)先找到待刪除元素再統(tǒng)一操作來(lái)避免但需仔細(xì)檢查循環(huán)和刪除的邏輯。重排坐標(biāo)消除后務(wù)必調(diào)用rearrangeSlotCards()為槽內(nèi)剩余的卡牌重新計(jì)算坐標(biāo)。5.4 游戲狀態(tài)判斷錯(cuò)誤現(xiàn)象卡牌已清空但未勝利或槽未滿卻判定失敗。排查勝利條件遍歷在checkGameState的勝利條件檢查中確保遍歷了所有圖層 (layers) 的所有卡牌并且判斷條件是“未消除且未選中”。失敗條件判斷時(shí)機(jī)失敗判斷應(yīng)在每次卡牌入槽moveCardToSlot后立即進(jìn)行。檢查onMouseClick中調(diào)用checkGameState()的時(shí)機(jī)。狀態(tài)變量更新確保gameState在勝利或失敗時(shí)被正確設(shè)置為GameState.WIN或GameState.FAIL并且在paint方法中根據(jù)此狀態(tài)繪制不同圖片。5.5 界面閃爍或卡頓現(xiàn)象畫(huà)面更新時(shí)有明顯閃爍。解決我們已經(jīng)使用了雙緩沖技術(shù)在GameFrame.paint中創(chuàng)建offScreenImage。如果仍有閃爍嘗試將重繪線程的睡眠時(shí)間Thread.sleep(30)適當(dāng)調(diào)大如改為T(mén)hread.sleep(50)20FPS以減少不必要的重繪。確保所有繪圖操作都在paint方法或其調(diào)用的方法中完成避免在事件線程中直接進(jìn)行耗時(shí)繪圖。6. 項(xiàng)目?jī)?yōu)化與擴(kuò)展方向完成基礎(chǔ)版本后可以從以下幾個(gè)方面進(jìn)行優(yōu)化和擴(kuò)展使其更完善、更像一個(gè)真正的項(xiàng)目。6.1 功能增強(qiáng)撤銷功能在GameService中維護(hù)一個(gè)操作棧記錄每次移動(dòng)卡牌的操作卡牌ID從哪層移到槽。實(shí)現(xiàn)一個(gè)撤銷按鈕或快捷鍵將槽中最后一張卡牌移回原處。洗牌/提示功能當(dāng)玩家無(wú)牌可消時(shí)提供“洗牌”功能隨機(jī)重排當(dāng)前可用卡牌位置或“提示”功能高亮一組可消除的卡牌。關(guān)卡與難度設(shè)計(jì)多個(gè)關(guān)卡每關(guān)使用不同的圖層布局、卡牌類型和槽容量。將關(guān)卡數(shù)據(jù)圖層定義、卡牌類型配置在外部文件如JSON中。音效與動(dòng)畫(huà)為卡牌移動(dòng)、消除、勝利失敗事件添加音效。使用Timer或線程實(shí)現(xiàn)卡牌移動(dòng)的平滑動(dòng)畫(huà)而不是瞬間跳轉(zhuǎn)。6.2 代碼結(jié)構(gòu)優(yōu)化引入 MVC 模式當(dāng)前GameService承擔(dān)了部分控制器Controller和模型Model的角色??梢赃M(jìn)一步明確分離GameModel純數(shù)據(jù)模型管理Layer,Card,slotCards,gameState。GameController處理鼠標(biāo)事件調(diào)用GameModel的方法修改狀態(tài)。GameView即GameFrame負(fù)責(zé)根據(jù)GameModel的數(shù)據(jù)進(jìn)行渲染。配置化將窗口大小、卡牌尺寸、槽容量、圖層定義等硬編碼參數(shù)提取到config.properties配置文件中。日志記錄使用SLF4JLogback替換System.out.println方便記錄游戲運(yùn)行狀態(tài)和調(diào)試信息。6.3 部署與打包生成可執(zhí)行 JAR在 IDE 中或使用 Maven/Gradle 將項(xiàng)目及其依賴本例無(wú)外部依賴打包成一個(gè)可執(zhí)行的 JAR 文件。確保res資源文件夾被打包進(jìn) JAR。制作安裝程序使用Launch4j或JPackageJDK 14將 JAR 打包成 Windows 的.exe或 macOS 的.app方便分發(fā)。這個(gè)項(xiàng)目麻雀雖小五臟俱全。通過(guò)它你實(shí)踐了 Java GUI 編程、事件處理、自定義繪圖、雙緩沖、集合操作、遞歸邏輯判斷等多個(gè)核心知識(shí)點(diǎn)。更重要的是你體驗(yàn)了一個(gè)完整小項(xiàng)目從設(shè)計(jì)、編碼、調(diào)試到優(yōu)化的全過(guò)程這份經(jīng)驗(yàn)遠(yuǎn)比單純學(xué)習(xí)語(yǔ)法更有價(jià)值。接下來(lái)你可以嘗試實(shí)現(xiàn)上述的某個(gè)擴(kuò)展功能或者用同樣的思路去實(shí)現(xiàn)另一個(gè)經(jīng)典小游戲如“連連看”或“掃雷”來(lái)鞏固你的技能。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产成人精品亚洲线观看| 久草狼人| 婷婷五月天影院| 另类图片婷婷五月天| 五月丁香激情四射综合| 999九九九久久久99HD| 婷婷五月色情天| 婷婷五月天a| 91九色中文字幕女在线观看| 色yeye欧美| 狠狠色综合网站久久久久| 五月丁香天堂网婷婷| 欧洲亚洲免费视频9| 免费久久这里只有精品99| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 色青五月天| 99色在线视频| 天天干一干| 久久综合五月天| 2025天天爽天天摸| 九热在线这里有精品6| 大伊香蕉玖玖爱| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 色五月婷婷91| 日韩无码系列| 综合九九日本| 五月婷中文娱乐综合| 在线99热| www.色婷婷| 亚洲操操操| 26uuu欧美亚洲日韩| 99ri在线| 激情五月综合色| 激情五月综合久久| 超碰色色综合| 婷婷五月亚洲综合| 综合色播| 午夜色色色极品视频| 96精品久久久久久久久| 91操网| 丁香五月激情欧美| 天堂中文国产| 99热91| 亚洲综合色网| 五月婷婷久久综合| 性做爰1一7伦| 五月天婷婷综合色| 99在线综合视频| 这里只有精品96| AA丁香综合激情| 99热在线看| 色五月婷婷久久| 91九色精品| 可以免费观看的AV| 99超级碰免费视频| 久热免费视频| 综合欧美五月婷婷| 超碰京东热av男人的天堂| WWW色色色COM| 操日本三片99| 免费AV播放| 久久久8| 99噜噜噜在线播放| 一本久久婷婷| 激情五月色婷婷| 超碰人人99| 激情综合在线播放| 亚洲人妻av| Av大香蕉| 99re热久久| 亚洲99在线| 天天爽曰日爽| 另类激情综合| 91性高潮久久久久久久久| 99re6在线视频精品免费| 欧美人与性动交CCOO| 97高清国语自产拍| 色色色97| 2025中文在线视频字幕免费观看| 九九无码视屏| 欧美色色色色色色色色色色| 色婷婷激情| 久热伊人| 亚洲黄色影视| 中文字幕中文有码在线| 婷婷五月天久久综合88| 久久久久久久综合狠狠综合| 丁香五月停停av| 人人爱摸视频| 成人精品视频99在线观看免费| 丁香五月婷婷av影院| 99玖玖视频| 99久久www| 婷婷五月天AV| 色亚洲欧洲| 狠狠99| www色五月| 99在线精品免费视频| 9久热视频| 五月天另类图片区99| 99综合在线| 亚洲 精品 综合 精品| 天天综合五月天| 色久九| 五月丁香婷婷五月色| 人人看人人摸人人| 91一起操| 成人丁香色| 激情com| 婷婷综合在线观看视频| 亚洲免费婷婷| 久七香蕉| 天天日天天日天天搞| 区美毛片子| 日本少妇裸体做爰高潮片| 九九九午夜视频| 婷婷激情丁香五月婷婷激情丁香五月婷婷 | 91狠狠色| 5月丁香婷婷激情网| 色色五月天婷婷| 超碰天堂网| 色呦精品| 日夜操B| 亚洲久热无码| 北京熟妇搡BBBB搡BBBB| 啊V视频在线观看| 激情综合色婷婷啪啪六月天| 五月天开心网| 91啪啪视频| 热久久这里只有精品20| 激情六月天| 激情性爱网站| 婷婷干五月综合在线播放| 色色色综合网| 久9热视频在线观看| 久久综合伊人综合在线| 成AV人片一区二区三区久久| 《诡秘之主》在线观看| 天堂A∨在线| 婷婷色资源| www.玖玖九| 亚洲天堂久久| 色停停香蕉视频| 无码一区二区三区四区五区91c| 激情婷婷内射| 婷婷俺去也| 激情五月份婷婷| 99.色| 色色色热热热| 激情综合五月激情17| 99精品在线观看| 五月丁香综合精品欧美| 天堂草在线观| 丁香色色五月| 五月婷婷综合久久| 麻豆123区| 五月天影院婷婷在线观看| 欧美久热| 婷婷色激情网| 五月天精品| 97色婷婷| 亚洲综合五月天婷婷| 婷婷五月色| 久热伊人| 国产又粗又大又爽又黄| 五月丁香色狠狠干大屄| 亚洲成AV人片在线观看| 黄色AAAAA| 五月天婷婷无码| 婷婷亚洲五月丁香综合在线| 色五月丁香com| 最新激情五月天| 五月天婷婷小说| 亚洲性爱99| 五月丁香六月激情综合| peg 2区三区四区的| 97色色综合| 大香蕉伊人久久| 欧美婷婷丁香五月社区| 天天舔夜夜操www com| 99热网站| 婷婷五月丁香五月天| 操操操Av| 91色五月| 97精品人人A片免费看| 五月情丁香色| 婷婷在线五月综合| 91精品久久久久、久五月天| 97资源碰碰| 欧美99热| 九九热这里只有精品12| 久久九⑨| 亚洲色婷婷| 五月开心婷婷极品激情| 99国产精品久久久久久久久久久| 九热视频| 六月婷婷成人| 97日本操| 人妻九九九九| 青青草搞屄视频网站| 婷婷五月天色色| 五月色丁香婷婷中文字幕| 97干干干丁香| 天天精品视频免费观看| 国产精品扒开腿做爽爽爽A片唱戏 青青草国产亚洲精品久久 | 婷婷在线综合| 熟女重口味αV| 狠狠操天天日| www.色情五月天.com| 色99网| 伊人大香蕉在线视频| 久久婷婷五月综合啪| 九九激情综合| 欧美三级巜人妻互换| 欧美综合五月丁香六月婷| 婷婷丁香久久网| 五月丁香黄色视频| 99热99成人| 日本不卡一区二区三区| 色婷婷先锋| 色色五月天激情| av九九| 人人爽人人爽人人爽人人爽| 婷婷五月丁香香蕉| 99在线精品视频| AV天堂婷婷五月天| 色五月网址| 天天操屄网| 成人免费视频一区| 26uuu欧美| 丁香五月激情视频在线| 色综合中文色综合网| 五月丁香久久| 99热这里只有精品18| 九九综合网色全集| 国产69久久久欧美黑人A片| 五月婷婷av| 婷婷色色综合| 玖玖色综合网| 婷婷开心久久| 天天日天天添| av免费在线网站| 激情五月综合| 99热国产免费| 激情婷婷五月基地| 草美女在线观看视频在线播放| 婷婷狠狠操| 99色在线观看免费| 激情图片婷婷丁香五月| 婷婷五月综合国产精品| 激情五月婷婷五月| 五月婷婷五月天| 色五月丁香婷婷综合| 97热久久五月婷婷| tingtingcaobi| 婷婷色网站| 五月丁香色婷婷基地| www五月天com| 丁香五月激情啪啪啪啪| 国产又粗又大又爽又黄| 精品久热| 大香蕉久久婷婷精品综合| 开心深爱五月天| 国产免费av在线| 五月天激情小说| 免费AV在线| 久久奄也去色色网站| 久久伦乱| 日韩AV一区二区三区| 五月天精品| 五月天社区| 婷婷五月天激情综合深爱| 99自拍视频网站| 一起操最新网址| 婷婷五月天综合网| 色播播五月天| 婷婷五月天激情文学| 五月婷婷综合视频| 天天搞天天爽| 99综合色| 五月天综合色| 婷婷婷婷婷婷婷婷| 激情六月综合| 久久久久er热| 久久这里有精品视频| 色播五月婷婷综合| 综合久久综合| 思思热久久阴99| 99婷婷国产最新视频| 久久日婷婷| 久久小说| 日韩一级一片内射视频4K| 精品人妻久久久久久| 99九无网码| 精品色色| 97香蕉久久超级碰碰高清版| 超碰免费大香蕉| 思思热这里只有精品| 99热精品在线播放| 五月天亚洲综合网| 深爱激情五月网| 思思热视频在线观看| 国产裸舞表演WWWW| 播四月婷婷六月丁香| 开心五月天激情| 天天综合图片| 婷婷亚洲在线| 深爱激情av| 久久99这里只有精品视频| 天天日人人| 色五月无码| 99热这里只有精品26| 大香蕉手机视频| 久久与婷婷| 久久久激情视频| 玖玖色综合网| 婷婷五月天直播| 欧美激情 日韩无码 婷婷 五月天| 婷婷开心深爱五月天| 丁香五月影院| 久久网站观看免费欧洲国产| 99精彩视频在线观看| 婷婷玉月丁香五月在线视频| 色婷婷五月在线| 伊人久久婷| 综合久久综合久久| 色99色| 国产成人一区二区三区在线观看 | 奇米影视777在线_在线观看午夜_h小视频在线观看_岛国大片 | 国产成人av在线播放| 久久久久婷婷| 亚洲欧美在线观看| 人人草碰| 色播五月婷婷| 先锋av性爱成人电影| 超碰1999| 久久九九免费视频| 色五天综合| 国产探花一片区| 91综合在线视频| 欧洲不卡视频| 婷婷五月深深爱| 五月天综合在线观看视频| 色老久久| 97色婷婷| www.99精品在线| 久久久这里都是精品| 激情综合网,婷婷五月天| 色丁香五月天婷婷| www.五月丁香| 97涩婷婷婷婷基地| 色婷婷五月影视| 丁香综合伊人AV| 久久综合五月天| 久久伊人五月天| 教师性爱毛片| 免费黄色视频网址| 欧美啄木乌丝袜人妻系列| 在线视频激情网站| 色婷婷丁香五月| 五月婷视频在线观看| 综合大香蕉| 天天综合图片| www99热| 一本色综合色| 五月丁香成人网| 丁香五月婷婷欧美成人色图| 五月激情六月宗合| 久久久精品99| 日本噜噜色网| 色色网站| 99狠狠操一| 精品无码色欲AV| 色色亚洲| 成人性生活免费观看。| 国产伊人五月天| 深爱激情丁香五月| 亚洲狠狠爱婷婷| 五月婷婷狠狠干| 婷婷丁香五月天小说| 9九色首页| 五月天久久色| 深爱五月激情网| 日本3级片一区2区| 91熟妇大香蕉| 激情婷婷五月色| 成人av在线电影| 丁香婷婷浪潮AV久久综合| 久久精品性爱视频,| 五月丁香久久| 一级无码作爱片| 婷婷丁香五月久久| 亚洲国产99| www.99热这里精品| 九九在线这里只有精品视频| 天堂美国久久| 97久久香草精品视频| 九九色人| 丁香成人五月天| 日本久久极品| dingxiangtingtingliuyue| 日本人妻伦在线中文字幕 | 思思热热久久| 国产精品久久久久久妇女6080| 一操久久| 激情五月影院| 久久婷婷六月综合综合| 婷婷五月视频| 99re8热精品免费视频| 激情六月丁香综合| 婷婷五月影院| 色五月天中文字幕| 久久久天堂国产精品女人| 亚州色婷婷| 色婷婷激情| 夜色.cnm| 开心五月激情网| 亚洲图色五月天| 五月天激情中文字幕| 狠狠干狠狠色| 五月亚洲激情| 中文幕无线码中文字蜜桃| 天堂爱爱| 欧美性猛交99久久久久99按摩| 色黑鬼导航| 人人摸人人干| 97激情五月天| 第四色色六月色综合| 精品久久久久久久人妻| 五月婷婷综合在线视频| 丁香六月婷婷综合在线| 欲色人妻| 亚韩在线视频| 美女天天艹人人爽| 丰满老熟妇BBBBB搡BBB| 五月婷婷六月激情网| AAA级久久久精品| 天天干-天天日| 大香蕉视频99| 五月婷婷日| 色五月婷婷影院| 五月丁香婷婷色色色| 欧美性爱中文字幕| 自拍偷窥99热| 丁香五月婷婷呀| 亚洲亚洲人成综合网络| 日日操天天| 大香蕉久久久久久久久| 亚洲黄色精品| 99热久久最新地址| 色综合中文综合网| 日韩成人AV在线播放| 99热福利| 综合六月久久| 少妇搡BBBB搡BBB搡毛茸茸 | 丁香六月AV| 久久精品国产一区二区三区四区 | 五月婷婷导航| 亚洲六月婷婷| 久久婷婷五月天综合| 99精品偷拍视频| 丁香五月成人网| 中文字幕av在线| 五月天社区| 五月天婷婷开心| 综合久久伊人| 久综合网| 五月婷婷草| 91爱操| 丁香六月色香蕉视频| 丁香五月天堂婷婷| 91碰在线| 我爱婷婷五月天综合88| 黄久久久| 中文字幕在线免费看线人| Www.狠狠| 无码四色色色| 色色丁香婷婷五月天| 激情五月激情综合网| 五月天色色激情综合| 久久婷婷综合五月| 色婷五月丁香久亚洲| 大香伊人婷婷影院| 99热这里只有精品8| 玖久精品视频9| 精品女人九九九| 婷婷丁香五月综合| 思思久久99| 五月丁香色色综合| 丁乡久久| 蒲京久久无码视频| 欧美性丁香色色五月天干干| 67194中文字幕| 狠色狠色狠狠色综合网| 六月婷婷综合久久| 偷拍丁香九月激情| 五月婷婷六月天| 婷婷五月天网| 天天舔天天摸天天透| 丁香六月激情| 色婷婷小视频| 色婷五月天| 久9久9久9久9久9久9| 天天干天天 亚洲| 91超碰在线观看| AV片在线观看| 图片区 小说区 区 亚洲五月| 五月色婷婷中文字幕| 操操操操操电影网| 久热这里只有精品在线观看| 爽极品色| 99超碰人人| 97成人丁香| 99热日本| 超碰狠狠操| 思思热视频在线观看| 五月丁香六月婷婷色| 精热在线综合网| 色天堂97| 五月天丁香欧美激情| 8090在线影视少妇| 午夜色婷婷| 99色免费观看全部| 久久久999精品| 五月丁香777| 九九热短视频在线观看 | 九九成人电影婷婷| 免费看欧美成人A片无码| 欧美日韩123| 思思热久久爱| 先锋av性爱成人电影| eeuss人妻| caop在线| 玖玖色综合网| 久久婷婷五月综合伊人| 大香蕉中文| 性爱七区| www.久久久久久| 99视频在线看| 五月激情婷婷国产精品久久久久久| 无码AV大香线蕉伊人| AV片一区在线观看| 色青青电影色五月| 色.五月综合网| 在线看片h站| 极品人妻VIDEOSSS人妻| 成人精品视频99在线观看免费| 97色婷| 丁香五月成人网| 激情综合网五月婷婷| 99亚洲视频| 五月丁香婷婷导航视频| 亚洲情色一区| 99在线精品观看99| 99超级碰免费视频| 日韩在线看AV| 亚洲无码www| 亚洲无码yw| 婷婷九月亚洲| 九九热这里只有精品23| 青青草原中文字幕| 伊人丁香花综合影院| 免费观看的AV| 99精品小视频| 香焦网五月天| 五月丁香六月| 婷婷色影音天| 大香婷婷| 91精品久久久久久久| 天天操夜夜啊| 色婷婷五月天综合网| 伊人久久五月天综合| 久久婷婷五月| 婷婷久久网| 国产高潮A片羞羞视频涩涩| 国产精品成人AV在线观看春天| 91嫩草国产线观看亚洲一区二区| 99视频极品在线香蕉| 色欲久久久久久综合网综合网| 9久热| 婷婷视频在线碰| 99精彩视频在线观看| 影音先锋男人资源站一区二区| 色9999日韩国产| 99re在线观看视频| 天天综合亚洲| 99热在线观看| 日韩人妻AV在线| 国产综合81p| 五月天色色色| 1010日日无码| 五月天丁香网站| 日韩无码专区| 日韩免费99| 五月天无码| 五月婷久久在线| 九九99热| 色婷青青| 色伊人婷婷| 91人人妻人人操| 成人欧美日韩| 性色视频| 天天射影院| 91伦| 五月丁香久久网| 26uuu精品国产| 国产成人网址| 好大好粗嗯啊-一级黄色大片免费观看-成人AV| 激情综合区| 夜夜噜夜夜奇| 婷婷丁香五月亚洲| 亚洲AV永久无码影院黑人| av中文在线| 热成人网| 欧美性生交A片免费看| 日本97在线| 日日噜噜久久婷婷五月天 | 久久激情天堂| 亚洲六月色| 欧美婷婷丁香五月社区| 天天日,天天插| 少妇人妻偷人精品无码视频新浪| 婷婷综合网性| 伊人午夜综合色啪| 99操逼| 97人人操| 丁香六月五月天| 久久精品99国产精品日本| 色哟哟www| 蜜桃五月天| 99这里有精品视频| 99色综合网| 激情丁香六月| 久久99人人| 色狠狠999综合网| 猫咪伊人久久| 丁香婷婷久久综合在线| 草榴视频网| 99爱精品视频| 99热在线观看| 五月丁香激情五月天| 91一起操| 丁香五月区| 五月丁香婷婷综合视频| 超碰人人摸人人操| 丁香五月天欧美| www.婷婷| 久久这里精彩免费在线观看| 99re视频在线播放| 久久婷丁香五月| 亚洲va欧美va天堂v国产综合| 99人妻碰碰久久久禁片| 久色视频首页| 成人精品视频99在线观看免费| 综合亚洲六月婷婷在线| 大香蕉婷婷五月天| 蜜臀av粉嫩av懂色av| 激情婷婷丁香| 日本WWW九九九| 99久久网站| 亚洲欧美国产A片免费观看| 99热这里只有精品搜| 五月婷婷色色爱| 五月丁综合在线观看| 99热思思| 玖操97| 久久99热网| 第四色婷婷最爱| 九九热最新| www.色窝| 涩丁香| 婷婷色情小说| 人操91在线| 丁香五月偷拍| 丁香 久久| 操操自拍| 婷婷亚洲综合| 激情婷婷| 久久这里只有精品16| 久久性综合| 夜夜操激情| 97人妻碰碰碰久久| 婷婷五月香蕉| 色婷婷五月天av在线| 色99在线| 五月婷婷激情刺激| 第九色区av天堂| 日日操日日干| 国产99久9在线| 久99视频在线观看| 五月丁香A片| 婷婷五月丁香五月| 26UUU精品一区二区c〇m| 久热A片| 亚洲色视频| 91视频一起草| 久久精品99国产精品日本| 激情婷婷五月天在线观看| 五月做爱| 五月天开心色情网| 狠狠干2007| 99re资源在线视频导航| 丁香五月天视频| 国产67194| 99精品偷自拍| 五月伊人婷婷| 五月丁香啪啪综合| 极品人妻VIDEOSSS人妻| 婷婷五月六月| 亚洲激情网| 亚洲V国产V欧美V久久久久久| 精a品a| 九九热99视频| αv中文字幕在线观| 六月丁香VA| 久久九九怡红院| 五月激情四射网站| 久久婷丁香五月| 欧美性丁香色色五月天| 五月婷婷七月丁香| 激情丁香五月婷婷| 日本五月天婷婷丁香| 五月开心婷婷极品激情| 天堂久热| 91久久久久久| 成人婷婷五月天| 国产九九一区二区三区| 国产精品a无线| 人人爽天天爽| 人妻久久久久久久久妻久久久久| 色婷婷AV在线| 色伊人91在线视频| 岛国av网站| 五月深爱婷婷| 天堂色婷婷| 九九综合影音先锋| 久久这里只有精品8| 99热这里只有精品最新网址| 120分钟婬片免费看| 五月婷婷色色| 婷婷综合色图| 99热久草| 色欲Av五月天| 色色爽爽天天| 婷婷五月综合免费在线| 99视频只有精品| 亚洲网视屏| 天天日天天干天天天| 激情综合网之激情五月| 偷拍91九色| Www.久久| AA片在线观看视频在线播放| 99精品自拍| 久久久久久久人妻| 婷婷六月天亚州| 性色欲情 网站| 欧美日韩五月婷婷| AⅤ在线播放网| 中文成人在线| 五月婷婷天| 九九热10| 国产午夜一区二区三区| 好好干av| 亚洲无码成人性爰网| 久久九九99| 日本成人综合| 99九九免费精品| 91碰碰视频在线观看| 熟女人妻一区二区三区免费看| 草草操操| 久99久视频| 久久色五月天| 天天日天天干天天爽| 99色看| 五月婷婷免费| 五丁香激情综合| 精品在线| 狠狠色狠狠干| 日日骑夜夜撸| 激情AV| 色色综合网站| 色色五月丁香婷婷| 99日本在线| 日熟女| 91青娱乐青青草| 色婷婷影| 国产精品人妻在线网址| 99丁香五月婷| 五月丁香啪综合| 在线资源av-超碰中文在线-成人AV| 視频福利乱色| 久久超级碰视频| 五月丁香婷婷激情四射迷人| 玖玖婷婷色| 热久69| 海外网站专业操老外| 一级性感毛片| 激情爱爱网站超大免费| 9l视频自拍9l视频自拍九色学生| www.婷婷,com| 婷婷五月丁香六月| 97人人干| 激情五月天婷婷免费观看| 天天爽天天弄| 婷婷夜夜夜夜| 五月深爱激情网| 综合久久99| www.五月天婷婷| 影音先锋一区| 亚洲激情综合| http:色情日本com| 婷婷操无码| 超级碰碰碰久久网站视频| 色婷婷91| 97干欧美| 丁香五月天激情婷婷丁香六月 | 国产毛片精品一区二区色欲黄A片| 91综合在线| 国产精品久久久久久久久久免费 | 黄色录像网点| 视频在线免费观看欧洲乱码| 六月婷婷色色色| 色一情一乱一乱一区91| 99成人网站| 少妇人妻凹凸视频| 天天插,天天射| 欧美色色色色色| 久久ww| 丁香五月综合网| 丁香五月综合激情性爱 | 综合网亚洲| 婷色五月| 屁股翘好撅高迎合跪趴| 奇米影视777在线_在线观看午夜_h小视频在线观看_岛国大片 | 六月婷婷色色色| 99re这里| 丰满少妇猛烈A片免费看观看| 综合爱久久| 四色永久成人网站| 久久五月丁香综合17C| 五月丁香婷婷综合| 婷婷五月天影院| 毛片九九九九九九九九18| 婷婷色啪| www。五月天。com| 夜夜爱网站| 超碰99在线观看| 91人人人人人人人| 亚洲精品成人| 丁香五月婷婷激情中文| 国产成人AV在线| 五月停停激情网| 五月伊人网| 欧美内射AAAAAAXXXXX| 9久操| 久er免费视频| 成人精品99| 三级三久久线久久99久目本WW| 国产毛片精品一区二区色欲黄A片 99国产在线精品视频 | 91色婷婷综合久久中文字幕二区| 亚洲人操亚洲人| 在线另类| 播四月婷婷六月丁香| 色色射| 色播五月丁香综合| 99热久只有精品首页| 伊人五月综合网| 办公室少妇激情呻吟A片在线观看| 久久大香蕉伊人| 狠狠人人| 成人视频一区| 婷婷天天五月天| 人人干人人干骚美女| 久久婷婷视频| 97超碰,人人舔,人人操,人人摸| 五月婷婷深深爱| 99国产性感视频| 久久久久久久人妻| 亚洲AVDVD| 久久婷婷亚洲五月天| 激情综合网五月激情| 亚洲人成网站999久久久综合| 五月婷婷综合激情| 影音先锋一区| 青青久久91| 先锋资源996| 九九精品热| 人人搡人人| 色久综合天天做视频| 婷婷色影院| 激情婷婷在线中文字幕| 五月天色丁香| AV成人在线网站| 国产xxxxx在线观看| 91碰碰视频| 超级97碰碰| 久久久人人人妻丝丝丝| 久久思思热| 大香蕉久| 色综合色综合网| 成人AV网站在线| 丁香五月综合亚洲| 精品国产AV色一区二区深夜久久 | 六月婷婷天天操夜夜爽视频| 99精品一二三四视频| 五月婷婷亚洲综合在线 | 色播六月| 色婷婷激情| 亚洲中文字幕AV| 日本色五月| 九九热99在线视频| 免费视频这里只有精品| 国产古装妇女野外A片| 九九热自拍| 可以免费观看的av| 色吧五月婷婷| 97人人妻人人艹| 办公室少妇激情呻吟A片在线观看| 97影院一级片| 五月香六月婷| 色综合九九| 噢美99| 婷婷丁香五月激情图片| 蜜桃五月天| 久久男人网婷婷| 影音先锋 91工厂| 超pen个人视频97| 思思99精品视频在线观看| 99色色视频| 如何安全看伊人婷婷| 五月丁香六月婷婷激情网| 97性高潮久久久| 丁香色婷婷五月天| 中文字幕欧美久久| 美欧日韩国产成人在战| 色婷婷久久综合| 天天肏夜夜肏| 色九月| 色五月亚洲| 激情五月丁香色婷婷| 噼里啪啦在线观看免费完整版视频| 婷婷舔| 成人免费黄色短视频| 天天射影| 亚洲精品字幕| 中文不卡一二区| 丁香五月婷综合| www.夜夜操| 国产免费AV在线| 五月婷婷综合在线| 狠狠色丁婷婷日日,伊人激情综合网| 人妻体体内射精一区二区| 婷婷五月天激情影片| 日本nghangse中文字幕| 久久婷婷内射| 激情小说五月天社区丁香| 91超级碰碰| 婷婷亚洲在线| 久久天堂色| 激情婷婷久久| 狠狠狠狠免费| 六六久久黄色| 色综合丁香婷婷| 丁香五月1页| 国产精产国品一二三在观看| 婷婷色正月| 久热99热| 内射人妻视频国内| 另类综合婷婷五月天欧美视频| 4438成人电影| 五月香婷婷| 五月好婷婷| 色玖玖玖| 99热91| 99日韩网站| 婷婷五月天堂| 国精产品一区一区三区免费视频| 色色色色色色97| 99热精品观看| 国产精品VIDEOSSEX久久发布| 丁香五月婷婷激情蜜桃| 精品久久久999| 五月花丁香婷婷| 婷婷五月丁香综合| 免费无码毛片一区二区A片| 色婷久久| 色五月之第四色| 婷婷五月开心六月AV| 99国产在线| 丁香社区婷婷五月| 亚洲综人色综网| 99九九这里有免费视频| 9l视频自拍9l九色9l成人| 激情丰满熟妇五月| 偷拍91九色| 婷婷五月色播天| 色射影院| 色色色色色色97| 99性视频| 丁香五月婷婷香| 久热91| 五月天播播| 另类综合激情| 97干免费视频| 色色综合网。| 欧美性爱五月天| 五月天色区| 五月丁香六月婷婷在线小说视频| 日本天堂爱爱| 99操九九网| 久久怡红院| 激情五月天婷婷五月天| 天天干狠狠操| 99精品热视频| 激情五月婷婷丁香综合网| 色婷婷影院| 123草逼网| 伊人五月成人| 九九热这里精品| 在线观看免费狠狠色丁香香综合| 五月色情精品| 国产做爰视频免费播放| 97碰在线| 婷婷开心激情| A√天堂网在线| 丁香蜜臀黄色婷婷五月天| 九九热视频精品999| 久久xx| 激情丁香婷婷| 激情婷婷五月天| 五月丁香六月婷婷网站| 蜜臀A∨在线水帘洞| 日本三级韩三级99久久| 高清国产一级婬片a免费| 午夜伊人大香蕉| 婷婷香蕉| 色99网站| 色色色婷婷五月| 丁香五月婷婷影院| 五月婷婷开心亚州在线| 亚洲熟妇AV综合网五月丁香伊人| 五月天丁香网| 久青操| 99综合自拍| 无码一级片| 色综合77777| 日本人人超碰| 强壮公让我夜夜高潮A片视频| 99热官网| 五月综合色| 久久99网站| 色婷婷9| 日日爽日日爽| 亚洲欧美另类在线23p| 九九亚洲小视频| 精品九九视频| 五月婷成人网| 五月丁香婷婷久久| 99区视频| 99视频超级精品| 丁香五月色| 超碰人人色| 色色是色N一| 99,色| 五月婷婷激情四季| 五月婷婷开心亚洲无| 亚洲小视频免费看| 99色区| 日本 欧美在线| 丁香婷婷网| 欧美日韩99| 天天搞夜夜叫| 久久色五月天| 日韩婷婷五月天| 丁香五月丁香伊人| 激情五月婷婷丁香综合网| 96五月丁香熟女| 激情综合网五月天天| 玖玖精品资源| www夜夜操wwwcon| 亚洲热视频在线| 五月婷婷激情综合av| 99久久99久久| 五月丁香婷婷在线| 日韩成人网址| 99精品国产在热久久| 九久久婷婷| 色婷婷四虎| 九九九午夜视频| 九九久久五月天| 99re6热在线精品视频播放速度| 思思99精品视频在线观看| 狠狠干总合| 可以直接看的AV| 亚洲熟妇无码乱子AV电影| 五月丁香六月婷婷久久| 色综合色色| 五月天操逼激情| 成人短视频免费| 久久一级片| 任你草| 五月婷人妻| 五月激情小说网| 色婷婷88| 亚洲精品V天堂中文字幕| 久久婷婷五月综合色欧美| www.激情com| 91超碰人人操| 3p日韩网站视频| 五月亚洲| 第五色婷婷| 亚洲成人AV高清字幕| 国产一区18| 婷婷伊人| 丁香五月激情婷婷| 九九在线视频| 丁香婷婷色九月| 婷婷97狠狠成人网站| 国产九月婷婷| 亚洲AV成人精品日韩在线播放| 99在线观看这里都是精品| 日韩AV大全| av九九| 97色综合视频| 成人短视频在线| 互月天综合| 午夜爱爱网站| AV大片在线播放| 亚洲无码成人网| 婷婷五月丁香基| 99热这里只有精品8| 国产精品久久久久久久久久| 五月丁香花激情啪啪网| 俺来也综合网精品一区| 五月婷婷欲色| 久久六月综合| 丝袜熟女一区二区三区| 久久只有精| 六月婷婷在线| 天天干,夜夜爽| 色五月婷婷伊人| 丁香五月日本| 操操自拍| 亚洲传媒在线观看| 国产亚洲色婷婷久久99精品91| 五月天婷婷在线播放免费| 六月激情婷婷| 涩涩婷婷五月| 天天综合图片| 天天干天天日天天操| 黄色AAAAAAA| 伊人日日干| 欧美影院婷婷| 91日综合欧美| 99爱免费在线观看| 丁香九月婷| 91九九热| ji'qing'luan'ren'lun| 亚洲婷婷91丁香| 婷婷香蕉视频| 天色综合网站| 五月天婷婷社区| av成人在线播放| WWW.99热| 久久曰曰| 五夜婷婷| 五月丁香色六月激情干大屄| 色情终和网| 丁香五月婷婷激情小说| 激情图片婷婷丁香五月| 亚洲综合色成丁香五月色| 欧美色色色色色色色色色色影视| 久碰婷婷视频| 色综合久网| 精品人妻久久久久久久| 婷婷五月丁香91| 99综合| 超碰色综合| 99在线免费视频播放| 激情五月婷婷在线区| 99精品国产热久久91色欲| 亚洲超级碰| 深爱1激情网| 成人丁香婷婷| 日本va网站| 99热91| 欧美激情综合| 五月婷啪| 欧美色图天堂网色| 婷婷亚洲欧美丁香五月| 一级黄在线| 天天日天天摸天天| 五月丁香六月欧美综合网站| 色域五月婷婷丁香| 91婷婷搞| 97五月天婷婷综合激情网| 激情婷婷六月天| 在线中文字幕免费视频| 婷婷五月婷婷五月| 日本婷婷激情四射中文字幕在线观看| 精品久久人妻热| 狠狠综合| 永久思思热在线| 泰州成人视频| 人妻熟妇国产精品| 99热色精品| 六月婷婷天天操夜夜爽视频| 亚洲日日日| 欧美色图天堂网| 色色色色色网| 7777激情基地| 91婷婷在线| 最新久久网址| 色五月天激情| 婷婷丁香五月综合| 99久视频| 五月激情五月丁香| 久久婷婷伊人| 天天干天天干天天干天天干天天干天天| 久久xx| 操日本人妻视频| 草草色情综合网| av性爱网站| 97五月久久丁香婷婷| 亚洲av日韩无码| 色五月婷婷中文字幕在线观看 | 九一牛视频探花| 九九色综合九九色| Www99热| 色综合久久88色综合天天99| 婷婷她六月天| 91碰碰| 久久这里只有国产视频| 五月婷婷黄色毛片| 五月天激情四射网站| 丁香婷婷人妻| 成人综合网站| 六月久久狠狠| 日本天堂免费99| 97人人干| 婷婷五月 丁香六月| 久久A极片| 偷拍五月丁香| 中文资源在线a| 天天爽天天操| 天天精品视频在线观看视频| 天天综合91入口| 五月丁香精品| 五月婷婷激情四季| 五月激情婷婷偷拍| 色色色色网站| 亚洲性受XXXX五月丁香| 亚洲精品久久久久久久久久飞鱼 | 99精品在线观看| av网站中文| 91人操| 亚洲中文字幕在线观看| 99在线精品免费视频| 中文无码婷婷| 亚洲爆乳无码精品AAA片蜜桃| 夜夜撸天天操| 色婷婷五月在线| 久久99久久99精品免视看婷婷| 这里只精品热在线18| 久久永久视频| 无码少妇高潮喷水A片免费|