精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

百行HTML 5代碼實現四種雙人對弈游戲

開發 前端
要做一個完整的雙人對弈游戲,至少要做如下事情,第一步:繪制棋盤。不同的棋類游戲棋盤不同,這一點需要進行動態處理;第二步:繪制棋子......

簡介:本文是一個非常具有挑戰性的編程,因為 100 行代碼,約莫 10000 個字符左右,將實現圍棋、五子棋、四子棋和翻轉棋四種雙人對弈游戲。請注意,這四個對弈游戲不是初級編程者的習作,而是有著棋盤、立體棋子、事件、走棋規則判斷、輸贏判斷的完整對弈游戲,并且可以離線存儲到 iPad、Android 平板中,試想一下,把這種游戲下載到平板中,就可以在火車,旅游景區,等沒有信號的地方進行對弈,是不是擴展了平板電腦的功能,是不是一種很愜意的事情。而且,關鍵是,這個程序沒有圖片,不需要去應用商店付費下載,僅僅是用 HTML5 技術寫的 100 行代碼而已,絕對是目前最迷您精悍的雙人對弈游戲源碼。(編者注:由于網頁代碼的寬度有限制,所以作者的源代碼經過了一些換行處理,特此說明。)

目標

要做一個完整的雙人對弈游戲,至少要做如下事情,第一步:繪制棋盤。不同的棋類游戲棋盤不同,這一點需要進行動態處理;第二步:繪制棋子。需要說明的是,圍棋,五子棋等這些棋子都是圓的啊,請不要為了圖片苦惱,在 HTML5 時代,我們用代碼就可以實現立體圓形棋子;第三步:判斷落子事件。當然是要定位手指的點擊位置,這四種棋中,有的是落在框里面的,有的卻是落在縱橫交錯的棋盤十字線上,需要動態處理;第四步:判斷落子規則。下棋都有規則,不要因為代碼少,就將規則打折扣,否則程序不成熟,會變成小朋友的玩具了;第五步:判斷輸贏。最后,我們要判斷輸贏。也就是要數子,這個事情必須由程序來完成,因為下棋總得需要一個裁判嘛;第六步:就是平板電腦時代,我們得實現離線應用。這個太重要了,否則,要是在臺式電腦上,接根網線玩的游戲,已經遍地都是了,您寫得再牛,有什么用?就是要移動,在沒有信號的地方,才有市場,現在平板,智能手機這么多,在沒有網絡信號的地方,掏出移動設備來下棋,才是一件很牛的事情。

繪制棋盤

前面說了圍棋、五子棋、四子棋和翻轉棋的棋盤并不相同,圍棋是縱橫 18 個格,其他三種棋則是 8 個格。所以繪制棋盤是需要有參數。這是個小問題,大問題是,選擇什么方法來繪制棋盤?

HTML5 框架下,有至少 3 種方法:第一種,用 Canvas 畫線;第二種,用 DIV,CSS3 里面增加了行列屬性;第三種,用 table 標簽。

用哪一種速度最快,代碼少呢?答案是:第三種。多少有點失望啊,HTML5 不是萬能的。詳細代碼如下:

  1. this.board=function(name,width,height,rowBak,colBak){ /* 畫棋盤 */  
  2. namenameBak=name;  
  3. if("turnover"==name){row=8;col=8;}else if("gogame"==name){row=18;col=18;}  
  4. var aW=Math.floor(width/(col+2)),aH=Math.floor(height/(row+2));  
  5. minL=(aW>aH?aH:aW)-4;// 這個減法很重要,否則填空時會把表格撐大  
  6. var array=new Array("<div style=\"margin:"+minL+"px;\"> "+  
  7. "<table border=1 cellspacing=0 width=\""+(aW*col)+"\"  
  8. height=\""+(aH*row)+"\">");  
  9. for(var i=0;i<row;i++){  
  10. array.push("<tr>");  
  11. for(var j=0;j<col;j++){array.push("<td align=center>"+  
  12. evt(i,j,minL,minL,aW*j+minL/2+8,aH*i+minL/2)+"</td>");}  
  13. if(nameBak!="four"&&nameBak!="turnover")/* 將事件添加到表格中 */  
  14. array.push(evt(i,col,minL,minL,aW*col+minL/2+8,aH*i+minL/2));  
  15. array.push("</tr>");  
  16. }  
  17. if(nameBak!="four"&&nameBak!="turnover"){  
  18. for(var j=0;j<=col;j++){  
  19. array.push(evt(row,j,minL,minL,aW*j+minL/2+8,aH*row+minL/2));  
  20. }  
  21. }  
  22. document.write(array.join("")+"</table></div>");  
  23. setClick(row,col,minL,minL);/* 初始化事件 */  
  24. start();/* 初始化棋子 */  

上面代碼中,最重要的是標黑體的第 6 行代碼,這里面有兩個訣竅,第一個就是 table 的定義,第二個就是使用了 Array 數組。為什么要使用數組,而不是定義一個字符串呢?答案是優化,就是 Array 數組的 push 方法的速度要遠遠快于 String 字符串的加 + 運算。共計 16 行代碼,一個棋盤就畫好了,當然這其中不僅僅是畫線,還有棋子處理,事件定義等方法的調用,后面將陸續談到。

繪制棋子

繪制完棋盤,我們來繪制棋子。我們挑選的這四種棋,雖然棋盤不同,但是棋子都是相同的,都是黑白棋子。這在以前,做在線對弈,除了 Flash 能實現美觀效果外,其他的必須先請美工做幾副小圖片,HTML5 時代,美工的人力和溝通成本就節省了。

我們至少有兩種方法繪制棋子,第一種是:canvas 類,第二種就是 css 的圓角屬性。用哪種速度又快代碼又少呢?答案是第二種,圓角。代碼如下:

  1. function man(width,height,id,colorBak){ /* 畫棋子 */  
  2. var color=colorBak==null?(order++%2==0?"000":"CCC"):colorBak;  
  3. var r="border-radius:"+width/2+"px;";  
  4. var obj=id==null?event.srcElement:_$(id);  
  5. obj.innerHTML="<div id=\"man_"+color+"_"+order+"\" style=\"display:block;-webkit-"  
  6. +r+"-moz-"+r+""+r+"-moz-box-shadow:inset 0 -10px 40px rgba(0,0,0,1);"+  
  7. "box-shadow:inset 0 -10px 40px rgba(0,0,0,1);"+  
  8. "background:-webkit-gradient(radial, 50 40, 30, center center, 80, from(#"+color+"),  
  9. to(rgba(255,255,255,1)));"+  
  10. "width:"+width+"px;height:"+height+"px;\"></div>";  

上面代碼中,我們看到,我們將每一個棋子定義了一個 DIV,使用了 CSS3 的 shadow,gradient 屬性,并且可以根據棋盤的大小自動計算棋子的大小,另外,如果用戶不喜歡黑白顏色,甚至可以定義成紅黃顏色,女生和小朋友估計會喜歡。這 5 行代碼是畫一個棋子的方法,做一個簡單的循環,就可以畫出多個棋子,方法如下。

  1. function moreMan(array){for(var i=0;i<array.length;i++)  
  2. man(minL,minL,nameBak+"_"+array[i]);}  
  3. /* 繪制多個棋子 */ 

#p#

處理事件

繪制完棋盤和棋子,我們來分析一下用戶的動作。用戶的動作無非就是兩種,一種是點擊棋盤 table,另外一種就是點擊棋子 DIV。難點在點擊 table 這里,我們要獲知用戶點擊 table 的位置。

傳統思路可能是這樣,使用 event 方法,獲得 x,y 的坐標,然后與 table 的左上角做減法,然后再跟單元格 cell 做除法。聽起來都麻煩。

如果您仔細閱讀了前面的代碼,就應該發現,其實在畫棋盤是,我們向 array 數組中 push 了一個 evt 方法,很明顯,這個 evt 方法要返回一個字符串變量的,那么他的內容是什么呢?答案揭曉:

  1. function evt(i,j,width,height,left,top){ /* 單一單元格事件 */  
  2. return "<div id=\""+nameBak+"_"+i+"_"+j+"\" style=\"position:"+  
  3. (nameBak=="four"||nameBak=="turnover"?"block":"absolute")+  
  4. ";border:0px solid #000;width:"+  
  5. width+"px;height:"+height+"px;top:"+top+"px;left:"+left+"px;\"></div>";  

原理是一個 DIV。對了,這個添加事件的方法非常特殊,實際上是在每個棋盤的交叉的地方畫了一個 DIV,然后給 DIV 添加事件。

  1. function setClick(row,col,width,height){  
  2. for(var i=0;i<=row;i++){  
  3. for(var j=0;j<=col;j++){  
  4. var els=_$(nameBak+"_"+i+"_"+j);  
  5. if(els!=null)els.onclick=function(){if(rule())man(width,height);};  
  6. }  
  7. }  

需要說明的是,DIV 一定要先定義,即 document.write 輸出出來,然后才能執行 onclick 的定義,否則會返回 DIV 未定義的錯誤。寥寥 10 行代碼,把事件問題搞定了。

落子規則

前面說了,用戶點擊事件有兩種,點擊棋盤 table 事件我們采用額外增加 DIV 的方法巧妙解決了,第二種點擊棋子的方法又該如何呢?

先要說明的是,點擊棋子其實是一種錯誤的事件,點擊棋盤可以落子,點擊棋子是什么意思?黑白棋點擊棋子是無意義的,我們必須要進行判斷,不能在有子的地方落子,這是規則之一。所以必須要定義一個方法,判斷是不是點擊的地方是不是有棋子。代碼如下:

  1. function isMan(row,col){var obj=_$(nameBak+"_"+row+"_"+col,1);  
  2. if(obj==null||obj.indexOf("man_")==-1)return null;  
  3. else if(obj.indexOf("000")!=-1)  
  4. return 0;  
  5. else if(obj.indexOf("CCC")!=-1)return 1;} 

想不到吧,其實只要一行代碼就可以就可以做是否有子的判斷,怎么判斷的,訣竅就在于判斷 DIV 的顏色,棋子要么黑,返回 0,要么白,返回 1,但是空白地方是沒有顏色的,返回 null。這里要特別注意返回值,后面判斷輸贏的時候還要用,所以不能簡單通過 true 或者 false 的的返回值來判斷是否有子,而是要判斷出有什么顏色的子。

對于五子棋和圍棋,這一條規則夠用了,但是對于翻轉棋和四子棋,還有第二條規則:不能在四周空白的地方落子,就是說必須是相連的。也就是說,不僅僅要判斷點擊的地方是不是有棋子,還要判斷其四周是不是有棋子,這個,不是可以有,而是,必須有。需要做一個小循環啊,代碼如下:

  1. function rule(){/* 走棋規則 */  
  2. var id=event.srcElement.id;  
  3. if(id.indexOf("man_")==0){alert("不能在有子的地方落子");return false;}else{  
  4. var p=id.indexOf("_"),p1=id.lastIndexOf("_");  
  5. var row=id.substr(p+1,p1-p-1)*1,col=id.substr(p1+1)*1;  
  6. if("gobang"==nameBak)return gobang(row,col);  
  7. else if("four"==nameBak){  
  8. if(isMan(row,col+1)==null&&isMan(row,col-1)==null&&  
  9. isMan(row+1,col)==null&&  
  10. isMan(row-1,col)==null){  
  11. alert("四子棋不能在四周空白的地方落子!");  
  12. return false;  
  13. }  
  14. return gobang(row,col,3);  
  15. }else if("turnover"==nameBak){  
  16. if(isMan(row,col+1)==null&&isMan(row,col-1)==null&&  
  17. isMan(row+1,col)==null&&isMan(row-1,col)==null&&  
  18. isMan(row-1,col-1)==null&&  
  19. isMan(row+1,col+1)==null){  
  20. alert("翻轉棋不能在四周空白的地方落子!");  
  21. return false;  
  22. }  
  23. turnover();  
  24. }else if("gogame"==nameBak){  
  25. }  
  26. }  
  27. return true;  

循環中,反復調用 isMan 方法判斷是否有棋子,所以如果 isMan 寫得不夠簡練,快速,不知道要耗費多少時間啊。數一數,總共 19 行代碼就處理了落子規則。

到這里,我們繪制了棋盤,棋子,獲得了點擊時間,判斷了落子規則,才用了 40 行左右的代碼,其實程序基本上可用了,但是我們不能滿足啊,還得讓他更加智能一些,我們還需要一個裁判斷輸贏。

判斷輸贏

要判斷輸贏,我們必須要知道下棋的規則:

五子棋是各個方向的五子相連算贏,四子棋是各個方向四個子相連算贏,翻轉棋數棋子的個數,圍棋則要麻煩些,不僅僅數棋子個數,還要數圍住的區域。

邏輯上好像很復雜啊,似乎也是計算最多的地方,有點人工智能的意思。沒錯,如果前面的基礎打得不好,這里的確要耗費很多代碼,但是因為我們前面定義了 DIV 用顏色判斷是否存在棋子的 iaMan 方法,這里再使用一個小技巧,就可以輕松搞定這個輸贏判斷。先看看五子棋和四子棋的輸贏判斷代碼,然后對照代碼來分析。

  1. function gobang(row,col,num){  
  2. numnum=num==null?4:num;  
  3. var rs=[[],[],[],[]],b=[],w=[];/* 這里采用四維數組來存儲棋子位置 */  
  4. for(var i=0,j=0;i<num*2+1;i++,j++){  
  5. rs[0].push(isMan(row-num+i,col));  
  6. rs[1].push(isMan(row,col-num+j));  
  7. rs[2].push(isMan(row-num+i,col-num+j));  
  8. rs[3].push(isMan(row-num+i,col-num+j));  
  9. if(i<num){b.push(0);w.push(1);}  
  10. }  
  11. if(rs.join("#").indexOf(b.join(","))!=-1){alert("黑棋勝");return false;  
  12. }else if(rs.join("#").indexOf(w.join(","))!=-1){alert("白棋勝");return false;}  
  13. return true;  

共計 9 行代碼就搞定,看懂沒?首先定義了一個 Javascript 多維數組 rs=[[],[],[],[]],這種定義多維數組的方法,挑出來重點說明一下,因為搜索引擎上都是搜不到的,我講課時差不多遇到的學生也都不清楚,他們大多采用 new Array,然后加循環的蝸牛方法。

第二步:從落子的地方開始循環,注意,不是循環整個棋盤,為的就是節省時間啊。循環設計縱橫交叉四個方向,有棋子的地方,就向這個四維數組 push 棋子的顏色。

第三步:把數組 join 起來就 ok 啦,如果有 4 個或 5 個 1 相連,自然就是白棋勝,否則就是黑棋勝。

寫道這里,就有點意思啦,注意我們處理的數據的方法,我稱之為“塊數據”的處理方法,就是充分利用 array 數組,保存一塊一塊的數據,無論寫入,讀取,還是統計分析,都是針對這一塊數據進行,這樣既可以提高內聚度,便于提煉出可以重用的方法,就可以大大的加快執行速度。

處理相連都不在話下,數子就更簡單了,使用塊數據處理方法,3 行搞定。

  1. function turnover(){  
  2. if(order<64)return;  
  3. var num=0;var total=row*col;for(var i=0;i<row;i++){  
  4. for(var j=0;j<col;j++){num+=isMan(i+"_"+j);}  
  5. }  
  6. if(num<total/2)alert("黑棋勝"+(total-num*2)+"子");  
  7. else if(num>row*col/2)alert("白棋勝"+(num*2-total)+"子");  
  8. else alert("平局");  

棋子初始化

環環相扣地寫到這里,還有最后一個關于棋子的問題需要處理。那就是,下五子棋是從空白棋盤開始,其他三種棋卻一開始都是有子的。其實給一個空白棋盤也行,但是其他三種棋因為一般的前幾步走法都是固定的,我們為了提高智能化程度,不得不在浪費四行代碼,畢竟,我們的目標是一個市場化的產品,而不是一個初學者不考慮用戶體驗的程序。

  1. function start(){  
  2. if("turnover"==nameBak){moreMan([3+"_"+3,4+"_"+3,4+"_"+4,3+"_"+4]);  
  3. }else if("four"==nameBak){man(minL,minL,nameBak+"_"+row/2+"_"+0);  
  4. }else if("gogame"==nameBak){moreMan([3+"_"+3,15+"_"+3,15+"_"+15,3+"_"+15]);  
  5. }  

其實就是調用了一下 moreMan 方法,注意也是塊數據引用,傳輸了一個數組,用下劃線分割橫向和縱向坐標。

#p#

做成離線應用

本文開頭就說過,臺式電腦的雙人或多人對弈程序早已多如牛毛爛大街了,只有移動應用才能有市場,我們的目標就是奔著這個來的,所以最后必須做成離線應用。

如何實現 HTML5 的離線應用,搜索引擎很快能找到結果,其實只要三個關鍵步驟。

第一步;在 Web 服務器的配置文件中聲明一下。Tomcat 和 Apache 的聲明方式不相同,需要注意;

第二步:定義 manifest 文件,文件格式需要注意;

第三步:在 HTML 的文件中調用一下 manifest 文件。

根據這三個步驟,讀者可以自行搜索細節,這里就不贅述了,我只講搜索引擎搜不到的。

另外需要說明的是,iPad 和 Android 平板上瀏覽器實現全屏的方法也不一樣,針對 iPad 用戶,我們還必須定義一行能夠實現全屏的代碼。

9. 效果圖、在線演示、開放源代碼

本文的在線演示網址是:http://www.chofo.com/chess.htm,效果圖如下圖所示:

圖1. 效果圖

[[82208]]

圖中加了一個選擇棋類型和設置背景功能,如要獲得全部源代碼,只要使用瀏覽器的查看源代碼功能即可,限于篇幅,這里就不貼了。

總結

作為一個程序員,最高的境界不是寫得代碼越多越好,而是用最少的代碼實現最多的計算,解決最多的問題。回想當年,蓋茨在編寫 Basic 時,為了節省幾個字符需要絞盡腦汁通宵達旦,以至于遺留了千年蟲世紀難題,反觀今日,在云計算時代,隨著硬盤和內存的容量越來越大,CPU 的運算越來越快,很多大型項目的程序員似乎失去了精簡代碼的習慣。但是移動計算的硬件,目前還沒有那么高的配置,本文通過 HTML5 對弈游戲,使用“塊數據”計算方法,實現了用最少代碼實現最多計算的目標,特別適用移動計算,與大家共勉。

原文鏈接:http://www.mhtml5.com/2012/07/5177.html

責任編輯:張偉 來源: HTML5研究小組
相關推薦

2011-08-19 09:15:01

HTML 5

2015-03-19 15:13:20

PHP基本排序算法代碼實現

2011-03-16 09:05:53

NATiptables

2021-12-22 09:34:01

Golagn配置方式

2012-07-05 10:18:03

HTML5

2010-08-05 09:33:08

Flex頁面跳轉

2025-01-16 00:00:00

MapStruct映射

2009-09-08 17:20:01

C#排序算法

2025-09-05 01:23:00

PyTorchPython分支

2013-11-15 13:35:17

html5代碼創意

2015-04-02 16:54:52

災難恢復VDI災難恢復

2015-04-13 11:39:26

VDI災難恢復

2012-05-15 13:57:41

HTML5

2021-10-24 08:37:18

網絡監控網絡架構網絡

2022-01-12 11:02:01

云計算安全技術

2023-07-11 10:24:00

分布式限流算法

2010-07-16 13:50:53

Perl哈希表

2012-05-28 10:01:19

2013-07-29 10:10:40

TCP協議TCP定時器TCP

2022-08-01 07:56:23

React Hook開發組件
點贊
收藏

51CTO技術棧公眾號

久久综合偷偷噜噜噜色| 超碰国产在线| 伊人久久综合| 亚洲欧美日韩爽爽影院| 欧在线一二三四区| 日本在线观看视频| 成人在线一区二区三区| 日本欧美爱爱爱| 很污很黄的网站| 牛牛影视久久网| 在线观看视频91| 精品嫩模一区二区三区| 天堂av网在线| 国产一区二三区好的| 欧美一级bbbbb性bbbb喷潮片| 精品伦精品一区二区三区视频密桃 | 亚洲一二区视频| 欧美日韩伊人| 色综久久综合桃花网| 国内自拍偷拍视频| jvid一区二区三区| 午夜精品久久久久久久99水蜜桃| 亚洲午夜精品久久| 性高潮久久久久久久久久| 寂寞少妇一区二区三区| 国产成人免费91av在线| 精品无码久久久久久久| 欧美高清视频手机在在线| 国产视频在线观看一区二区| 下面一进一出好爽视频| 国产成人77亚洲精品www| 精品久久久香蕉免费精品视频| 最新av在线免费观看| 成人在线免费电影| 99r国产精品| 18成人免费观看网站下载| 日韩综合在线观看| 国产欧美大片| 欧美精品福利视频| 少妇影院在线观看| 亚洲欧美综合久久久| 在线观看国产精品91| 老鸭窝一区二区| 伊人精品综合| 日韩三级高清在线| 在线播放黄色av| 欧美成人高清视频在线观看| 欧美三级中文字幕| 中文字幕第80页| 久久久成人av毛片免费观看| 疯狂蹂躏欧美一区二区精品| 大地资源网在线观看免费官网| 婷婷成人激情| 亚洲欧洲三级电影| eeuss中文| 国产激情小视频在线| 国产精品拍天天在线| 日韩av影视| 超碰免费在线观看| 国产精品久久久久影院| 亚洲在线不卡| 岛国中文字幕在线| 一区二区三区四区在线| 精品免费久久久久久久| 欧美激情成人动漫| 亚洲国产欧美在线| 少妇无码av无码专区在线观看| 99re6在线精品视频免费播放| 香蕉加勒比综合久久| 国产在线播放观看| 国产高清不卡| 欧美影院精品一区| 亚洲午夜激情影院| 亚洲伊人影院| 精品视频www| 亚洲精品国产精品国自产网站| 精品国产av一区二区三区| 久久字幕精品一区| 国产精品日韩电影| 国产又粗又猛又爽| 成人免费观看男女羞羞视频| 精品产品国产在线不卡| 精品视频一二区| 中文字幕成人av| 欧美性受xxxx黑人猛交88| 蜜桃传媒在线观看免费进入| 婷婷综合在线观看| 簧片在线免费看| 国产人与zoxxxx另类91| 日韩激情在线视频| 青青青视频在线播放| 午夜精品久久久久99热蜜桃导演 | 麻豆成全视频免费观看在线看| 欧美性猛交xxx| 日韩一区二区三区久久| 91精品导航| 亚洲性生活视频| 唐朝av高清盛宴| 香蕉国产精品偷在线观看不卡| 国产精品影院在线观看| 亚洲精品综合网| 国产欧美一区二区三区沐欲| 成人免费a级片| 日韩在线短视频| 日韩欧美成人午夜| 无码人妻aⅴ一区二区三区69岛| 我不卡神马影院| 91av在线播放视频| 国产伦精品一区二区三区免.费 | 一级黄色录像毛片| 欧美三级小说| 国产精品久久综合av爱欲tv| 囯产精品一品二区三区| 中文字幕中文字幕一区二区| 久久久久久久久久久99| 精品视频在线播放一区二区三区| 日韩精品视频观看| 国产一级一片免费播放| 久久精品国产99| 欧美日韩一区二区视频在线 | 1024成人网| 一本大道熟女人妻中文字幕在线| 国产免费区一区二区三视频免费 | 国内精品久久国产| 久久77777| 欧美又粗又大又爽| 少妇久久久久久久久久| 伊人久久大香线蕉av超碰演员| 91九色精品视频| 国产精品久久一区二区三区不卡| 精品女同一区二区三区在线播放| 992tv人人草| 99久久精品费精品国产| 国产精品久久91| 欧洲亚洲精品视频| 精品久久久精品| 欧类av怡春院| 亚洲精品综合| 国产专区一区二区三区| 国产精品186在线观看在线播放| 9191精品国产综合久久久久久| 欧美激情 一区| 久久字幕精品一区| 日本一区网站| 色综合天天色| 中文字幕亚洲欧美在线| 超碰在线免费97| 国产亚洲欧美日韩俺去了| 国产精品欧美激情在线观看| 香蕉国产成人午夜av影院| 国产综合在线视频| 婷婷开心激情网| 天天色图综合网| 亚洲av片不卡无码久久| 麻豆成人精品| 奇米影视首页 狠狠色丁香婷婷久久综合| 性欧美18~19sex高清播放| 亚洲国产精彩中文乱码av在线播放 | 色综合久久88色综合天天看泰| 99久久一区二区| 一区二区成人在线| 97精品人妻一区二区三区蜜桃| 激情综合亚洲| 精品婷婷色一区二区三区蜜桃| 亚洲风情在线资源| 国产香蕉一区二区三区在线视频| 高潮无码精品色欲av午夜福利| 国产精品人成在线观看免费| 中文字幕1234区| 欧美日韩蜜桃| 欧美精品二区三区四区免费看视频 | 一区二区在线免费| 东京热av一区| 丝袜美腿亚洲色图| 人人妻人人澡人人爽精品欧美一区| 成人动漫视频在线观看| 欧美精品xxx| 久色视频在线| 69堂国产成人免费视频| 国产午夜小视频| 国产欧美综合在线| 国产精品999.| 久久九九精品| 2025韩国大尺度电影| 成人高潮a毛片免费观看网站| 欧美最猛性xxxxx亚洲精品| 午夜视频在线| 日韩av在线网| 在线观看国产小视频| 亚洲综合免费观看高清完整版在线| 97人妻精品一区二区三区免 | 国产精品日韩专区| 日本三级在线观看网站| 亚洲午夜精品视频| 亚洲av无码乱码在线观看性色| 日韩欧美精品免费在线| 国产一区二区三区在线视频观看| a在线播放不卡| 色戒在线免费观看| 国产精品呻吟| 久久精品在线免费视频| 欧美猛男男男激情videos| 亚洲a级在线观看| 成人勉费视频| 欧美多人乱p欧美4p久久| 成人影视在线播放| 亚洲第一页在线| 在线观看免费黄色小视频| 红桃视频成人在线观看| 欧美性x x x| 国产欧美视频在线观看| 99久久免费看精品国产一区| 捆绑紧缚一区二区三区视频| 337p粉嫩大胆噜噜噜鲁| 女同性一区二区三区人了人一 | 午夜精品一区在线观看| 免费成人深夜夜行网站| 久久久噜噜噜久噜久久综合| 韩国一区二区三区四区| 久久99精品视频| 无码人妻h动漫| 136国产福利精品导航网址| 2025韩国大尺度电影| 欧美精品系列| 免费国产在线精品一区二区三区| 91精品入口| 成人精品久久一区二区三区| 亚洲天堂一区二区| 欧美一级高清免费播放| 超碰在线网站| 欧美激情亚洲视频| 午夜dj在线观看高清视频完整版| 色悠悠久久久久| 2019中文字幕在线视频| 亚洲午夜激情免费视频| 国产有码在线| 国产小视频91| 国产大片在线免费观看| 亚洲人成网7777777国产| 色在线免费视频| 日韩精品免费在线视频观看| 天天色天天操天天射| 亚洲成人黄色在线观看| 国产成人无码www免费视频播放| 欧美成人免费网站| 欧美熟妇另类久久久久久不卡| 精品国产91乱码一区二区三区| av网站在线观看免费| 欧美一卡2卡三卡4卡5免费| a级片免费观看| 欧美成人免费网站| 深夜福利视频网站| 日韩国产激情在线| 免费在线视频一级不卡| 亚洲欧美日韩国产中文专区| 国模吧精品人体gogo| 中文日韩在线视频| 日本高清视频在线播放| 久久伊人色综合| 国产网红女主播精品视频| 97在线视频精品| 免费观看亚洲| 国产成人精品久久二区二区| 99久久亚洲国产日韩美女 | 777777国产7777777| 国产校园另类小说区| 亚洲综合欧美综合| 国产精品久久久99| 国产探花在线免费观看| 亚洲天堂免费在线观看视频| 青草影院在线观看| 亚洲成av人综合在线观看| 丰满人妻老熟妇伦人精品| 欧美性猛片aaaaaaa做受| 一卡二卡三卡在线| 欧美不卡一区二区三区四区| 午夜性色福利视频| 夜夜嗨av一区二区三区四区 | 99久久精品国产一区色| 精品国产伦一区二区三区免费 | 一级黄色在线观看| 91麻豆精品国产自产在线 | 中文字幕精品在线| 在线三级电影| 欧洲日本亚洲国产区| 一级欧美视频| 精品一区久久| 99久久久国产精品美女| 水蜜桃色314在线观看| 喷白浆一区二区| 国产精品欧美性爱| 国产日韩欧美在线一区| 免费无遮挡无码永久在线观看视频| 五月婷婷激情综合| 91影院在线播放| 精品偷拍一区二区三区在线看| 日本在线视频网| 91爱视频在线| 久久伊人久久| 欧美日韩精品免费在线观看视频| 68国产成人综合久久精品| 国产亚洲综合视频| 国产一区视频在线看| 偷拍夫妻性生活| 午夜一区二区三区视频| 国产裸体无遮挡| 亚洲欧美一区二区三区久久| 色呦呦呦在线观看| 国产精品高精视频免费| 高清精品xnxxcom| 中文字幕中文字幕一区三区| 亚洲欧美bt| 黄色av电影网站| 自拍偷拍亚洲综合| 国产一级片一区二区| 亚洲白虎美女被爆操| 哥也色在线视频| 国产精品一区二区三区免费视频 | 亚洲另类xxxx| 欧美人与牲禽动交com| 91嫩草在线视频| 欧美三级伦理在线| 国产免费毛卡片| av网站免费线看精品| 国产1区2区3区4区| 欧美精品第1页| 91精品专区| 日本欧美一级片| 伊人成综合网yiren22| 国产毛片视频网站| 国产.欧美.日韩| 欧美黄色免费看| 欧美一区二区三区四区高清| 日本成a人片在线观看| 国产精品久久久久久一区二区| 丝袜连裤袜欧美激情日韩| 高清欧美精品xxxxx| 国产v综合v亚洲欧| 久久国产精品波多野结衣av | 天天色综合久久| 欧美日本亚洲视频| 色妞ww精品视频7777| 肉大捧一出免费观看网站在线播放 | 99九九99九九九99九他书对| 国产精品久久网站| 91精品国自产| 毛片精品免费在线观看| av在线国产精品| 法国空姐在线观看免费| 国产麻豆视频一区| www青青草原| 精品国一区二区三区| 俺来也官网欧美久久精品| 国产欧美韩日| 亚洲毛片av| 中文精品在线观看| 欧美亚洲动漫另类| 免费在线毛片网站| 91成人免费在线观看| 欧美成人精品| 国产xxxxxxxxx| 狠狠躁天天躁日日躁欧美| 久久电影中文字幕| 国产精品国产福利国产秒拍| 99久久亚洲精品蜜臀| 性鲍视频在线观看| 午夜国产精品一区| 国产三级在线| 亚洲va久久久噜噜噜| 亚洲视频碰碰| 91网站免费入口| 欧美日韩成人综合天天影院| av网站在线免费| 久久精品国产美女| 奇米影视在线99精品| 国产高清在线免费观看| 亚洲精品国产福利| 国产精品久久久久久妇女| 精品免费久久久久久久| 99视频精品在线| 中文字幕一级片| 欧美大片免费看| 免费看日本一区二区| xxx国产在线观看| 亚洲高清免费一级二级三级| 久久久久久久久亚洲精品| 国产在线精品一区免费香蕉| 国内精品美女在线观看| 免费人成又黄又爽又色| 欧美一区二区三区视频在线观看| 国产夫妻在线播放| 一区二区日本伦理| av在线不卡免费看| 亚洲系列在线观看| 欧美重口另类videos人妖| 99久久www免费| 无遮挡aaaaa大片免费看| 欧美一区二区三区婷婷月色| 国产精品迅雷| 日本久久久网站|