亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

原生JavaScript實現連連看游戲(附源碼)

2019-11-20 21:47:17
字體:
來源:轉載
供稿:網友
向大家推薦一款原生JavaScript版連連看游戲,源碼下載,首頁如下圖所示:
 
首先看一下html的布局方式在index.html文件中:
復制代碼 代碼如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>連連看</title>
<link rel="stylesheet" type="text/css" href="css/index.css"/>
</head>
<body>
<center>
<div id="whole">
<div id="gamePanel" tabindex="0">
<div id="pieces">
</div>
</div>
<div id="gameLogo">
</div>
<div id="scorePanel">
<span>分 數</span>
</div>
<div id="score">
<span>0</span>
</div>
<div id="timePanel">
<span>時 間</span>
</div>
<div id="time">
<span>0</span>
</div>
<div id="button">
<input id="start" type="button" onclick="Start();" value="開始"></input>
<input id="reset" type="button" onclick="Reset();"value="重置"></input>
</div>
</div>
</center>
<script type="text/javascript" src="js/map.js"></script>
<script type="text/javascript" src="js/piece.js"></script>
<script type="text/javascript" src="js/game.js"></script>
</body>
</html>

css文件夾下的index.css文件如下:
復制代碼 代碼如下:

body {
font-size : 16px;
font-weight : bold;
color : grey;
}
#whole {
border : 1px double #999999;
border-width : 5px;
width : 800px;
height : 505px;
position : relative;
}
#gamePanel {
margin: 1px 1px 1px 1px;
width : 602px;
height : 502px;
background : url(../img/background.gif) repeat;
position : absolute;
}
#pieces {
margin-top : 35px;
border : 1px solid #999999;
width : 546px;
height : 434px;
position: relative;
}
#pieces .piece {
width : 32px;
height : 36px;
position : relative;
cursor : pointer;
float : left;
}
#pieces .track {
width : 32px;
height : 36px;
position : relative;
float : left;
}
#pieces .track2 {
width : 32px;
height : 36px;
position : relative;
float : left;
background : red;
}
#gameLogo {
margin-top : 60px;
border : 1px solid #999999;
left : 607px;
width : 187px;
height : 73px;
background : url(../img/logo.gif);
position: absolute;
}
#scorePanel {
border : 1px solid #999999;
left : 607px;
top : 200px;
width : 187px;
height : 30px;
position : absolute;
}
#score {
border : 1px solid #999999;
left : 607px;
top : 240px;
width : 187px;
height : 30px;
position : absolute;
}
#timePanel {
border : 1px solid #999999;
left : 607px;
top : 300px;
width : 187px;
height : 30px;
position : absolute;
}
#time {
border : 1px solid #999999;
left : 607px;
top : 340px;
width : 187px;
height : 30px;
position : absolute;
}
#button {
border : 1px solid #999999;
left : 607px;
top : 400px;
width : 187px;
height : 30px;
position : absolute;
}

下面讓我們來看一下最核心的js部分實現代碼,js部分分為三個源文件即game.js、map.js、piece.js每一個源文件對應一個類,其中本游戲通過game類來操縱map和圖片piece對象:
game.js代碼如下:
復制代碼 代碼如下:

// 游戲控制類
var Game = {
// 游戲背景
gamePanel : null,
// 分數
score : 0,
// 時間
time : 0,
// 圖片映射表
pieceMap : null,
// 圖片列表
pieceList : [],
// 圖片列表不包含圖片
pieceImgList : [],
// 圖片隨機數列表
randomList : [],
// 軌跡列表
trackList : [],
// 游戲是否開始
isGameBigin : false,
// 游戲是否結束
isGameOver : false,
// 游戲是否重置
isGameReset : false,
// 圖片元素是否第一次點擊
isFirstClick : true,
// 開始游戲
start : function() {
document.getElementById("start").disabled = true;
document.getElementById("reset").disabled = false;
if (this.isGameReset) {
this.isGameOver = false;
this.startTime();
return;
} else if (this.isGameBegin) {
return;
} else {
this.init();
return;
}
},
reset : function() {
document.getElementById("start").disabled = false;
document.getElementById("reset").disabled = true;
this.clear();
this.initPieces();
this.initImgPieces();
this.time = 0;
document.getElementById("time").innerHTML = 0;
this.score = 0;
document.getElementById("score").innerHTML = 0;
this.isGameReset = true;
this.isGameBegin = true;
},
// 初始化
init : function() {
if (this.isGameBegin) {
return;
}
this.pieceMap = new Map();
var _this = this;
this.time = 0;
this.startTime();
this.gamePanel = document.getElementById("pieces");
this.initPieces();
this.initImgPieces();
this.isGameBegin = true;
},
// 將隨機生成的150張圖片添加進畫布
initPieces : function() {
var _this = this;
this.initRandomList();
// 打亂隨機列表排序
this.messRandomList();
for (var i = 0; i < 204; i ++) {
var piece = new Piece(this);
this.pieceList.push(piece);
var x = (i%17);
var y = Math.floor(i/17);
this.pieceMap.put(x+","+y, piece);
piece.setPosition(x, y);
this.gamePanel.appendChild(piece.dom);
if (x == 0 || x == 16 || y == 0 || y == 11) {
piece.track = document.createElement("div");
piece.track.className = "track";
piece.dom.appendChild(piece.track);
piece.isTracked = true;
continue;
} else {
if (x == 1 || x == 15 || y == 1 || y == 10) {
piece.setAtEdge(true);
}
this.pieceImgList.push(piece);
}
}
},
// 初始化圖片
initImgPieces : function() {
for (var i = 0; i < this.pieceImgList.length; i ++) {
this.pieceImgList[i].initImg();
this.pieceImgList[i].img.src = "img/pieces/"+this.randomList[i]+".gif"
this.pieceImgList[i].setImgSrc(this.pieceImgList[i].img.src);
// 執行圖片點擊事件
this.pieceImgList[i].onClick();
}
},
// 初始化隨機表
initRandomList : function() {
// 獲取隨機數列,成雙出現
for (var i = 0; i < 75; i ++) {
var random = parseInt(Math.random()*22*10000, 10);
var number = random%23;
this.randomList.push(number);
this.randomList.push(number);
}
},
// 打亂隨機表
messRandomList : function() {
for (var i = 0; i < this.randomList.length; i ++) {
var random = parseInt(Math.random()*15*10000, 10);
var number = random%150;
var temp;
temp = this.randomList[i];
this.randomList[i] = this.randomList[number];
this.randomList[number] = temp;
}
},
// 開始計時
startTime : function() {
var _this = this;
if (this.isGameOver) {
return;
} else {
this.time ++;
document.getElementById("time").innerHTML = this.time;
this.isGameBegin = true;
setTimeout(function() {_this.startTime();}, 1000);
}
},
// 清除
clear : function() {
for (var i = 0; i < this.pieceList.length; i ++) {
this.gamePanel.removeChild(this.pieceList[i].dom);
}
this.pieceList = [];
this.randomList = [];
this.pieceImgList = [];
this.isGameOver = true;
this.isGameBegin = false;
}
}
window.onload = function() {
document.getElementById("start").disabled = false;
document.getElementById("reset").disabled = true;
}
// 游戲開始入口
function Start() {
Game.start();
}
// 游戲重置入口
function Reset() {
Game.reset();
}

自定義的js版映射結構map.js源文件如下:
復制代碼 代碼如下:

var Map = function(){
this.data = [];
}
Map.prototype = {
put : function(key, value) {
this.data[key] = value;
},
get : function(key) {
return this.data[key];
},
remove : function(key) {
this.data[key] = null;
},
isEmpty : function() {
return this.data.length == 0;
},
size : function() {
return this.data.length;
}
}

圖片類piece.js源文件如下:
復制代碼 代碼如下:

var Piece = function(game) {
// 游戲對象
this.game = game;
// 是否為邊緣元素
this.isEdge = false;
// 是否挨著邊緣元素
this.atEdge = false;
// 圖片dom元素
this.dom = null;
// 圖片元素
this.img = null;
// 圖片元素來源
this.src = null;
// 軌跡元素
this.track = null;
// 是否可以作為軌跡
this.isTracked = false;
// 選中標記元素
this.selected = null;
// 圖片橫向排列
this.x = 0;
// 圖片縱向排列
this.y = 0;
// 圖片閃爍Id
this.flashId = null;
// 圖片是否點擊
this.onClicked = false;
// 閃爍次數
this.flashCount = 0;
this.init();
}
Piece.prototype = {
// 初始化
init : function() {
this.dom = document.createElement("div");
this.dom.className = "piece";
this.selected = document.createElement("img");
},
// 初始化圖片
initImg : function() {
this.img = document.createElement("img");
this.dom.appendChild(this.img);
},
// 滿足算法后初始化track元素
initTrack : function() {
if (this.flashId != null) {
// 停止閃爍
this.stopFlash();
}
//alert("initTrack middle");
if (this.track != null) {
return;
}
this.onClicked = false;
this.dom.removeChild(this.img);
this.track = document.createElement("div");
this.track.className = "track";
this.dom.appendChild(this.track);
},
// 位圖片設置來源
setImgSrc : function(src) {
this.src = src;
},
// 為圖片設置二維排列位置
setPosition : function(x, y) {
this.x = x;
this.y = y;
},
// 為圖片設置選中元素
setSelected : function() {
if (this.flashCount ++ % 2 == 0) {
//this.dom.removeChild(this.img);
//this.selected.src = "img/selected.gif";
//this.dom.appendChild(this.selected);
this.img.src = "img/pieces/flash.gif";
} else {
//if (this.selected != null) {
// this.dom.removeChild(this.selected);
//}
this.img.src = this.src;
//this.dom.appendChild(this.img);
}
},
// 設置是否為邊緣元素
setEdge : function(isEdge) {
this.isEdge = isEdge;
},
// 設置是否挨著邊緣元素
setAtEdge : function(atEdge) {
this.atEdge = atEdge;
},
// 開始閃爍
flash : function() {
var _this = this;
this.flashId = setInterval(function() {_this.setSelected();}, 500);
},
// 停止閃爍
stopFlash : function() {
clearInterval(this.flashId);
if (this.flashCount % 2 == 1) {
//if (this.selected != null) {
// this.dom.removeChild(this.selected);
//}
this.img.src = this.src;
//this.dom.appendChild(this.img);
}
},
// 對象被選擇的內部函數
onClick : function() {
if (this.onClicked) {
return;
}
var _this = this;
this.img.onclick = function() {
if (!document.getElementById("start").disabled) {
return;
}
if (_this.onClicked) {
return;
}
if (_this.checkPiece()) {
return;
}
_this.flash();
_this.onClicked = true;
};
},
// 檢查是否有被點擊的圖片
checkPiece : function() {
for (var i = 0; i < this.game.pieceList.length; i ++) {
if (this.game.pieceList[i].onClicked && !this.game.pieceList[i].equal(this)) {
if (this.game.pieceList[i].equalImage(this)) {
//alert("The same Image");
this.searchTrack(this.game.pieceList[i]);
} else {
this.game.pieceList[i].stopFlash();
this.game.pieceList[i].onClicked = false;
this.onClicked = false;
return false;
}
return true;
} else {
continue;
}
}
return false;
},
// 是否為同一個對象
equal : function(piece) {
return (this.x == piece.x && this.y == piece.y);
},
// 是否為同一個圖片
equalImage : function(piece) {
return this.src == piece.src;
},
// 搜尋路徑
searchTrack : function(piece) {
if (this.isNear(piece)) {
this.linkTrack(piece);
return;
}
if (this.isReach(piece) || this.isReach2(piece)) {
this.linkTrack(piece);
return;
}
},
// 是否相鄰
isNear : function(piece) {
var a = (Math.abs(piece.x - this.x) == 1) && (piece.y == this.y)
|| (Math.abs(piece.y - this.y) == 1) && (piece.x == this.x);
return a;
},
// 直線
isStraightReach : function(piece) {
//alert("isStraightReach");
if (this.isNear(piece)) {
return true;
}
var a = false;
var b = false;
// 沿y軸方向搜索
if (this.x == piece.x) {
//alert("!!!!!!!!!!!");
for (var i = this.min(this.y, piece.y) + 1; i < this.max(this.y, piece.y); i ++) {
//alert("this.x == piece.x: " + piece.x + "," + i);
if (this.game.pieceMap.get(piece.x + "," + i).isPass()) {
a = true;
this.game.trackList.push(this.game.pieceMap.get(piece.x + "," + i));
continue;
} else {
a = false;
this.game.trackList = [];
return a;
}
}
}
// 沿x軸方向搜索
if (this.y == piece.y) {
//alert("!!!!!!!!!!!");
for (var i = this.min(this.x, piece.x) + 1; i < this.max(this.x, piece.x); i ++) {
//alert("this.y == piece.y: " + i + "," + piece.y);
if (this.game.pieceMap.get(i + "," + piece.y).isPass()) {
b = true;
this.game.trackList.push(this.game.pieceMap.get(i + "," + piece.y));
continue;
} else {
b = false
this.game.trackList = [];
return b;
}
}
}
return a || b;
},
// 拐一次彎搜索
isReach1 : function(piece) {
//alert("isReach1");
var corner_1 = this.game.pieceMap.get(this.x + "," + piece.y);
var corner_2 = this.game.pieceMap.get(piece.x + "," + this.y);
var _this = this;
if ((_this.isStraightReach(corner_1))
&& (corner_1.isStraightReach(piece))
&& corner_1.isPass()) {
//alert("corner_1: " + this.x + "," + piece.y);
this.game.trackList.push(corner_1);
return true;
}
if ((_this.isStraightReach(corner_2))
&& (corner_2.isStraightReach(piece))
&& corner_2.isPass()) {
//alert("corner_2: " + piece.x + "," + this.y);
this.game.trackList.push(corner_2);
return true;
}
return false;
},
// 直接或拐一次彎搜索
isReach : function(piece) {
var a = this.isStraightReach(piece);
var b = this.isReach1(piece);
return a || b;
},
// 拐兩次彎搜索
isReach2 : function(piece) {
// 沿x軸正向搜索
for (var i = this.x + 1; i < 17; i ++) {
if (!this.game.pieceMap.get(i + "," + this.y).isPass()) {
this.game.trackList = [];
break;
} else if (this.game.pieceMap.get(i + "," + this.y).isReach(piece)
&& this.game.pieceMap.get(i + "," + this.y).isPass()) {
this.game.trackList.push(this.game.pieceMap.get(i + "," + this.y));
return true;
}
}
// 沿x軸搜索
for (var i = this.x - 1; i >= 0; i --) {
if (!this.game.pieceMap.get(i + "," + this.y).isPass()) {
this.game.trackList = [];
break;
} else if (this.game.pieceMap.get(i + "," + this.y).isReach(piece)
&& this.game.pieceMap.get(i + "," + this.y).isPass()) {
this.game.trackList.push(this.game.pieceMap.get(i + "," + this.y));
return true;
}
}
// 沿y軸搜索
for (var i = this.y - 1; i >= 0; i --) {
if (!this.game.pieceMap.get(this.x + "," + i).isPass()) {
this.game.trackList = [];
break;
} else if (this.game.pieceMap.get(this.x + "," + i).isReach(piece)
&& this.game.pieceMap.get(this.x + "," + i).isPass()) {
this.game.trackList.push(this.game.pieceMap.get(this.x + "," + i));
return true;
}
}
// 沿y軸正向搜索
for (var i = this.y + 1; i < 12; i ++) {
if (!this.game.pieceMap.get(this.x + "," + i).isPass()) {
this.game.trackList = [];
break;
} else if (this.game.pieceMap.get(this.x + "," + i).isReach(piece)
&& this.game.pieceMap.get(this.x + "," + i).isPass()) {
this.game.trackList.push(this.game.pieceMap.get(this.x + "," + i));
return true;
}
}
return false;
},
// 路徑連接
linkTrack : function(piece) {
this.initTrack();
piece.initTrack();
this.changeScore();
this.showTrack(piece);
},
// 顯示足跡
showTrack : function(piece) {
this.game.trackList.push(piece);
this.track.className = "track2";
for (var i = 0; i < this.game.trackList.length; i ++) {
//alert(i);
this.game.trackList[i].track.className = "track2";
}
var _this = this;
setTimeout(function() {_this.hideTrack()}, 500);
},
// 隱匿足跡
hideTrack : function() {
for (var i = 0; i < this.game.trackList.length; i ++) {
this.game.trackList[i].track.className = "track";
}
this.game.trackList = [];
this.track.className = "track";
this.isTracked = true;
},
// 分數增加
changeScore : function() {
this.game.score += 100;
document.getElementById("score").innerHTML = this.game.score;
},
min : function(a, b) {
if (a < b) {
return a;
} else {
return b;
}
},
max : function(a, b) {
if (a > b) {
return a;
} else {
return b;
}
},
// 判斷是否通過
isPass : function() {
return this.track != null;
}
}

以上是源文件的代碼,具體的實現代碼請關注CSDN中zhangjinpeng66下載。下面講一下連連看游戲最核心的部分,js實現搜索路徑。
js實現搜索路徑算法首先最簡單的是判斷兩個圖片能否直線到達函數代碼如下:
復制代碼 代碼如下:

// 直線
isStraightReach : function(piece) {
//alert("isStraightReach");
if (this.isNear(piece)) {
return true;
}
var a = false;
var b = false;
// 沿y軸方向搜索
if (this.x == piece.x) {
//alert("!!!!!!!!!!!");
for (var i = this.min(this.y, piece.y) + 1; i < this.max(this.y, piece.y); i ++) {
//alert("this.x == piece.x: " + piece.x + "," + i);
if (this.game.pieceMap.get(piece.x + "," + i).isPass()) {
a = true;
this.game.trackList.push(this.game.pieceMap.get(piece.x + "," + i));
continue;
} else {
a = false;
this.game.trackList = [];
return a;
}
}
}
// 沿x軸方向搜索
if (this.y == piece.y) {
//alert("!!!!!!!!!!!");
for (var i = this.min(this.x, piece.x) + 1; i < this.max(this.x, piece.x); i ++) {
//alert("this.y == piece.y: " + i + "," + piece.y);
if (this.game.pieceMap.get(i + "," + piece.y).isPass()) {
b = true;
this.game.trackList.push(this.game.pieceMap.get(i + "," + piece.y));
continue;
} else {
b = false
this.game.trackList = [];
return b;
}
}
}
return a || b;
},

該函數實現了連連看判斷兩圖片是否符合連接條件的最簡單的一步,然后是拐一次彎搜索。
復制代碼 代碼如下:

// 拐一次彎搜索
isReach1 : function(piece) {
//alert("isReach1");
var corner_1 = this.game.pieceMap.get(this.x + "," + piece.y);
var corner_2 = this.game.pieceMap.get(piece.x + "," + this.y);
var _this = this;
if ((_this.isStraightReach(corner_1))
&& (corner_1.isStraightReach(piece))
&& corner_1.isPass()) {
//alert("corner_1: " + this.x + "," + piece.y);
this.game.trackList.push(corner_1);
return true;
}
if ((_this.isStraightReach(corner_2))
&& (corner_2.isStraightReach(piece))
&& corner_2.isPass()) {
//alert("corner_2: " + piece.x + "," + this.y);
this.game.trackList.push(corner_2);
return true;
}
return false;
},

在拐一次彎搜索的函數中調用了直接搜索的函數,同樣最復雜的拐兩次彎搜索也會調用拐一次彎搜索的函數。
復制代碼 代碼如下:

// 拐兩次彎搜索
isReach2 : function(piece) {
// 沿x軸正向搜索
for (var i = this.x + 1; i < 17; i ++) {
if (!this.game.pieceMap.get(i + "," + this.y).isPass()) {
this.game.trackList = [];
break;
} else if (this.game.pieceMap.get(i + "," + this.y).isReach(piece)
&& this.game.pieceMap.get(i + "," + this.y).isPass()) {
this.game.trackList.push(this.game.pieceMap.get(i + "," + this.y));
return true;
}
}
// 沿x軸搜索
for (var i = this.x - 1; i >= 0; i --) {
if (!this.game.pieceMap.get(i + "," + this.y).isPass()) {
this.game.trackList = [];
break;
} else if (this.game.pieceMap.get(i + "," + this.y).isReach(piece)
&& this.game.pieceMap.get(i + "," + this.y).isPass()) {
this.game.trackList.push(this.game.pieceMap.get(i + "," + this.y));
return true;
}
}
// 沿y軸搜索
for (var i = this.y - 1; i >= 0; i --) {
if (!this.game.pieceMap.get(this.x + "," + i).isPass()) {
this.game.trackList = [];
break;
} else if (this.game.pieceMap.get(this.x + "," + i).isReach(piece)
&& this.game.pieceMap.get(this.x + "," + i).isPass()) {
this.game.trackList.push(this.game.pieceMap.get(this.x + "," + i));
return true;
}
}
// 沿y軸正向搜索
for (var i = this.y + 1; i < 12; i ++) {
if (!this.game.pieceMap.get(this.x + "," + i).isPass()) {
this.game.trackList = [];
break;
} else if (this.game.pieceMap.get(this.x + "," + i).isReach(piece)
&& this.game.pieceMap.get(this.x + "," + i).isPass()) {
this.game.trackList.push(this.game.pieceMap.get(this.x + "," + i));
return true;
}
}
return false;
},

該函數以點擊的圖片為中心分別沿x軸,y軸展開搜索。
以上是本游戲代碼的全部內容。具體游戲源碼請到CSDN中zhangjinpeng66的資源里下載。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品丝袜高跟| 国产91在线播放九色快色| 国产成人av网址| 一个人看的www久久| 亚洲新中文字幕| 欧美伦理91i| 国产91精品不卡视频| 亲子乱一区二区三区电影| 亚洲精品久久7777777| 国产成人高清激情视频在线观看| 少妇激情综合网| 国产欧美va欧美va香蕉在线| 国产精品中文字幕在线| 人人澡人人澡人人看欧美| 国产精品嫩草影院久久久| 成人黄色av免费在线观看| 亚洲天堂av在线免费观看| 欧美在线观看网址综合| 成人动漫网站在线观看| 亚洲人成毛片在线播放| 日韩精品高清视频| 26uuu日韩精品一区二区| 亚洲最大av网| 国产精品白丝av嫩草影院| 久久在线观看视频| 在线国产精品播放| 久久99精品视频一区97| 国产97在线视频| 成人激情视频小说免费下载| 久久成人这里只有精品| 成人福利网站在线观看11| 日韩中文字幕在线看| 亚洲国产精品电影在线观看| 精品一区二区三区电影| 日韩欧美视频一区二区三区| 亚洲无亚洲人成网站77777| 国产精品揄拍500视频| 色偷偷888欧美精品久久久| 2019中文字幕免费视频| 亚洲美女福利视频网站| 亚洲成人中文字幕| 国产精品香蕉国产| 高清欧美电影在线| 97久久超碰福利国产精品…| 欧美黄色免费网站| 日韩禁在线播放| 国产精品毛片a∨一区二区三区|国| 久久99热这里只有精品国产| 亚洲国产古装精品网站| 国产一区二区三区四区福利| 久久影视三级福利片| 在线不卡国产精品| 日韩av网址在线| 亚洲精品99久久久久| 欧美成人激情视频免费观看| 欧美国产视频日韩| 亚洲黄页网在线观看| 亚洲国产精品国自产拍av秋霞| 国产人妖伪娘一区91| 中文字幕精品一区久久久久| 亚洲免费av网址| 欧美一区二区色| 色综合久久久888| 国产亚洲精品高潮| 中文字幕欧美日韩精品| 亚洲成色777777在线观看影院| www.美女亚洲精品| 日韩av在线看| 久久久久久久国产精品| 9.1国产丝袜在线观看| 国产精品高清在线观看| 日韩成人激情在线| 7m精品福利视频导航| 国产91ⅴ在线精品免费观看| 国产精品jizz在线观看麻豆| 久久精品国产欧美亚洲人人爽| 亚洲丝袜一区在线| 992tv在线成人免费观看| 日韩在线视频二区| 精品一区电影国产| 国产欧美va欧美va香蕉在| 日韩av资源在线播放| 欧美电影免费观看| 亚洲欧洲视频在线| 国产98色在线| 国产精品久久综合av爱欲tv| 91亚洲国产成人久久精品网站| 91在线网站视频| 亚洲最大的成人网| 国产国语videosex另类| 国产精品久久久久久av福利| 久久精品青青大伊人av| 日韩一区二区久久久| 国产亚洲欧美日韩美女| 国产精品99久久久久久www| www.午夜精品| 伦伦影院午夜日韩欧美限制| 欧美情侣性视频| 精品久久香蕉国产线看观看gif| 欧美在线一区二区三区四| 精品久久久久久中文字幕大豆网| 主播福利视频一区| 国产精品福利无圣光在线一区| 激情亚洲一区二区三区四区| 国产日韩欧美91| 日韩国产激情在线| 伊人一区二区三区久久精品| 国产精品偷伦一区二区| 97久久精品在线| 精品国产欧美成人夜夜嗨| 国产精品一区二区三区在线播放| 亚洲人午夜精品免费| 韩国19禁主播vip福利视频| 色综合久综合久久综合久鬼88| 日韩精品视频在线免费观看| 日韩av第一页| 日韩欧美精品网址| 国产日韩综合一区二区性色av| 日韩欧美在线视频日韩欧美在线视频| 欧洲成人免费视频| 亚洲精品国产精品自产a区红杏吧| 欧美在线亚洲在线| 国产精品精品视频| 成人淫片在线看| 精品国偷自产在线视频| 色777狠狠综合秋免鲁丝| 在线视频国产日韩| 欧美日韩性视频在线| 在线观看91久久久久久| 亚洲成**性毛茸茸| 国产欧美一区二区三区在线看| 国产成人一区二区三区| 欧美一级大片在线观看| 日韩中文字幕在线视频| 日韩av在线高清| 成人激情视频免费在线| 成人精品在线观看| 粗暴蹂躏中文一区二区三区| 亚洲男人天堂2024| 91久久精品美女| 国产区亚洲区欧美区| 日韩美女毛茸茸| 久久欧美在线电影| 国产69精品99久久久久久宅男| 国产亚洲视频中文字幕视频| 4438全国亚洲精品在线观看视频| 狠狠躁夜夜躁久久躁别揉| 久久久精品视频在线观看| 久久国产精品99国产精| 91人人爽人人爽人人精88v| 欧美激情视频播放| 欧美性xxxxxxxxx| 在线视频欧美性高潮| 日韩欧美成人网| 成人性生交大片免费看视频直播| 欧美精品www| 亚洲人线精品午夜| 91久久在线播放| 77777少妇光屁股久久一区| 亚洲国产成人在线播放| 国产精品丝袜久久久久久高清| 午夜精品一区二区三区在线播放| 红桃av永久久久| 久久久这里只有精品视频|