久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 10567|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

基于51的小游戲設(shè)計(jì)思路和方法講解

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:213690 發(fā)表于 2017-6-22 13:36 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
基于51的小游戲設(shè)計(jì)思路和方法講解
詳細(xì)圖文版請(qǐng)下載:
單片機(jī)游戲設(shè)計(jì).doc (165 KB, 下載次數(shù): 31)


內(nèi)容預(yù)覽:
單片機(jī)游戲設(shè)計(jì)
1。概念
對(duì)于大部分單片機(jī)+LCD的游戲設(shè)計(jì),基本采用前后臺(tái)方式,就是一個(gè)臺(tái)中斷,一個(gè)臺(tái)循環(huán)
(哪個(gè)前哪個(gè)后忘了),LCD部分基本是以固定點(diǎn)陣形式設(shè)計(jì),什么叫固定點(diǎn)陣??首先先
明確,我們?cè)O(shè)計(jì)的游戲不是什

么魔獸爭(zhēng)霸或CS,而是黑白形式的固定點(diǎn)陣游戲,例如常見(jiàn)著名游戲貪吃蛇或俄羅斯方
塊。他們的每個(gè)點(diǎn)
都是預(yù)先就固定下來(lái)的,而且是比較大的點(diǎn),這類(lèi)專(zhuān)門(mén)的游戲機(jī)玻璃是經(jīng)過(guò)廠家開(kāi)模出來(lái)
的,有固定的COM,SEG線(xiàn),然后接到專(zhuān)門(mén)的單片機(jī)上,例如常用的6502指令集合的單片
機(jī),呵呵,我以前就用6502設(shè)計(jì)過(guò)一個(gè)。
對(duì)于業(yè)余設(shè)計(jì)的游戲,我們一般用如128*64的LCD來(lái)顯示,那么我們?cè)O(shè)計(jì)的時(shí)候首先應(yīng)該把
這個(gè)128*64的LCD分塊,也就是分出固定點(diǎn)陣出來(lái)。LCD的基本點(diǎn)陣是128*64,就是•
¥##¥總之就是好多個(gè)點(diǎn)啦,但我們事實(shí)上不一定要運(yùn)算這么多個(gè)點(diǎn),除非你做的游戲很
有看頭。例如你只用左邊64*64的地方來(lái)做貪吃蛇,那么你打算你的貪吃蛇的活動(dòng)空間是多
少呢?如果是8*8個(gè)點(diǎn)的話(huà),算一下就是每個(gè)點(diǎn)64/8,64/8,也就是8*8個(gè)基本點(diǎn)陣,不過(guò)
想好玩一點(diǎn),當(dāng)然就是要有16*16個(gè)點(diǎn)的活動(dòng)空間啦,那么每個(gè)固定點(diǎn)陣就要占4*4的基本
點(diǎn)陣了。要注意,這些4*4的東西在64*64LCD上共16*16個(gè),每個(gè)都要用來(lái)獨(dú)立運(yùn)算。

2。時(shí)鐘
這個(gè)其實(shí)是游戲的速度,對(duì)于一般的弱智類(lèi)游戲機(jī),他也代表了難度,物體在每個(gè)時(shí)鐘到
達(dá)的時(shí)候就傳動(dòng)一次,例如俄羅斯方塊沒(méi)個(gè)時(shí)刻向下跑一層。賽車(chē)游戲每個(gè)時(shí)刻想前走一
步。一般這類(lèi)時(shí)鐘的時(shí)間在0.X秒到1秒之間,物體有規(guī)律地勻速運(yùn)動(dòng),讓人看到感覺(jué)是連
動(dòng)。

3。運(yùn)動(dòng)

在這里,我先介紹兩種比較普遍的弱智游戲機(jī)的物體運(yùn)動(dòng)規(guī)則:柔體傳動(dòng),剛體傳動(dòng)。

剛體傳動(dòng)
代表作是俄羅斯方塊,所謂剛體,就是硬硬的一個(gè)東東,運(yùn)動(dòng)的時(shí)候也不怎么旋轉(zhuǎn)(注
意,俄羅斯方塊是會(huì)旋轉(zhuǎn),但其實(shí)他是沒(méi)有經(jīng)過(guò)算法的旋轉(zhuǎn),純提取數(shù)組的方式,也就是
把一個(gè)放塊做成4個(gè)模式的點(diǎn)陣結(jié)構(gòu),其實(shí)就是4個(gè)方向,呵呵)對(duì)于剛體的傳動(dòng),在每個(gè)
時(shí)鐘到達(dá)的時(shí)候向一個(gè)方向(很可能是用戶(hù)輸入的)運(yùn)動(dòng)一個(gè)固定點(diǎn)陣。如果以坐標(biāo)來(lái)表
達(dá),就是物體的所有基本點(diǎn)陣同時(shí)向一個(gè)方向(X或Y)移動(dòng)一個(gè)單位。

柔體傳動(dòng)
代表作是貪吃蛇,貪吃蛇跑動(dòng)的時(shí)候并不是整條蛇向一個(gè)方向動(dòng)的(呵呵,蛇蛇身體僵硬
了),而是在每個(gè)時(shí)鐘的到來(lái),物體由能量頭帶動(dòng)(如蛇頭),每個(gè)點(diǎn)的方向都向下一個(gè)
點(diǎn)傳播,然后自己向新的方向走動(dòng)一步,走動(dòng)后,下一個(gè)點(diǎn)由于得到了上一個(gè)點(diǎn)的方向并
同樣地運(yùn)動(dòng)一步,所以,他會(huì)馬上填補(bǔ)上一個(gè)點(diǎn)的地方,如此類(lèi)推。
說(shuō)的好象沒(méi)說(shuō),看不懂沒(méi)關(guān)系,因?yàn)閷?shí)際的算法可以簡(jiǎn)化(傻瓜才會(huì)一個(gè)個(gè)點(diǎn)來(lái)走的),
實(shí)際上在設(shè)計(jì)貪吃蛇的時(shí)候,只需要把蛇尾巴的那個(gè)點(diǎn)陣去掉,然后在蛇頭的新方向放一
個(gè)點(diǎn)陣就是了。期間需要記錄下每個(gè)蛇身的固定點(diǎn)陣的位置,并且在每個(gè)運(yùn)動(dòng)時(shí)刻過(guò)后刷
新一次每個(gè)點(diǎn)的位置。

4。顯示接口
我們用的一般是點(diǎn)陣式LCD,就是一大片點(diǎn)點(diǎn),128*64,132*64,240*128等等等等啦,這
些又叫條屏,就是一寫(xiě)就寫(xiě)一條——8個(gè)點(diǎn)(有的也提供寫(xiě)一個(gè)點(diǎn)的功能,但貴,至少我沒(méi)
有),那么如果你只想寫(xiě)一個(gè)點(diǎn)怎么辦?那就得先把這個(gè)點(diǎn)所在的條讀出來(lái),然后通過(guò)
與,或,的運(yùn)算后,再放回到LCD上,這時(shí)候就要涉及到一個(gè)讀LCD的問(wèn)題了,有的LCD提供
讀的功能,你寫(xiě)過(guò)什么在上面他記的很清楚(就好象老丁實(shí)驗(yàn)板上的LCD),但有的便宜貨
就不行了,那么我們?cè)趺崔k?沒(méi)關(guān)系,你在內(nèi)存中提取出一片空間,虛擬一個(gè)LCD出來(lái),每
次寫(xiě)在真實(shí)LCD上面的時(shí)候,也同時(shí)寫(xiě)到內(nèi)存的哪個(gè)虛擬LCD上,那么你要讀出LCD的值的時(shí)
候?qū)嶋H就是讀出虛擬LD上的數(shù)據(jù),然后與或后,再重新寫(xiě)到LCD上,記得也要寫(xiě)到虛擬LCD
上哦。你可以把這片緩沖叫做顯存(COOL吧??)


5。流程
這是成功設(shè)計(jì)游戲的靈魂,你在設(shè)計(jì)游戲之前必須能正確構(gòu)思到一個(gè)基本模型出來(lái)。這個(gè)
基本是菜鳥(niǎo)和蝦米的一個(gè)區(qū)別,有了構(gòu)思,其他的其實(shí)都是時(shí)間問(wèn)題了。
以貪吃蛇為例,我們需要有這樣的基本思路:(普通手機(jī)上的那種)

蛇運(yùn)動(dòng)處理,吃到食物的處理,放新食物的處理,死亡的處理。

以上是基本的思路,至于那些記錄分?jǐn)?shù),音樂(lè)效果,玩到一定分?jǐn)?shù)會(huì)自動(dòng)加速度等不是游
戲的必須,可以在后期處理!
分析下來(lái):

運(yùn)動(dòng):根據(jù)用戶(hù)輸入按鍵進(jìn)行柔體傳動(dòng)。
吃到食物:置沒(méi)有食物標(biāo)志了,蛇長(zhǎng)大一個(gè)點(diǎn)陣。
放新食物:判斷食物標(biāo)志,如果沒(méi)有食物,就要放食物,判斷放的食物是否和蛇身重疊,
重疊了要重放。
死亡處理:判斷是否撞中自己或撞墻。

這就是基本要做的東西,實(shí)際上就是程序要做的東西,那么把上面的東西連成一個(gè)流程是
怎樣的呢?我以文字表達(dá):

蛇向一個(gè)固定方向進(jìn)行柔體傳動(dòng),沒(méi)個(gè)運(yùn)動(dòng)時(shí)鐘到達(dá)要做:1。判斷食物標(biāo)志,沒(méi)有食物了
就放一個(gè),放的時(shí)候判斷,不能和蛇身重疊 2。得到用戶(hù)按鍵值,蛇走一步,并判斷是否
撞死了,沒(méi)撞死,再判斷是否吃到東西了,沒(méi)有吃到,就等下一個(gè)運(yùn)動(dòng)時(shí)鐘,吃了?就增
長(zhǎng)一點(diǎn)。置一個(gè)沒(méi)有食物的標(biāo)志。然后等待下一個(gè)時(shí)刻的來(lái)臨。


呵呵,其實(shí)程序就是這么簡(jiǎn)單,基本設(shè)計(jì)只有LCD部分和按鍵部分是和單片機(jī)有關(guān)的,其他
都是程序思維和算法。對(duì)于菜鳥(niǎo)來(lái)說(shuō),難度在于思維,而不是單片機(jī)。
說(shuō)了屁話(huà)一堆,還得放上個(gè)能玩的,這里我介紹我的貪吃蛇程序,在丁丁的DX實(shí)驗(yàn)板上跑
的,很久以前就寫(xiě)的了,老丁也玩過(guò),基本和手機(jī)上的那個(gè)區(qū)別不是很大。
程序注意:這是在DX51板子上跑的程序,有些函數(shù)部分采用了丁丁寫(xiě)的底層:例如鍵盤(pán)
掃描,漢字顯示,LCD顯示等,為了保障老丁的利益,我沒(méi)有完全給出所有的底層部分,其
實(shí)他們和貪吃蛇本身沒(méi)有太大關(guān)系。貪婪者別以為拿來(lái)就用,我只希望大家用來(lái)交流學(xué)
習(xí)。其實(shí)改改就能玩的了。
注釋?xiě)?yīng)該很詳盡,有不懂自己想啦。
還有,我有點(diǎn)反感有些人公布程序了,但卻把很多注釋去掉,這個(gè)不知道是什么心態(tài)
呢??希望大家能大方點(diǎn),要給,就要給最好的!!
////////////////////////////////////////////////////////////
/*snake_flag是游戲標(biāo)志,第一位是跑動(dòng)標(biāo)志,在定時(shí)器中斷上設(shè)置,下面程序沒(méi)有定時(shí)
器中斷函數(shù),因?yàn)槎〞r(shí)器函數(shù)在丁板上是給很多個(gè)程序共用的,函數(shù)根據(jù)標(biāo)志判斷當(dāng)前是
為那個(gè)進(jìn)程服務(wù)*/

//貪吃蛇游戲程序,屏左半部用于游戲活動(dòng),右半部為分?jǐn)?shù)顯示
//游戲屏為16*16游戲點(diǎn)陣,可容納蛇身塊數(shù)256。每個(gè)游戲點(diǎn)陣又由4*4個(gè)LCD基本點(diǎn)陣組

//蛇行標(biāo)志在定時(shí)器上置位,這里為游戲的主體部分。


#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

#define LCMD XBYTE[0xAfff] // 液晶數(shù)據(jù)口
#define LCMC XBYTE[0xAbff] // 液晶命令口

#define TIME_RUN 10 //定時(shí)器分品系
數(shù)

#include "study.h"
#include "reg51.h"
#include "absacc.h"
#include "intrins.h"

//游戲部分
//x,y最大極限
#define MAX_GAME_X 15
#define MAX_GAME_Y 15


#define lcd_no_read 1 //編譯選項(xiàng),把這項(xiàng)屏蔽掉就
采用LCD讀出方式,否則采用顯存形式


uchar snake_flag, //蛇頭標(biāo)志 7 6 5 4 3 2
1 0

// 上 下 左 右 x gameover food run
snake_len, //蛇身長(zhǎng)度
snake_food; //食物位置,高4位Y,低4位x

uchar xdata snake_body[256]; //蛇身每個(gè)部分的數(shù)據(jù)

// 7 6 5 4 3 2 1 0
//
高4位Y方向 低4位X方向

#ifdef lcd_no_read
uchar xdata lcd_buf[8][64];//lcd緩沖,用于記錄LCD內(nèi)部的點(diǎn)陣,可以理解為顯存
//當(dāng)
LCD無(wú)讀出功能時(shí),就要采用顯示緩沖。本LCD為可讀,一般不用這個(gè)功能
//緩
沖只記錄蛇身活動(dòng)的部分,即LCD左半屏
#endif




/******************************************************
* 游戲LCD部分,根據(jù)游戲的特點(diǎn)把LCD分成16*16塊
* 用作游戲點(diǎn)陣,
*******************************************************/

//
//函數(shù)名:clr_game_dot
//功能:清一個(gè)游戲點(diǎn)
//輸入?yún)?shù):游戲點(diǎn)的X,Y坐標(biāo)
//注意事項(xiàng):這里的X,Y坐標(biāo)和LCD底層的X,Y坐標(biāo)不同,他最大只能是
MAX_GAME_X,MAX_GAME_Y
//使用方式:內(nèi)部調(diào)用
void clr_game_dot(uchar x,uchar y)
{
uchar lcd_x,i,tmp;
while(x>MAX_GAME_X)x-=(MAX_GAME_X+1); //這個(gè)是寫(xiě)程序習(xí)慣的保護(hù)措
施,預(yù)防輸入范圍過(guò)大
while(y>MAX_GAME_Y)y-=(MAX_GAME_Y+1);
lcd_x=x<<2;
LCMC=lcd_x&0x0f; //設(shè)置x位置
LCMC=(lcd_x>>4)|0x10;
LCMC=0xb0+y/2; //設(shè)置Y位置
LCMC=0xe0;

if(y%2)//行的下半部
{
for(i=0;i<4;i++)
{
#ifdef lcd_no_read //以下是顯存法的清點(diǎn)程序,
其他例如亮點(diǎn)的部分和這個(gè)原理一樣

tmp=lcd_buf[y>>1][(x<<2)+i];
//先從緩沖讀出要修改的LCD片的數(shù)據(jù)
tmp&=0x0f;
//清對(duì)應(yīng)的游戲點(diǎn)
LCMD=tmp;
_nop_();
lcd_buf[y>>1][(x<<2)+i]=tmp;
//把新數(shù)據(jù)寫(xiě)回緩沖
#else
tmp=LCMD;tmp=LCMD;
//讀LCD的方法,要求連讀2次
LCMD=tmp&0x0f;

#endif
}
}
else //行的上半部,下同
{
for(i=0;i<4;i++)
{
#ifdef lcd_no_read

tmp=lcd_buf[y>>1][(x<<2)+i];
tmp&=0xf0;
LCMD=tmp;
_nop_();
lcd_buf[y>>1][(x<<2)+i]=tmp;
#else
tmp=LCMD;tmp=LCMD;
LCMD=tmp&0xf0;
#endif
}
}
LCMC=0xee;
}

//函數(shù)名:fill_game_dot
//功能:亮一個(gè)游戲點(diǎn)
//輸入?yún)?shù):游戲坐標(biāo)的X,Y坐標(biāo)
//注意事項(xiàng):這里的X,Y坐標(biāo)和LCD底層的X,Y坐標(biāo)不同,他最大只能是
MAX_GAME_X,MAX_GAME_Y
// 這個(gè)函數(shù)和上面的clr_game_dot基本相同,只是在寫(xiě)LCD數(shù)據(jù)的時(shí)候是全1而
不是0
//使用方式:內(nèi)部調(diào)用
void fill_game_dot(uchar x,uchar y)
{
uchar lcd_x,i,tmp;
while(x>MAX_GAME_X)x-=(MAX_GAME_X+1);
while(y>MAX_GAME_Y)y-=(MAX_GAME_Y+1);
lcd_x=x<<2;
LCMC=lcd_x&0x0f; //設(shè)置x位置
LCMC=(lcd_x>>4)|0x10;
LCMC=0xb0+y/2; //設(shè)置Y位置
LCMC=0xe0;
if(y%2)//行的下半部
{
for(i=0;i<4;i++)
{
#ifdef lcd_no_read
tmp=lcd_buf[y>>1][(x<<2)+i];
tmp|=0xf0;
LCMD=tmp;
_nop_();
lcd_buf[y>>1][(x<<2)+i]=tmp;
#else
tmp=LCMD;tmp=LCMD;
LCMD=tmp|0xf0;
#endif
}
}
else
{
for(i=0;i<4;i++)
{
#ifdef lcd_no_read
tmp=lcd_buf[y>>1][(x<<2)+i];
tmp|=0x0f;
LCMD=tmp;
_nop_();
lcd_buf[y>>1][(x<<2)+i]=tmp;
#else
tmp=LCMD;tmp=LCMD;
LCMD=tmp|0x0f;
#endif
}
}
LCMC=0xee;
}

//函數(shù)名:fill_game_dot2
//功能:亮一個(gè)游戲點(diǎn)(另一種方式,這里用來(lái)顯示食物用)
//輸入?yún)?shù):X,Y
//注意事項(xiàng):X,Y為游戲的點(diǎn)陣,非LCD點(diǎn)陣...還有LCD填充數(shù)據(jù)是0x05或0x50
//使用方式:內(nèi)部調(diào)用,顯示蛇的食物的時(shí)候用這個(gè)函數(shù),區(qū)分開(kāi)蛇身和食物.
void fill_game_dot2(uchar x,uchar y)
{
uchar lcd_x,i,tmp;
while(x>MAX_GAME_X)x-=(MAX_GAME_X+1);
while(y>MAX_GAME_Y)y-=(MAX_GAME_Y+1);
lcd_x=x<<2;
LCMC=lcd_x&0x0f; //設(shè)置x位置
LCMC=(lcd_x>>4)|0x10;
LCMC=0xb0+y/2; //設(shè)置Y位置
LCMC=0xe0;
if(y%2)
{
for(i=0;i<4;i++)
{
#ifdef lcd_no_read
tmp=lcd_buf[y>>1][(x<<2)+i];
tmp|=0x50;
LCMD=tmp;
_nop_();
lcd_buf[y>>1][(x<<2)+i]=tmp;

#else
tmp=LCMD;tmp=LCMD;
LCMD=tmp|0x50;
#endif
}
}
else
{
for(i=0;i<4;i++)
{
#ifdef lcd_no_read
tmp=lcd_buf[y>>1][(x<<2)+i];
tmp|=0x05;
LCMD=tmp;
_nop_();
lcd_buf[y>>1][(x<<2)+i]=tmp;
#else
tmp=LCMD;tmp=LCMD;
LCMD=tmp|0x05;
#endif
}
}
LCMC=0xee;
}


/************************************************************
*
* 游戲算法部分(8*8LCD)
*
**************************************************************/

//函數(shù)名 game_init()
//功能:游戲開(kāi)始的時(shí)候初始化畫(huà)面的,這里只是簡(jiǎn)單地把132*64LCD用一條中間線(xiàn)劃分開(kāi)來(lái)
//注意事項(xiàng):暫時(shí)在中間畫(huà)條線(xiàn)用來(lái)劃分游戲空間
//使用方式:內(nèi)部調(diào)用,
void game_init()
{
uchar i;
uchar xdata *da;
for(da=0;da<0x8000;da++)//清空xDATA,
*da=0x0;

cls(9); //丁丁的清屏函
數(shù)
initlcd();
for(i=0;i<8;i++)
{
LCMC=64&0x0f;
LCMC=(64>>4)|0x10; //線(xiàn)在x=64,
LCMC=0xb0+i; //y=(0-15)的地方
LCMC=0xe0; //把LCD劃分,左邊用來(lái)游戲
LCMD=0xff;
}
LCMC=0xee;

}


//函數(shù)名:snake_init
//功能:蛇初始化
//注意事項(xiàng):初始化只有3節(jié)蛇身,向右跑
//使用情況:內(nèi)部調(diào)用
void snake_init()
{
fill_game_dot(0,0); //顯示射身
fill_game_dot(1,0);
fill_game_dot(2,0);
snake_len=2;
snake_flag=0x10; //蛇的初始化,3個(gè)身.向右跑
snake_body[0]=0x02; //裝入射身數(shù)據(jù)
snake_body[1]=0x01;
snake_body[2]=0x00;
//一開(kāi)始游戲時(shí)的文字部分
setcursor(8,0);
lcdstring("分?jǐn)?shù)為:\r\n");
setcursor(8,2);
lcddigit(snake_len-2);
}

//函數(shù)名:show_mark
//功能:顯示當(dāng)前分?jǐn)?shù),暫時(shí)以蛇身個(gè)數(shù)為分?jǐn)?shù)
//參數(shù)說(shuō)明:0,和非0, 0代表游戲中的顯示,!0代表掛了的顯示
//注意事項(xiàng):調(diào)用到LCD.c顯示函數(shù),并需要漢字庫(kù)的支持.
// 返回值在GAMEOVER時(shí)候有效,返回0退出游戲,1從新游

//使用情況:snake_run()在蛇吃到食物的時(shí)候調(diào)用,在GAMEOVER后調(diào)用
uchar show_mark(uchar mode)
{
uchar ch;
setcursor(8,0);
lcdstring("分?jǐn)?shù)為:\r\n");
setcursor(8,2);
lcddigit(snake_len-2);
if(mode)//gameover中顯示
{
setcursor(8,0);
lcddigit(snake_len-2);
lcdstring(" 分.");
setcursor(8,2);
lcdstring("C退出");
setcursor(8,4);
lcdstring("回車(chē)?yán)^續(xù)");
do ch=getkey(1000);
while( (ch!='C') && (ch!='Y') );
//游戲結(jié)束了會(huì)在這里死等,直到用戶(hù)按鍵
if(ch=='Y')
return(1);
else
return(0);
}

return(0);

}

//函數(shù)名:snake_run
//功能:蛇運(yùn)行函數(shù)
//輸入?yún)?shù):一個(gè)全局變量flag_snake,蛇根據(jù)這個(gè)變量判斷運(yùn)動(dòng)方向
//注意事項(xiàng):蛇跑動(dòng)函數(shù),用于判斷路徑,食物,長(zhǎng)大,死亡
//使用情況:內(nèi)部調(diào)用
void snake_run()
{
uchar tmp_head_x,tmp_head_y;
uchar i;

…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:356419 發(fā)表于 2018-6-26 21:07 | 只看該作者
看看!!!!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美a级成人淫片免费看 | 一区二区三区精品在线 | av网站免费在线观看 | 成人av播放 | 日本久草| 天啪| 久久精品视频网站 | www.久久久久久久久久久 | 特黄小视频 | 国产综合久久久久久鬼色 | 成人免费视频网站 | 亚洲精品不卡 | 一区二区三区免费 | 毛片免费观看 | 久久国产日韩欧美 | 99re热精品视频 | 91久久爽久久爽爽久久片 | 91素人| 国产精品一区二区无线 | 亚洲欧美视频一区 | 日韩在线免费视频 | 91黄在线观看| 国产精品一区在线观看 | 天天玩天天干天天操 | 亚洲 自拍 另类 欧美 丝袜 | 欧美一级www片免费观看 | 久久激情网 | 午夜激情免费视频 | 久久精品91 | a亚洲精品| av在线免费网站 | 久久久久久高潮国产精品视 | 欧洲一区在线观看 | www.夜夜草 | 一区二区三区视频免费看 | 日韩在线观看网站 | 99精品欧美一区二区三区 | 欧美一区二区激情三区 | 成人在线视频一区 | 免费观看一级毛片 | 国产精品伦理一区二区三区 |