婷婷亚洲天堂影院-国产精品豆花视频www-伊人影院在线观看-日本少妇浓毛bbwbbwbbw-av网站观看-亚州欧美在线-91精品国产乱码久-任我爽精品视频在线播放-日本视频不卡-亚洲国产精品va在线观看香蕉-国产毛片乡下农村妇女-国产成人免费ā片在线观看老同学-欧美日韩免费在线-成人无码视频免费播放-色综合美女-免费毛片av

電子開發(fā)網(wǎng)

電子開發(fā)網(wǎng)電子設計 | 電子開發(fā)網(wǎng)Rss 2.0 會員中心 會員注冊
搜索: 您現(xiàn)在的位置: 電子開發(fā)網(wǎng) >> 編程學習 >> C語言 >> 正文

C語言寫的俄羅斯方塊程序

作者:佚名    文章來源:本站原創(chuàng)    點擊數(shù):    更新時間:2017/6/16

大概在最近兩天之內(nèi)編碼完成,但此前一天開始構思。第一天晚上主要完成了方塊旋轉(zhuǎn)算法,第二天也就是今天加了消方塊的處理算法。但是可能還有一些考慮不周的地方,比如,沒有采用定時中斷,而是圖方便采用了和cpu頻率有關的delay()函數(shù)來模擬時間間隔,這是需要改進的地方。
其中的主要邏輯有:
(1)由于c的隨機性函數(shù)不好,所以每次游戲開始根據(jù)bios時間設置種子。
(2)得分越高,方塊下降速度越快(每200分為單位)。
(3)每下落一個方塊加1分,每消除一行加10分,兩行加30分,三行加70分,四行加150分。初試分數(shù)為100分。
游戲控制:
   up-旋轉(zhuǎn);空格-下落到底; 左右下方向鍵-控制方向。P-開始或暫停游戲。 ESC-退出。
特點:
(1)由于tc不支持中文,所以基本都是英文注釋。
(2)函數(shù)命名盡可能規(guī)范的表達其內(nèi)部處理目的和過程。
(3)代碼加上注釋僅有577行。(我下載過的兩個俄羅斯方塊代碼一個在1087行,一個在993行,我的比它們代碼少)。
(4)除了消除空格時算法比較復雜,其他算法都比較簡單易讀。
(5)繪圖效率和局部代碼效率扔有待提高。
(6)FrameTime參數(shù)可能依據(jù)不同硬件環(huán)境進行具體設置,InitGame需要正確的TC路徑。

    俄羅斯方塊源于大約9年前上大一時的一個夢,我們在學習c語言時,我的同寢室友邀請我合作一起完成俄羅斯方塊(課外作業(yè)性質(zhì)),但是當時限于我們的水平比較菜和學習狀態(tài)比較懶散,我們沒有完成。大一的時候我在機房里無意發(fā)現(xiàn)別人留下的俄羅斯方塊程序,運行,老師發(fā)現(xiàn)后激動的問我是我寫的嗎,我慚愧的搖搖頭。那時看到別人做c的大程序深感羨慕(自己只是寫幾十行的程序)。數(shù)年后我仍然看到有不同樣式的實現(xiàn),但是我一直沒有實現(xiàn)它,知道今天忽然有這個想法去做,算是彌補多年前的遺憾和心愿吧。

//-----------------------【以下是我的代碼文件:】---------------------
/********************************/
/* Desc:    俄羅斯方塊游戲                */
/* By:        hoodlum1980                */
/* Email:    jinfd@126.com            */
/* Date:    2008.03.12 22:30            */
/********************************/
#include 
#include 
#include 
#include 
#include 
#include 
#define true         1
#define false         0
#define BoardWidth    12
#define BoardHeight     23
#define _INNER_HELPER 
/*inner helper method */
/*Scan Codes Define*/
enum KEYCODES
{
    K_ESC                =0x011b,
    K_UP                =0x4800,        /* upward arrow */
    K_LEFT            =0x4b00,
    K_DOWN            =0x5000,
    K_RIGHT            =0x4d00,
    K_SPACE            =0x3920,
    K_P                =0x1970
};
/* the data structure of the block */
typedef struct tagBlock
{
    char c[4][4];    /* cell fill info array, 0-empty, 1-filled */
    int x;                /* block position cx [ 0,BoardWidht -1] */
    int y;                /* block position cy [-4,BoardHeight-1] */
    char color;        /* block color */
    char size;        /* block max size in width or height */
    char name;        /* block name (the block's shape) */
} Block;
/* game's global info */
int FrameTime= 1300;
int CellSize= 18;
int BoardLeft= 30;
int BoardTop=    30;
/* next block grid */
int NBBoardLeft= 300;
int NBBoardTop=    30;
int NBCellSize=  10;
/* score board position */
int ScoreBoardLeft= 300;
int ScoreBoardTop=100;
int ScoreBoardWidth=200;
int ScoreBoardHeight=35;
int ScoreColor=LIGHTCYAN;
/* infor text postion */
int InfoLeft=300;
int InfoTop=200;
int InfoColor=YELLOW;
int BorderColor=DARKGRAY;
int BkGndColor=BLACK;
int GameRunning=true;
int TopLine=BoardHeight-1;    /* top empty line */
int TotalScore=100;
char info_score[20];
char info_help[255];
char info_common[255];
/* our board, Board[x][y][0]-isFilled, Board[x][y][1]-fillColor */
unsigned char Board[BoardWidth][BoardHeight][2];
char BufferCells[4][4];    /* used to judge if can rotate block */
Block curBlock;        /* current moving block */
Block nextBlock;    /* next Block to appear */
/* function list */
int GetKeyCode();
int CanMove(int dx,int dy);
int CanRotate();
int RotateBlock(Block *block);
int MoveBlock(Block *block,int dx,int dy);
void DrawBlock(Block *block,int,int,int);
void EraseBlock(Block *block,int,int,int);
void DisplayScore();
void DisplayInfo(char* text);
void GenerateBlock(Block *block);
void NextBlock();
void InitGame();
int PauseGame();
void QuitGame();
/*Get Key Code */
int GetKeyCode()
{
    int key=0;
    if(bioskey(1))
    {
        key=bioskey(0);
    }
    return key;
}
/* display text! */
void DisplayInfo(char *text)
{
    setcolor(BkGndColor);
    outtextxy(InfoLeft,InfoTop,info_common);
    strcpy(info_common,text);
    setcolor(InfoColor);
    outtextxy(InfoLeft,InfoTop,info_common);
}
/* create a new block by key number,
* the block anchor to the top-left corner of 4*4 cells
*/
void _INNER_HELPER GenerateBlock(Block *block)
{
    int key=(random(13)*random(17)+random(1000)+random(3000))%7;
    block->size=3;/* because most blocks' size=3 */
    memset(block->c,0,16);
    switch(key)
    {
        case 0:
            block->name='T';
            block->color=RED;
            block->c[1][0]=1;
            block->c[1][1]=1, block->c[2][1]=1;
            block->c[1][2]=1;
            break;
        case 1:
            block->name='L';
            block->color=YELLOW;
            block->c[1][0]=1;
            block->c[1][1]=1;
            block->c[1][2]=1, block->c[2][2]=1;
            break;
        case 2:
            block->name='J';
            block->color=LIGHTGRAY;
            block->c[1][0]=1;
            block->c[1][1]=1;
            block->c[1][2]=1, block->c[0][2]=1;
            break;
        case 3:
            block->name='z';
            block->color=CYAN;
            block->c[0][0]=1, block->c[1][0]=1;
            block->c[1][1]=1, block->c[2][1]=1;
            break;
        case 4:
            block->name='5';
            block->color=LIGHTBLUE;
            block->c[1][0]=1, block->c[2][0]=1;
            block->c[0][1]=1, block->c[1][1]=1;
            break;
        case 5:
            block->name='o';
            block->color=BLUE;
            block->size=2;
            block->c[0][0]=1, block->c[1][0]=1;
            block->c[0][1]=1, block->c[1][1]=1;
            break;
        case 6:
            block->name='I';
            block->color=GREEN;
            block->size=4;
            block->c[1][0]=1;
            block->c[1][1]=1;
            block->c[1][2]=1;
            block->c[1][3]=1;
            break;
    }
}
/* get next block! */
void NextBlock()
{
    /* copy the nextBlock to curBlock */
    curBlock.size=nextBlock.size;
    curBlock.color=nextBlock.color;
    curBlock.x=(BoardWidth-4)/2;
    curBlock.y=-curBlock.size;
    memcpy(curBlock.c,nextBlock.c,16);
    /* generate nextBlock and show it */
    EraseBlock(&nextBlock,NBBoardLeft,NBBoardTop,NBCellSize);
    GenerateBlock(&nextBlock);
    nextBlock.x=1,nextBlock.y=0;
    DrawBlock(&nextBlock,NBBoardLeft,NBBoardTop,NBCellSize);
}
/* rotate the block, update the block struct data */
int _INNER_HELPER RotateCells(char c[4][4],char blockSize)
{
    char temp,i,j;
    switch(blockSize)
    {
        case 3:
            temp=c[0][0];
            c[0][0]=c[2][0], c[2][0]=c[2][2],    c[2][2]=c[0][2], c[0][2]=temp;
            temp=c[0][1];
            c[0][1]=c[1][0], c[1][0]=c[2][1],    c[2][1]=c[1][2], c[1][2]=temp;
            break;
        case 4:    /* only 'I' block arived here! */
            c[1][0]=1-c[1][0], c[1][2]=1-c[1][2], c[1][3]=1-c[1][3];
            c[0][1]=1-c[0][1], c[2][1]=1-c[2][1],    c[3][1]=1-c[3][1];
            break;
    }
}
/* judge if the block can move toward the direction */
int CanMove(int dx,int dy)
{
    int i,j,tempX,tempY;
    for(i=0;i(BoardWidth-1))    return false; /* make sure x is valid! */
                /* cannot move downward */
                tempY = curBlock.y + j + dy;
                if(tempY>(BoardHeight-1))    return false; /* y is only checked lower bound, maybe negative!!!! */
                /* the cell already filled, we must check Y's upper bound before check cell ! */
                if(tempY>=0 && Board[tempX][tempY][0]) return false;
            }
        }
    }
    return true;
}
/* judge if the block can rotate */
int CanRotate()
{
    int i,j,tempX,tempY;
    /* update buffer */
    memcpy(BufferCells, curBlock.c, 16);
    RotateCells(BufferCells,curBlock.size);
    for(i=0;i(BoardWidth-1))
                    return false;
                if(tempY>(BoardHeight-1))
                    return false;
                if(tempY>=0 && Board[tempX][tempY][0])
                    return false;
            }
        }
    }
    return true;
}
/* draw the block */
void _INNER_HELPER DrawBlock(Block *block,int bdLeft,int bdTop,int cellSize)
{
    int i,j;
    setfillstyle(SOLID_FILL,block->color);
    for(i=0;isize;i++)
    {
        for(j=0;jsize;j++)
        {
            if(block->c[i][j] && (block->y+j)>=0)
            {
                floodfill(
                    bdLeft+cellSize*(i+block->x)+cellSize/2,
                    bdTop+cellSize*(j+block->y)+cellSize/2,
                    BorderColor);
            }
        }
    }
}
/* Rotate the block, if success, return true */
int RotateBlock(Block *block)
{
    char temp,i,j;
    int b_success;
    if(curBlock.size==2)
        return;
    if(( b_success=CanRotate()))
    {
        EraseBlock(block,BoardLeft,BoardTop,CellSize);
        memcpy(curBlock.c,BufferCells,16);
        DrawBlock(block,BoardLeft,BoardTop,CellSize);
    }
    return b_success;
}
/* erase a block, only fill the filled cell with background color */
void _INNER_HELPER EraseBlock(Block *block,int bdLeft,int bdTop,int cellSize)
{
    int i,j;
    setfillstyle(SOLID_FILL,BkGndColor);
    for(i=0;isize;i++)
    {
        for(j=0;jsize;j++)
        {
            if(block->c[i][j] && (block->y+j>=0))
            {
                floodfill(
                    bdLeft+cellSize*(i+block->x)+cellSize/2,
                    bdTop+cellSize*(j+block->y)+cellSize/2,
                    BorderColor);
            }
        }
    }
}
/* move by the direction if can, donothing if cannot
* return value: true - success, false - cannot move toward this direction
*/
int MoveBlock(Block *block,int dx,int dy)
{
    int b_canmove=CanMove(dx,dy);
    if(b_canmove)
    {
        EraseBlock(block,BoardLeft,BoardTop,CellSize);
        curBlock.x+=dx;
        curBlock.y+=dy;
        DrawBlock(block,BoardLeft,BoardTop,CellSize);
    }
    return b_canmove;
}
/* drop the block to the bottom! */
int DropBlock(Block *block)
{
    EraseBlock(block,BoardLeft,BoardTop,CellSize);
    while(CanMove(0,1))
    {
        curBlock.y++;
    }
    DrawBlock(block,BoardLeft,BoardTop,CellSize);
    return 0;/* return value is assign to the block's alive */
}
/* init the graphics mode, draw the board grid */
void InitGame()
{
    int i,j,gdriver=DETECT,gmode;
    struct time sysTime;
    /* draw board cells */
    memset(Board,0,BoardWidth*BoardHeight*2);
    memset(nextBlock.c,0,16);
    strcpy(info_help,"P: Pause Game. --by hoodlum1980");
    initgraph(&gdriver,&gmode,"c:\\tc\\");
    setcolor(BorderColor);
    for(i=0;i<=BoardWidth;i++)
    {
        line(BoardLeft+i*CellSize, BoardTop, BoardLeft+i*CellSize, BoardTop+ BoardHeight*CellSize);
    }
    for(i=0;i<=BoardHeight;i++)
    {
        line(BoardLeft, BoardTop+i*CellSize, BoardLeft+BoardWidth*CellSize, BoardTop+ i*CellSize);
    }
    /* draw board outer border rect */
    rectangle(BoardLeft-CellSize/4, BoardTop-CellSize/4,
        BoardLeft+BoardWidth*CellSize+CellSize/4,
        BoardTop+BoardHeight*CellSize+CellSize/4);
    /* draw next block grids */
    for(i=0;i<=4;i++)
    {
        line(NBBoardLeft+i*NBCellSize, NBBoardTop, NBBoardLeft+i*NBCellSize, NBBoardTop+4*NBCellSize);
        line(NBBoardLeft, NBBoardTop+i*NBCellSize, NBBoardLeft+4*NBCellSize, NBBoardTop+ i*NBCellSize);
    }
    /* draw score rect */
    rectangle(ScoreBoardLeft,ScoreBoardTop,ScoreBoardLeft+ScoreBoardWidth,ScoreBoardTop+ScoreBoardHeight);
    DisplayScore();
    /* set new seed! */
    gettime(&sysTime);
    srand(sysTime.ti_hour*3600+sysTime.ti_min*60+sysTime.ti_sec);
    GenerateBlock(&nextBlock);
    NextBlock();    /* create first block */
    setcolor(DARKGRAY);
    outtextxy(InfoLeft,InfoTop+20,"Up  -rotate  Space-drop");
    outtextxy(InfoLeft,InfoTop+35,"Left-left    Right-right");
    outtextxy(InfoLeft,InfoTop+50,"Esc -exit");
    DisplayInfo(info_help);
}
/* set the isFilled and fillcolor data to the board */
void _INNER_HELPER FillBoardData()
{
    int i,j;
    for(i=0;i=0)
            {
                Board[curBlock.x+i][curBlock.y+j][0]=1;
                Board[curBlock.x+i][curBlock.y+j][1]=curBlock.color;
            }
        }
    }
}
/* draw one line of the board */
void _INNER_HELPER PaintBoard()
{
    int i,j,fillcolor;
    for(j=max((TopLine-4),0);j0 && topy>0);
    /* remove the full filled line (max remove lines count = 4) */
    do
    {
        sum=0;
        for(i=0;i< BoardWidth; i++)
            sum+=Board[i][j][0];
        if(sum==BoardWidth)/* we find this line is full filled, remove it! */
        {
            /* move the cells data down one line */
            for(k=j; k > topy;k--)
            {
                for(i=0;i0 && j>topy && lines<4);
    /* speed up the game when score is high, minimum is 400 */
    FrameTime=max(1200-100*(TotalScore/200), 400);
    TopLine=topy;/* update the top line */
    /* if no lines remove, only add 1: */
    if(lines==0)
        TotalScore++;
}
/* display the score */
void _INNER_HELPER DisplayScore()
{
    setcolor(BkGndColor);
    outtextxy(ScoreBoardLeft+5,ScoreBoardTop+5,info_score);
    setcolor(ScoreColor);
    sprintf(info_score,"Score: %d",TotalScore);
    outtextxy(ScoreBoardLeft+5,ScoreBoardTop+5,info_score);
}
/* we call this function when a block is inactive. */
void UpdateBoard()
{
    FillBoardData();
    CheckBoard();
    PaintBoard();
    DisplayScore();
}
/* pause the game, and timer handler stop move down the block! */
int PauseGame()
{
    int key=0;
    DisplayInfo("Press P to Start or Resume!");
    while(key!=K_P && key!=K_ESC)
    {
        while(!(key=GetKeyCode())){}
    }
    DisplayInfo(info_help);
    return key;
}
/* quit the game and do cleaning work. */
void QuitGame()
{
    closegraph();
}
/* the entry point function. */
void main()
{
    int i,flag=1,j,key=0,tick=0;
    InitGame();
    if(PauseGame()==K_ESC)
        goto GameOver;
    /* wait until a key pressed */
    while(key!=K_ESC)
    {
        /* wait until a key pressed */
        while(!(key=GetKeyCode()))
        {
            tick++;
            if(tick>=FrameTime)
            {
                /* our block has dead! (can't move down), we get next block */
                if(!MoveBlock(&curBlock,0,1))
                {
                    UpdateBoard();
                    NextBlock();
                    if(!CanMove(0,1))
                        goto GameOver;
                }
                tick=0;
            }
            delay(100);
        }
        switch(key)
        {
            case K_LEFT:
                MoveBlock(&curBlock,-1,0);
                break;
            case K_RIGHT:
                MoveBlock(&curBlock,1,0);
                break;
            case K_DOWN:
                MoveBlock(&curBlock,0,1);
                break;
            case K_UP:
                RotateBlock(&curBlock);
                break;
            case K_SPACE:
                DropBlock(&curBlock);
                break;
            case K_P:
                PauseGame();
                break;
        }
    }
GameOver:
    DisplayInfo("GAME OVER!  Press any key to exit!");
    getch(); /* wait the user Press any key. */
    QuitGame();
}
//----------------------------------【代碼文件結尾】--------------------------------------
Tags:C語言,俄羅斯方塊程序  
責任編輯:admin
  • 上一篇文章: 沒有了
  • 下一篇文章:
  • 請文明參與討論,禁止漫罵攻擊。 昵稱:注冊  登錄
    [ 查看全部 ] 網(wǎng)友評論
    關于我們 - 聯(lián)系我們 - 廣告服務 - 友情鏈接 - 網(wǎng)站地圖 - 版權聲明 - 在線幫助 - 文章列表
    返回頂部
    刷新頁面
    下到頁底
    晶體管查詢
    婷婷亚洲天堂影院-国产精品豆花视频www-伊人影院在线观看-日本少妇浓毛bbwbbwbbw-av网站观看-亚州欧美在线-91精品国产乱码久-任我爽精品视频在线播放-日本视频不卡-亚洲国产精品va在线观看香蕉-国产毛片乡下农村妇女-国产成人免费ā片在线观看老同学-欧美日韩免费在线-成人无码视频免费播放-色综合美女-免费毛片av
    <button id="4i884"></button>
  • <abbr id="4i884"><source id="4i884"></source></abbr>
  • <code id="4i884"><tr id="4i884"></tr></code>
  • <rt id="4i884"></rt>
    <li id="4i884"></li>
  • <rt id="4i884"><tr id="4i884"></tr></rt>
  • 欧美网站免费观看| 黄网站色视频免费观看| 中文字幕在线观看第三页| 极品粉嫩国产18尤物| 欧美午夜性视频| 无码人妻丰满熟妇区五十路百度| 欧美a级黄色大片| 日本一二三四区视频| 9999在线观看| 欧美 另类 交| 久激情内射婷内射蜜桃| 999精品网站| 一二三av在线| 我的公把我弄高潮了视频| 亚洲熟妇av一区二区三区| 亚洲色图久久久| 精品一区二区成人免费视频| 欧美一级中文字幕| 免费无码av片在线观看| 亚洲第一天堂久久| 欧美成人三级在线视频| 日本在线观看免费视频| 黄瓜视频免费观看在线观看www| www在线观看免费| 美女黄色片视频| 久久精品久久99| 精品无码国模私拍视频| av污在线观看| 国产亚洲精品久久久久久久| aaa毛片在线观看| 超碰在线超碰在线| aa免费在线观看| 国产成人强伦免费视频网站| 国产精品333| 亚洲欧美日韩网站| wwwxxx黄色片| 日本十八禁视频无遮挡| 97人人爽人人| 污污的网站18| 国产中文字幕二区| 激情视频小说图片| 天天操天天干天天做| 成年人视频观看| 狠狠干视频网站| 涩多多在线观看| 四季av一区二区| 日本免费一级视频| 男人插女人视频在线观看| 日日夜夜精品视频免费观看| 免费在线观看毛片网站| 日韩av在线第一页| 97在线国产视频| 国内自拍中文字幕| 一级黄色录像免费看| 波多野结衣国产精品| 国产视频在线视频| 麻豆av免费在线| 黄色一级在线视频| 日韩中字在线观看| 亚洲人成无码网站久久99热国产 | 精品久久久久久久无码| 9久久9毛片又大又硬又粗| 国产探花在线观看视频| 天天干天天玩天天操| 少妇一级淫免费放| 成人精品视频一区二区| 日韩 欧美 高清| 日本中文字幕高清| 亚洲精品午夜在线观看| 天天操狠狠操夜夜操| 天天摸天天舔天天操| 毛葺葺老太做受视频| 国产三级三级看三级| 亚洲天堂网2018| 黄色影视在线观看| 久久手机在线视频| 草b视频在线观看| 奇米精品一区二区三区| 99热成人精品热久久66| 日本中文字幕二区| 日韩精品视频网址| 18禁裸男晨勃露j毛免费观看| 国产在线播放观看| 人妻熟女一二三区夜夜爱| 色七七在线观看| 国产成人美女视频| 黄色网络在线观看| 激情综合在线观看| 爆乳熟妇一区二区三区霸乳| 欧美国产日韩另类| 欧美图片激情小说| 午夜精品在线免费观看| 91亚洲一区二区| www..com日韩| 国产三级精品三级在线| 人妻少妇精品久久| 中文字幕网av| 天堂8在线天堂资源bt| 日本精品免费在线观看| 日本黄色播放器| 男人揉女人奶房视频60分 | www.欧美激情.com| 黄色三级中文字幕| 熟女少妇精品一区二区| 日韩专区第三页| 黄色aaa级片| 日韩精品一区二区免费| 久久九九国产视频| 国产一区二区四区| 亚洲一级免费观看| 国产a级片网站| 日本丰满少妇黄大片在线观看| 亚洲国产精品毛片av不卡在线| 深夜做爰性大片蜜桃| 欧美日韩亚洲第一| 夜夜添无码一区二区三区| 91亚洲一区二区| 粉色视频免费看| 中国丰满人妻videoshd| 国产美女视频免费看| 日韩欧美xxxx| 国产成人在线小视频| caoporm在线视频| 黄色高清无遮挡| 免费不卡av在线| 精品人妻人人做人人爽| 国产资源中文字幕| 色一情一区二区| 国产一区视频免费观看| 国产二区视频在线播放| 青草青青在线视频| www.18av.com| 99久久99久久精品| 99re8这里只有精品| 亚洲精品在线网址| 一区二区三区四区久久| 两性午夜免费视频| 大桥未久一区二区三区| 三区视频在线观看| 波多野结衣在线免费观看| 在线观看av免费观看| 午夜一区二区视频| 国产日韩欧美大片| 黄色污污在线观看| 日韩伦理在线免费观看| 免费毛片小视频| 99福利在线观看| 99视频在线视频| 亚洲国产成人va在线观看麻豆| 欧美少妇在线观看| 草b视频在线观看| 91好吊色国产欧美日韩在线| 久久综合色视频| 一级黄色香蕉视频| 夜夜夜夜夜夜操| 91精品一区二区三区四区| 亚洲乱码日产精品bd在线观看| 国产婷婷一区二区三区| 成人午夜视频在线观看免费| 国产妇女馒头高清泬20p多| 777久久久精品一区二区三区| 成年人网站av| 免费的一级黄色片| 波多野结衣av一区二区全免费观看| 人妻无码视频一区二区三区| 亚洲三级视频网站| 国产精品jizz在线观看老狼| 日b视频免费观看| 久久黄色免费看| 大地资源网在线观看免费官网| 霍思燕三级露全乳照| a√天堂在线观看| 波多野结衣免费观看| 欧美视频免费看欧美视频| 美女喷白浆视频| 穿情趣内衣被c到高潮视频| av免费观看网| 欧美性受黑人性爽| 超碰网在线观看| 中文字幕第50页| 亚洲一级免费观看| 成人污网站在线观看| 成年人免费在线播放| 精品国产一区二区三区在线| 亚洲精品高清无码视频| 久久精品在线免费视频| 国产区二区三区| 午夜精品久久久久久久无码| av噜噜在线观看| 激情五月亚洲色图| 奇米影视亚洲色图| 成人午夜免费剧场| 亚洲欧美自偷自拍另类| 人妻av中文系列| 做爰高潮hd色即是空| www日韩视频| 鲁一鲁一鲁一鲁一色| 91香蕉视频网址| www.99在线| 激情六月丁香婷婷|