日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android开发学习之路——连连看之游戏逻辑(五)

發(fā)布時間:2024/4/17 编程问答 69 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android开发学习之路——连连看之游戏逻辑(五) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? ? GameService組件則是整個游戲邏輯實現(xiàn)的核心,而且GameService是一個可以復用的業(yè)務(wù)邏輯類。

?

(一)定義GameService組件接口

? ? 根據(jù)前面程序?qū)ameService組件的依賴,程序需要GameService組件包含如下方法。

? ? ·start():初始化游戲狀態(tài),開始游戲的方法。

? ? ·Piece[][] getPieces():返回表示游戲狀態(tài)的Piece[][]數(shù)組。

? ? ·boolean hasPieces():判斷Pieces[][]數(shù)組中是否還剩Piece對象;如果所有Piece都被消除了,游戲也就勝利了。

? ? ·Piece findPiece(float touchX,float touchY):根據(jù)觸碰點的X、Y坐標來獲取。

? ? ·LinkInfo link(Piece p1,Piece p2):判斷p1、p2兩個方塊是否可以相連。

? ? 為了考慮以后的可拓展性,需先為GameService組件定義如下接口。

? ? 接口代碼如下:src\org\crazyit\link\board\GameService

1 public interface GameService 2 { 3 /** 4 * 控制游戲開始的方法 5 */ 6 void start(); 7 8 /** 9 * 定義一個接口方法, 用于返回一個二維數(shù)組 10 * 11 * @return 存放方塊對象的二維數(shù)組 12 */ 13 Piece[][] getPieces(); 14 15 /** 16 * 判斷參數(shù)Piece[][]數(shù)組中是否還存在非空的Piece對象 17 * 18 * @return 如果還剩Piece對象返回true, 沒有返回false 19 */ 20 boolean hasPieces(); 21 22 /** 23 * 根據(jù)鼠標的x座標和y座標, 查找出一個Piece對象 24 * 25 * @param touchX 鼠標點擊的x座標 26 * @param touchY 鼠標點擊的y座標 27 * @return 返回對應(yīng)的Piece對象, 沒有返回null 28 */ 29 Piece findPiece(float touchX, float touchY); 30 31 /** 32 * 判斷兩個Piece是否可以相連, 可以連接, 返回LinkInfo對象 33 * 34 * @param p1 第一個Piece對象 35 * @param p2 第二個Piece對象 36 * @return 如果可以相連,返回LinkInfo對象, 如果兩個Piece不可以連接, 返回null 37 */ 38 LinkInfo link(Piece p1, Piece p2); 39 }

?

(二)實現(xiàn)GameService組件

? ? GameService組件的前面三個方法實現(xiàn)起來都比較簡單。

? ? 前3個方法的代碼如下:src\org\crazyit\link\board\impl\GameServiceImpl

1 public class GameServiceImpl implements GameService 2 { 3 // 定義一個Piece[][]數(shù)組,只提供getter方法 4 private Piece[][] pieces; 5 // 游戲配置對象 6 private GameConf config; 7 8 public GameServiceImpl(GameConf config) 9 { 10 // 將游戲的配置對象設(shè)置本類中 11 this.config = config; 12 } 13 14 @Override 15 public void start() 16 { 17 // 定義一個AbstractBoard對象 18 AbstractBoard board = null; 19 Random random = new Random(); 20 // 獲取一個隨機數(shù), 可取值0、1、2、3四值。 21 int index = random.nextInt(4); 22 // 隨機生成AbstractBoard的子類實例 23 switch (index) 24 { 25 case 0: 26 // 0返回VerticalBoard(豎向) 27 board = new VerticalBoard(); 28 break; 29 case 1: 30 // 1返回HorizontalBoard(橫向) 31 board = new HorizontalBoard(); 32 break; 33 default: 34 // 默認返回FullBoard 35 board = new FullBoard(); 36 break; 37 } 38 // 初始化Piece[][]數(shù)組 39 this.pieces = board.create(config); 40 } 41 42 // 直接返回本對象的Piece[][]數(shù)組 43 @Override 44 public Piece[][] getPieces() 45 { 46 return this.pieces; 47 } 48 49 // 實現(xiàn)接口的hasPieces方法 50 @Override 51 public boolean hasPieces() 52 { 53 // 遍歷Piece[][]數(shù)組的每個元素 54 for (int i = 0; i < pieces.length; i++) 55 { 56 for (int j = 0; j < pieces[i].length; j++) 57 { 58 // 只要任意一個數(shù)組元素不為null,也就是還剩有非空的Piece對象 59 if (pieces[i][j] != null) 60 { 61 return true; 62 } 63 } 64 } 65 return false; 66 } 67 ..... 68 }

? ? 前面3個方法實現(xiàn)得很簡單。下面會詳細介紹后面的兩個方法findPiece(float touchX,float touchY)和link(Piece p1,Piece p2)。

?

(三)獲取觸碰點的方塊

? ? 當用戶觸碰游戲界面時,事件監(jiān)聽器獲取的時該觸碰點在游戲界面上的X、Y坐標,但程序需要獲取用戶觸碰的是哪塊方塊,就要把獲取的X、Y坐標換算成Piece[][]二維數(shù)組中的兩個索引值。

? ? 考慮到游戲界面上每個方塊的寬度、高度都是相同的,因此將獲取得X、Y坐標除以圖片得寬、高即可換算成Piece[][]二維數(shù)組中的索引。

? ? 根據(jù)觸碰點X、Y坐標獲取對應(yīng)方塊得代碼如下:src\org\crazyit\link\board\impl\GameServiceImpl.java

1 // 根據(jù)觸碰點的位置查找相應(yīng)的方塊 2 @Override 3 public Piece findPiece(float touchX, float touchY) 4 { 5 // 由于在創(chuàng)建Piece對象的時候, 將每個Piece的開始座標加了 6 // GameConf中設(shè)置的beginImageX/beginImageY值, 因此這里要減去這個值 7 int relativeX = (int) touchX - this.config.getBeginImageX(); 8 int relativeY = (int) touchY - this.config.getBeginImageY(); 9 // 如果鼠標點擊的地方比board中第一張圖片的開始x座標和開始y座標要小, 即沒有找到相應(yīng)的方塊 10 if (relativeX < 0 || relativeY < 0) 11 { 12 return null; 13 } 14 // 獲取relativeX座標在Piece[][]數(shù)組中的第一維的索引值 15 // 第二個參數(shù)為每張圖片的寬 16 int indexX = getIndex(relativeX, GameConf.PIECE_WIDTH); 17 // 獲取relativeY座標在Piece[][]數(shù)組中的第二維的索引值 18 // 第二個參數(shù)為每張圖片的高 19 int indexY = getIndex(relativeY, GameConf.PIECE_HEIGHT); 20 // 這兩個索引比數(shù)組的最小索引還小, 返回null 21 if (indexX < 0 || indexY < 0) 22 { 23 return null; 24 } 25 // 這兩個索引比數(shù)組的最大索引還大(或者等于), 返回null 26 if (indexX >= this.config.getXSize() 27 || indexY >= this.config.getYSize()) 28 { 29 return null; 30 } 31 // 返回Piece[][]數(shù)組的指定元素 32 return this.pieces[indexX][indexY]; 33 }

? ? 上面得代碼根據(jù)觸碰點X、Y坐標來計算它在Piece[][]數(shù)組中得索引值。調(diào)用了getIndex(int relative,int size)進行計算。

? ??getIndex(int relative,int size)方法的實現(xiàn)就是拿relative除以size,只是程序需要判斷可以整除和不能整除兩種情況:如果可以整除,說明還在前一塊方塊內(nèi);如果不能整除,則對應(yīng)于下一塊方塊。

? ???getIndex(int relative,int size)方法的代碼如下:src\org\crazyit\link\board\impl\GameServiceImpl.java

1 // 工具方法, 根據(jù)relative座標計算相對于Piece[][]數(shù)組的第一維 2 // 或第二維的索引值 ,size為每張圖片邊的長或者寬 3 private int getIndex(int relative, int size) 4 { 5 // 表示座標relative不在該數(shù)組中 6 int index = -1; 7 // 讓座標除以邊長, 沒有余數(shù), 索引減1 8 // 例如點了x座標為20, 邊寬為10, 20 % 10 沒有余數(shù), 9 // index為1, 即在數(shù)組中的索引為1(第二個元素) 10 if (relative % size == 0) 11 { 12 index = relative / size - 1; 13 } 14 else 15 { 16 // 有余數(shù), 例如點了x座標為21, 邊寬為10, 21 % 10有余數(shù), index為2 17 // 即在數(shù)組中的索引為2(第三個元素) 18 index = relative / size; 19 } 20 return index; 21 }

?

(四)判斷兩個方塊是否可以相連

? ? ?判斷兩個方塊是否可以相連是本程序需要處理的最繁瑣的地方:兩個方塊可以相連的情形比較多,大致可分為:

? ? ·兩個方塊位于同一條水平線,可以直接相連。

? ? ·兩個方塊位于同一條豎直線,可以直接相連。

? ? ·兩個方塊以兩條線段相連,有1個拐點。

? ? ·兩個方塊以三條線段相連,有2個拐點。

? ? 下面link(Piece p1,Piece p2)方法把這四種情況分開進行處理。

? ? ?代碼如下:src\org\crazyit\link\board\impl\GameServiceImpl.java

1 // 實現(xiàn)接口的link方法 2 @Override 3 public LinkInfo link(Piece p1, Piece p2) 4 { 5 // 兩個Piece是同一個, 即選中了同一個方塊, 返回null 6 if (p1.equals(p2)) 7 return null; 8 // 如果p1的圖片與p2的圖片不相同, 則返回null 9 if (!p1.isSameImage(p2)) 10 return null; 11 // 如果p2在p1的左邊, 則需要重新執(zhí)行本方法, 兩個參數(shù)互換 12 if (p2.getIndexX() < p1.getIndexX()) 13 return link(p2, p1); 14 // 獲取p1的中心點 15 Point p1Point = p1.getCenter(); 16 // 獲取p2的中心點 17 Point p2Point = p2.getCenter(); 18 // 如果兩個Piece在同一行 19 if (p1.getIndexY() == p2.getIndexY()) 20 { 21 // 它們在同一行并可以相連 22 if (!isXBlock(p1Point, p2Point, GameConf.PIECE_WIDTH)) 23 { 24 return new LinkInfo(p1Point, p2Point); 25 } 26 } 27 // 如果兩個Piece在同一列 28 if (p1.getIndexX() == p2.getIndexX()) 29 { 30 if (!isYBlock(p1Point, p2Point, GameConf.PIECE_HEIGHT)) 31 { 32 // 它們之間沒有真接障礙, 沒有轉(zhuǎn)折點 33 return new LinkInfo(p1Point, p2Point); 34 } 35 } 36 // 有一個轉(zhuǎn)折點的情況 37 // 獲取兩個點的直角相連的點, 即只有一個轉(zhuǎn)折點 38 Point cornerPoint = getCornerPoint(p1Point, p2Point, 39 GameConf.PIECE_WIDTH, GameConf.PIECE_HEIGHT); 40 if (cornerPoint != null) 41 { 42 return new LinkInfo(p1Point, cornerPoint, p2Point); 43 } 44 // 該map的key存放第一個轉(zhuǎn)折點, value存放第二個轉(zhuǎn)折點, 45 // map的size()說明有多少種可以連的方式 46 Map<Point, Point> turns = getLinkPoints(p1Point, p2Point, 47 GameConf.PIECE_WIDTH, GameConf.PIECE_WIDTH); 48 if (turns.size() != 0) 49 { 50 return getShortcut(p1Point, p2Point, turns, 51 getDistance(p1Point, p2Point)); 52 } 53 return null; 54 }

? ? 上面的代碼就前面提到的4種情況,對應(yīng)了4個不同的方法。我們需要為這4個方法提供實現(xiàn)。

? ? 為了實現(xiàn)上面4個方法,可以對兩個Piece的位置關(guān)系進行歸納。

? ? ·p1于p2在同一行(indexY值相同)。

? ? ·p1與p2在同一列(indexX值相同)。

? ? ·p2在p1的右上角(p2的indexX>p1的indexX,p2的indexY<p1的indexY)。

? ? ·p2的p1的右下角(p2的indexX>p1的indexX,p2的indexY>p1的indexY)。

? ? 至于p2在p1的左上角,或者p2在p1的左下角這兩種情況,程序可以重新執(zhí)行l(wèi)ink方法,將p1和p2兩個參數(shù)的位置互換即可。

?

(五)定義獲取通道的工具方法

? ? 這里所謂的通到,指的是一個方塊上、下、左、右四個方向的空白方塊。

? ? 下面是獲取某個坐標點四周通道的4個方法的代碼如下:src\org\crazyit\link\board\impl\GameServiceImpl.java

1 /** 2 * 給一個Point對象,返回它的左邊通道 3 * 4 * @param p 5 * @param pieceWidth piece圖片的寬 6 * @param min 向左遍歷時最小的界限 7 * @return 給定Point左邊的通道 8 */ 9 private List<Point> getLeftChanel(Point p, int min, int pieceWidth) 10 { 11 List<Point> result = new ArrayList<Point>(); 12 // 獲取向左通道, 由一個點向左遍歷, 步長為Piece圖片的寬 13 for (int i = p.x - pieceWidth; i >= min 14 ; i = i - pieceWidth) 15 { 16 // 遇到障礙, 表示通道已經(jīng)到盡頭, 直接返回 17 if (hasPiece(i, p.y)) 18 { 19 return result; 20 } 21 result.add(new Point(i, p.y)); 22 } 23 return result; 24 } 25 26 /** 27 * 給一個Point對象, 返回它的右邊通道 28 * 29 * @param p 30 * @param pieceWidth 31 * @param max 向右時的最右界限 32 * @return 給定Point右邊的通道 33 */ 34 private List<Point> getRightChanel(Point p, int max, int pieceWidth) 35 { 36 List<Point> result = new ArrayList<Point>(); 37 // 獲取向右通道, 由一個點向右遍歷, 步長為Piece圖片的寬 38 for (int i = p.x + pieceWidth; i <= max 39 ; i = i + pieceWidth) 40 { 41 // 遇到障礙, 表示通道已經(jīng)到盡頭, 直接返回 42 if (hasPiece(i, p.y)) 43 { 44 return result; 45 } 46 result.add(new Point(i, p.y)); 47 } 48 return result; 49 } 50 51 /** 52 * 給一個Point對象, 返回它的上面通道 53 * 54 * @param p 55 * @param min 向上遍歷時最小的界限 56 * @param pieceHeight 57 * @return 給定Point上面的通道 58 */ 59 private List<Point> getUpChanel(Point p, int min, int pieceHeight) 60 { 61 List<Point> result = new ArrayList<Point>(); 62 // 獲取向上通道, 由一個點向右遍歷, 步長為Piece圖片的高 63 for (int i = p.y - pieceHeight; i >= min 64 ; i = i - pieceHeight) 65 { 66 // 遇到障礙, 表示通道已經(jīng)到盡頭, 直接返回 67 if (hasPiece(p.x, i)) 68 { 69 // 如果遇到障礙, 直接返回 70 return result; 71 } 72 result.add(new Point(p.x, i)); 73 } 74 return result; 75 } 76 77 /** 78 * 給一個Point對象, 返回它的下面通道 79 * 80 * @param p 81 * @param max 向上遍歷時的最大界限 82 * @return 給定Point下面的通道 83 */ 84 private List<Point> getDownChanel(Point p, int max, int pieceHeight) 85 { 86 List<Point> result = new ArrayList<Point>(); 87 // 獲取向下通道, 由一個點向右遍歷, 步長為Piece圖片的高 88 for (int i = p.y + pieceHeight; i <= max 89 ; i = i + pieceHeight) 90 { 91 // 遇到障礙, 表示通道已經(jīng)到盡頭, 直接返回 92 if (hasPiece(p.x, i)) 93 { 94 // 如果遇到障礙, 直接返回 95 return result; 96 } 97 result.add(new Point(p.x, i)); 98 } 99 return result; 100 }

?

(六)沒有轉(zhuǎn)折點的橫向連接

? ? 如果兩個Piece在Piece[][]數(shù)組中的第二維索引值相等,那么這兩個Piece就位于同一行,如前面的link(Piece p1,Piece p2)方法中,調(diào)用isXBlock(Point p1,Point p2,int pieceWidth)判斷p1、p2之間是否有障礙。

? ? 下面是isXBlock方法的代碼:src\org\crazyit\link\board\impl\GameServiceImpl.java

1 /** 2 * 判斷兩個y座標相同的點對象之間是否有障礙, 以p1為中心向右遍歷 3 * 4 * @param p1 5 * @param p2 6 * @param pieceWidth 7 * @return 兩個Piece之間有障礙返回true,否則返回false 8 */ 9 private boolean isXBlock(Point p1, Point p2, int pieceWidth) 10 { 11 if (p2.x < p1.x) 12 { 13 // 如果p2在p1左邊, 調(diào)換參數(shù)位置調(diào)用本方法 14 return isXBlock(p2, p1, pieceWidth); 15 } 16 for (int i = p1.x + pieceWidth; i < p2.x; i = i + pieceWidth) 17 { 18 if (hasPiece(i, p1.y)) 19 {// 有障礙 20 return true; 21 } 22 } 23 return false; 24 }

? ? 如果兩個方塊位于同一行,且它們之間沒有障礙,那么這兩個方塊就可以消除,兩個方塊的連接信息就是它們的中心。

?

(七)沒有轉(zhuǎn)折點的縱向連接

? ???如果兩個Piece在Piece[][]數(shù)組中的第一維索引值相等,那么這兩個Piece就位于同一列,如前面的link(Piece p1,Piece p2)方法中,調(diào)用isYBlock(Point p1,Point p2,int pieceWidth)判斷p1、p2之間是否有障礙。

? ? ?下面是isYBlock方法的代碼:src\org\crazyit\link\board\impl\GameServiceImpl.java

/*** 判斷兩個x座標相同的點對象之間是否有障礙, 以p1為中心向下遍歷* * @param p1* @param p2* @param pieceHeight* @return 兩個Piece之間有障礙返回true,否則返回false*/private boolean isYBlock(Point p1, Point p2, int pieceHeight){if (p2.y < p1.y){// 如果p2在p1的上面, 調(diào)換參數(shù)位置重新調(diào)用本方法return isYBlock(p2, p1, pieceHeight);}for (int i = p1.y + pieceHeight; i < p2.y; i = i + pieceHeight){if (hasPiece(p1.x, i)){// 有障礙return true;}}return false;}

?

(八)一個轉(zhuǎn)折點的連接

? ? 對于兩個方塊連接線上只有一個轉(zhuǎn)折點的情況,程序需要先找到這個轉(zhuǎn)折點。為了找到這個轉(zhuǎn)折點,程序定義一個遍歷兩個通道并獲取它們交點的方法。

? ? 代碼如下:src\org\crazyit\link\board\impl\GameServiceImpl.java

/*** 遍歷兩個通道, 獲取它們的交點* * @param p1Chanel 第一個點的通道* @param p2Chanel 第二個點的通道* @return 兩個通道有交點,返回交點,否則返回null*/private Point getWrapPoint(List<Point> p1Chanel, List<Point> p2Chanel){for (int i = 0; i < p1Chanel.size(); i++){Point temp1 = p1Chanel.get(i);for (int j = 0; j < p2Chanel.size(); j++){Point temp2 = p2Chanel.get(j);if (temp1.equals(temp2)){// 如果兩個List中有元素有同一個, 表明這兩個通道有交點return temp1;}}}return null;}

? ? 為了找出兩個方塊連接線上的連接點,程序同樣需要分析p1、p2兩個點的位置分布。根據(jù)前面的分析,我們知道p2要么位于p1的右上角,要么位于p1的右下角。

? ? 當p2位于p1的右上角時,應(yīng)該計算p1的向左通道與p2的向下通道是否有交點,p1的向上通道與p2的向左通道是否有交點。

? ? 當p2位于p1的右上角時,應(yīng)該計算p1的向右通道與p2的向上通道是否有交點,p1的向下通道與p2的向左通道是否有交點。

? ? 根據(jù)p1與p2具有上面兩種分布情形,程序提供如下方法進行處理。

? ? 代碼如下:src\org\crazyit\link\board\impl\GameServiceImpl.java

1 /** 2 * 獲取兩個不在同一行或者同一列的座標點的直角連接點, 即只有一個轉(zhuǎn)折點 3 * 4 * @param point1 第一個點 5 * @param point2 第二個點 6 * @return 兩個不在同一行或者同一列的座標點的直角連接點 7 */ 8 private Point getCornerPoint(Point point1, Point point2, int pieceWidth, 9 int pieceHeight) 10 { 11 // 先判斷這兩個點的位置關(guān)系 12 // point2在point1的左上角, point2在point1的左下角 13 if (isLeftUp(point1, point2) || isLeftDown(point1, point2)) 14 { 15 // 參數(shù)換位, 重新調(diào)用本方法 16 return getCornerPoint(point2, point1, pieceWidth, pieceHeight); 17 } 18 // 獲取p1向右, 向上, 向下的三個通道 19 List<Point> point1RightChanel = getRightChanel(point1, point2.x, 20 pieceWidth); 21 List<Point> point1UpChanel = getUpChanel(point1, point2.y, pieceHeight); 22 List<Point> point1DownChanel = getDownChanel(point1, point2.y, 23 pieceHeight); 24 // 獲取p2向下, 向左, 向下的三個通道 25 List<Point> point2DownChanel = getDownChanel(point2, point1.y, 26 pieceHeight); 27 List<Point> point2LeftChanel = getLeftChanel(point2, point1.x, 28 pieceWidth); 29 List<Point> point2UpChanel = getUpChanel(point2, point1.y, pieceHeight); 30 if (isRightUp(point1, point2)) 31 { 32 // point2在point1的右上角 33 // 獲取p1向右和p2向下的交點 34 Point linkPoint1 = getWrapPoint(point1RightChanel, point2DownChanel); 35 // 獲取p1向上和p2向左的交點 36 Point linkPoint2 = getWrapPoint(point1UpChanel, point2LeftChanel); 37 // 返回其中一個交點, 如果沒有交點, 則返回null 38 return (linkPoint1 == null) ? linkPoint2 : linkPoint1; 39 } 40 if (isRightDown(point1, point2)) 41 { 42 // point2在point1的右下角 43 // 獲取p1向下和p2向左的交點 44 Point linkPoint1 = getWrapPoint(point1DownChanel, point2LeftChanel); 45 // 獲取p1向右和p2向下的交點 46 Point linkPoint2 = getWrapPoint(point1RightChanel, point2UpChanel); 47 return (linkPoint1 == null) ? linkPoint2 : linkPoint1; 48 } 49 return null; 50 }

? ? 上面代碼分別處理了p2位于p1的右上、右下的兩種情形。

? ? 在上面程序中用到isLeftUp、isLeftDown、isRightUp、isRightDown四個方法來判斷p2位于p1的左上、左下、右上、右下4種情形。這4個方法的實現(xiàn),只要對它們的X、Y坐標進行簡單判斷即可。

? ? 4個方法的代碼如下:src\org\crazyit\link\board\impl\GameServiceImpl.java

1 /** 2 * 判斷point2是否在point1的左上角 3 * 4 * @param point1 5 * @param point2 6 * @return p2位于p1的左上角時返回true,否則返回false 7 */ 8 private boolean isLeftUp(Point point1, Point point2) 9 { 10 return (point2.x < point1.x && point2.y < point1.y); 11 } 12 13 /** 14 * 判斷point2是否在point1的左下角 15 * 16 * @param point1 17 * @param point2 18 * @return p2位于p1的左下角時返回true,否則返回false 19 */ 20 private boolean isLeftDown(Point point1, Point point2) 21 { 22 return (point2.x < point1.x && point2.y > point1.y); 23 } 24 25 /** 26 * 判斷point2是否在point1的右上角 27 * 28 * @param point1 29 * @param point2 30 * @return p2位于p1的右上角時返回true,否則返回false 31 */ 32 private boolean isRightUp(Point point1, Point point2) 33 { 34 return (point2.x > point1.x && point2.y < point1.y); 35 } 36 37 /** 38 * 判斷point2是否在point1的右下角 39 * 40 * @param point1 41 * @param point2 42 * @return p2位于p1的右下角時返回true,否則返回false 43 */ 44 private boolean isRightDown(Point point1, Point point2) 45 { 46 return (point2.x > point1.x && point2.y > point1.y); 47 }

?

(九)兩個轉(zhuǎn)折點的連接

? ? 兩個轉(zhuǎn)折點的1連接又是最復雜的一種連接情況,因為兩個轉(zhuǎn)折點又可分為如下幾種情況。

? ??·p1、p2位于同一行,不能直接相連,就必須有兩個轉(zhuǎn)折點,分向上與向下兩種連接情況。

? ??·p1、p2位于同一列,不能直接相連,也必須有兩個轉(zhuǎn)折點,分向左與向右兩種連接情況。

? ??·p2在p1的右下角,有6種轉(zhuǎn)折情況。

? ??·p2在p1的右上角,有6種轉(zhuǎn)折情況。

? ? 對于上面4種情況,同樣需要分別進行處理。

? ? 1.同一行不能直接相連

? ? p1、p2位于同一行,但它們不能直接相連,因此必須有兩個轉(zhuǎn)折點。當p1與p2位于同一行不能直接相連時,這兩個點既可在上面相連,也可在下面相連。這兩種情況都代表它們可以相連,我們先把這兩種情況都加入結(jié)果中,最后再去計算最近的距離。

? ? 實現(xiàn)時可以先構(gòu)建一個Map,Map的key為第一個轉(zhuǎn)折點,Map的value為第二轉(zhuǎn)折點,如果Map的size()大于1,說明這兩個Point有多種連接途徑,那么程序還需要計算路徑最小的連接方式。

? ? 2.同一列不能直接相連

? ??p1、p2位于同一列,但它們不能直接相連,因此必須有兩個轉(zhuǎn)折點。當p1與p2位于同一列不能直接相連時,這兩個點既可在左邊相連,也可在右邊相連。這兩種情況都代表它們可以相連,我們先把這兩種情況都加入結(jié)果中,最后再去計算最近的距離。

? ? 同樣的,我們實現(xiàn)時也是構(gòu)建一個Map。當size()大于1,還要計算最小的連接方式。

? ? 3.p2位于p1右下角的六種轉(zhuǎn)折情況

? ? 有一條垂直通道與p1的向右通道和p2的向左通道相交的方式。有一條水平通道與p1的向下通道和p2的向上通道相交的方式。即可在上面相連,也可在下面相連。即可在左邊相連,也可在右邊相連。共6種相連情況。

? ? 4.p2位于p1右上角的六種轉(zhuǎn)折情況

? ? 與3類似,不再敘述。

? ? 對具有兩個連接點的情況進行處理的代碼如下:src\org\crazyit\link\board\impl\GameServiceImpl.java

1 /** 2 * 獲取兩個轉(zhuǎn)折點的情況 3 * 4 * @param point1 5 * @param point2 6 * @return Map對象的每個key-value對代表一種連接方式, 7 * 其中key、value分別代表第1個、第2個連接點 8 */ 9 private Map<Point, Point> getLinkPoints(Point point1, Point point2, 10 int pieceWidth, int pieceHeight) 11 { 12 Map<Point, Point> result = new HashMap<Point, Point>(); 13 // 獲取以point1為中心的向上, 向右, 向下的通道 14 List<Point> p1UpChanel = getUpChanel(point1, point2.y, pieceHeight); 15 List<Point> p1RightChanel = getRightChanel(point1, point2.x, pieceWidth); 16 List<Point> p1DownChanel = getDownChanel(point1, point2.y, pieceHeight); 17 // 獲取以point2為中心的向下, 向左, 向上的通道 18 List<Point> p2DownChanel = getDownChanel(point2, point1.y, pieceHeight); 19 List<Point> p2LeftChanel = getLeftChanel(point2, point1.x, pieceWidth); 20 List<Point> p2UpChanel = getUpChanel(point2, point1.y, pieceHeight); 21 // 獲取Board的最大高度 22 int heightMax = (this.config.getYSize() + 1) * pieceHeight 23 + this.config.getBeginImageY(); 24 // 獲取Board的最大寬度 25 int widthMax = (this.config.getXSize() + 1) * pieceWidth 26 + this.config.getBeginImageX(); 27 // 先確定兩個點的關(guān)系 28 // point2在point1的左上角或者左下角 29 if (isLeftUp(point1, point2) || isLeftDown(point1, point2)) 30 { 31 // 參數(shù)換位, 調(diào)用本方法 32 return getLinkPoints(point2, point1, pieceWidth, pieceHeight); 33 } 34 // p1、p2位于同一行不能直接相連 35 if (point1.y == point2.y) 36 { 37 // 在同一行 38 // 向上遍歷 39 // 以p1的中心點向上遍歷獲取點集合 40 p1UpChanel = getUpChanel(point1, 0, pieceHeight); 41 // 以p2的中心點向上遍歷獲取點集合 42 p2UpChanel = getUpChanel(point2, 0, pieceHeight); 43 Map<Point, Point> upLinkPoints = getXLinkPoints(p1UpChanel, 44 p2UpChanel, pieceHeight); 45 // 向下遍歷, 不超過Board(有方塊的地方)的邊框 46 // 以p1中心點向下遍歷獲取點集合 47 p1DownChanel = getDownChanel(point1, heightMax, pieceHeight); 48 // 以p2中心點向下遍歷獲取點集合 49 p2DownChanel = getDownChanel(point2, heightMax, pieceHeight); 50 Map<Point, Point> downLinkPoints = getXLinkPoints(p1DownChanel, 51 p2DownChanel, pieceHeight); 52 result.putAll(upLinkPoints); 53 result.putAll(downLinkPoints); 54 } 55 // p1、p2位于同一列不能直接相連 56 if (point1.x == point2.x) 57 { 58 // 在同一列 59 // 向左遍歷 60 // 以p1的中心點向左遍歷獲取點集合 61 List<Point> p1LeftChanel = getLeftChanel(point1, 0, pieceWidth); 62 // 以p2的中心點向左遍歷獲取點集合 63 p2LeftChanel = getLeftChanel(point2, 0, pieceWidth); 64 Map<Point, Point> leftLinkPoints = getYLinkPoints(p1LeftChanel, 65 p2LeftChanel, pieceWidth); 66 // 向右遍歷, 不得超過Board的邊框(有方塊的地方) 67 // 以p1的中心點向右遍歷獲取點集合 68 p1RightChanel = getRightChanel(point1, widthMax, pieceWidth); 69 // 以p2的中心點向右遍歷獲取點集合 70 List<Point> p2RightChanel = getRightChanel(point2, widthMax, 71 pieceWidth); 72 Map<Point, Point> rightLinkPoints = getYLinkPoints(p1RightChanel, 73 p2RightChanel, pieceWidth); 74 result.putAll(leftLinkPoints); 75 result.putAll(rightLinkPoints); 76 } 77 // point2位于point1的右上角 78 if (isRightUp(point1, point2)) 79 { 80 // 獲取point1向上遍歷, point2向下遍歷時橫向可以連接的點 81 Map<Point, Point> upDownLinkPoints = getXLinkPoints(p1UpChanel, 82 p2DownChanel, pieceWidth); 83 // 獲取point1向右遍歷, point2向左遍歷時縱向可以連接的點 84 Map<Point, Point> rightLeftLinkPoints = getYLinkPoints( 85 p1RightChanel, p2LeftChanel, pieceHeight); 86 // 獲取以p1為中心的向上通道 87 p1UpChanel = getUpChanel(point1, 0, pieceHeight); 88 // 獲取以p2為中心的向上通道 89 p2UpChanel = getUpChanel(point2, 0, pieceHeight); 90 // 獲取point1向上遍歷, point2向上遍歷時橫向可以連接的點 91 Map<Point, Point> upUpLinkPoints = getXLinkPoints(p1UpChanel, 92 p2UpChanel, pieceWidth); 93 // 獲取以p1為中心的向下通道 94 p1DownChanel = getDownChanel(point1, heightMax, pieceHeight); 95 // 獲取以p2為中心的向下通道 96 p2DownChanel = getDownChanel(point2, heightMax, pieceHeight); 97 // 獲取point1向下遍歷, point2向下遍歷時橫向可以連接的點 98 Map<Point, Point> downDownLinkPoints = getXLinkPoints(p1DownChanel, 99 p2DownChanel, pieceWidth); 100 // 獲取以p1為中心的向右通道 101 p1RightChanel = getRightChanel(point1, widthMax, pieceWidth); 102 // 獲取以p2為中心的向右通道 103 List<Point> p2RightChanel = getRightChanel(point2, widthMax, 104 pieceWidth); 105 // 獲取point1向右遍歷, point2向右遍歷時縱向可以連接的點 106 Map<Point, Point> rightRightLinkPoints = getYLinkPoints( 107 p1RightChanel, p2RightChanel, pieceHeight); 108 // 獲取以p1為中心的向左通道 109 List<Point> p1LeftChanel = getLeftChanel(point1, 0, pieceWidth); 110 // 獲取以p2為中心的向左通道 111 p2LeftChanel = getLeftChanel(point2, 0, pieceWidth); 112 // 獲取point1向左遍歷, point2向右遍歷時縱向可以連接的點 113 Map<Point, Point> leftLeftLinkPoints = getYLinkPoints(p1LeftChanel, 114 p2LeftChanel, pieceHeight); 115 result.putAll(upDownLinkPoints); 116 result.putAll(rightLeftLinkPoints); 117 result.putAll(upUpLinkPoints); 118 result.putAll(downDownLinkPoints); 119 result.putAll(rightRightLinkPoints); 120 result.putAll(leftLeftLinkPoints); 121 } 122 // point2位于point1的右下角 123 if (isRightDown(point1, point2)) 124 { 125 // 獲取point1向下遍歷, point2向上遍歷時橫向可連接的點 126 Map<Point, Point> downUpLinkPoints = getXLinkPoints(p1DownChanel, 127 p2UpChanel, pieceWidth); 128 // 獲取point1向右遍歷, point2向左遍歷時縱向可連接的點 129 Map<Point, Point> rightLeftLinkPoints = getYLinkPoints( 130 p1RightChanel, p2LeftChanel, pieceHeight); 131 // 獲取以p1為中心的向上通道 132 p1UpChanel = getUpChanel(point1, 0, pieceHeight); 133 // 獲取以p2為中心的向上通道 134 p2UpChanel = getUpChanel(point2, 0, pieceHeight); 135 // 獲取point1向上遍歷, point2向上遍歷時橫向可連接的點 136 Map<Point, Point> upUpLinkPoints = getXLinkPoints(p1UpChanel, 137 p2UpChanel, pieceWidth); 138 // 獲取以p1為中心的向下通道 139 p1DownChanel = getDownChanel(point1, heightMax, pieceHeight); 140 // 獲取以p2為中心的向下通道 141 p2DownChanel = getDownChanel(point2, heightMax, pieceHeight); 142 // 獲取point1向下遍歷, point2向下遍歷時橫向可連接的點 143 Map<Point, Point> downDownLinkPoints = getXLinkPoints(p1DownChanel, 144 p2DownChanel, pieceWidth); 145 // 獲取以p1為中心的向左通道 146 List<Point> p1LeftChanel = getLeftChanel(point1, 0, pieceWidth); 147 // 獲取以p2為中心的向左通道 148 p2LeftChanel = getLeftChanel(point2, 0, pieceWidth); 149 // 獲取point1向左遍歷, point2向左遍歷時縱向可連接的點 150 Map<Point, Point> leftLeftLinkPoints = getYLinkPoints(p1LeftChanel, 151 p2LeftChanel, pieceHeight); 152 // 獲取以p1為中心的向右通道 153 p1RightChanel = getRightChanel(point1, widthMax, pieceWidth); 154 // 獲取以p2為中心的向右通道 155 List<Point> p2RightChanel = getRightChanel(point2, widthMax, 156 pieceWidth); 157 // 獲取point1向右遍歷, point2向右遍歷時縱向可以連接的點 158 Map<Point, Point> rightRightLinkPoints = getYLinkPoints( 159 p1RightChanel, p2RightChanel, pieceHeight); 160 result.putAll(downUpLinkPoints); 161 result.putAll(rightLeftLinkPoints); 162 result.putAll(upUpLinkPoints); 163 result.putAll(downDownLinkPoints); 164 result.putAll(leftLeftLinkPoints); 165 result.putAll(rightRightLinkPoints); 166 } 167 return result; 168 }

? ? 上面代碼調(diào)用了getYLinkPoints、getXLinkPoints方法來收集各種可能出現(xiàn)的連接路徑。

? ??getYLinkPoints、getXLinkPoints兩種方法的代碼如下:src\org\crazyit\link\board\impl\GameServiceImpl.java

/*** 遍歷兩個集合, 先判斷第一個集合的元素的y座標與另一個集合中的元素y座標相同(橫向),* 如果相同, 即在同一行, 再判斷是否有障礙, 沒有 則加到結(jié)果的map中去* * @param p1Chanel* @param p2Chanel* @param pieceWidth* @return 存放可以橫向直線連接的連接點的鍵值對*/private Map<Point, Point> getXLinkPoints(List<Point> p1Chanel,List<Point> p2Chanel, int pieceWidth){Map<Point, Point> result = new HashMap<Point, Point>();for (int i = 0; i < p1Chanel.size(); i++){// 從第一通道中取一個點Point temp1 = p1Chanel.get(i);// 再遍歷第二個通道, 看下第二通道中是否有點可以與temp1橫向相連for (int j = 0; j < p2Chanel.size(); j++){Point temp2 = p2Chanel.get(j);// 如果y座標相同(在同一行), 再判斷它們之間是否有直接障礙if (temp1.y == temp2.y){if (!isXBlock(temp1, temp2, pieceWidth)){// 沒有障礙則直接加到結(jié)果的map中 result.put(temp1, temp2);}}}}return result;}

? ? 經(jīng)過上面的處理,getLinkPoints(Point point1,Point point2,int pieceWidth,int pieceHeight)方法可以找出point1、point2兩個點之間的所有可能的連接情況,該方法返回一個Map對象,每個key-value對代表一種連接情況,其中key代表第一個連接點,value代表第二個連接點。

? ? 但point1、point2之間有多種連接情況時,程序還需要找出所有連接情況中的最短路徑,,上面代碼中調(diào)用了getShortcut(Point p1,Point p2,turns,getDistance(Point p1,Point p2))方法進行處理。

?

(十)找出最短距離

? ? 為了找出最短路徑,程序可分為兩步。

? ? 1.遍歷轉(zhuǎn)折點Map中所有key-value對,與原來選擇的兩個點構(gòu)成了一個LinkInfo。每個LinkInfo代表一條完整的連接路徑,并將這些LinkInfo收集成一個List集合。

? ? 2.遍歷第一步得到的List<LinkInfo>集合,計算每個LinkInfo中連接全部連接點的總距離,選與最短距離相差最小的LinkInfo返回即可。

? ? 代碼如下:src\org\crazyit\link\board\impl\GameServiceImpl.java

1 /** 2 * 獲取p1和p2之間最短的連接信息 3 * 4 * @param p1 5 * @param p2 6 * @param turns 放轉(zhuǎn)折點的map 7 * @param shortDistance 兩點之間的最短距離 8 * @return p1和p2之間最短的連接信息 9 */ 10 private LinkInfo getShortcut(Point p1, Point p2, Map<Point, Point> turns, 11 int shortDistance) 12 { 13 List<LinkInfo> infos = new ArrayList<LinkInfo>(); 14 // 遍歷結(jié)果Map, 15 for (Point point1 : turns.keySet()) 16 { 17 Point point2 = turns.get(point1); 18 // 將轉(zhuǎn)折點與選擇點封裝成LinkInfo對象, 放到List集合中 19 infos.add(new LinkInfo(p1, point1, point2, p2)); 20 } 21 return getShortcut(infos, shortDistance); 22 } 23 24 /** 25 * 從infos中獲取連接線最短的那個LinkInfo對象 26 * 27 * @param infos 28 * @return 連接線最短的那個LinkInfo對象 29 */ 30 private LinkInfo getShortcut(List<LinkInfo> infos, int shortDistance) 31 { 32 int temp1 = 0; 33 LinkInfo result = null; 34 for (int i = 0; i < infos.size(); i++) 35 { 36 LinkInfo info = infos.get(i); 37 // 計算出幾個點的總距離 38 int distance = countAll(info.getLinkPoints()); 39 // 將循環(huán)第一個的差距用temp1保存 40 if (i == 0) 41 { 42 temp1 = distance - shortDistance; 43 result = info; 44 } 45 // 如果下一次循環(huán)的值比temp1的還小, 則用當前的值作為temp1 46 if (distance - shortDistance < temp1) 47 { 48 temp1 = distance - shortDistance; 49 result = info; 50 } 51 } 52 return result; 53 } 54 55 /** 56 * 計算List<Point>中所有點的距離總和 57 * 58 * @param points 需要計算的連接點 59 * @return 所有點的距離的總和 60 */ 61 private int countAll(List<Point> points) 62 { 63 int result = 0; 64 for (int i = 0; i < points.size() - 1; i++) 65 { 66 // 獲取第i個點 67 Point point1 = points.get(i); 68 // 獲取第i + 1個點 69 Point point2 = points.get(i + 1); 70 // 計算第i個點與第i + 1個點的距離,并添加到總距離中 71 result += getDistance(point1, point2); 72 } 73 return result; 74 } 75 76 /** 77 * 獲取兩個LinkPoint之間的最短距離 78 * 79 * @param p1 第一個點 80 * @param p2 第二個點 81 * @return 兩個點的距離距離總和 82 */ 83 private int getDistance(Point p1, Point p2) 84 { 85 int xDistance = Math.abs(p1.x - p2.x); 86 int yDistance = Math.abs(p1.y - p2.y); 87 return xDistance + yDistance; 88 }

? ? 到這,連連看游戲中兩個方塊可能相連的所有情況都處理完成了,應(yīng)用程序即可調(diào)用GameServiceImpl所提供的Link(Piece p1,Piece p2)方法來判斷兩個方塊是否可以相連了,這個過程也是最繁瑣的地方。

? ? 通過連連看游戲的分析與學習,加強了開發(fā)者界面分析與數(shù)據(jù)建模的能力。通過自定義View來實現(xiàn)游戲的主界面。連連看中需要判斷兩個方塊是否可以相連,需要開發(fā)這對兩個方塊的位置分門別類地進行處理,也加強開發(fā)者冷靜、條理化的思維。

?

具體實現(xiàn)步驟連接:

android開發(fā)學習之路——連連看之游戲界面(一)

android開發(fā)學習之路——連連看之數(shù)據(jù)模型(二)

android開發(fā)學習之路——連連看之加載圖片(三)

android開發(fā)學習之路——連連看之游戲Activity(四)

android開發(fā)學習之路——連連看之游戲邏輯(五)

轉(zhuǎn)載于:https://www.cnblogs.com/weilongfu/p/7388081.html

總結(jié)

以上是生活随笔為你收集整理的android开发学习之路——连连看之游戏逻辑(五)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

中文在线a∨在线 | 视频91| 黄色精品久久久 | 午夜黄色影院 | 精品一区精品二区高清 | 久久最新视频 | 91看片在线观看 | 黄色大片免费网站 | 91高清一区| 91最新视频 | 亚洲精品资源在线 | 97视频在线免费播放 | 一级特黄aaa大片在线观看 | 日本精品一区二区三区在线播放视频 | 99在线国产| 免费视频色 | 国产欧美综合在线观看 | 久久国产精品99久久久久久进口 | 精品一区 精品二区 | 国产日韩在线播放 | 午夜精品视频免费在线观看 | 国产精品系列在线观看 | 成人免费观看在线视频 | 婷婷综合导航 | 国产精品99久久99久久久二8 | 97在线免费观看 | 国产小视频网站 | 三级黄色在线观看 | 青青草华人在线视频 | 欧美久久久久 | 视频在线91 | 亚洲一级片免费观看 | 国产在线精品一区二区不卡了 | 日韩视频免费 | www.操.com| 激情视频久久 | 91精品久久久久久综合乱菊 | 麻豆视频免费入口 | 国产精品视频永久免费播放 | 一区二区精品在线视频 | 91欧美日韩国产 | 国产成人综合图片 | 在线播放一区二区三区 | 亚洲精品www久久久久久 | 中文字幕精品一区 | 91成人精品国产刺激国语对白 | 亚洲国产wwwccc36天堂 | 夜夜骑日日 | 成年人黄色免费视频 | 色欧美日韩 | 美女性爽视频国产免费app | 国产精品日韩欧美一区二区 | 77国产精品 | 天堂va欧美va亚洲va老司机 | 成人免费视频网 | 久久久av电影 | 中文字幕资源在线 | 黄色app网站在线观看 | 天天干天天做 | 欧美黄色高清 | 日韩综合一区二区三区 | 黄色一级网 | 成人网在线免费视频 | 中文不卡视频在线 | 天天综合天天做 | 免费看黄的视频 | 狠狠操狠狠干2017 | 国产91精品久久久久久 | 日韩精品一区二区在线 | 在线亚洲日本 | 日本精品视频在线播放 | 久久久久久久影视 | 在线观看激情av | 久久精品一级片 | 日韩精品三区四区 | 最近中文字幕完整高清 | 久久精品网站视频 | 中文字幕视频播放 | 久久久国产影院 | 国产精品2018 | av高清不卡 | 天天操夜操视频 | 亚洲91精品在线观看 | 国产视频一区精品 | 欧美精品九九99久久 | 亚洲国产精品一区二区久久,亚洲午夜 | 国偷自产中文字幕亚洲手机在线 | 天天爱天天射天天干天天 | 四虎海外影库www4hu | 久久久麻豆视频 | 人人dvd| 日本最新一区二区三区 | 亚洲一区二区三区毛片 | 国产在线黄色 | 欧美 亚洲 另类 激情 另类 | av视屏在线播放 | 色在线免费 | 成人精品福利 | 国产91精品在线播放 | 一区视频在线 | 亚洲国产精品女人久久久 | 国产91精品高清一区二区三区 | 97精品免费视频 | 日日天天干 | 国内视频 | 久操免费视频 | www在线观看视频 | 亚洲欧美成人在线 | 亚洲精品字幕 | 国产精品成人一区二区三区吃奶 | 97超碰免费在线观看 | 麻豆 91 在线 | 欧美精品国产综合久久 | 日本精品中文字幕在线观看 | 日韩av一区在线观看 | 欧美男同视频网站 | 亚洲欧洲精品一区二区 | 男女日麻批 | 亚洲精品乱码久久久久久蜜桃动漫 | 嫩草av在线 | 热久久免费视频精品 | 国产自在线 | 国产一在线精品一区在线观看 | 视频高清 | 亚洲欧美国产精品18p | 国产在线精品观看 | 国产最新视频在线观看 | 国产婷婷精品av在线 | 日本精品久久 | 色婷婷福利 | 国产黄色在线观看 | 中日韩三级视频 | 亚洲高清网站 | 久久无码精品一区二区三区 | 亚洲精品女人 | 国产va饥渴难耐女保洁员在线观看 | 日韩精品在线免费播放 | 成人免费观看大片 | 国产精品久久久久久一区二区 | 婷婷六月激情 | 久久精品亚洲精品国产欧美 | 成片人卡1卡2卡3手机免费看 | 国产精品视频app | 中文字幕日韩电影 | www亚洲精品| av在线一级 | 天天综合操| 狠狠操狠狠干天天操 | 亚洲无线视频 | 成人av片免费观看app下载 | www.亚洲精品在线 | 亚洲视频大全 | 日本中文字幕影院 | 日韩精品在线免费观看 | 亚洲三区在线 | 国产一级在线 | 天天操天天干天天操天天干 | 欧美久久久久久久久 | 中文字幕免费国产精品 | 日韩激情免费视频 | 五月天婷婷综合 | 免费网站黄色 | 国产精品成人一区二区三区吃奶 | 婷婷在线视频观看 | 欧美在线你懂的 | 国产私拍在线 | 91麻豆精品| 99久久久国产精品免费观看 | 亚洲欧美国产视频 | 91久久精品日日躁夜夜躁国产 | 中文字幕在线观看视频一区 | 亚洲视频一区二区三区在线观看 | 国产精品视频在线看 | 国产一区二区网址 | 国产高清在线免费视频 | 欧美性生活免费 | 天天色综合天天 | 不卡av免费在线观看 | a在线免费观看视频 | 91探花在线视频 | 色综合久久99 | 国产1区2 | 色婷婷成人 | 九九久久精品 | 午夜国产在线观看 | 色视频在线免费 | 天天操天天干天天 | 天天天色| 国产在线观看 | 国产香蕉视频 | 九九九热 | 在线视频a | 日韩xxxbbb| 国产精品一区一区三区 | 国产亚洲aⅴaaaaaa毛片 | 美女网站黄免费 | 91插插视频| 国产视频中文字幕 | 久久久久一区二区三区四区 | 黄色片视频在线观看 | 日韩av视屏 | 99re国产 | 色婷婷丁香 | 久久国产精品二国产精品中国洋人 | 日韩精品极品视频 | 丁香六月天 | 国产精品一区二区吃奶在线观看 | 欧美日本在线视频 | 麻豆国产视频下载 | 日韩欧美一区二区三区视频 | 黄色三级网站在线观看 | 免费av片在线 | 97超碰国产精品女人人人爽 | 伊人电影天堂 | 日韩av影视在线观看 | 亚洲三级国产 | 精品久久久久国产免费第一页 | 婷婷在线视频观看 | 欧美日韩国产精品一区二区 | 亚洲成av人影片在线观看 | 九九久久电影 | 中文 一区二区 | 婷婷网站天天婷婷网站 | 日韩在线精品视频 | av福利网址导航 | 国产精品久久久免费看 | 亚洲乱码一区 | 九九免费精品视频在线观看 | 97色噜噜 | 亚洲国产最新 | 日韩色区 | 亚州性色| 欧美日本日韩aⅴ在线视频 插插插色综合 | 亚洲精品乱码久久久久v最新版 | 天天综合91 | 国产一级电影免费观看 | v片在线看 | 天天爽夜夜爽精品视频婷婷 | 国产精品自产拍在线观看中文 | 中文字幕在线资源 | 97精品国自产拍在线观看 | 亚洲影院一区 | 国产不卡在线 | 亚洲成人免费在线 | 国内视频1区 | 天天射天天操天天 | 国产少妇在线观看 | 亚洲精品影视在线观看 | 国产免费观看久久黄 | 久久黄色影院 | 三级av网| 免费久久网站 | 中文字幕在线看片 | 国产高清专区 | 在线观看国产一区 | 91精品国产综合久久婷婷香蕉 | 国产精品18久久久 | 日韩婷婷 | 久久久久久久久网站 | 天天做天天爱天天爽综合网 | 久久影院中文字幕 | 国产美女网站在线观看 | 日本精品在线看 | 亚洲精品乱码白浆高清久久久久久 | 成人精品999 | 亚洲精品理论 | av电影一区二区三区 | 日韩精品在线看 | 狠狠88综合久久久久综合网 | 国产精品久久在线 | 中文字幕中文字幕在线中文字幕三区 | 国产精品99久久久精品免费观看 | 精品国产区在线 | www.午夜色.com | 国内综合精品午夜久久资源 | 中文字幕精品一区久久久久 | 免费av黄色 | 99精品视频在线播放观看 | 99精品国产一区二区三区麻豆 | 丁香婷婷成人 | 日韩视频一区二区在线观看 | 日日成人网| www.亚洲精品视频 | 亚洲va男人天堂 | 亚洲男女精品 | 午夜视频在线观看欧美 | 色夜影院| 五月婷婷视频在线 | 国产91精品久久久久久 | 国产一区在线免费观看视频 | 狠狠色噜噜狠狠狠合久 | 狠狠插天天干 | 久久久精品亚洲 | 欧美日韩中文字幕在线视频 | 久久视频这里有久久精品视频11 | 成人免费av电影 | 亚洲精品影院在线观看 | 日本精品免费看 | 久久久九色精品国产一区二区三区 | 国产一区二区三区免费观看视频 | 国产 在线 高清 精品 | 九九一级片 | 狠狠色丁香婷婷综合基地 | 国产日韩亚洲 | 97超碰免费在线观看 | 免费视频 你懂的 | 亚洲日韩欧美一区二区在线 | 国产精品精品久久久 | 丁香九月婷婷综合 | 看片一区二区三区 | 欧美久久久久久久久久 | 免费在线一区二区 | 99久久这里只有精品 | 亚洲精品美女视频 | av在线色| 在线观看中文av | av三级在线免费观看 | 免费高清无人区完整版 | 久久字幕精品一区 | 综合在线亚洲 | 91精品久久久久久粉嫩 | 国产日韩欧美中文 | 国产精品区二区三区日本 | 综合色爱 | 亚洲高清视频在线播放 | 日韩av在线免费播放 | 欧美伊人网 | av资源网在线播放 | 91九色视频在线观看 | 91激情在线视频 | 黄色亚洲 | 韩国一区二区三区在线观看 | 成人av一区二区在线观看 | 天天干,天天干 | 精品99久久久久久 | 婷婷国产在线观看 | 欧美成人一区二区 | 成人动漫一区二区 | 91免费看黄 | 成人在线视频免费 | 国产成人av福利 | 蜜臀精品久久久久久蜜臀 | 精品免费视频 | 国产成人福利在线 | 在线中文字幕一区二区 | 久99久精品视频免费观看 | 午夜久久 | 欧美日韩在线免费观看视频 | 久久久蜜桃一区二区 | 亚洲精品九九 | 免费福利在线观看 | 四虎成人免费影院 | 97电影手机 | 日韩视频一区二区 | 国内精品久久久久久久影视麻豆 | 伊人天堂网 | 香蕉视频18 | 免费观看av网站 | 国产精品久久久久久久久久不蜜月 | 久久免费片 | 久久影视网 | 午夜视频在线观看网站 | 久久久黄色免费网站 | 亚洲一区二区视频在线播放 | 男女精品久久 | 国产成人精品一区二区三区在线观看 | 中文字幕资源在线 | 友田真希x88av| 日韩三级一区 | 99精品一区二区 | 日韩精品极品视频 | 久久九九免费 | 99精品在线看 | 看v片| 亚洲成人黄色 | 99国产情侣在线播放 | 最近中文字幕大全中文字幕免费 | 综合色在线观看 | 午夜av剧场| 99久久婷婷国产综合亚洲 | 久草视频在线看 | a精品视频| 成人免费视频免费观看 | 综合久久久久久久 | 婷婷色综合色 | 婷婷在线精品视频 | 九九热免费精品视频 | 欧美极品少妇xxxx | 国产成人精品一区二区三区福利 | 欧美午夜a | 欧美精品亚洲二区 | 欧美日韩在线免费观看 | 在线观看视频国产一区 | 日韩精品一区在线观看 | 国产一区二区三区在线免费观看 | 国产成人精品999在线观看 | 99视频在线看 | av在线看网站 | 黄色毛片视频免费 | 国产中文字幕在线看 | 99精品毛片 | 在线成人高清电影 | 欧美激情视频一区 | 91麻豆.com| 波多野结衣在线中文字幕 | 91av在线免费观看 | 波多野结衣在线中文字幕 | 欧美怡红院视频 | 日韩欧美一区二区不卡 | 国产一级黄色片免费看 | 欧美日韩一区二区三区视频 | 国产亚洲视频在线观看 | av免费黄色| av在线精品 | 久草视频首页 | 91大神电影 | 中文字幕 在线看 | 久草在线观看 | 日韩色一区二区三区 | 亚洲精品在线资源 | 国产精品成人一区二区三区 | 色婷婷综合久久久久中文字幕1 | 81精品国产乱码久久久久久 | 日本精a在线观看 | 中文字幕色在线视频 | 欧美日韩三级在线观看 | 精品自拍sae8—视频 | 亚洲国产一区在线观看 | 国产精品入口久久 | 久草视频免费在线播放 | 国产人免费人成免费视频 | 国产成人综合精品 | 欧美亚洲国产一卡 | 中文字幕av最新更新 | 欧美一区二视频在线免费观看 | bayu135国产精品视频 | 日韩成人精品一区二区 | 中文字幕在线免费97 | 久草在线资源观看 | 精品亚洲在线 | 亚洲人人av| 精品在线亚洲视频 | 欧洲一区二区三区精品 | av观看久久久 | 狠狠色网 | 天天综合网在线观看 | 精品字幕在线 | 色网av | 精品一区二区三区在线播放 | 日韩在线网址 | 精品久久久久久久久亚洲 | 国产精品伦一区二区三区视频 | 激情xxxx| 久久国产一区二区 | 欧美日韩色婷婷 | 中文字幕av最新更新 | 亚洲91av| 日韩精品久久一区二区 | 久久激情小视频 | 97成人精品区在线播放 | 超碰在线国产 | 人人干网站 | 91麻豆高清视频 | 97国产在线观看 | 国产精品美女久久久久aⅴ 干干夜夜 | 国产精品9区 | 在线久热 | 成人禁用看黄a在线 | 999免费视频 | 国产精品入口传媒 | 玖玖色在线观看 | 亚洲成a人片77777kkkk1在线观看 | 九九视频免费在线观看 | 久久影视精品 | 久久午夜视频 | 激情小说久久 | 免费成人黄色av | 97人人添人澡人人爽超碰动图 | 午夜国产在线 | 国产91精品一区二区麻豆网站 | 在线免费黄色av | 国产美女网| 国产香蕉av | 综合色中色 | 国内精品在线观看视频 | 亚洲一区日韩在线 | 国内精品毛片 | 久久精品免费观看 | 中文字幕在线看视频国产中文版 | 五月婷婷av | 三级黄色三级 | www黄色 | 日本中文字幕在线视频 | 午夜91视频| 免费看片网址 | 精品国产一区二区三区噜噜噜 | 中文字幕在线观看完整版 | 在线观看91av | 亚洲一区二区三区在线看 | www.看片网站 | 欧美a级免费视频 | 色婷婷啪啪免费在线电影观看 | 99精品国产一区二区三区麻豆 | 亚洲精品在线观看网站 | 亚洲精品午夜久久久久久久久久久 | 91精品在线麻豆 | 91黄色小网站| 久久免费在线观看视频 | 免费黄av| 久草精品视频 | 精品欧美一区二区三区久久久 | 亚洲伦理电影在线 | 香蕉在线视频观看 | 久久久久久高潮国产精品视 | 久久se视频| 91九色视频导航 | 狠狠色丁香九九婷婷综合五月 | 在线精品亚洲一区二区 | 亚洲视频在线看 | 在线国产一区二区三区 | 国产精品综合av一区二区国产馆 | 国产剧情在线一区 | 九热精品 | 国产亚洲久一区二区 | 激情网五月婷婷 | 午夜视频色 | 91成人小视频 | 日韩欧美精品一区二区三区经典 | 在线观看午夜av | 国产亚洲视频系列 | 91精品一区二区三区蜜臀 | 国产精品美女毛片真酒店 | 日本h在线播放 | 99精品在线播放 | 西西444www大胆高清图片 | 97在线观看免费高清 | 97超碰人人澡人人爱学生 | 国产精品区在线观看 | 日韩欧美在线综合网 | 美女黄视频免费 | 午夜电影 电影 | 国产伦理剧 | 99亚洲视频| 国产精品中文久久久久久久 | 少妇av片 | 热久久99这里有精品 | 久久久一本精品99久久精品 | 91在线精品视频 | 免费观看www7722午夜电影 | 欧美黑人性爽 | 99免费在线观看 | 最近2019好看的中文字幕免费 | 国产黄色免费电影 | 精品久久久久久久久久久久久久久久 | 日本韩国中文字幕 | 高清免费av在线 | 国产一区在线免费观看 | 91综合久久一区二区 | 天天操伊人 | 激情深爱.com | 久久综合久久综合这里只有精品 | 大胆欧美gogo免费视频一二区 | 伊人中文字幕在线 | 成人久久久久久久久久 | 久久高清视频免费 | 国产精品嫩草影视久久久 | 欧美日韩精品在线观看 | 日韩动漫免费观看高清完整版在线观看 | 成人综合婷婷国产精品久久免费 | 免费精品国产va自在自线 | 国产精品久久久久久久久久久久午夜 | 国产精品欧美久久久久无广告 | 91尤物在线播放 | 91精品国产自产91精品 | av片中文 | 午夜精品一区二区三区可下载 | 中文免费观看 | 亚洲精品小视频 | 免费观看的av网站 | 国产91精品欧美 | 手机在线小视频 | 欧美日韩国产免费视频 | av免费网页 | 日韩精品视频在线观看免费 | 四虎国产永久在线精品 | 国产原创中文在线 | 日韩大片免费在线观看 | 黄色视屏在线免费观看 | 黄色精品久久久 | 2019精品手机国产品在线 | 麻豆成人在线观看 | 97视频人人 | 99精品国产视频 | 91亚洲永久精品 | 国产成人av一区二区三区在线观看 | 五月天,com | 操老逼免费视频 | 婷婷色在线播放 | 九九久久精品 | 麻豆视频大全 | 成人国产精品久久久 | 亚洲人成网站精品片在线观看 | 999精品网 | www.五月婷婷.com | 成人免费观看网站 | 五月婷社区| 98涩涩国产露脸精品国产网 | 91免费网站在线观看 | 天天天天天天天天操 | 亚洲欧美成人综合 | www.天天射.com| 成年人国产精品 | av日韩在线网站 | 99精品国产在热久久下载 | 午夜精品久久久99热福利 | 三级黄色免费 | 亚洲精品乱码久久久久 | 精品一区电影 | 国产精品麻豆三级一区视频 | 免费一级特黄毛大片 | 最近中文字幕mv免费高清在线 | 在线观看视频黄 | 久久综合亚洲鲁鲁五月久久 | 麻花天美星空视频 | 不卡的av | 午夜电影久久久 | 黄色小网站在线观看 | 狠狠色丁香久久综合网 | 色天天久久 | 国产精彩视频一区 | 国产精品免费久久久久 | 99人久久精品视频最新地址 | 国产一区二区高清不卡 | 国产黄色观看 | 色激情在线 | 久久久视频在线 | 在线探花| 国产私拍在线 | 中文在线a√在线 | 国产一区国产二区在线观看 | 黄色av在 | 91精彩视频| 伊人国产在线播放 | 精品99在线观看 | 久久免费精品国产 | 久久久精品日本 | 在线一二区 | 国产精品久久久久久久久费观看 | 久久久91精品国产一区二区三区 | 9在线观看免费 | av亚洲产国偷v产偷v自拍小说 | 中文字幕在线成人 | 伊人宗合| 欧美激情综合五月 | 国产欧美精品xxxx另类 | 中文字幕观看av | 亚洲一二三区精品 | 免费在线观看不卡av | 手机av电影在线观看 | 成人理论在线观看 | www.狠狠| 午夜日b视频 | 欧美激情在线网站 | 日韩城人在线 | 日本aaaa级毛片在线看 | 日日夜夜天天久久 | 婷婷丁香激情网 | 成人av电影免费在线播放 | 国产精品美女久久久久久久久久久 | 亚洲国产综合在线 | 国产理伦在线 | 九热精品| 91在线播放国产 | 国产精品成人久久久 | 九色琪琪久久综合网天天 | 婷婷草 | 成人超碰在线 | 成人黄在线 | 97香蕉久久超级碰碰高清版 | 中文字幕美女免费在线 | 91在线观| a黄在线观看 | 免费观看性生活大片 | 久久97久久 | 超碰在线日韩 | 日韩在线视频国产 | 综合色狠狠 | 免费观看福利视频 | 免费午夜在线视频 | 久久电影国产免费久久电影 | 91av免费在线观看 | 国产五月婷婷 | 伊人中文在线 | 国产伦精品一区二区三区高清 | 日韩一区二区三区高清免费看看 | 国产视频在线观看一区 | 狠日日 | 黄色影院在线免费观看 | 成年人三级网站 | 久久天堂网站 | 国产精品成人一区二区 | 极品久久久久久久 | 亚洲欧美日韩中文在线 | 亚洲视频播放 | 久久久午夜剧场 | 欧美 日韩 国产 成人 在线 | 人人看看人人 | 最近中文字幕在线中文高清版 | 国产高清第一页 | 天天射天天搞 | av在线之家电影网站 | 成人永久免费 | 国产不卡网站 | 亚洲精品国产综合久久 | 中文字幕乱在线伦视频中文字幕乱码在线 | 91看片在线 | 久久人人艹 | 国产剧在线观看片 | 欧美一区二区在线 | 黄色在线观看免费 | 精品国产成人av | 91九色pron| 午夜在线免费观看视频 | 韩国一区二区三区视频 | 国产精品美女久久久久久久 | 欧美日韩中文字幕视频 | 国产精品一区二区av影院萌芽 | 韩国在线一区 | 中文字幕av免费在线观看 | 91看国产| 日本中文字幕在线播放 | 九九久久久久久久久激情 | 激情综合婷婷 | 国产精品成人aaaaa网站 | 欧美日韩精品二区第二页 | 日韩av免费在线电影 | 久久新视频 | 亚洲三级在线免费观看 | 91中文字幕在线视频 | 99免费在线视频观看 | 亚洲精品在线看 | 日韩欧美一区视频 | 黄色中文字幕 | 亚洲成a人片在线www | 欧美成人黄色片 | 91在线超碰 | 天天婷婷 | 五月天激情综合网 | 激情久久一区二区三区 | 亚洲九九精品 | 免费久久久久久 | 99久久精品国产网站 | 亚洲精品88欧美一区二区 | 日本护士三级少妇三级999 | 精品成人国产 | 中文av影院 | 国际精品网 | 成全在线视频免费观看 | 久久久精品欧美一区二区免费 | 久久高清毛片 | 久久黄色免费视频 | 欧洲激情综合 | 亚洲韩国一区二区三区 | 国产精品久久一区二区三区不卡 | 91麻豆精品国产91久久久更新时间 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 亚洲一级二级三级 | 欧美激情视频一区二区三区免费 | 在线国产中文字幕 | 亚洲视频h | 狠狠网站 | 国产视频久久久 | av在线播放快速免费阴 | 91亚色视频在线观看 | 91最新视频 | 亚洲特级片| 亚洲精品在线观看视频 | 91亚瑟视频 | 黄色片网站大全 | 日本99干网 | www夜夜操 | 中国一级特黄毛片大片久久 | 91九色性视频 | 久久久久97国产 | 狠狠gao | 中文字幕2021 | 久久色视频 | 亚洲午夜av | 最近日本字幕mv免费观看在线 | 精品无人国产偷自产在线 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 亚洲国产中文字幕在线观看 | 日韩激情免费视频 | 婷婷色在线资源 | 特级毛片爽www免费版 | 经典三级一区 | 久久一区91 | 亚洲精品视频中文字幕 | av千婊在线免费观看 | 91av在线免费 | 久久好看免费视频 | 国产精品不卡一区 | 国产精品九九热 | 91欧美国产 | 久久精品国产第一区二区三区 | 在线视频日韩欧美 | 日韩午夜av | 久久夜色精品国产亚洲aⅴ 91chinesexxx | av网站播放 | 九九视频这里只有精品 | 国产精品手机播放 | 天天曰夜夜操 | 色综合网在线 | 日韩免费一区二区三区 | 天天综合网 天天综合色 | 国产麻豆精品传媒av国产下载 | 高清在线一区二区 | 国产精品女主播一区二区三区 | 日韩久久久久久久久久 | 国产一区二区观看 | 国产99在线 | 欧美精品在线观看免费 | www.色午夜,com | 亚洲人在线7777777精品 | 久久久久久国产精品久久 | 中文字幕乱码一区二区 | 久久国产免 | 亚洲乱码国产乱码精品天美传媒 | 欧美在线不卡一区 | 青青河边草免费 | 久久久五月天 | 欧美在线视频不卡 | 亚洲精选在线观看 | 色偷偷网站视频 | 天天干天天上 | 在线亚州| 亚洲欧洲精品久久 | 亚洲成人国产精品 | 色99色| 欧美大片在线看免费观看 | 一区二区三区四区五区六区 | 97超级碰碰碰碰久久久久 | 久久精品综合视频 | 亚洲天天综合 | 人人爽人人爽人人片 | 色综合 久久精品 | www最近高清中文国语在线观看 | 九九九九精品九九九九 | 亚洲精品在线观看中文字幕 | 国产一区二区三区在线免费观看 | 精品一区二区日韩 | 粉嫩av一区二区三区免费 | 久久精品导航 | 蜜臀av网站 | www免费视频com━ | 中文在线字幕观看电影 | 欧美精品少妇xxxxx喷水 | 久操视频在线免费看 | 天天射天 | 九九色网 | 中文字幕第 | 黄色三级免费片 | 日韩精品在线观看av | 亚洲精品国产精品国自产观看 | 国产福利网站 | 99精品视频在线观看播放 | 午夜色婷婷| 欧美一二三视频 | 欧美成人在线网站 | 国产亚洲精品成人av久久ww | 亚洲精品乱码久久久久 | 日韩成人免费在线 | 久久av中文字幕片 | 国产精成人品免费观看 | 日本精品一区二区在线观看 | 91在线观看高清 | 亚洲日本黄色 | 婷婷久久一区二区三区 | 久久国产一区二区三区 | 99国产情侣在线播放 | 国产日韩精品一区二区在线观看播放 | 精品久久电影 | 国产精品美女免费看 | 日本中文字幕观看 | 国产精品一区二区久久精品 | 日韩免费在线视频观看 | 日韩黄色一级电影 | 久久的色 | 日本三级在线观看中文字 | 丁香久久婷婷 | 亚洲成人av免费 | 在线看v片成人 | 欧美最猛性xxxxx亚洲精品 | 最近高清中文在线字幕在线观看 | 久久伊人操 | 色网站在线免费观看 | www.狠狠干 | 天天爽天天摸 | 色婷婷亚洲综合 | 99热精品在线观看 | 波多野结衣理论片 | 成人免费 在线播放 | 欧美精彩视频 | 国产中文字幕在线免费观看 | 成年人看片网站 | 国产在线毛片 | 久久精美视频 | 亚洲午夜久久久久久久久 | 韩国一区二区三区视频 | 91桃色免费视频 | 五月天婷婷视频 | 永久免费看av | 日韩欧美一区二区不卡 | 日日干天天操 | zzijzzij亚洲日本少妇熟睡 | 又色又爽又激情的59视频 | 99在线视频播放 | 青青河边草免费观看 | 国产精品免费高清 | 色综合久久88色综合天天6 | 亚洲黄色在线 | 91精品欧美| 激情五月***国产精品 | 美女免费视频观看网站 | 国产不卡一二三区 | 黄污网站在线观看 | av中文字幕第一页 | 99视频一区 | 在线成人看片 | 精品人人爽 | 精品国产123| 久久99久久99精品中文字幕 | 精品福利网站 | 亚洲精品看片 | 久久天堂网站 | 国产精华国产精品 | 日韩羞羞 | 免费黄色一区 | 黄色软件大全网站 | 国产精品一区二区三区在线免费观看 | 婷婷色 亚洲 | 国产精品视频在线观看 | 伊人资源站| 成人黄在线 | 亚洲美女免费视频 | 国产中文字幕在线 | 日韩理论在线视频 | 久久99国产精品久久99 | 亚洲黄网址 | 亚洲视频免费在线看 | av免费线看 | 中文字幕在线观看完整版 | 国产91免费在线观看 | 国产一区二区高清视频 | 午夜精品久久久久久99热明星 | 国产一性一爱一乱一交 | 国产亚洲情侣一区二区无 | 久久综合精品国产一区二区三区 | 国产精品久久久久久久久搜平片 | 国产精品一区二区三区免费看 | 国产日韩高清在线 | 热久久99这里有精品 | 成人黄色在线视频 | 在线国产一区 | 日韩免费一区二区在线观看 | 免费观看一级视频 | 国产小视频在线免费观看 | 在线观看亚洲国产 | 日韩欧美国产成人 | 韩国av免费在线 | 成人一区二区三区在线观看 | 波多野结衣视频一区二区三区 | 亚洲国产中文字幕在线视频综合 | 国产亚洲精品综合一区91 | 中文字幕资源网 | 国产精品免费成人 | 久久情侣偷拍 | 精品国产乱码久久久久久三级人 | 91成人在线视频观看 | 麻豆影视网 | 91片在线观看 | 色资源网在线观看 | 一区二区不卡视频在线观看 | 96久久欧美麻豆网站 | 中文字幕日韩在线播放 | 精品国内自产拍在线观看视频 | 五月婷在线观看 | 成人国产精品久久久 | 日本久久久影视 | 91激情视频在线观看 | 久久人人爽人人片av | 中文字幕在线播放第一页 | 一区二区三区动漫 | 在线视频1卡二卡三卡 | 99在线观看免费视频精品观看 | 九色视频网址 | va视频在线观看 | 91香蕉亚洲精品 |