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

首頁 > 編程 > C++ > 正文

C++實現俄羅斯方塊(windows API)

2020-05-23 13:27:16
字體:
來源:轉載
供稿:網友

本文分享的這些俄羅斯方塊代碼是我最近放假在家里自己寫的,雖然以前有過看別人寫的代碼,但是那個游戲代碼好像不是很全面,因為無法實現全部的方塊和實現隨機的產生任意方向的方塊,現在也基本上是忘光了當時的代碼,下面的這些代碼是我最近寫的,沒有參考其他人的代碼,真正寫俄羅斯方塊起來感覺真的是挺難的,關鍵是在于方塊的旋轉。當然下面的代碼僅僅是一個框架,只能夠實現大致上的功能,還不全面,貼出來和大家交流學習。

編譯器是code::block  +  MinGW ,感覺CB這個IDE真的是太強大,太棒了,下面的代碼直接復制到VC里面運行應該不會出錯,有個問題一直不知道怎么解決,就是更新客戶區時窗口總是閃不知道有哪位達人能指點我一下。有的都是windows API寫的,對windows編程還不是很懂,望大家多多留言,指點一下本人。

#include <windows.h> #include <iostream> #include <cstdlib> #include <ctime> using namespace std; #define CellWidth 20 #define MAP_WIDTH 12 #define MAP_HEIGHT 18 #define ID_TIMER 1 class map_floor; class Block; LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); /* Make the class name into a global variable */ char szClassName[ ] = "CodeBlocksWindowsApp"; int WINAPI WinMain (HINSTANCE hThisInstance,            HINSTANCE hPrevInstance,            LPSTR lpszArgument,            int nCmdShow) {   HWND hwnd;        /* This is the handle for our window */   MSG messages;      /* Here messages to the application are saved */   WNDCLASSEX wincl;    /* Data structure for the windowclass */    /* The Window structure */   wincl.hInstance = hThisInstance;   wincl.lpszClassName = szClassName;   wincl.lpfnWndProc = WindowProcedure;   /* This function is called by windows */   wincl.style = CS_DBLCLKS|CS_HREDRAW | CS_VREDRAW;         /* Catch double-clicks */   wincl.cbSize = sizeof (WNDCLASSEX);    /* Use default icon and mouse-pointer */   wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);   wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);   wincl.hCursor = LoadCursor (NULL, IDC_ARROW);   wincl.lpszMenuName = NULL;         /* No menu */   wincl.cbClsExtra = 0;           /* No extra bytes after the window class */   wincl.cbWndExtra = 0;           /* structure or the window instance */   /* Use Windows's default colour as the background of the window */   wincl.hbrBackground =(HBRUSH) GetStockObject(WHITE_BRUSH);//COLOR_BACKGROUND;    /* Register the window class, and if it fails quit the program */   if (!RegisterClassEx (&wincl))     return 0;    /* The class is registered, let's create the program*/   hwnd = CreateWindowEx (       0,         /* Extended possibilites for variation */       szClassName,     /* Classname */       "Code::Blocks Template Windows App",    /* Title Text */       WS_OVERLAPPEDWINDOW, /* default window */       CW_USEDEFAULT,    /* Windows decides the position */       CW_USEDEFAULT,    /* where the window ends up on the screen */       CW_USEDEFAULT,         /* The programs width */       CW_USEDEFAULT,         /* and height in pixels */       NULL,    /* The window is a child-window to desktop */       NULL,        /* No menu */       hThisInstance,    /* Program Instance handler */       NULL         /* No Window Creation data */       );    /* Make the window visible on the screen */   ShowWindow (hwnd, nCmdShow);    /* Run the message loop. It will run until GetMessage() returns 0 */   while (GetMessage (&messages, NULL, 0, 0))   {     /* Translate virtual-key messages into character messages */     TranslateMessage(&messages);     /* Send message to WindowProcedure */     DispatchMessage(&messages);   }    /* The program return-value is 0 - The value that PostQuitMessage() gave */   return messages.wParam; }  enum{e_LINE,e_CORNER,e_STAIR,e_TANCK,e_TIAN}; const int TOTAL_BLOCK_STYLE = 5;//方塊類型有4種 class Block {   public:       Block(int x = 100, int y = 100);       Block(const Block & rh)//復制構造函數,可能沒什么用,但是還是定義它吧       {         this->m_style = rh.m_style;         this->m_direct = rh.m_direct;         for(int i = 0 ; i < 4 ; i ++)           this->m_block[i] = rh.m_block[i];       }       Block & operator = (const Block& rh)//重載=號,實現方塊的賦值       {         this->m_style = rh.m_style;         this->m_direct = rh.m_direct;         for(int i = 0 ; i < 4 ; i ++)           this->m_block[i] = rh.m_block[i];         return *this;       }       ~Block(){}   int   create_block(int x = 100 , int y = 100);   //顯示在游戲區內移動的方塊   int   show_block(HDC hdc,const POINT& GameLeftTop);   //顯示將要出現的方塊,即游戲區左邊的方塊   int   show_next_block(HDC hdc);   //旋轉,該函數比較難實現,代碼量也比較大,以后有時間在慢慢優化,關于解析看定義處   int   rotate();   //產生隨機方塊   int   random_block();    //下面為方塊移動的成員函數   int   get_block_height(){ return m_block[1].y;}   int   move_down(const RECT& GameClient);   int   move_left(const RECT& GameClient);   int   move_right(const RECT& GameClient);   int   move_up(const RECT& GameClient);   int   move_to(int x , int y);   //檢測方塊是否在游戲區內 //  int   check_block(const map_floor& map, const RECT& GameClent);   int   check_block(const map_floor& map, const POINT& LeftTopScrCdnt);   int   print_to_map(map_floor& map , const POINT& LeftTopScrCdnt);   private:   int   m_style;//方塊的風格樣式,具體看定義的枚舉變量   int   m_direct;//方塊的方向,是對m_style的具體數據  POINT   m_block[4];//下標為1的方塊是中心坐標,旋轉都是圍繞著該方塊進行,這樣可以利于旋轉和邏輯清晰 }; class map_floor {   public:     map_floor()     {       ZeroMemory(m_block_bar,sizeof(int )*12*18);     }     ~map_floor(){}   void show_block_bar(HDC hdc , const POINT& LeftTopScrCdnt)   {     for(int i = 0 ; i < MAP_HEIGHT ; ++ i)     {       for(int j = 0 ; j < MAP_WIDTH ; ++ j)       {         if(m_block_bar[i][j])         {           Rectangle(hdc,LeftTopScrCdnt.x + j*CellWidth , LeftTopScrCdnt.y + i*CellWidth,                  LeftTopScrCdnt.x + (j+1)*CellWidth , LeftTopScrCdnt.y + (i+1)*CellWidth);         }       }     }    }   friend class Block;   protected:    private:    int     m_block_bar[MAP_HEIGHT][MAP_WIDTH];//游戲區的地板,用18*12的二維數組表示   };  Block::Block(int x , int y) { //  ZeroMemory(m_block_bar,sizeof(int )*12*18);   srand( (unsigned)time( NULL ) );//初始化隨機數,用于產生方塊 //  POINT pt = {100,100};   create_block(x,y); } int Block::random_block() {   m_style = rand()%TOTAL_BLOCK_STYLE; //  m_style = e_CORNER; //測試之用 //  m_style = e_LINE; //測試之用   if(m_style == e_STAIR || m_style == e_TANCK)     m_direct = rand()%4;   else if(m_style == e_LINE)     m_direct = rand()%2;   else if(m_style == e_CORNER)     m_direct = rand()%8;   else if(m_style == e_TIAN)     m_direct = 0;   m_direct = 1;  } int  Block::check_block(const map_floor& map, const POINT& LeftTopScrCdnt) {   int x , y ; //x , y 為方塊相對于地圖的坐標,左上角為(0,0)   for(int i = 0 ; i < 4 ; i ++)   {     x = (m_block[i].x - LeftTopScrCdnt.x)/CellWidth;     y = (m_block[i].y - LeftTopScrCdnt.y)/CellWidth;     if(x < 0 || x >= MAP_WIDTH || y >= MAP_HEIGHT)//不用檢測y < 0 的情況     return 0;     if(y < 0) continue;     if(map.m_block_bar[y][x])     return 0;   }   return 1; } int Block::move_down(const RECT& GameClient)//下移,由計時器消息調用 {   int i; //  for (i = 0 ; i < 4 ; i ++ ) //  { //   if(m_block[i].y == GameClient.bottom - CellWidth) //   return 0; //  }   for (i = 0; i < 4 ;i ++ )   {     m_block[i].y += CellWidth;   }   return 1; } int Block::move_up(const RECT& GameClient) {   move_to(m_block[1].x,m_block[1].y - CellWidth);   return 1; } int Block::move_left(const RECT& GameClient) {   move_to(m_block[1].x - CellWidth,m_block[1].y);   return 1; } int Block::move_right(const RECT& GameClient) {   move_to(m_block[1].x + CellWidth , m_block[1].y);   return 1; } int Block::create_block(int x , int y) {   m_block[1].x = x;   m_block[1].y = y;   random_block();   rotate();   return 1; } int Block::move_to(int x , int y) {   int Vx = x - m_block[1].x;   int Vy = y - m_block[1].y;   for(int i = 0 ; i < 4 ; i ++)   {     m_block[i].x += Vx;     m_block[i].y += Vy;   } } int Block::print_to_map(map_floor& map , const POINT& LeftTopScrCdnt) {   int x , y;   int i , j;   for(i = 0 ; i < 4 ; i ++ )   {     x = (m_block[i].x - LeftTopScrCdnt.x)/CellWidth;     y = (m_block[i].y - LeftTopScrCdnt.y)/CellWidth;     if(x<0 || x >= MAP_WIDTH || y <0 || y >= MAP_HEIGHT)//為保安全 ,測試之用,完成后將被注釋掉       return 0;     map.m_block_bar[y][x] = 1 ;     for(j = 0 ; j < MAP_WIDTH ; j ++)     {       if(map.m_block_bar[y][j] != 1)         break;     }     if(MAP_WIDTH == j)     {       for(j = 0 ; j < MAP_WIDTH ; j ++)       {         map.m_block_bar[y][j] = 5;//數字5代表要消掉的行       }     }    }   int idx;   for(i = 0 ; i < MAP_WIDTH ; i ++)   {     for(idx = j = MAP_HEIGHT - 1 ; j >= 0 ; j --)     {       if(map.m_block_bar[j][i] != 5)       {         map.m_block_bar[idx--][i] = map.m_block_bar[j][i];       }     }     while(idx >= 0)     {       map.m_block_bar[idx--][i] = 0;     }   }   return 1; }  //下面該函數功能是實現方塊旋轉,可以說是整個【俄羅斯方塊】的難點所在,也是其核心部分 //方塊用以數組block【4】表示,其余3個方格都將圍繞block【1】旋轉,方塊由于有不對稱方塊 //存在,我原本是要分7種,但是后面代碼量太大了,所以我將方塊根據樣式歸為了四種,分別是: // //e_LINE 線形   就是一條線的那個,這個是對稱的方塊,只需分兩個方向分別為橫向和縱向,方向 //        用m_direct保持,其他的方塊一樣 // //e_TANCK 坦克形 這個是方塊是對稱的,分四種方向,根據m_direct對4進行求余的方法可以大大縮減 //        代碼量,對于下面兩種方塊也是利用了求余的方式化簡許多,才使得代碼不會那么冗余, //        這是后面我才想到的方法。 // //e_STAIR 樓梯形 這個方塊相對前面兩種來說有點難度,主要是因為它不是對稱的,但是相對下面的這種 //        來說比較簡單,原本我沒用對m_direct求余的方法時,我將它分為了e_STAIR_BACK和e_STAIR_FRONT //        兩類來討論的,后面發現代碼可以縮減才將其歸為一類只要記住block【0】和block【1】的位置不會 //        變化,變化的是block【2】和block【3】,block【2】相對block【1】上移或下移,x坐標與block【1】 //        相同,block【3】.y一直在block【1】下面一行,相對其左右變化 // //e_CORNER 角形 這個方塊個人覺得是最難旋轉的方塊,與上面一種異樣,原本我將它分為e_CORNER_FRONT , e_CORNER_BACK //        兩類,每類有四個方向的變化,后來根據求余可以將同一個方向的變化變為一種,只是block【3】號方塊要 //        根據m_direct方向來進行調整  int Block::rotate() {       switch (m_style)       {         case e_LINE:         {           switch(m_direct)           {             case 0://橫向轉為縱向             {               for(int i = 0 ; i < 4 ; i ++)                 {                   m_block[i].x = m_block[1].x;                   m_block[i].y = m_block[1].y + (1-i)*CellWidth;                 }               m_direct = 1;             }               break;             case 1://縱向轉為橫向             {               for(int i = 0 ; i < 4 ; i ++)               {                   m_block[i].y = m_block[1].y;                   m_block[i].x = m_block[1].x + (1-i)*CellWidth;               }               m_direct = 0;             }               break;           }         }           break;         //下面為樓梯風格的方塊,由于其不是對稱的分類為正反兩種,正反種風格各有兩種變化,         //m_direct% == 0是正反兩面的同種變化         case e_STAIR:         {           int flag;           flag = m_direct < 2 ? 1 : -1;           m_block[0].x = m_block[1].x + flag*CellWidth;           m_block[0].y = m_block[1].y;           m_block[2].x = m_block[1].x;           m_block[3].y = m_block[1].y + CellWidth;           if(m_direct%2 == 0)           {             m_block[2].y = m_block[1].y - CellWidth;             m_block[3].x = m_block[1].x + flag*CellWidth;             m_direct++;           }           else           {             m_block[2].y = m_block[1].y + CellWidth;             m_block[3].x = m_block[1].x - flag*CellWidth;             if(m_direct < 2) m_direct = 0;             else       m_direct = 2;           }         }           break;         //角形方塊,與樓梯形方塊一樣非對稱,有正反倆個種,每種有四種變化,         //下面根據m_direct%4的值將這些變化歸類解決,對于正,反面對應的相同         //變化的方向,只有block【3】方格位置不一樣,可以看我畫的圖對比即可了解         case e_CORNER:         {           switch (m_direct%4)           {             case 0:             {               m_block[0].x = m_block[1].x+CellWidth;               m_block[0].y = m_block[2].y = m_block[1].y;               m_block[2].x = m_block[1].x-CellWidth;               m_block[3].x = m_block[1].x-CellWidth;               if(m_direct>=4) m_block[3].y = m_block[1].y-CellWidth;               else       m_block[3].y = m_block[1].y+CellWidth;               m_direct ++;             }               break;             case 1:             {               m_block[0].x = m_block[2].x = m_block[1].x;               m_block[0].y = m_block[1].y+CellWidth;               m_block[2].y = m_block[1].y-CellWidth;               if(m_direct>=4)   m_block[3].x = m_block[1].x+CellWidth;               else       m_block[3].x = m_block[1].x-CellWidth;               m_block[3].y = m_block[1].y-CellWidth;               m_direct ++;             }               break;             case 2:             {               m_block[0].x = m_block[1].x-CellWidth;               m_block[0].y = m_block[2].y = m_block[1].y;               m_block[2].x = m_block[1].x+CellWidth;               m_block[3].x = m_block[1].x+CellWidth;               if (m_direct>=4)  m_block[3].y = m_block[1].y+CellWidth;               else       m_block[3].y = m_block[1].y-CellWidth;                m_direct ++;             }               break;             case 3:             {               m_block[0].x = m_block[2].x = m_block[1].x;               m_block[0].y = m_block[1].y-CellWidth;               m_block[2].y = m_block[1].y+CellWidth;               if(m_direct>=4)  { m_block[3].x = m_block[1].x-CellWidth; m_direct = 4;}               else       { m_block[3].x = m_block[1].x+CellWidth; m_direct = 0;}               m_block[3].y = m_block[1].y+CellWidth;             }               break;             default:               break;           }          }           break;         case e_TANCK://坦克形方塊,與線形方塊一樣是對稱的,分四種變化         {           switch (m_direct%2)           {             case 0:             {               m_block[0].x = m_block[2].x = m_block[1].x;               m_block[0].y = m_block[1].y - CellWidth;               m_block[2].y = m_block[1].y + CellWidth;               int flag = m_direct == 0 ? 1 : -1;               m_block[3].x = m_block[1].x + flag*CellWidth;               m_block[3].y = m_block[1].y;               m_direct++;             }               break;             case 1:             {               m_block[0].y = m_block[2].y = m_block[1].y;               m_block[0].x = m_block[1].x - CellWidth;               m_block[2].x = m_block[1].x + CellWidth;               m_block[3].x = m_block[1].x;               int flag = m_direct == 3 ? -1:1;               m_block[3].y = m_block[1].y + flag*CellWidth;               if(m_direct == 3) m_direct = 0;               else m_direct++;              }               break;             default:               break;           }          }           break;         case e_TIAN:         {           m_block[0].y = m_block[1].y;           m_block[0].x = m_block[1].x + CellWidth;           m_block[2].x = m_block[1].x;           m_block[2].y = m_block[1].y + CellWidth;           m_block[3].x = m_block[1].x + CellWidth;           m_block[3].y = m_block[1].y + CellWidth;         }           break;          default:           break;       }          return 0; } int Block::show_block(HDC hdc,const POINT& GameLeftTop) {   for (int i = 0 ; i < 4 ; i ++ )   {     if(m_block[i].y >= GameLeftTop.y)       Rectangle(hdc,m_block[i].x,m_block[i].y,m_block[i].            x+CellWidth,m_block[i].y+CellWidth);     if(i==0)//測試所用,完成后將會被注釋掉     {MoveToEx(hdc,m_block[i].x,m_block[i].y,NULL);     LineTo(hdc,m_block[i].x+CellWidth,m_block[i].y+CellWidth);}    }   return 1; } int Block::show_next_block(HDC hdc) {    for (int i = 0 ; i < 4 ; i ++ )   {      Rectangle(hdc,m_block[i].x,m_block[i].y,m_block[i].            x+CellWidth,m_block[i].y+CellWidth);   }   return 1; } Block block , next_block , try_block; map_floor map;int d = 0; LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {    HDC     hdc ;    PAINTSTRUCT ps ;    //游戲客戶區    static RECT GameClient;    //一個方格的像素為CellWidth = 20 游戲區寬 12 個方格 高 18 個方格    const int  Width = 240 ,Height = 360;    static POINT LeftTopScrCdnt;//游戲區得左上角坐標     switch (message)    {    case WM_CREATE:      SetTimer(hwnd,ID_TIMER,500,NULL);      return 0 ;    case WM_SIZE:      GetClientRect(hwnd,&GameClient);      LeftTopScrCdnt.x = (GameClient.right-GameClient.left)/2 - Width/2;      LeftTopScrCdnt.y = GameClient.top + 50;      GameClient.left  = LeftTopScrCdnt.x;      GameClient.top  = LeftTopScrCdnt.y;      GameClient.right = LeftTopScrCdnt.x + Width;      GameClient.bottom = LeftTopScrCdnt.y + Height;      //創建下一個將要出現的方塊      next_block.create_block(GameClient.right+2*CellWidth,(GameClient.bottom+GameClient.top)/2-3*CellWidth);      block.move_to((GameClient.right+GameClient.left)/2,GameClient.top-CellWidth);       break;    case WM_TIMER:      block.move_down(GameClient);      if(!block.check_block(map,LeftTopScrCdnt))//檢測方塊的碰撞,如果則說明方塊到底底部,將其上移然后打印進地圖      {        block.move_up(GameClient);        if(!block.check_block(map,LeftTopScrCdnt) ||          block.get_block_height() <= LeftTopScrCdnt.y )//檢測游戲是否結束          {            KillTimer(hwnd,ID_TIMER);            d = 4;          }        block.print_to_map(map,LeftTopScrCdnt);        SendMessage(hwnd,WM_KEYDOWN,VK_ESCAPE,0);      }      InvalidateRect(hwnd,NULL,true);      break;    case WM_PAINT:      hdc = BeginPaint (hwnd, &ps) ;      MoveToEx(hdc,LeftTopScrCdnt.x,LeftTopScrCdnt.y,NULL);      Rectangle(hdc,GameClient.left,GameClient.top,GameClient.right,GameClient.bottom);//游戲區邊框      SelectObject(hdc,GetStockObject(BLACK_BRUSH));      map.show_block_bar(hdc,LeftTopScrCdnt);      block.show_block(hdc,LeftTopScrCdnt);      next_block.show_next_block(hdc);      EndPaint (hwnd, &ps);      break;    case WM_KEYDOWN:      InvalidateRect(hwnd,NULL,true);      switch (wParam)      {       case VK_SPACE:       {         try_block = block;         try_block.rotate();         if(try_block.check_block(map ,LeftTopScrCdnt))           block = try_block;         break;       }       case VK_LEFT:       {         block.move_left(GameClient);         if(!block.check_block(map ,LeftTopScrCdnt))           block.move_right(GameClient);       }         break;       case VK_RIGHT:       {         block.move_right(GameClient);         if (!block.check_block(map ,LeftTopScrCdnt))           block.move_left(GameClient);       }         break;       case VK_DOWN:       { //        block.move_down(GameClient);          SendMessage(hwnd,WM_TIMER,0,0);       }         break;        case VK_ESCAPE://測試用,完成后將會被注釋掉       {         block = next_block;         next_block.create_block(GameClient.right+2*CellWidth,(GameClient.bottom+GameClient.top)/2-3*CellWidth);         block.move_to((GameClient.right+GameClient.left)/2,GameClient.top-CellWidth);       }         break;       default:         break;      }      break;    case WM_DESTROY:      PostQuitMessage (0) ;      return 0 ;    }    return DefWindowProc (hwnd, message, wParam, lParam) ; } 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产依人香蕉在线精品| 精品视频久久久| 国产在线精品自拍| 欧美视频精品一区| 欧美xxxx做受欧美| 欧美激情视频在线观看| 日韩男女性生活视频| 日韩一区二区av| 久久九九精品99国产精品| 亚洲综合日韩中文字幕v在线| 91精品在线观看视频| 亚洲综合av影视| 综合国产在线视频| 亚洲精品视频免费| 亲子乱一区二区三区电影| 懂色av中文一区二区三区天美| 高潮白浆女日韩av免费看| 国产精品成人观看视频国产奇米| 最近2019中文字幕mv免费看| 国产成人91久久精品| 国产中文字幕亚洲| www.xxxx精品| 亚洲国产精品视频在线观看| 国产精品美乳一区二区免费| 欧美二区乱c黑人| 亚洲日本中文字幕免费在线不卡| 57pao成人国产永久免费| 91亚洲精品久久久久久久久久久久| 中文字幕日韩精品在线| 日韩av在线免费观看一区| 国产精品看片资源| 欧美成人精品一区| 久久久亚洲精品视频| 亚洲aaa激情| 91精品国产91久久久久久吃药| 大胆欧美人体视频| 中文在线资源观看视频网站免费不卡| 日韩在线中文字| 性色av一区二区三区免费| 日韩电影在线观看永久视频免费网站| 欧美精品午夜视频| 国产亚洲日本欧美韩国| 成人妇女免费播放久久久| 亚洲欧美中文日韩在线| 精品久久久久久久中文字幕| 久久精品久久精品亚洲人| 欧美激情中文字幕在线| 久久国产精品影片| 亚洲影院色在线观看免费| 国产精品白嫩美女在线观看| 精品国产乱码久久久久久天美| 一区二区三区 在线观看视| 一本一本久久a久久精品牛牛影视| 国产精品美女www爽爽爽视频| 国产97人人超碰caoprom| 国产在线视频不卡| 日韩成人中文字幕在线观看| 国产成人精品久久亚洲高清不卡| 亚洲一区中文字幕在线观看| 91久久久精品| 欧美激情一区二区三区成人| 久久久久久久91| 国产成人黄色av| 日韩中文字幕精品| 91中文精品字幕在线视频| 亚洲国产精品999| 日韩高清有码在线| 亚洲美女福利视频网站| 成人午夜一级二级三级| 欧美中文在线视频| 最新91在线视频| 亚洲免费伊人电影在线观看av| 亚洲a一级视频| 这里只有精品视频| 精品国产一区二区三区久久久狼| 亚洲欧洲国产伦综合| 国产婷婷97碰碰久久人人蜜臀| 欧美贵妇videos办公室| 欧美在线精品免播放器视频| 91国产美女在线观看| 91爱爱小视频k| 综合网日日天干夜夜久久| 国产精品人人做人人爽| 精品香蕉在线观看视频一| 亚洲国产毛片完整版| 国产黑人绿帽在线第一区| 国产精品日日摸夜夜添夜夜av| 欧美孕妇与黑人孕交| 成人激情在线播放| 日本高清久久天堂| 亚洲三级av在线| 81精品国产乱码久久久久久| 亚洲激情电影中文字幕| 欧美日韩一区二区免费在线观看| 亚洲国产天堂久久综合| 亚洲一区www| 国产一区二区三区在线播放免费观看| 亚洲伊人一本大道中文字幕| 欧美日本高清视频| 亚洲精品视频在线播放| 精品国产91久久久久久老师| 成人乱人伦精品视频在线观看| 亚洲性无码av在线| 77777亚洲午夜久久多人| 青草热久免费精品视频| 欧美一乱一性一交一视频| 精品久久久国产| 欧美极品少妇xxxxⅹ免费视频| 亚洲精品欧美一区二区三区| 精品国产精品三级精品av网址| 国自产精品手机在线观看视频| 欧美孕妇毛茸茸xxxx| 国产精品劲爆视频| 91九色蝌蚪国产| 精品国产一区二区三区久久久狼| 中文字幕精品—区二区| 日韩av中文字幕在线免费观看| 91精品久久久久久综合乱菊| 日韩一区二区三区xxxx| 欧美一级淫片播放口| 欧美一级片一区| 国产精品欧美风情| 欧美性猛交xxxxx水多| 激情av一区二区| 亚洲色图色老头| 成人深夜直播免费观看| 国产精品揄拍500视频| 成人性生交大片免费看小说| 精品综合久久久久久97| 亚洲国产精品成人一区二区| 精品久久久香蕉免费精品视频| 久久久免费精品| 精品中文字幕视频| 亚洲精品99久久久久中文字幕| 91久久国产精品91久久性色| 欧美性色19p| 国产精品自产拍在线观看中文| 国产乱肥老妇国产一区二| 一区二区三区四区在线观看视频| 福利一区视频在线观看| 成人精品福利视频| 亚洲一区二区福利| 亚洲老头老太hd| 欧美激情精品久久久久久蜜臀| 中文字幕不卡在线视频极品| 国产69精品久久久| 国产精品久久视频| 成人伊人精品色xxxx视频| 国产一区二区三区免费视频| 一区二区三区动漫| 伊人伊成久久人综合网小说| 日韩电影第一页| 国产精品男人爽免费视频1| 中文字幕精品网| 国产综合在线看| 久热精品在线视频| 精品无码久久久久久国产| 久久九九国产精品怡红院| 国产+成+人+亚洲欧洲| 亚洲综合在线播放| 亚洲永久免费观看| 5252色成人免费视频| 久久久天堂国产精品女人| 日韩有码在线视频|