日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JavaScript 俄羅斯方塊游戲實現(xiàn)方法與代碼解釋

瀏覽:120日期:2023-11-05 11:11:52

本文實例講述了JavaScript 俄羅斯方塊游戲。分享給大家供大家參考,具體如下:

俄羅斯方塊代碼說明

/** 名稱:Javascript 俄羅斯方塊! 作者:Gloot 郵箱:glootz@gmail.com QQ:345268267 網(wǎng)站:http://www.cnblogs.com/editor/*/OLSFK = {};

本俄羅斯方塊代碼采用 JavaScript 腳本代碼寫成,簡單易懂;

全代碼采用靜態(tài)類及靜態(tài)變量成員組成;

全腳本通過實現(xiàn)代碼全局配置 OLSFK.Options = {...}

定義方塊起始坐標及定義各自的旋轉點;

從初始化俄羅斯方塊界面開始,再監(jiān)聽鍵盤事件;以及左右,向下及旋轉動作判斷,重新渲染方塊位置;

判斷是否消行,以及相應的加級判斷,執(zhí)行速度,加分操作來執(zhí)行;

最后以判斷是否當前級別大于所定義的最大級別來判斷是否結束;

代碼說明講解

OLSFK.Options = { //相關參數(shù) width:12,//界面橫向方塊數(shù) height:20,//界面縱向方塊數(shù) boxWidth : ’16px’, curLevel:1, speed : 1000, //setInterval,setTimeout direct : { //可以設定是A S D W, 還是← ↓ → Down: 40 , /*run speed*/ Left: 37, Right: 39, Rotate: 38 }, Move:true,//是否正在移動 Eventing:false, Levels: { 1:1000, 2:900, 3:800, 4:700, 5:600, 6:500, 7:400, 8:300, 9:200, 10:100 }, curBlock:4, //當前移動的圖形名稱 nextBlock:0, GampMap:new Object(), Timer:null, deline:0, Score:0, Deling:false, Start:false, lineNum:10, //刪除幾行了,加級 ScoreNum:40 //消一行加分}

direct 表示 使用鍵盤方位鍵來操作方塊的移動方向;

使用哪種方向鍵按自由喜歡配置,比如字母鍵的A, S, D, W; 或右邊小數(shù)字鍵盤的數(shù)字鍵各自的鍵盤編碼;

比如 上(旋轉)、下、左、右 方向鍵的編碼分別為:38、40、37、39;

Levels:表示級別配置,本配置共分為10級,每個級別所對應的下落速度,即定時執(zhí)行間隔;

curBlock:表示當前活動的方塊;

nextBlock:表示接下來執(zhí)行的方塊索引,并顯示界面右上角的預覽框中;

GampMap:用于保存在根據(jù)定義行列數(shù)形成的游戲表格中保存每個格的數(shù)據(jù)信息;

OLSFK.Options.GampMap[x+’_’+y] = 0;

對象表格為: id: 'box_'+x+'_'+y;

初始化數(shù)據(jù)為 ‘0’; 表示該表格還未占用;當有占用時,設置值為 ‘1’;

Timer:為定時執(zhí)行器;setTimeout 定時執(zhí)行方塊下落的的頻率;定時時間越小,速度越快;

Deling:當正在執(zhí)行消行操作時,下次暫不顯示并下落;

lineNum:表示消超過 10 行,加一級;

ScoreNum:表示每消一行所加的分數(shù);

OLSFK.ReItems = function (cur){ //key旋轉點 switch (cur) { case 1: OLSFK.Items[1] = {//長塊 LongBlock1:{x:4,y:0},2:{x:5,y:0},3:{x:6,y:0},4:{x:7,y:0},5:{x:5,y:0} //旋轉點 }; break; //.... }}

該方法用于恢復方塊的初始設置;

OLSFK.Next = { //key旋轉點 //長塊 LongBlock 1: { 1:{x:0,y:1}, 2:{x:1,y:1}, 3:{x:2,y:1}, 4:{x:3,y:1} }, //...}

為不了不與游戲方塊的設置沖突,獨立出來下次隨機方塊的對象配置;

OLSFK.Items = { //key旋轉點 //長塊 LongBlock 1: { 1:{x:4,y:0}, 2:{x:5,y:0}, 3:{x:6,y:0}, 4:{x:7,y:0}, 5:{x:5,y:0} }, //方塊Box 2: { 1:{x:4,y:0}, 2:{x:5,y:0}, 3:{x:4,y:1}, 4:{x:5,y:1}, 5:{x:0,y:0} }, //凸塊 TuBlock 3: { 1:{x:4,y:1}, 2:{x:5,y:0}, 3:{x:5,y:1}, 4:{x:6,y:1}, 5:{x:5,y:1} }, //L塊 LBlock 4: { 1:{x:5,y:0}, 2:{x:5,y:1}, 3:{x:5,y:2}, 4:{x:6,y:2}, 5:{x:5,y:2} }, 5: { //反向L塊 FLBlock 1:{x:5,y:2}, 2:{x:6,y:2}, 3:{x:6,y:1}, 4:{x:6,y:0}, 5:{x:6,y:2} }, //Z塊 ZBlock 6: { 1:{x:4,y:0}, 2:{x:5,y:0}, 3:{x:5,y:1}, 4:{x:6,y:1}, 5:{x:5,y:0} }, 7: {//反向Z塊 FZBlock 1:{x:4,y:1}, 2:{x:5,y:1}, 3:{x:5,y:0}, 4:{x:6,y:0}, 5:{x:5,y:1} }}

方塊共分為:長條塊,方塊,凸塊(T塊),L塊,反L塊,Z塊,反Z塊幾種;

共7種方塊,以1,2,3,4,5,6,7 索引鍵表示,方塊是四個小塊組成,每塊都有各自的坐標,1-4表示組成該塊的初始坐標位置,5表示旋轉點;

OLSFK.Init = function() { //初始化界面 //...}

俄羅斯方塊的界面初始化方法;將在 window.onload 中調用執(zhí)行;

var w = OLSFK.Options.width; var h = OLSFK.Options.height; var total = w * h; var x=0,y=0; for (var i=0; i<total; i++) {OLSFK.Options.GampMap[x+’_’+y] = 0; Lib.Tag(’SPAN’,{id:'box_'+x+'_'+y,name:'cbox',style:{ width:OLSFK.Options.boxWidth, height:OLSFK.Options.boxWidth, border:'2px outset #669', background:'#ddd', float:'left', overflow:'hidden' },innerHTML:'&nbsp;',className:'cssbox'},back); var end = i + 1; x++; if (end >= w && end % w == 0) { x=0; y++; Lib.Tag(’DIV’,{style:{clear:'both' }},back); } }

通過設置的 Options.width, Options.height 列數(shù)與行數(shù),以及設置的小方格寬度,初始化了一個寬:Options.width列,高為 Options.height 的表格界面出來;

Lib.Tag 用于創(chuàng)建標簽對象;

Lib.Tag = function(TAG,json,pnode) { //...}

TAG為標簽名,比如: div, span 等;

json為設置標簽樣式 style;

pnode 是該創(chuàng)建所在的父容器;

OLSFK.Init = function() {} 還創(chuàng)建主游戲區(qū)域旁邊的下次隨機方塊預覽區(qū),當前級別,及分數(shù),以及操作“開始”,“暫停”按鈕等;

JavaScript 俄羅斯方塊游戲實現(xiàn)方法與代碼解釋

游戲初始入口點

window.onload = function() { if (window.isIE) { document.attachEvent('onkeydown',function(e) { if (OLSFK.Options.Start) {var E = OLSFK.KeyCode();OLSFK.EventFunc(E); } }); document.attachEvent('onkeyup',function(e) { if (!OLSFK.Options.Move && OLSFK.Options.Start) {OLSFK.Options.Move = true;OLSFK.Options.Eventing = false;OLSFK.Options.Timer = setTimeout(function() { OLSFK.play();}, OLSFK.Options.Levels[OLSFK.Options.curLevel]); } }); } else { document.addEventListener('keydown',function(e) { if (OLSFK.Options.Start) {var E = OLSFK.KeyCode();OLSFK.EventFunc(E); } },false); document.addEventListener('keyup',function(e) { if (!OLSFK.Options.Move && OLSFK.Options.Start) {OLSFK.Options.Move = true;OLSFK.Options.Eventing = false;OLSFK.Options.Timer = setTimeout(function() { OLSFK.play();}, OLSFK.Options.Levels[OLSFK.Options.curLevel]); } },false); } OLSFK.Init();}

主要是監(jiān)聽鍵盤事件,根據(jù) 鍵盤事件 返回的按鈕編碼與 OLSFK.Options.direct 設置方向鍵匹配來操作方塊的移動,旋轉等;

keydown 用于操作下落方塊的移動方向,旋轉等;并重新繪制方塊位置;

keyup 后繼續(xù)按本級速度向下落;

OLSFK.Options.Levels[OLSFK.Options.curLevel]

表示當前級別對應的速度,即定時器間隔執(zhí)行時間(毫秒);

OLSFK.EventFunc = function(code) { switch (code) { case OLSFK.Options.direct.Left: //LEFT if (!OLSFK.Options.Deling) {clearTimeout(OLSFK.Options.Timer);OLSFK.Options.Eventing = true;OLSFK.Options.Move = false;OLSFK.Left(); } break; //... }}

該方法是 監(jiān)聽 keydown 事件執(zhí)行的動作;code 為按鍵 編碼;

當判斷未在消行動作時,清除定時器,OLSFK.Options.Eventing 設置為事件中 true,OLSFK.Options.Move 為 false 表示停止移動;

進入 向左移動方法 OLSFK.Left();

OLSFK.Left = function() { var block = OLSFK.Items[OLSFK.Options.curBlock]; if (block) { var flag = true; for (var i=1; i<=4; i++) { var x = block[i].x; var y = block[i].y; if (x-1 < 0) {flag = false;break; } if (OLSFK.Options.GampMap[(x-1)+’_’+y] == 1 && !OLSFK.isMe(x-1,y)) {flag = false;break; } } if (flag) { for (var i=1; i<=4; i++) //清除圖形 {var itm = block[i];var box = Lib.Getid(’box_’+itm.x+’_’+itm.y);box.style.background = ’#ddd’;OLSFK.Options.GampMap[itm.x+’_’+itm.y] = 0; } for (var i=1; i<=5; i++) {var x = block[i].x;var y = block[i].y;OLSFK.Items[OLSFK.Options.curBlock][i] = {x:(x-1),y:y}; } OLSFK.draw(); } }}

var block = OLSFK.Items[OLSFK.Options.curBlock]; 表示獲取當前移動方塊;

if (OLSFK.Options.GampMap[(x-1)+’_’+y] == 1 && !OLSFK.isMe(x-1,y)){ flag = false; break;}

判斷該方塊四個小方塊左邊是否有被占用的方塊,也即: OLSFK.Options.GampMap[(x-1)+’_’+y] 為 1; 并且該位置塊不屬于方塊自己的;

當左邊方向無占用格時,清除當前方塊四個小方塊位置,重新繪制方塊新坐標位置;并重置 相應的 OLSFK.Options.GameMap [x+y] 相應格的值;

當按鈕 keyup 時,繼承正常向下落;

OLSFK.isMe 代碼:

OLSFK.isMe = function(x,y) { var block = OLSFK.Items[OLSFK.Options.curBlock]; if (block) { for (var i=1; i<=4; i++) { if (block[i].x == x && block[i].y == y) {return true; } } } return false;}

即指定的 x,y (參數(shù)值) 是否還在當前方塊四個坐標內;

OLSFK.Right () 與 Left() 一樣;

旋轉方塊代碼;

OLSFK.Rotate = function() { var block = OLSFK.Items[OLSFK.Options.curBlock]; if (block) { var flag = true; var R = block[5]; for (var i=1; i<=4; i++) { var x = block[i].x; var y = block[i].y; if (R.x == x && R.y == y) { } else {var nson = new Object();nson.x = R.x + R.y - y;nson.y = R.y - R.x + x;if ( nson.x < 0 || nson.y < 0 || nson.x >= OLSFK.Options.width || nson.y >= OLSFK.Options.height ){ flag = false; break;}if (OLSFK.Options.GampMap[nson.x+’_’+nson.y] == 1 && !OLSFK.isMe(nson.x,nson.y)){ flag = false; break;} } } if (flag) { for (var i=1; i<=4; i++) //清除圖形 {var itm = block[i];var box = Lib.Getid(’box_’+itm.x+’_’+itm.y);box.style.background = ’#ddd’;OLSFK.Options.GampMap[itm.x+’_’+itm.y] = 0; } var Pnt = 1; for (var i=1; i<=4; i++) {var x = block[i].x;var y = block[i].y;if (R.x == x && R.y == y){ Pnt = i;} else { var nson = new Object(); nson.x = R.x + R.y - y; nson.y = R.y - R.x + x; OLSFK.Items[OLSFK.Options.curBlock][i] = {x:nson.x,y:nson.y};} } OLSFK.Items[OLSFK.Options.curBlock][5] = OLSFK.Items[OLSFK.Options.curBlock][Pnt]; OLSFK.draw(); } }}

var R = block[5]; 就是獲取旋轉點;

就開始對方塊四個小塊以旋轉點為中心,逆時針旋轉(并不全是 90 度);當當前塊不為旋轉點時,旋轉公式;

var nson = new Object();nson.x = R.x + R.y - y;nson.y = R.y - R.x + x;

這個公式要這樣看;

ResultX = RotateX + (RotateY - CurrentY);ResultY = RotateY - (RotateX - CurrentX);//Y的偏移量,就是X的增加值;//反之同

當旋轉四周都無占用物時;清除當前圖形,重繪旋轉后的圖形位置;

重置 OLSFK.Options.GampMap[itm.x+’_’+itm.y] 各個方塊的占用值;

OLSFK.Random = function() { if (OLSFK.Options.nextBlock != 0) { OLSFK.Options.curBlock = OLSFK.Options.nextBlock; var block = OLSFK.Next[OLSFK.Options.nextBlock]; if (block) { for (var i=1; i<=4; i++) {var itm = block[i];var box = Lib.Getid(’cur_’+itm.x+’_’+itm.y);box.style.background = ’#ddd’;//OLSFK.Options.GampMap[itm.x+’_’+itm.y] = 0; } } } else { OLSFK.Options.curBlock = Math.floor(Math.random() * 7 + 1); } OLSFK.Options.nextBlock = Math.floor(Math.random() * 7 + 1); OLSFK.drawNext();}

隨機生成下次預下落的方塊;并顯示到右上角的預覽表格里;

OLSFK.play = function(speed) { var block = OLSFK.Items[OLSFK.Options.curBlock]; if (block && OLSFK.Options.Move) { var flag = true; for (var i=1; i<=4; i++) { var x = block[i].x; var y = block[i].y; if (y+1 >= OLSFK.Options.height) {flag = false;break; } if (OLSFK.Options.GampMap[x+’_’+(y+1)] == 1 && !OLSFK.isMe(x,y+1)) {flag = false;break; } }if (flag) { for (var i=1; i<=4; i++) //清除圖形 {var itm = block[i];var box = Lib.Getid(’box_’+itm.x+’_’+itm.y);box.style.background = ’#ddd’;OLSFK.Options.GampMap[itm.x+’_’+itm.y] = 0; } for (var i=1; i<=5; i++) {var x = block[i].x;var y = block[i].y;OLSFK.Items[OLSFK.Options.curBlock][i] = {x:x,y:(y+1)}; } OLSFK.draw(); var S = OLSFK.Options.Levels[OLSFK.Options.curLevel]; if (speed) {S = 50; } OLSFK.Options.Timer = setTimeout(function() {OLSFK.play(); }, S); } else { OLSFK.ReItems(OLSFK.Options.curBlock); OLSFK.newRun(); } }}

OLSFK.play 正常下落的方法,也得判斷下落一格是否有被占用的格,如果沒有,清除當前方塊,繪制方塊新位置;

當方塊不能再下落時(flag = false),重置當前方塊坐標配置; OLSFK.ReItems(OLSFK.Options.curBlock);

進入 OLSFK.newRun(); 新下落方塊下落過程準備;

OLSFK.newRun = function() { clearTimeout(OLSFK.Options.Timer); OLSFK.DelFunc(); if (OLSFK.Options.deline >= 10) { OLSFK.Options.deline = 0; OLSFK.Options.curLevel ++; OLSFK.Element.CurLevel.setHTML('級:'+OLSFK.Options.curLevel); } OLSFK.Element.Score.setHTML('分:'+OLSFK.Options.Score); if (OLSFK.Options.curLevel <= OLSFK.Options.lineNum) { OLSFK.Random(); //判斷是否結束 OLSFK.ChkEnd(); } else { OLSFK.Options.Move = false; OLSFK.Options.Start = false; OLSFK.Options.Eventing = false; OLSFK.Options.Deling = false; Lib.Getid(’spn’).innerHTML = ’Game Is Over! You Win the Game!’; Lib.Getid(’dobtn’).innerHTML = ’ 開始 ’; } }

當下落結束時,清除定時器,暫停新方塊下落,檢測是否有可消除的行;減了多少行;

每減去一行 加分

OLSFK.Options.Score += OLSFK.Options.ScoreNum;

這個方法在 :

OLSFK.DelFunc = function() { OLSFK.Options.Deling = true; OLSFK.Options.Move = false; OLSFK.Options.Eventing = false; var Fn = 0; for (var i=OLSFK.Options.height-1; i>=0; i--) { Fn = 0; for (var j=0; j<OLSFK.Options.width; j++) { if (OLSFK.Options.GampMap[j+’_’+i] == 1) {Fn++; } } if (Fn == OLSFK.Options.width) { OLSFK.Options.deline ++; OLSFK.Options.Score += OLSFK.Options.ScoreNum; OLSFK.DelLine(i); i++; } } OLSFK.Options.Deling = false; OLSFK.Options.Move = true; OLSFK.Options.Eventing = true;}

中執(zhí)行;

減完一行,就重置該行以上所有行往下降一行;并重置 :

OLSFK.Options.GampMap[x+’_’+y] = OLSFK.Options.GampMap[x+’_’+(y-1)];

該減行為上行的數(shù)據(jù);

if (Fn == OLSFK.Options.width) { OLSFK.Options.deline ++; OLSFK.Options.Score += OLSFK.Options.ScoreNum; OLSFK.DelLine(i); i++; }

該判斷表示該行上所有格都被占用到;

回到 newRun 上,當判斷消行超過幾行時,即加級;

if (OLSFK.Options.curLevel <= OLSFK.Options.lineNum) { OLSFK.Random(); //判斷是否結束 OLSFK.ChkEnd(); }

如果級數(shù)小于配置的總級數(shù),則進入 OLSFK.random();

設置當前下落方塊,并隨機生成下次下落方塊并預覽右上角表格上;

OLSFK.ChkEnd = function() { var block = OLSFK.Items[OLSFK.Options.curBlock]; if (block && OLSFK.Options.Move) { var flag = true; for (var i=1; i<=4; i++) { var x = block[i].x; var y = block[i].y; if (OLSFK.Options.GampMap[x+’_’+y] == 1) {flag = false;break; } } } if (flag ) { OLSFK.draw(); //定時往下掉 OLSFK.Options.Timer = setTimeout(function() { OLSFK.play(); }, OLSFK.Options.Levels[OLSFK.Options.curLevel]); } else { OLSFK.Options.Move = false; OLSFK.Options.Start = false; OLSFK.Options.Eventing = false; OLSFK.Options.Deling = false; Lib.Getid(’spn’).innerHTML = ’Game Is Over’; Lib.Getid(’dobtn’).innerHTML = ’ 開始 ’; }}

當當前下落的方塊進入表格上有被占用的格子,即被卡住,游戲結束;

反之 則 setTimeout 開始新方塊的下落動作;

其他方法說明

OLSFK.Event = function() { if (window.isIE) return window.event; func = OLSFK.Event.caller; while(func!=null) { var arg0=func.arguments[0]; if(arg0) { return arg0; } func=func.caller; } return null; }OLSFK.KeyCode = function() { return OLSFK.Event().keyCode || OLSFK.Event().which;}OLSFK.Event = function();

這是一種獲取當前事件的方法,可以比較兼容獲取當前的事件;

俄羅斯方塊 JavaScript 代碼

點擊此處本站下載

更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《JavaScript數(shù)學運算用法總結》、《JavaScript數(shù)據(jù)結構與算法技巧總結》、《JavaScript數(shù)組操作技巧總結》、《JavaScript排序算法總結》、《JavaScript遍歷算法與技巧總結》、《JavaScript查找算法技巧總結》及《JavaScript錯誤與調試技巧總結》

希望本文所述對大家JavaScript程序設計有所幫助。

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
www.51av欧美视频| 日韩av一级| 久久99伊人| 麻豆91精品| 亚洲精一区二区三区| 亚洲另类黄色| 国产欧美日韩在线一区二区| 欧美日韩亚洲一区| 欧美日韩精品一区二区三区视频 | 99综合视频| 首页亚洲欧美制服丝腿| 色狠狠一区二区三区| 国产精品亚洲欧美日韩一区在线| 欧美成人精品一级| 亚洲天堂资源| 久久av一区| 国产精品1区在线| 日本精品不卡| 亚洲涩涩av| 久久亚洲国产精品尤物| 久久精品官网| 日韩在线视频一区二区三区| 美女在线视频一区| 成人av二区| 亚洲欧美一级| 给我免费播放日韩视频| 亚洲一区亚洲| 精品深夜福利视频| 中国女人久久久| 久久超级碰碰| 亚洲一区网站| 97人人精品| 亚洲精品字幕| 欧美三区四区| 日本免费在线视频不卡一不卡二| 日韩伦理在线一区| 日韩高清成人在线| 在线日韩电影| 欧美日韩夜夜| 久久精品成人| 国产精品一国产精品k频道56| 日韩精品中文字幕第1页| 男人的天堂亚洲一区| 国产在线视频欧美一区| 国产亚洲一级| 亚洲黄色免费av| 日本欧美韩国一区三区| 欧美影院三区| 免费一级欧美在线观看视频 | 色吊丝一区二区| 免播放器亚洲一区| 91综合视频| 欧美亚洲国产日韩| 五月婷婷六月综合| 国语对白精品一区二区| 日韩精品一级二级| 久久亚洲精品中文字幕蜜潮电影| 国产乱人伦丫前精品视频 | 亚洲综合欧美| 国产精品久久久久久久免费观看| 日韩精品亚洲aⅴ在线影院| 在线日韩av| 天堂√中文最新版在线| 国产免费久久| 视频一区免费在线观看| www成人在线视频| 麻豆一区二区在线| 日韩极品在线观看| 中文在线一区| 日韩毛片在线| а√天堂中文在线资源8| 日韩av在线播放中文字幕| 五月天久久久| 久久裸体视频| 国产精品久久观看| 韩国女主播一区二区三区| 欧美日韩伊人| 婷婷亚洲精品| 视频精品一区二区| 久久久久久久久久久妇女| 国产精品国产一区| 国产精品magnet| 青青国产91久久久久久| 亚洲三级av| 日韩天堂av| 亚洲黄色在线| 欧美日韩在线二区| 亚洲91精品| 亚洲高清激情| 免费国产自久久久久三四区久久| 成人看片网站| 国产91一区| 五月天久久久| 午夜在线视频观看日韩17c| 欧美99久久| 国产精品88久久久久久| 欧美日韩精品免费观看视频完整| 欧美91福利在线观看| 欧美另类综合| 久久电影一区| 最新亚洲国产| 91九色综合| 免费在线播放第一区高清av| 久久精品国产99| 国产精品成人一区二区不卡| 亚洲不卡系列| 亚洲自拍另类| 欧美欧美黄在线二区| 捆绑调教美女网站视频一区| 麻豆久久久久久久| 精品欧美日韩精品| 中文另类视频| 黄色成人91| 亚洲精品进入| 国产精品一区二区精品视频观看 | 国产精品日本欧美一区二区三区| 午夜久久美女| 亚洲综合激情在线| 国产精品极品在线观看| 精品国产一级| 国产伊人精品| 老鸭窝毛片一区二区三区| 最近国产精品视频| 国产精品国产三级在线观看| а√天堂中文在线资源8| 久久中文字幕av| 一区二区国产在线观看| 欧美一级二级三级视频| 高潮久久久久久久久久久久久久| 91精品国产调教在线观看| 国产午夜精品一区二区三区欧美| 亚洲不卡视频| 精品理论电影在线| 午夜精品影院| 国产精品白丝一区二区三区| 亚洲一区资源| 亚洲在线网站| 精品精品99| 国产日韩综合| 久久精品国产亚洲一区二区三区| 亚洲午夜黄色| 国产精品一二| 激情综合网站| 麻豆精品久久久| 美女精品在线| 精品国产麻豆| 免费观看日韩电影| 国产精品成久久久久| 免费在线看一区| 国产suv精品一区二区四区视频| 欧美日韩视频一区二区三区| 青青草国产精品亚洲专区无| 久久精品123| 国产麻豆精品久久| 国产手机视频一区二区| 久久超级碰碰| 亚洲免费专区| 99久精品视频在线观看视频| 国产亚洲精品美女久久| 久久久久欧美精品| 欧美激情福利| 亚州av一区| 91超碰国产精品| 高清在线一区| 91伊人久久| 午夜在线精品偷拍| 国产精品精品国产一区二区| 日韩高清不卡一区二区| 欧美~级网站不卡| 国产66精品| 国产精品资源| 亚洲精品福利| 久久精品国产亚洲夜色av网站| 国产福利一区二区三区在线播放| 免费一区二区视频| 久久九九精品| 国产99在线| 欧美激情福利| 久久国内精品自在自线400部| 91久久中文| 日韩欧美综合| 国产乱人伦精品一区| 日韩中文字幕一区二区三区| 1024精品一区二区三区| 福利精品一区| 国产精品亚洲产品| 日本成人中文字幕| 国产视频亚洲| 成人av二区| 亚洲成人精品| 免费在线小视频| 国产精品二区不卡| 精品视频一区二区三区四区五区| 国产麻豆一区| 国产情侣一区在线| 欧美视频精品全部免费观看| 视频一区免费在线观看| 香蕉久久国产| 久久高清一区| 先锋影音久久久|