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

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

C++制作俄羅斯方塊

2020-05-23 14:05:01
字體:
來源:轉載
供稿:網友
俄羅斯方塊寫過好幾次了,每次的感覺都不一樣,都有新的收獲。就像達芬奇畫雞蛋一樣,雖然都是畫同樣的雞蛋,但是每次都有不同的收獲。 
 

緣起:

  在玩Codeblocks自帶的俄羅斯方塊時覺得不錯,然而有時間限制。所以想自己再寫一個。

程序效果:

C++,俄羅斯方塊

主要內容:

  程序中有一個board數組,其中有要顯示的部分,也有不顯示的部分,不顯示的部分都存儲1。

  如下圖:

C++,俄羅斯方塊

  shape采用4*4數組(shape)保存。如:

    0 0 0 0
    0 1 0 0 
    1 1 1 0
    0 0 0 0

  另外用變量row和column保存shape數組左上角在board中的位置。

  每次下落或左右移動,先對row和column做出改變,然后檢測當前row和column下,shape是否重合了為1的格子,如果有重合,就說明shape出界了或者到達下落最低點,則要恢復row和column值。另外,如果是下落,還要將shape放在board上,并產生新的shape。

  旋轉時,先對shape數組進行旋轉操作,然后檢測重合,如果有重合,則反向旋轉回來。

代碼:

#if defined(UNICODE) && !defined(_UNICODE)#define _UNICODE#elif defined(_UNICODE) && !defined(UNICODE)#define UNICODE#endif#include <tchar.h>#include <windows.h>#include <pthread.h>#include <stdio.h>#include <time.h>/*-----------------宏定義--------------------------------------------------------*/#define WIDTH 180#define HEIGHT 400#define LONG_SLEEP 300#define BKCOLOR RGB(238,238,238)//背景色/*-----------------變量----------------------------------------------------------*/static int shapes[7][4][4];//存儲7個形狀static int high_score[4]= {0,0,0,0};//前三個元素存儲最高分,最后一個元素存儲此次得分static int **shape;//當前形狀static int **board;static int M=15;//顯示的列數static int N=30;//顯示的行數static int MM=M+8;//board的列數static int NN=N+4;//board的行數static int LEFT=4;//顯示的最左一列static int RIGHT=LEFT+M-1;//顯示的最右一列static int TOP=0;//顯示的最上一列static int BOTTOM=N-1;//顯示的最下一列static int score=0;static int row=0;//形狀所在行static int column=MM/2;//形狀坐在列static bool is_pause=false;static HBRUSH grey_brush =CreateSolidBrush (RGB(210,210,210));static HBRUSH white_brush =CreateSolidBrush (RGB(130,130,130));static HBRUSH bk_brush =CreateSolidBrush (BKCOLOR);static HPEN hPen = CreatePen(PS_SOLID,1,RGB(147,155,166));static int lattices_top=40;//上面留白static int lattices_left=20;//左側留白static int width=WIDTH/M;//每個格子的寬度static int height=(HEIGHT-lattices_top)/N;//每個格子的高度/*-----------------函數-----------------------------------------------------------*/void add_score() ;bool check_is_lose() ;void clear_up() ;//消除沒有空格子的行void* down_thread_function(void * args) ;//形狀下落進程要執行的函數void exit_game(HWND hwnd) ;void give_new_shape() ;//隨機生成一個新形狀int handle_key(HWND hwnd,WPARAM wParam) ;int init_down_thread(HWND hwnd) ;//初始化形狀下落進程int init_game(HWND hwnd) ;//初始化游戲程序void init_play() ;//初始化游戲數據bool is_legel() ;//檢測形狀在當前位置是否合法(即是否重合了非空的格子)int load_scores(int* a) ;//讀取游戲最高分數據int load_shape() ;//從文件中加載7個形狀void lose_game(HWND hwnd) ;int move_down(HWND hwnd) ;//形狀下落int move_lr(HWND hwnd,int lr) ;//形狀左右移動void paint_lattice(HDC hdc,int x,int y,int color) ;//顯示一個格子void paint_UI(HDC hdc) ;//畫界面void reset_rc() ;void rerotate_matrix(int mn) ;//順時針旋轉一個行列數為mn的方陣void rotate_matrix(int mn) ;//逆時針旋轉一個行列數為mn的方陣int rotate_shape(HWND hwnd) ;//旋轉當前形狀并更新界面bool save_score(HWND hwnd) ;//保存最高分數據void shape_to_ground() ;//當前形狀落地之后,更新boardbool sort_scores(int* a) ;//對最高分和此次得分排序,若創造新紀錄則返回truevoid update_UI(HWND hwnd) ;//更新界面,僅更新Rect區域(形狀所在的那幾行)內void update_UI_all(HWND hwnd) ;//更新界面,更新整個界面int write_scores(int* a) ;//寫最高分數據/* Declare Windows procedure */LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);/* Make the class name into a global variable */TCHAR szClassName[ ] = _T("Tris");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;         /* 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 =bk_brush;  /* 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 */        _T("Tris"),    /* Title Text */        WS_OVERLAPPEDWINDOW, /* default window */        CW_USEDEFAULT,    /* Windows decides the position */        CW_USEDEFAULT,    /* where the window ends up on the screen */        WIDTH+200,         /* The programs width */        HEIGHT+70,         /* and height in pixels */        HWND_DESKTOP,    /* 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;}//從文件中加載7個形狀int load_shape() {  FILE* f=fopen("shapes.txt","rb");  if(f==NULL) {    return -1;  }  for(int i=0; i<7; i++) {    for(int j=0; j<4; j++) {      for(int k=0; k<4; k++) {        if(fscanf(f,"%d",&shapes[i][j][k])!=1) {          return -1;        }      }    }  }  fclose(f);  return 0;}//隨機生成一個新形狀void give_new_shape() {  int shape_num=rand()%7;  for(int i=0; i<4; i++) {    for(int j=0; j<4; j++) {      shape[i][j]=shapes[shape_num][i][j];    }  }}void add_score() {  score+=100;}//消除沒有空格子的行void clear_up() {  for(int i=row; i<=row+3; i++) {    if(i>BOTTOM)continue;    bool there_is_blank=false;    for(int j=LEFT; j<=RIGHT; j++) {      if(board[i][j]==0) {        there_is_blank=true;        break;      }    }    if(!there_is_blank) {      add_score();      for(int r=i; r>=1; r--) {        for(int c=LEFT; c<=RIGHT; c++) {          board[r][c]=board[r-1][c];        }      }    }  }}//檢測形狀在當前位置是否合法(即是否重合了非空的格子)bool is_legel() {  for(int i=0; i<4; i++) {    for(int j=0; j<4; j++) {      if(shape[i][j]==1&&board[row+i][column+j]==1) {        return false;      }    }  }  return true;}//逆時針旋轉一個行列數為mn的方陣void rotate_matrix(int mn) {  int** a=shape;  int s=0;  for(int n=mn; n>=1; n-=2) {    for(int i=0; i<n-1; i++) {      int t=a[s+i][s];      a[s+i][s]=a[s][s+n-i-1];      a[s][s+n-i-1]=a[s+n-i-1][s+n-1];      a[s+n-i-1][s+n-1]=a[s+n-1][s+i];      a[s+n-1][s+i]=t;    }    s++;  }}//順時針旋轉一個行列數為mn的方陣void rerotate_matrix(int mn) {  int** a=shape;  int s=0;  for(int n=mn; n>=1; n-=2) {    for(int i=0; i<n-1; i++) {      int t=a[s+i][s];      a[s+i][s]=a[s+n-1][s+i];      a[s+n-1][s+i]=a[s+n-i-1][s+n-1];      a[s+n-i-1][s+n-1]=a[s][s+n-i-1];      a[s][s+n-i-1]=t;    }    s++;  }}//顯示一個格子void paint_lattice(HDC hdc,int x,int y,int color) {  if(x<TOP||x>BOTTOM||y<LEFT||y>RIGHT) {    return ;  }  x-=TOP;  y-=LEFT;  int left=lattices_left+y*width;  int right=lattices_left+y*width+width;  int top=lattices_top+x*height;  int bottom=lattices_top+x*height+height;  MoveToEx (hdc,left,top, NULL) ;  LineTo (hdc,right,top) ;  MoveToEx (hdc,left,top, NULL) ;  LineTo (hdc,left,bottom) ;  MoveToEx (hdc,left,bottom, NULL) ;  LineTo (hdc,right,bottom) ;  MoveToEx (hdc,right,top, NULL) ;  LineTo (hdc,right,bottom) ;  SelectObject(hdc, grey_brush);  if(color==0) {    SelectObject(hdc, white_brush);  }  Rectangle(hdc,left,top,right,bottom);}//更新界面,僅更新Rect區域(形狀所在的那幾行)內void update_UI(HWND hwnd) {  static RECT rect;  rect.left=lattices_left;  rect.right=lattices_left+M*width+width;  rect.top=lattices_top+(row-1)*height;  rect.bottom=lattices_top+(row+4)*height;  InvalidateRect (hwnd,&rect, false) ;}//更新界面,更新整個界面void update_UI_all(HWND hwnd) {  InvalidateRect (hwnd,NULL, false) ;}//畫界面void paint_UI(HDC hdc) {  SetBkColor(hdc,BKCOLOR);  SelectObject(hdc,hPen); //選用畫筆  char score_str[20];  sprintf(score_str,"Score:%d",score);  TextOut(hdc,10,10,score_str,strlen(score_str));  sprintf(score_str,"Highest Scores:");  TextOut(hdc,WIDTH+50,50,score_str,strlen(score_str));  for(int i=0; i<3; i++) {    sprintf(score_str,"%d",high_score[i]);    TextOut(hdc,WIDTH+50,50+(i+1)*20,score_str,strlen(score_str));  }  for(int i=TOP; i<=BOTTOM; i++) {    for(int j=LEFT; j<=RIGHT; j++) {      paint_lattice(hdc,i,j,board[i][j]);    }  }  for(int i=0; i<4; i++) {    for(int j=0; j<4; j++) {      if(shape[i][j]==1)        paint_lattice(hdc,row+i,column+j,shape[i][j]);    }  }}//旋轉當前形狀并更新界面int rotate_shape(HWND hwnd) {  int mn=4;  rotate_matrix(mn);  if(!is_legel()) {    rerotate_matrix(mn);  }  update_UI(hwnd);}void reset_rc() {  row=0;  column=MM/2-2;}//讀取游戲最高分數據int load_scores(int* a) {  FILE* f=fopen("scores.txt","r");  if(f==NULL)return -1;  fscanf(f,"%d%d%d",&a[0],&a[1],&a[2]);  return 0;}//初始化游戲數據void init_play() {  load_scores(high_score);  for(int i=0; i<NN; i++) {    for(int j=0; j<MM; j++) {      board[i][j]=0;    }  }  for(int i=0; i<N; i++) {    for(int j=0; j<LEFT; j++) {      board[i][j]=1;    }  }  for(int i=0; i<N; i++) {    for(int j=RIGHT+1; j<MM; j++) {      board[i][j]=1;    }  }  for(int i=BOTTOM+1; i<NN; i++) {    for(int j=0; j<MM; j++) {      board[i][j]=1;    }  }  reset_rc();  score=0;  give_new_shape();  is_pause=false;  return ;}bool check_is_lose() {  if(row==0)return true;  return false;}//對最高分和此次得分排序,若創造新紀錄則返回truebool sort_scores(int* a) {  int temp=a[3];  for(int i=0; i<4; i++) {    for(int j=0; j<3; j++) {      if(a[j]<a[j+1]) {        int t=a[j];        a[j]=a[j+1];        a[j+1]=t;      }    }  }  if(temp>a[3])return true;  return false;}//寫最高分數據int write_scores(int* a) {  FILE* f=fopen("scores.txt","w");  if(f==NULL)return -1;  fprintf(f,"%d/n%d/n%d/n",a[0],a[1],a[2]);  return 0;}//保存最高分數據bool save_score(HWND hwnd) {  high_score[3]=score;  bool made_record=sort_scores(high_score);  if(write_scores(high_score)!=0) {    MessageBox(hwnd,"Write file error.Program will exit.","Error",NULL);    DestroyWindow(hwnd);  }  return made_record;}void lose_game(HWND hwnd) {  if(is_pause)return ;  is_pause=true;  char message[200]="You lose the Game./n";  char title[50]="Game Over";  if(save_score(hwnd)) {    strcat(message,"You have made a new record./n");    char score_str[100];    sprintf(score_str,"The Highest Scores:/n%d/n%d/n%d/n",high_score[0],high_score[1],high_score[2]);    strcat(message,score_str);  }  strcat(message,"/nPlay again?/n");  if(MessageBox(hwnd,message,title,MB_YESNO)==IDYES) {    init_play();    update_UI_all(hwnd);  } else {    exit(0);  }}void exit_game(HWND hwnd) {  is_pause=true;  char message[200]="";  char title[50]="Exit";  if(save_score(hwnd)) {    strcat(message,"You have made a new record./n");    char score_str[100];    sprintf(score_str,"The Highest Scores:/n%d/n%d/n%d/n",high_score[0],high_score[1],high_score[2]);    strcat(message,score_str);    MessageBox(hwnd,message,title,NULL);  }  exit(0);}//當前形狀落地之后,更新boardvoid shape_to_ground() {  for(int i=0; i<4; i++) {    for(int j=0; j<4; j++) {      board[row+i][column+j]=shape[i][j]==1?1:board[row+i][column+j];    }  }}//形狀下落int move_down(HWND hwnd) {  row++;  if(!is_legel()) {    row--;    if(check_is_lose()) {      lose_game(hwnd);      return 0;    }    shape_to_ground();    clear_up();    update_UI_all(hwnd);    reset_rc();    give_new_shape();  }  update_UI(hwnd);}//進程參數結構體struct thread_arg {  HWND arg_hwnd;};//形狀下落進程要執行的函數void* down_thread_function(void * args) {  thread_arg *arg=(thread_arg*)args;  HWND dhwnd=arg->arg_hwnd;  while(true) {    if(is_pause) {      Sleep(300);      continue;    }    move_down(dhwnd);    Sleep(LONG_SLEEP);  }}//初始化形狀下落進程int init_down_thread(HWND hwnd) {  int ret;  pthread_t t;  thread_arg *argp=new thread_arg;  argp->arg_hwnd=hwnd;  ret=pthread_create(&t,NULL,down_thread_function,argp);  delete argp;  if(ret!=0) {    return -1;  }  return 0;}//初始化游戲程序int init_game(HWND hwnd) {  board=new int*[NN];  for(int i=0; i<NN; i++) {    board[i]=new int[MM];  }  shape=new int*[4];  for(int i=0; i<4; i++) {    shape[i]=new int[4];  }  srand(time(0));  if(load_shape()!=0) {    MessageBox(hwnd,"Read file error.Program will exit.","Error",NULL);    exit(-1);  }  init_play();  update_UI_all(hwnd);  if(init_down_thread(hwnd)!=0) {    MessageBox(hwnd,"Thread error.Program will exit.","Error",NULL);    exit(-1);  }  return 0;}//形狀左右移動int move_lr(HWND hwnd,int lr) {  int temp=column;  if(lr==0)column--;  else {    column++;  }  if(!is_legel()) {    column=temp;  }  update_UI(hwnd);}int handle_key(HWND hwnd,WPARAM wParam) {  if(wParam==VK_ESCAPE) {//ESC退出    exit_game(hwnd);  }  if(wParam==VK_SPACE) {//空格暫停    is_pause=!is_pause;  }  if(is_pause==true) {    Sleep(300);    return 0;  }  if(wParam==VK_UP) {    rotate_shape(hwnd);  }  if(wParam==VK_DOWN) {    move_down(hwnd);  }  if(wParam==VK_LEFT) {    move_lr(hwnd,0);  }  if(wParam==VK_RIGHT) {    move_lr(hwnd,1);  }  return 0;}/* This function is called by the Windows function DispatchMessage() */HWND hwnd;LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {  static HDC hdc;  static HDC hdcBuffer;  static HBITMAP hBitMap;  static PAINTSTRUCT ps ;  switch (message) {        /* handle the messages */  case WM_CREATE:    init_game(hwnd);    break;  case WM_KEYDOWN:    handle_key(hwnd,wParam);    break;  case WM_DESTROY:    exit_game(hwnd);    PostQuitMessage (0);    /* send a WM_QUIT to the message queue */    break;  case WM_PAINT:    hdc = BeginPaint (hwnd, &ps) ;    paint_UI(hdc);    EndPaint (hwnd, &ps) ;    break;  default:           /* for messages that we don't deal with */    return DefWindowProc (hwnd, message, wParam, lParam);  }  return 0;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91成人精品网站| 丝袜亚洲欧美日韩综合| 日韩免费av片在线观看| 国产精品成av人在线视午夜片| 美女av一区二区三区| 国产亚洲成av人片在线观看桃| 亚洲欧美一区二区三区四区| 亚洲人成在线一二| 日韩亚洲一区二区| 亚洲日本成人女熟在线观看| 亚洲精品国产suv| 日韩电影中文字幕一区| 国产亚洲欧美一区| 亚洲尤物视频网| 亚洲精品女av网站| 久热精品视频在线观看一区| 95av在线视频| 欧美高清视频一区二区| 亚洲成人黄色在线观看| 国产成人精彩在线视频九色| 欧美乱妇高清无乱码| 国产视频精品一区二区三区| 亚洲国产成人av在线| 91在线看www| 91日韩在线播放| 欧美精品www在线观看| 久久国产精品久久久久久| 欧美成人精品不卡视频在线观看| 啊v视频在线一区二区三区| 国产精品爽黄69天堂a| 日韩动漫免费观看电视剧高清| 国产精品视频一区国模私拍| 久久国产精彩视频| 国产在线精品成人一区二区三区| 91视频-88av| 在线视频欧美日韩精品| 中文亚洲视频在线| 欧美一区二区三区免费观看| 色老头一区二区三区在线观看| 久久精品亚洲热| 欧美激情一区二区三区成人| 欧美极品少妇xxxxⅹ免费视频| 亚洲人免费视频| 久久69精品久久久久久久电影好| 亚洲精品aⅴ中文字幕乱码| 久久久女女女女999久久| 久久久噜噜噜久久| 亚洲欧美日本另类| 亚洲国产美女久久久久| 日韩中文字幕欧美| 国产精品人成电影在线观看| 亚洲人永久免费| 欧美成人免费全部观看天天性色| 精品国产一区二区在线| 视频在线观看一区二区| 日韩电影网在线| 亚洲一品av免费观看| 国产精品狠色婷| 欧美日韩国产va另类| 国产精品www色诱视频| 亚洲成人精品视频| 日韩毛片在线观看| 久久免费成人精品视频| 亚洲人成人99网站| 亚洲欧美日韩精品久久奇米色影视| 亚洲精品一区在线观看香蕉| 国产精品丝袜白浆摸在线| 日韩中文第一页| 欧美大片免费观看在线观看网站推荐| 日韩欧美在线第一页| 国产精品96久久久久久| 亚洲女人被黑人巨大进入al| 亚洲xxxx做受欧美| 在线日韩日本国产亚洲| 久久久久久久久久久成人| 亚洲人成在线播放| 久久久电影免费观看完整版| 精品成人乱色一区二区| 色狠狠久久aa北条麻妃| 欧美国产精品日韩| 亚洲综合日韩在线| 国产性猛交xxxx免费看久久| www.久久撸.com| 91国产高清在线| 青青久久av北条麻妃黑人| 国产精品成人av在线| 亚洲石原莉奈一区二区在线观看| 性色av一区二区三区在线观看| 91免费高清视频| www.欧美三级电影.com| 国产视频在线一区二区| 午夜剧场成人观在线视频免费观看| 欧美性猛交99久久久久99按摩| xx视频.9999.com| 丝袜亚洲另类欧美重口| 国产精品高潮呻吟久久av无限| 高清亚洲成在人网站天堂| 黑丝美女久久久| 国产美女被下药99| 亚洲性线免费观看视频成熟| 97婷婷涩涩精品一区| 国产一区二区黑人欧美xxxx| www.美女亚洲精品| 亚洲自拍av在线| 国产精品一区二区久久国产| 国产成人精品免费久久久久| 欧美成人h版在线观看| 日韩精品黄色网| 国模私拍视频一区| 日韩欧美亚洲国产一区| 欧美日韩国产区| 日韩中文字幕国产精品| 中文字幕久久精品| 日韩亚洲成人av在线| 狠狠爱在线视频一区| 日韩成人在线观看| 91av免费观看91av精品在线| 亚洲国产成人精品一区二区| 日日噜噜噜夜夜爽亚洲精品| 亚洲伊人一本大道中文字幕| 正在播放国产一区| 亚洲第一二三四五区| 18久久久久久| 亚洲三级 欧美三级| 伊人久久综合97精品| 91免费综合在线| 久久精品电影一区二区| 日韩精品在线观看一区二区| 亚洲成人黄色网| 欧美成人免费大片| 国产做受69高潮| 国内精品在线一区| 亚洲最新视频在线| 欧美成人在线网站| 国产精品视频导航| 国模叶桐国产精品一区| 欧美激情一区二区三区久久久| 成人亚洲欧美一区二区三区| 7m第一福利500精品视频| 少妇高潮久久久久久潘金莲| 在线观看欧美视频| 欧美一级电影久久| 精品欧美激情精品一区| 国产91色在线免费| 日韩欧美国产免费播放| 日日骚久久av| 久久精品国产久精国产一老狼| 国产精品久久久久一区二区| 亚洲一品av免费观看| 亚洲国产精品人久久电影| 国产精品免费久久久久影院| 精品久久久久久久久久久久久久| 亚洲精品98久久久久久中文字幕| 欧美自拍视频在线| 日韩av三级在线观看| 国产欧美精品一区二区三区介绍| 精品亚洲男同gayvideo网站| 中文字幕亚洲综合久久筱田步美| 亚洲老板91色精品久久| 久久成人这里只有精品| 欧美在线观看网站| 亚洲一区免费网站| 国产精品精品一区二区三区午夜版| 日韩中文字幕在线免费观看|