日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

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è)羊”這類(lèi)消除游戲因其規(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ù)棧不依賴(lài)任何游戲引擎完全通過(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ì)遮擋下層的卡牌??ㄅ祁?lèi)型有多種圖案的卡牌相同圖案的卡牌可以消除。消除規(guī)則玩家需要點(diǎn)擊選擇卡牌將其移入屏幕下方的“待消除槽”。當(dāng)槽內(nèi)出現(xiàn)三張相同圖案的卡牌時(shí)這三張卡牌會(huì)被消除騰出槽位??捎眯耘袛嘀挥刑幱谧钌蠈忧椅幢黄渌ㄅ普趽醯目ㄅ萍纯梢?jiàn)卡牌才能被點(diǎn)擊選中。游戲狀態(tài)當(dāng)所有卡牌被消除游戲勝利當(dāng)“待消除槽”被填滿(mǎn)且無(wú)法構(gòu)成消除時(shí)游戲失敗。基于這些規(guī)則我們需要設(shè)計(jì)幾個(gè)核心的類(lèi)模型來(lái)承載游戲狀態(tài)。1.2 核心模型類(lèi)設(shè)計(jì)我們將創(chuàng)建三個(gè)核心模型類(lèi)Card卡牌、Layer圖層和GameService游戲邏輯服務(wù)。Card類(lèi)代表一張卡牌是游戲世界中的最小單元。屬性卡牌的唯一ID、圖案類(lèi)型、坐標(biāo)位置、寬度高度、是否被選中、是否已被消除。方法判斷鼠標(biāo)點(diǎn)是否落在卡牌區(qū)域內(nèi)、繪制自身。Layer類(lèi)代表一個(gè)圖層管理一組按特定布局堆疊的Card。屬性圖層名稱(chēng)、圖層坐標(biāo)、行數(shù)、列數(shù)、卡牌間隔、本層所有卡牌集合。方法初始化本層卡牌設(shè)置坐標(biāo)、判斷某張卡牌在本層是否“可用”即上方無(wú)其他卡牌遮擋、繪制本層所有卡牌。GameService類(lèi)游戲的大腦負(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)與依賴(lài)本項(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包存放上述核心模型類(lèi)。view包存放游戲主窗口和繪制相關(guān)的類(lèi)。util包存放工具類(lèi)如圖片加載工具。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)加載器來(lái)讀取這些資源。2.2 實(shí)現(xiàn)工具類(lèi)與主窗口框架首先實(shí)現(xiàn)一個(gè)簡(jiǎn)單的圖片加載工具類(lèi)避免在業(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ì)的核心模型類(lèi)。3.1 實(shí)現(xiàn) Card 類(lèi)Card類(lèi)除了存儲(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; // 圖案類(lèi)型如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 類(lèi)Layer類(lèi)負(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)的卡牌類(lèi)型數(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è)圖案類(lèi)型 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 類(lèi)這是游戲邏輯的核心它串聯(lián)了所有模型并處理用戶(hù)交互。// 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)行撤銷(xiāo)等操作此處略過(guò)。 } private void moveCardToSlot(Card card) { if (slotCards.size() SLOT_CAPACITY) { // 槽已滿(mǎn)理論上不應(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)滿(mǎn)足條件的卡牌。 */ private void tryEliminateInSlot() { // 按卡牌類(lèi)型分組 MapInteger, ListCard typeMap new HashMap(); for (Card card : slotCards) { typeMap.computeIfAbsent(card.getType(), k - new ArrayList()).add(card); } // 查找是否有某種類(lèi)型的卡牌數(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; } // 失敗條件槽已滿(mǎn)且無(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類(lèi)補(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類(lèi)游戲窗口應(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ú)法消除的卡牌填滿(mǎn)時(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的勝利條件槽滿(mǎn)且無(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 圖片加載失敗窗口空白或拋出異常現(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或類(lèi)似資源目錄。在ImageUtil類(lèi)的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??ㄅ茽顟B(tài)錯(cuò)誤檢查被點(diǎn)擊的卡牌isEliminated()和isSelected()狀態(tài)是否均為false。5.3 卡牌消除邏輯異?,F(xiàn)象槽內(nèi)已有三張相同卡牌但未消除或消除后卡牌位置錯(cuò)亂。排查類(lèi)型匹配確認(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)象卡牌已清空但未勝利或槽未滿(mǎ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)撤銷(xiāo)功能在GameService中維護(hù)一個(gè)操作棧記錄每次移動(dòng)卡牌的操作卡牌ID從哪層移到槽。實(shí)現(xiàn)一個(gè)撤銷(xiāo)按鈕或快捷鍵將槽中最后一張卡牌移回原處。洗牌/提示功能當(dāng)玩家無(wú)牌可消時(shí)提供“洗牌”功能隨機(jī)重排當(dāng)前可用卡牌位置或“提示”功能高亮一組可消除的卡牌。關(guān)卡與難度設(shè)計(jì)多個(gè)關(guān)卡每關(guān)使用不同的圖層布局、卡牌類(lèi)型和槽容量。將關(guān)卡數(shù)據(jù)圖層定義、卡牌類(lèi)型配置在外部文件如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的角色。可以進(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)目及其依賴(lài)本例無(wú)外部依賴(lài)打包成一個(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
返回資訊列表
啊啊啊啊操死我| 久久久久久久久久久久97| 日韩性爱毛片操骚逼| 麻豆天美在线| 99re综合伊人| 性色国产东北露脸精品视频| 日韩精品一二三四| 色婷婷香蕉| 亚洲一区二区久久久久| 国产精品午夜福利视频| 操人妻逼91| 日韩三级一区 | 激情五月天网| 无码乱人伦中文视频| 亚洲人成网站7777| 999久久久国产精品| 综合欧美日韩在线| 色第一页| 91九九九馒头| 色欲人妻一区二区在线| 玖玖爱一区在线| 厕所偷拍在线| 亚洲av在线免费观看| 精品一区二区综合熟妇| 欧美精品久久久久久久久88| 26UUU欧美激情一区二区| 18禁无码永久免费无限制| 国产视频人人网| 超碰色综合| 白丝av| 色九久| 久久久偷拍| 啊啊啊啊,啊啊好多水| 色娱乐色呦呦夜夜夜夜av| 91亚洲综合| 黑人精品欧美一区二区蜜桃| 亚洲熟女综合网| 中文字幕人妻丝袜乱一区三区| 97久久国产亚洲精品超碰热| 中文字幕一区二区三区蜜桃视频| 伦理第一页| 精品人妻15区| 91亚州| 国产亚洲色停停久久99精品91| 99久久99久久免费精品蜜臀| 一本色道无码DVD中文字幕| 蜜臀99久久国产| 福利视频网站| 国产 日韩 欧美高清| 密乳无码| av资源在线播放天堂| 调教熟妇 久久久久久| 婷婷久久综合| 日韩成人午夜精品久久高潮| 五十路熟女工口 | 亚洲色图亚洲无码强奸乱伦| 成人性爱全视频观看| 泰国AV在线观看| 久久精品一区二区三区不卡| 97干天天| 五月天AV资源| 999久久久免费精品国产牛牛| 久久久久久久伊人精品| 五月丁香激情综合网| 久肏视频字幕| 高清无码一区二区三区| 啊啊啊啊嗯嗯嗯用力好爽| 极品尤物女神在线观看| 久久无码电影| 欧美人妻精品一区二区| 色欲蜜臀AV| 青青三级视频| 日本人妻天堂网站在线播放| 婷婷情色综合网| 福利在线黄片| 亚洲黄色| 99re国产中文字幕| 国产精品久久久久久亚洲色欲| 国产精品分类在线观看| 国产资源中文字幕在线| 日韩九区| 任你干在线视频| 91殴美| 天天影视网色欲色香| 韩国午夜理伦三级好看| 大胆91| 美女诱惑在线一区| 午夜啊啊啊| 色色九区| 亚洲九区| 欧美gv在线观看| 日本午夜久久电影| 伊人97超碰| 9.1小视频| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 日本福利社| 97一本大道亚洲一区| 97精| 日韩精品国产一区二区| 超碰78| 超碰91在线| 久日综合网| 精品无码久久久久久久杏吧| 淫妻综合网| 四虎影视永久在线观看精品免费网站| 国产成人亚洲精品无码最新在线| 人人摸人人添人人操| 啪啪啪精品视频| 久久久久久久久久黄色网| 日本乱人伦片中文三区| 亚州男人天堂| 综合久久久久久久综合网| 天天综合网国产| 春色91| AA丁香综合激情| 97操综合| 夜夜草网站| 色天堂在线观看| 亚洲精品国产日韩无码AV永久免| 69综合网| 岛国毛片在线观看免费| 超碰97久久国| WWW黄片COM| 亚洲日韩资源| 蜜桃臀 后入 一区 二区 三区 在线| 国产精品久久久久久久久久久久久久吹 | 天天日天天干天天操| 伊人久久88国产女| 天天综合网网欲色| 成人久久无码www| 欧美岛国精品在线观看| 4141514逼喷水三级片| 国产精品日本无码A片| 中日韩久久人妻一区二区| 超碰97久久| 美女在线H91| 国产1024在线播放| 免费看久久久性性| 精品欧美乱码久| 色老汉玖玖爱| 尤物黄色在线观看网站| 97久操| 夜夜草天天| 粉嫩AV一区夜夜嗨| www.99色| 精品高清一区二区三区三州| 中文字幕无码不卡啪啪| 蜜桃久久久久久| 欧美成人A√在线一区二区| 天天天乱色综合全| 黄色av片三级三级三级免费看| 福利视频一区二区微拍| 超碰在线一区| 亚洲骚男同com| 欧美亚洲国内自拍| 日本在线不卡v二区| 九九热国产| 91成人在线| 大香蕉五月天| 欧美一级久久久丰满| 天天日天天干天天摸天天操| 精品国产污一区二区三区| 婷婷丁香五月天综合东京热| 最新亚洲黄色免费电影 | 国精精品无码一二三区水多多| 亚洲色综网| 夜夜操91744565| 天天色播亚洲综合网站| a片偷拍视频| 国偷自 一区二区| 超碰久久中文| 日本国产成人亚洲精品无码| 国产一区自拍欧美日韩| 欧美v亚洲v综合v国产v妖精| 欧美日韩不卡传媒| 国产白丝网站| 懂色av中文字幕一区二区三区天美 | 日韩 女同 综合| 一区二区三区日韩欧美| 五月婷婷色色| 在线v中文字幕一区二区三区| 中文字幕日韩专区精品系列| 中国一级αV| 超碰97伊人| 色天堂在线观看| 熟妇视频一区二区三区在线观看| 六月天婷婷| 国产精品麻豆视频网站| 黑人精品一区二区在线播放| 欧美亚洲激情| 91亚洲欧美激情| 色哟哟精品1精品2| 成人黄页| 色拍偷亚洲| 国产精品suv一区| 人妻精品综合中文字幕在线 | 五月丁香社区婷婷日韩欧美精品影院 | 中文字幕青青草| 操淫穴亚洲五月丁香| 熟女欧美日韩综合婷婷| 99国产在线绯色一区| 天天日天天插| 久热99| 日韩av乱伦| 成人美女av| 国产色精品午夜大片| 91深夜夜| 99精品久久久久久久婷婷| 久久综合资源一区二区| 色五月激情综合网| 五月丁香网站| 色呦呦、国产精品| 欧美少妇第一页| 日韩/97| 射丝袜高跟鞋99| 色情亚洲日本成人| 欧洲自拍色图gif在线| 在线免费试看60秒| 夜夜国自区| 久久久久九九九九九| 日韩成人人妻网站| 啊啊啊啊好疼| 精品91| 国产中文字幕在线点播| 日韩av在线免费网站| 日韩黄色一区二区三区| 国产亚洲人妻综合日韩 久久| 亚洲色吧网| 高清不卡一二三区视频......| 日han少妇无码| 97精品国产精品免费观看| 中文字幕伊人| 久久精品国产亚洲av水密被窝| 久久久96| 日本Xx性爱| 99综合| 中文字幕在线观看网页| 夜夜青青无码影院| 性爱网站一区二区| 五月丁香婷婷啪啪| 97超碰色屌| 欧美丝袜美女电影一二三四区| 国产精品农村妇女精品| 激情五月综合开心五月| 国产一区二区视频在线播放| 成人精品视频一区二区| 亚洲精品久久久久久| 日韩在线观看三级电影| 黄色性爱网网| 亚洲自拍欧美国产首页网曝| 啊啊啊啊免费视频| 精品中文字幕第一页| 爽 好舒服 无码刺激久久| 性色一线| 麻豆AV一区二区天美传媒| 日韩高清黄片| 天美国产精品| 久久网亚洲| 亚洲āv网址在线观看| 大香网站| 夜色97| 中文字幕av亚洲精品| 成人免费在线网站| 伊人网在线观看| 国产精品久久久久9999小说| av在线观看不卡网站| 99热精品在线观看| 日韩国产九九精品一区二区三区毛片| 丁香九月婷婷| 欧美激情五月天| 热的中文 热的有码 热的国产| 国产精品久久久久久久久久久久| 99精品成人免费看| 久久久草草精品| 精品成人动漫一区二区| 干B| 欧美激情久操网| 综合五月婷婷| 国产一区二区精品久久久不卡蜜臀| 亚洲成aⅴ人片不卡无码| 欧洲天天在线| 国产高清成人免费视频| 六月色婷婷| 蜜桃传媒视频第一区入口在线看| 国产亚洲日韩在线三区黑人| 白 大 人妻 区 在线| 伊人天天久久动态图| 99热精品免费| 91女日逼| 久热99| 欧美九九九| 久久久中文| avav青青草久久夜| 欧美一级色| 国产精品一区二区麻豆| 综合久| 亚洲做性| 99热综合| 少妇厨房愉情理伦片bd在线观看| 97精品视频免费| 99久国产精品午夜性色福利| 大香蕉色欲AV| JIZZJIZZ国产精品喷水| 日韩精品午夜操呦呦不卡影院| 国产激情视频在线观看| 四虎在线视频| 蜜臀久久99精品久久综合| 欧美亚洲情色| 美女淫穴| 婷婷五月天激情网| 91高清欧美| 亚洲 日韩 欧美 国产综合体| 白丝AV| 夜夜高潮夜夜爽高清视频一| 亚洲第一精品在线视频| 91成人精品| 先锋精品av色鲁| 精品免费视频国产一区| 黑人干亚洲| 久久色情| 国产一区在线观看无码AV| 亚洲天天精品| 91久久精品国产| 激情熟女12P| 欧洲亚洲人人爽爽视频| 亚洲,欧美,春色,另类| 日本大片日本一区二区免费高清 | 九色PORNY9l原创自拍| 96精品久久| 欧美性,亚州色| www.av在线视频| 丝袜加勒比| 四虎AV无码| 欧美丝袜制服久久| 日日爱99| 精品一区二区2| 素人美腿视频网站| 欧美网站免费| 男女猛烈无遮掩视频免费软件| 亚洲999综合| 首页亚洲国产高跟丝袜诱惑视频| 欧美性91| 日韩ab网 | 夜夜嗨一区二区| 精品人妻av在线播放| 日夜精品| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 91社操逼| 91香蕉国产尤物视频| 妇人噜噜| 日韩99999色| 国产高清成人传媒影视| 亚洲欧美自拍偷拍| 久久亚洲中文字幕视频| 特污精品女优骚货黄色视频在线免费观看| 97视频在线免费看| 69人妻精品一区二区绯色| 国模不卡| 国产精品呦一区二区三区| 91在线视频国产网站| 日韩不卡码| 91狠狠综合久久| ,成人免费啪啪视频| 97超碰这里只有精品| 午夜天堂精品久久| 射丝袜高跟鞋99| 婷婷色婷婷| 日本国产欧美高清在线| 1769成人国产精品视频| 九九九九九九视频免费| 男人天堂2030| 亚洲欧美综合图片| 天天欧美97| 2019亚洲男人天堂| 少好三P| 精品国产乱码久久久兰草影视| 国产白嫩精品久久| 殴美综合色88| 91超碰碰在线| 中文久久96| 96国产污污污丝袜| 日日噜噜夜夜久久亚洲一区二区| 欧美精品双插| 激情网色| 成人性爱高清视频免费看| 久久社区一区二区三区| 欧美十八禁导航成人| 性爱免费视频成人| 免费啪啪一级视频| 国产精品99久久久www| 国产亚洲中文不卡二区| 黄片无码在线制服| 99国产人成精品| 97超碰69| 国产精品久久久久久久久久久久久久久久久久| 欧美色图亚洲特色| 91爱看| 疯操AV| 无码二级三级| 国产无码三级视频在线观看| 曰韩操B| 欧美性爱中文字幕无线码| 黄在线| 日本九九九九| 免费的av网| 久久久国产精品人妻丝袜| 色老牛| 久久超碰天天| 成年人免费观看网站| 精品二999| 91欧美www| 欧美黄色手机在线观看| 亚洲AV永久无码一区仙野| 99国产人成精品| 中文字幕在在线观看网站| 亚州综合图片| 变态综合色| 日韩黄片影院| 桃色五月天| 天堂国产AV| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 亚洲操人| 日韩传媒在线| 九九热re99re6在线精品| 午夜精品一区二区三区三上悠亚| 91在线丝袜视频| 精品少妇99| 日逼视频日本| 白丝1区2区3区| 任我爽在线视频免费观看| 久久无码精品| 91干熟女| 中文字幕AV片| 超碰在线人人射| 性爱1区| 91最新综合| 一二三区视频在线观看| 东亚亚洲无码高清| 伦理弟一页| 欧美成人精品欧美一级乱黄一区二…| 2019久久久久久久久福利| 国产欧美第五页| 99999这里都精品| 狠狠婷婷亚洲中文综合久久| 色婷婷五月天| 特污精品女优骚货黄色视频在线免费观看| 男人a天堂手机在线版| 91 丝袜在线| 中文字幕蜜乳av| 激情开心五月天| 色一情一乱一乱一区91Av| 欧美亚洲素人制服精品| 亚洲欧美综合区自拍另类| 亚洲美乱| 密臀在线一区尤物| 日本天天色| 欧美高清在线| 天天搞在线综合网| 精品一二三区女同| 亚洲国产奇米影视久久| 刺激精品视频| 精品久久久久久无码| 看看小穴| 啪啪综合网| www.91色综合| 精品福利| 久久综合18p| 成人久久久| 992这里有精品| 农村少妇久久久久久久| 长长久久免费视频| 白嫩少妇| 色鬼在线综合| 欧美黄色大片在线观看| 和协影院中文字幕三区| 韩国成人精品久久久免费看| 久久网亚洲| 欧美一级A片在线看视频性色| 91操人| 盗摄女人妻在线| 综合av影片| 欧美成人性爱视频免费观看 | 久久无码成人| 色在线69堂| 91成人久久 | 亚洲天堂在线怕怕视频| 美国久久一二三四| 日韩一级成人毛片免费观看| 精品一区二区2| 久久ww| 国产色图乱伦| 操曰本熟女| 久热婷婷| 韩美日操逼| 亚洲日韩欧美一区二区| 婷婷激情四射| 91福利网在线观看| 日韩欧美偷拍美女视频| 免费啪啪啪网站18岁| 欧美亚洲系列| 啊啊啊97视频| 精品人人插人人操| 亚洲开心网| 青青草日本中文字幕| 久久久久久精品免费看A级| 黑人在线91| 91精品人妻一区二区三区蜜桃臀| 国产极品一区二区三区三州| 国产精品乱码久久| 美女91色黄18| 欧美久久草熟女| 十八禁的黄污污免费网站| 少妇的嫩逼图片| 丁香婷婷激情五月天无毒不卡| 一级久久久久久久久久久| 福利视频网站| 久久精品成人| 夜夜操一区二区| 女同在线视频一区| 丝袜熟女一区二区三区| 亚洲黄片免费在线播放| 91岛国动作片| 无码操逼天堂| 久久、1234| 91欧美高清| 久久久久久AⅤ无码免费肉站| 色综合一本| 国产综合久| 亚洲黄色网址| 91网18| 亚洲图片欧美日韩| 丁香婷婷啪啪| 日韩精品亚洲专区在线影视| 一起草欧美| 亚洲天堂精品日韩电影| 亚洲色图日韩丝袜制服一区二区五月在线| 超碰在线97国产| 97综合日韩| 日韩乱码Av| 无遮挡猛进视频免费无限观看| 密乳AV免费观看| 日韩激情电影中文字幕| 九九九精品| 欧美96精品在线| 蜜臀99久久精品| 亚洲青青草| 亚欧美综合网。| 97色色色综合网站| 超碰性爱97| 男人下部插入女人下部| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 日韩综合无码色欲vv| 国产内射爽爽大片| 日韩福利电影网| 久久久97| 9国产超碰| 熟女乱3伦999| 影音先锋少妇| 手机在线视频国内精品| 日韩三级天堂在线观看| 91精品伊人久久久大香线蕉91| 国产理论视频在线播放| 福利伊人玖玖国产| 操逼逼无码| 国产自偷自拍一区| 色色色综合网| 婷婷日韩一区二区三区中文字幕在线| 中文字幕二区日韩天堂| 91大神电影天堂| 欧洲中文字幕| 农村妇女精品一区二区| 91亚洲欧美综合高清在线| 欲女人妻性色av| 亚洲骚男同com| 日骚逼视频| 黑人猛交| 久久精品毛片免费不卡| 欧美疯狂做爰xxxx| 久久久久久久一级黄色打同平台| 96AV久久久| 人妻丝袜肏逼| 精品人妻一区二区三区四区| 黄色大片视频在线免费看| 人人操,人人插| 太久视频| 欧美综合97www| 国产性爱欧美性爱在线| 91无码人妻精品一区二区三区蜜桃| 男人的天堂VA| 超清福利精品视频在线| 亚洲一本大道中文字幕无码在线| 发朗少妇买婬全视频中文| 97露脸精品丝袜| 精品久操| 操逼无码操逼| 日韩在线观看中文字幕视频| 亚洲精品欧美专业| 亚洲久草AV色图| 亚洲欧美日韩中文播放| 欧洲一级性爱视频在线观看| 日本在线不卡123| 日影院久久婷婷夜夜网| 黑人猛交| 欧美性生活综合| 欧美色九九九| 传媒在线观看一区二区三区| 人人艹亚洲| 天天日少妇逼AV| 97超碰免费生活| 成年无码动漫av片无尽在线 | 97久久免费| 玖玖久久久| 亚洲第2页| 色老汉色| 五十路熟女人妻一区二区在线观看| 久操网视频| 欧美少妇一区二区三区| 蜜臀久久99精品久久久久久成人小说 | 内射老妇BBWX0C0CK| 狠狠穞A片一區二區三區| 天天色怡春院| 黄色香蕉视频网站一区| 成人五月香网在线| 国产白丝网站| 全球成人中文在线| 亚洲男人的天堂网| 无码直播久久久| 国产精品青青草| 青青草好吊色| 精品久热| 欧美性高潮| 国产精品探花在线| 日本高清加勒比| www亚洲免费| 欧美日日夜夜| 日韩视频中文字幕| 久久国产精品91| 免费一二区| 91大学精品激情戏| 鸥美中出| 999在线电影香蕉| 久久粉色| 国产精品一区二区三区在线密挑| 三级色影综合网| 午夜丁香| 夜夜爽夜夜操| 亚洲欧洲小说图片视频| 91n欧美| 女色视频社区| 亚洲色图8| 91亚洲色图| 最新欧洲欧美日本激情网站| 男人天堂新在线| 成人欧美一区二区三区黑人一| 91痴汉| 婷婷五月天丁香花| 玖玖久久久| 97资源制服丝袜| 操国产高清| 亚洲激情 欧美色图| 亚洲,日韩,欧美,成人播放| 亚洲揄拍网| 玖玖玖玖精品国产剧情| 精品少妇一区二区| 欧美天天插| 国产家庭乱伦表演| 日韩资源网| 色丁香五月婷婷| 我要色综合网| 久久爽爽精品| 免费看日产一区二区三区| 亚洲男人天堂网站| 午夜久久一区二区无码中出| 中文字幕一区二区日韩网| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 人人操人人摸人| 青青草一区二区高清无码视频| 青青草中文-久久青草精品一区二区三| 亚洲天堂男人天堂网| 人妻天天爽夜夜爽精品2| 又大又长又粗又爽又黄| 国产在线激情| 中文字幕55555| 在线观看亚洲专区| 91欧美网| 九九九九欧美| 人妻丝袜无 码视频专区| 亚洲乱色熟女一区| 天天色综合影视网| 久久夜嗨| 婷婷六月天| 欧美日产国产在线成人第一区| 亚洲色天堂九9| 热天堂一区二区| 免费看欧美美女黄色大片| 9久精品| 超碰是碰在线观看| 伊人久久国产免费观看视频| 亚洲av强奸乱伦| 性色av大全| 91久久婷婷| 1024午夜激情男人的天堂| 色穴精品| 大香蕉综合网| 免费A V在线播放| 99re免费视频精品全部| 亚洲欧美洲综合| 天天操天天看| 91久久伊人婷婷青青草| 男人的天堂2010| 亚洲免费人妻在| 国产精品网址| 天天看天天日天天操| 一本大道青青| 夜夜 中文视频rt| 97内射偷拍| 亚洲 欧美都市激情| 久久草视频污视频| 亚洲美女精品| 资源在线观一 二| 成人丁香五月| 欧美性爱在线无码| 色久桃花影院在线观看| 国产一区二区免费福利片| 色香AV| 搡老女人老91二区| 亚洲丝袜少妇在线| 亚洲激情在线| 日韩本不卡视频在线观看| 日本中文字幕熟妇| 日日妻色网| 婷婷五月天无码| 热久日综合| 五月天久久婷婷亚洲| 久久9亚洲| 尻女朋友一夜| 亚洲图片欧美日韩| 日本天天吊| 婷婷伊人一区| 色老汉色| 99热 按摩 日韩| 免费成人在线熟妇网| 久久日本熟女精品一区| 美美91成人国产精品欧美精品久久久久久久| 久久9久9久99久9久9| 日本精品人妻少妇一区二区| 日日日啊啊啊| 日韩人妻无码精品系列| 素人无码中文字幕| 午夜精品人妻二区三区| 日本国产二线女色| 0755午夜福利视频| 欧美AB在线| 国产91影院| 亚洲无码太久| 国产又大又硬又长又粗| 乱老女人一区二区视频| 久久久爆乳翘臀一线天伦理视频| 亚州少妇| 99re95| 国内成人圈中文字幕无码视频| 超碰97人人乐| 啪啪综合网| 日韩在线一区高清在线| 91人妻尻屄视频| 精品人妻伦一二三区久久| 青青草自拍视频在线播放| 青青草白白色| 日本不卡中文| 家庭乱伦麻豆| 免费伦费视频在线观看| 五月激情综合网| 97高清啪啪| 日韩特一级久久| 欧美色图亚洲激情| 变态乱伦伪娘灌肠一区二区| 色情五月丁香| 老熟女熟妇| 91狠狠狠| 一级婬片120分钟试看| 无色无码| 欧美久久婷| 欧美 日韩第一性色| 九九九色| 日本在线播放不卡一区| 亚洲精品久| 2003天天干夜夜操| 日本国产亚洲一区在线观看| av婷婷色婷婷色六月| 久热伊人99re| 蜜桃臀一区二区三区久久| 日韩无码人妻| 亚洲欧美经典一区二区| 亚洲永久永久永久永久一级一级一级精品 | 久久99午夜精品一区人妻| 亚洲综合网电影91| 人人九九精| 国产91亚洲精品一区二区三区| 国产精品亚洲免费| 成人五月天色网| 97超碰欧美精品| 久久av成人无码免费| 野狼激情网| 久久九九精品一区二区 | 蜜桃视频一区二区三区| 东北毛片| 久久久久久久人妻| 中文字幕精品亚洲熟女| 国产日韩欧美中文在线播放 | 超碰97中文| 免费一级欧美片片线观看| 日韩ab网| 久久久久久99AV无码免费网站| 色婷婷狠狠| 超碰社区97| 国产久久av| 动漫区日韩区欧美区| TS人妖另类精品视频系列| 91久久婷婷| 日本免费一区二区不卡| 国产操伦| 91网站18在线| 日欧操屄| 亚洲码和欧洲精品激情系列| 久操电影| 无码99| 嗯嗯啊啊操我| 亚洲欧美一区二区三区在钱蜜桃| 日日夜夜骑| 玖玖色综合| 9I1性色影院| 亚洲黄色影视| 91精品导航| AV中文在线| 欧美天天干| 国产久久一区二区午夜| 国产精品乱码久久久| 日本人妻A片成人免费看片| 国产日韩中文字幕欧美| 亚洲精品乱码久久久久久蜜桃麻豆| 久草精品一区 | 97超碰总站| 首页中文字幕中文字幕免费| 热热色国产一二区AV| 日韩av不卡在线观看| 亚洲91射| 91色情黑丝搞鸡在线观看一区二区三区三州| 熟女少妇视频| 欧美精品另类人妖xxxx| 香蕉欧美| 欧美熟妇亚洲版| 黄片免费看黄片免费看| 蜜臀Av一区二区三区| 情侣开房子拍 日韩无码 女的很漂亮| 91内射| 日韩情色AV| 人人操,操人人| 黑人黄片在线免费观看| 久久久久久中文| 五月丁香六月激情| 成人小说另类在线| 青青三级视频| 99欧美| 日本孕妇一区二区视频操逼免费看 | 老熟乱一区二区三区四区| 人妻嗯啊啊在线播放| 国产精品美女久久久久久网站| 91中文精品日韩欧美在线| 精品亚洲黄色片 国产精品导航一区二区 | 日本 情色 1区2区3区| 99综合视频一体| 日韩性爱长视频免费| 97超碰在线资源网站| 免费在线观看AV无码网站| 97干在线视频| 久久精9| 婷婷五月激情综合| 国产精品人妻一区二区| 亚洲综合色在线| 美女尤物福利视频| 日本Xx性爱| 性色亚洲| 91n.欧美| 精品国产99| 五月天婷婷基地| 久久透逼视频| 欧美日韩狠狠爱| 欧美日韩国产电影| 一区二区日韩欧美久久| 免费又黄又裸乳的视频| 777超碰| 亚洲国产中文字幕| 澳门成人网站久国产日韩| 久久久久久久国产视频| 人人操人人色网| 成人夜夜| 超碰人妻中文在线| 亚洲欧美一区二区三区在钱蜜桃 | 综合网欧| 亚洲综合另类| 特级毛片特黄久久免费看| 2021国产成人精品久久| 青青操日韩| 日本新免费二区三区| ss久久| 激情99| 欧美中出1| 免费在线黄片视频| 久久久久亚洲三级电影| juliaann欧美丝袜办公室| 4虎在线视频| 99热导航| 中文字幕在线观看网页| 五月天综合网| 免费看日产一区二区三区| 国内毛片婷婷六月色| 国产精品麻豆成人av| 亚洲AV无码乱码| 97久久久网站| 日产精品久久久一区二区| 亚洲精品不卡一二三区| 日韩免费福利在线观看| 毛片久久| 亚洲无码精品AV久久久| 久久69| 91伊人| 欧美少妇色图| 999999精品| 中文字幕三四五区| 国产搭汕a级片| 亚洲图片欧美偷拍| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 爱射综合| 色噜噜综合在线| 精品久久視頻在线| 丰满人妻一区二区三区免费,| 婷婷五月av| 操操啪| 日韩熟妇二区| 91久久精品国产| 有码免费观看| 夜夜狼人妻| 啊啊啊97视频| 一区二区视频你懂的| 在线观看午夜婷婷久久久久清性观看| 人妻 欧美 中文| 自拍亚洲综合| 九色97| 美女啊啊啊啊pc| 久久久久久久78| 伊人 俄罗斯 a v| 日本黄色天堂| 黑人性欧美| 久久久久国产精品久久久| 亚洲欧美另类激情小说 | 亚洲凸凹超碰成人| 91精品人妻五十路| 色九色久| 欧美影院一区二区三区| 免费日韩黄片| 亚洲色图亚洲无码强奸乱伦| 欧美精品99久久久| 嗯嗯啊啊用力视频免费| 欧美 亚洲 综合 制服 另类| 欧洲一区二区| 激情婷婷综合久久| 综合五月婷婷亚洲一区| 色婷视频| 亚洲综合影视| 超碰偷拍| 国产h小视频在线观看免费| 亚洲精品乱码线路中文字幕| 日韩av影片在线观看| 嗯嗯嗯啊啊啊在线免费观看| 日韩人妻精品中文字幕| 天天射天天色成人| 日韩精品字幕| 国产成人www免费人成看片| 亚州精人品大香蕉| 少妇色综合| 97干在线| 日韩av不卡在线观看| 久jiu久神马影院| 亚洲综合一| 91色图| 美国日韩黄色片| 免费视频在线观看啊啊啊啊啊| 免费超碰97久久| 97超碰欧美中文字幕| 亚洲一区二区久久久久| 嗯嗯啊中文字幕| 试看60秒| 天堂v无码免费视频| 亚洲精品久久久久久| 91在线视频国产网站| 国产欧美日韩精品中文| 亚熟在线| 丰满人妻一区二区三区免费| 一线黄色免费性爱片| 操人妻丝袜高跟| 33044男人的天堂深夜备| 无码高清少妇久久| 男人的天堂2019AV| 丁香7月婷婷| 国产AV色黄看到爽| 久热69九色熟妇97| 91无码精品| 国产精品成人蜜臀AV在线| 欧美精品偷拍| 国产精品com| 黑丝少妇| 国产视频97| 国产精品欧美日韩久久| 91国产大片| 国产高清自拍| 综合色图区| 肥佬影院91| 日韩性爱高清免费视频| 青娱乐手机日韩在线视频| 日韩综合无码一区久久92| 狠狠色色| 97ai亚洲| 日本女人操逼| 欧美一区二区三熟女剧情| av强奸乱轮| 性爱AV天堂| 欧 美 自 拍 偷 拍| 成人日韩中文字幕| 亚洲日韩人妻中文字幕一区| 国产精品久久久视频| 人妻少妇精品久久久久久久| 加勒比大香蕉视频在线| 青青青青青手机视频| 色色综合网站| 91亚洲图片| 可以免费观看的av| 97天天操| 无码欧美有限公司| 26UUU欧美日本| 无码一区二区三区四区五区六区七区八区九区十区视频 | 亚洲AV色图一区| 乱伦3P视频| 一区超碰一区| 欧美日韩第一页| 欧美热图99| 精品国产乱码久久久久A| 欧美在线啊啊| 蜜臀精品1区2区| 日韩免费高清大片在线| 欧美成人综合| 97欧美性爱| 噜噜噜亚洲精| 又大又白奶子| 一级片视频啪啪| 色偷偷色偷偷欧美日韩| av在线一区二区三区| 欧美激情黑人| 九九热精品视频在线观看| 久久午夜色播影院免费高清| 欧美高潮在线| 国产精品香蕉| 久久久九| 国产成人 综合亚洲 天堂| 中文字幕91综合| 久久精品国产精品一区| 欧美精品91| 精品久久久久久中文| 91超碰丝袜制服| 国产少妇肉丝在线观看| 国产91影院| 在线情色电影 91大 | 在线国产福利网址导航| 熟女91网| 亚洲国产第一页综合视频| 亚洲av综合伊人久久| 亚洲图片 激情小说| 狠狠操狠狠爱| 欧美成人性爱视频在线播放| 超碰97久久观看| 色婷婷基地| 乱操乱伦AV| 福利五区| 三级片大波波| 国产又操| 一道α片欧美| 激情内射| 午夜成人福利影视| 91精品啪在线观看国产城中村| 9久久久久| 天综合网欧美| 热久久91婷婷| 激情干在线| 12一15性XXXX粉嫩国产| 久久久96精品| 欧美激情 日韩精品| 国产精品午夜高潮呻吟久久av| 视频国产欧美在线播放| 黑人综合色| 东北老女人的激情视频| 人人操AV| 天天视频黄网站| 亚洲AV成人精品网站在AV| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 日韩精品资源| 污污污8888| 在线啊啊啊啊| 久久婷婷影院| 老熟女乱子伦中文字幕一区二区| 大香蕉欧美| 91中出视频| 日本精品一区二区三| 97色色国产视频| 欧美大码在线视频| 色婷婷五月综合| 色综合久久88色综合久久天天| 国产9 9在线 | 亚洲| 干少妇视频| 亚洲综合嫩| 怡红院亚洲怡春院av| 久草男人天堂| 99精品网站| 一区麻豆 高清中文字幕| 四虎AV在线观看| 免费AV播放| 狠狠爱综合| 717影院理论午夜伦八戒| 色色福利| 亚洲精品天堂久久A∨51成人漫| 99久久久久久亚洲精品不卡| 色网色网色网色网色网色| 97干在线视频| 国产精品农村妇女| 中韩中文字幕在线观看| 色婷婷一区二区三区久久午夜| 久草在| 久久久久久久久久久999| 九九英色视频| 在线视频一区二区传媒| 亚洲精品 超碰| 久久超碰免费的| 久久亚洲不卡一区二区三区| 日本女厕偷拍| 东京热一区二区三区四区五区六区| 嗯嗯嗯啊啊啊在线免费观看| 无码免费一区二区三区啪啪| 五月天色图影视| 免费精品无码一级毛片牛牛影视 | 国色天香av| 国产熟女少妇一区| 亚洲精品819| 97玖玖人妻| 午夜欧美J进J出白浆流出久久久 | 国产av强奸美女| 一级黄色性爱A级片| 永久免费发布性爱网| 国模少妇一区二区三区| 国内三级自拍小视频在线观看| 欧美激情综合| 欧美老熟另类| 1204av韩国|