日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

俄罗斯方块(C语言实现)

發布時間:2023/12/10 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 俄罗斯方块(C语言实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 游戲說明
  • 游戲效果展示
  • 游戲代碼
  • 游戲代碼詳解
    • 游戲框架構建
    • 隱藏光標
    • 光標跳轉
    • 初始化界面
    • 初始化方塊信息
    • 顏色設置
    • 畫出方塊
    • 空格覆蓋
    • 合法性判斷
    • 判斷得分與結束
    • 游戲主體邏輯函數
    • 從文件讀取最高分
    • 更新最高分到文件
    • 主函數

游戲說明

俄羅斯方塊相信大家都知道,這里就不再介紹什么游戲背景了,我這里對本代碼實現的俄羅斯方塊作一些說明

  • 按方向鍵的左右鍵可實現方塊的左右移動。
  • 按方向鍵的下鍵可實現方塊的加速下落。
  • 按空格鍵可實現方塊的順時針旋轉。
  • 按Esc鍵可退出游戲。
  • 按S鍵可暫停游戲,暫停游戲后按任意鍵繼續游戲。
  • 按R鍵可重新開始游戲。
  • 除此之外,本游戲還擁有計分系統,可保存玩家的歷史最高記錄。

    游戲效果展示

    游戲代碼

    博友們可以將以下代碼復制到自己的編譯器當中運行:

    #include <stdio.h> #include <Windows.h> #include <stdlib.h> #include <time.h> #include <conio.h>#define ROW 29 //游戲區行數 #define COL 20 //游戲區列數#define DOWN 80 //方向鍵:下 #define LEFT 75 //方向鍵:左 #define RIGHT 77 //方向鍵:右#define SPACE 32 //空格鍵 #define ESC 27 //Esc鍵struct Face {int data[ROW][COL + 10]; //用于標記指定位置是否有方塊(1為有,0為無)int color[ROW][COL + 10]; //用于記錄指定位置的方塊顏色編碼 }face;struct Block {int space[4][4]; }block[7][4]; //用于存儲7種基本形狀方塊的各自的4種形態的信息,共28種//隱藏光標 void HideCursor(); //光標跳轉 void CursorJump(int x, int y); //初始化界面 void InitInterface(); //初始化方塊信息 void InitBlockInfo(); //顏色設置 void color(int num); //畫出方塊 void DrawBlock(int shape, int form, int x, int y); //空格覆蓋 void DrawSpace(int shape, int form, int x, int y); //合法性判斷 int IsLegal(int shape, int form, int x, int y); //判斷得分與結束 int JudeFunc(); //游戲主體邏輯函數 void StartGame(); //從文件讀取最高分 void ReadGrade(); //更新最高分到文件 void WriteGrade();int max, grade; //全局變量 int main() { #pragma warning (disable:4996) //消除警告max = 0, grade = 0; //初始化變量system("title 俄羅斯方塊"); //設置cmd窗口的名字system("mode con lines=29 cols=60"); //設置cmd窗口的大小HideCursor(); //隱藏光標ReadGrade(); //從文件讀取最高分到max變量 InitInterface(); //初始化界面InitBlockInfo(); //初始化方塊信息srand((unsigned int)time(NULL)); //設置隨機數生成的起點StartGame(); //開始游戲return 0; }//隱藏光標 void HideCursor() {CONSOLE_CURSOR_INFO curInfo; //定義光標信息的結構體變量curInfo.dwSize = 1; //如果沒賦值的話,隱藏光標無效curInfo.bVisible = FALSE; //將光標設置為不可見HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //獲取控制臺句柄SetConsoleCursorInfo(handle, &curInfo); //設置光標信息 } //光標跳轉 void CursorJump(int x, int y) {COORD pos; //定義光標位置的結構體變量pos.X = x; //橫坐標設置pos.Y = y; //縱坐標設置HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //獲取控制臺句柄SetConsoleCursorPosition(handle, pos); //設置光標位置 } //初始化界面 void InitInterface() {color(7); //顏色設置為白色for (int i = 0; i < ROW; i++){for (int j = 0; j < COL + 10; j++){if (j == 0 || j == COL - 1 || j == COL + 9){face.data[i][j] = 1; //標記該位置有方塊CursorJump(2 * j, i);printf("■");}else if (i == ROW - 1){face.data[i][j] = 1; //標記該位置有方塊printf("■");}elseface.data[i][j] = 0; //標記該位置無方塊}}for (int i = COL; i < COL + 10; i++){face.data[8][i] = 1; //標記該位置有方塊CursorJump(2 * i, 8);printf("■");}CursorJump(2 * COL, 1);printf("下一個方塊:");CursorJump(2 * COL + 4, ROW - 19);printf("左移:←");CursorJump(2 * COL + 4, ROW - 17);printf("右移:→");CursorJump(2 * COL + 4, ROW - 15);printf("加速:↓");CursorJump(2 * COL + 4, ROW - 13);printf("旋轉:空格");CursorJump(2 * COL + 4, ROW - 11);printf("暫停: S");CursorJump(2 * COL + 4, ROW - 9);printf("退出: Esc");CursorJump(2 * COL + 4, ROW - 7);printf("重新開始:R");CursorJump(2 * COL + 4, ROW - 5);printf("最高紀錄:%d", max);CursorJump(2 * COL + 4, ROW - 3);printf("當前分數:%d", grade); } //初始化方塊信息 void InitBlockInfo() {//“T”形for (int i = 0; i <= 2; i++)block[0][0].space[1][i] = 1;block[0][0].space[2][1] = 1;//“L”形for (int i = 1; i <= 3; i++)block[1][0].space[i][1] = 1;block[1][0].space[3][2] = 1;//“J”形for (int i = 1; i <= 3; i++)block[2][0].space[i][2] = 1;block[2][0].space[3][1] = 1;for (int i = 0; i <= 1; i++){//“Z”形block[3][0].space[1][i] = 1;block[3][0].space[2][i + 1] = 1;//“S”形block[4][0].space[1][i + 1] = 1;block[4][0].space[2][i] = 1;//“O”形block[5][0].space[1][i + 1] = 1;block[5][0].space[2][i + 1] = 1;}//“I”形for (int i = 0; i <= 3; i++)block[6][0].space[i][1] = 1;int temp[4][4];for (int shape = 0; shape < 7; shape++) //7種形狀{for (int form = 0; form < 3; form++) //4種形態(已經有了一種,這里每個還需增加3種){//獲取第form種形態for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){temp[i][j] = block[shape][form].space[i][j];}}//將第form種形態順時針旋轉,得到第form+1種形態for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){block[shape][form + 1].space[i][j] = temp[3 - j][i];}}}} } //顏色設置 void color(int c) {switch (c){case 0:c = 13; //“T”形方塊設置為紫色break;case 1:case 2:c = 12; //“L”形和“J”形方塊設置為紅色break;case 3:case 4:c = 10; //“Z”形和“S”形方塊設置為綠色break;case 5:c = 14; //“O”形方塊設置為黃色break;case 6:c = 11; //“I”形方塊設置為淺藍色break;default:c = 7; //其他默認設置為白色break;}SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); //顏色設置//注:SetConsoleTextAttribute是一個API(應用程序編程接口) } //畫出方塊 void DrawBlock(int shape, int form, int x, int y) {for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){if (block[shape][form].space[i][j] == 1) //如果該位置有方塊{CursorJump(2 * (x + j), y + i); //光標跳轉到指定位置printf("■"); //輸出方塊}}} } //空格覆蓋 void DrawSpace(int shape, int form, int x, int y) {for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){if (block[shape][form].space[i][j] == 1) //如果該位置有方塊{CursorJump(2 * (x + j), y + i); //光標跳轉到指定位置printf(" "); //打印空格覆蓋(兩個空格)}}} } //合法性判斷 int IsLegal(int shape, int form, int x, int y) {for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){//如果方塊落下的位置本來就已經有方塊了,則不合法if ((block[shape][form].space[i][j] == 1) && (face.data[y + i][x + j] == 1))return 0; //不合法}}return 1; //合法 } //判斷得分與結束 int JudeFunc() {//判斷是否得分for (int i = ROW - 2; i > 4; i--){int sum = 0; //記錄第i行的方塊個數for (int j = 1; j < COL - 1; j++){sum += face.data[i][j]; //統計第i行的方塊個數}if (sum == 0) //該行沒有方塊,無需再判斷其上的層次(無需再繼續判斷是否得分)break; //跳出循環if (sum == COL - 2) //該行全是方塊,可得分{grade += 10; //滿一行加10分color(7); //顏色設置為白色CursorJump(2 * COL + 4, ROW - 3); //光標跳轉到顯示當前分數的位置printf("當前分數:%d", grade); //更新當前分數for (int j = 1; j < COL - 1; j++) //清除得分行的方塊信息{face.data[i][j] = 0; //該位置得分后被清除,標記為無方塊CursorJump(2 * j, i); //光標跳轉到該位置printf(" "); //打印空格覆蓋(兩個空格)}//把被清除行上面的行整體向下挪一格for (int m = i; m >1; m--){sum = 0; //記錄上一行的方塊個數for (int n = 1; n < COL - 1; n++){sum += face.data[m - 1][n]; //統計上一行的方塊個數face.data[m][n] = face.data[m - 1][n]; //將上一行方塊的標識移到下一行face.color[m][n] = face.color[m - 1][n]; //將上一行方塊的顏色編號移到下一行if (face.data[m][n] == 1) //上一行移下來的是方塊,打印方塊{CursorJump(2 * n, m); //光標跳轉到該位置color(face.color[m][n]); //顏色設置為還方塊的顏色printf("■"); //打印方塊}else //上一行移下來的是空格,打印空格{CursorJump(2 * n, m); //光標跳轉到該位置printf(" "); //打印空格(兩個空格)}}if (sum == 0) //上一行移下來的全是空格,無需再將上層的方塊向下移動(移動結束)return 1; //返回1,表示還需調用該函數進行判斷(移動下來的可能還有滿行)}}}//判斷游戲是否結束for (int j = 1; j < COL - 1; j++){if (face.data[1][j] == 1) //頂層有方塊存在(以第1行為頂層,不是第0行){Sleep(1000); //留給玩家反應時間system("cls"); //清空屏幕color(7); //顏色設置為白色CursorJump(2 * (COL / 3), ROW / 2 - 3);if (grade>max){printf("恭喜你打破最高記錄,最高記錄更新為%d", grade);WriteGrade();}else if (grade == max){printf("與最高記錄持平,加油再創佳績", grade);}else{printf("請繼續加油,當前與最高記錄相差%d", max - grade);}CursorJump(2 * (COL / 3), ROW / 2);printf("GAME OVER");while (1){char ch;CursorJump(2 * (COL / 3), ROW / 2 + 3);printf("再來一局?(y/n):");scanf("%c", &ch);if (ch == 'y' || ch == 'Y'){system("cls");main();}else if (ch == 'n' || ch == 'N'){CursorJump(2 * (COL / 3), ROW / 2 + 5);exit(0);}else{CursorJump(2 * (COL / 3), ROW / 2 + 4);printf("選擇錯誤,請再次選擇");}}}}return 0; //判斷結束,無需再調用該函數進行判斷 } //游戲主體邏輯函數 void StartGame() {int shape = rand() % 7, form = rand() % 4; //隨機獲取方塊的形狀和形態while (1){int t = 0;int nextShape = rand() % 7, nextForm = rand() % 4; //隨機獲取下一個方塊的形狀和形態int x = COL / 2 - 2, y = 0; //方塊初始下落位置的橫縱坐標color(nextShape); //顏色設置為下一個方塊的顏色DrawBlock(nextShape, nextForm, COL + 3, 3); //將下一個方塊顯示在右上角while (1){color(shape); //顏色設置為當前正在下落的方塊DrawBlock(shape, form, x, y); //將該方塊顯示在初始下落位置if (t == 0){t = 15000; //這里t越小,方塊下落越快(可以根據此設置游戲難度)}while (--t){if (kbhit() != 0) //若鍵盤被敲擊,則退出循環break;}if (t == 0) //鍵盤未被敲擊{if (IsLegal(shape, form, x, y + 1) == 0) //方塊再下落就不合法了(已經到達底部){//將當前方塊的信息錄入face當中//face:記錄界面的每個位置是否有方塊,若有方塊還需記錄該位置方塊的顏色。for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){if (block[shape][form].space[i][j] == 1){face.data[y + i][x + j] = 1; //將該位置標記為有方塊face.color[y + i][x + j] = shape; //記錄該方塊的顏色數值}}}while (JudeFunc()); //判斷此次方塊下落是否得分以及游戲是否結束break; //跳出當前死循環,準備進行下一個方塊的下落}else //未到底部{DrawSpace(shape, form, x, y); //用空格覆蓋當前方塊所在位置y++; //縱坐標自增(下一次顯示方塊時就相當于下落了一格了)}}else //鍵盤被敲擊{char ch = getch(); //讀取keycodeswitch (ch){case DOWN: //方向鍵:下if (IsLegal(shape, form, x, y + 1) == 1) //判斷方塊向下移動一位后是否合法{//方塊下落后合法才進行以下操作DrawSpace(shape, form, x, y); //用空格覆蓋當前方塊所在位置y++; //縱坐標自增(下一次顯示方塊時就相當于下落了一格了)}break;case LEFT: //方向鍵:左if (IsLegal(shape, form, x - 1, y) == 1) //判斷方塊向左移動一位后是否合法{//方塊左移后合法才進行以下操作DrawSpace(shape, form, x, y); //用空格覆蓋當前方塊所在位置x--; //橫坐標自減(下一次顯示方塊時就相當于左移了一格了)}break;case RIGHT: //方向鍵:右if (IsLegal(shape, form, x + 1, y) == 1) //判斷方塊向右移動一位后是否合法{//方塊右移后合法才進行以下操作DrawSpace(shape, form, x, y); //用空格覆蓋當前方塊所在位置x++; //橫坐標自增(下一次顯示方塊時就相當于右移了一格了)}break;case SPACE: //空格鍵if (IsLegal(shape, (form + 1) % 4, x, y + 1) == 1) //判斷方塊旋轉后是否合法{//方塊旋轉后合法才進行以下操作DrawSpace(shape, form, x, y); //用空格覆蓋當前方塊所在位置y++; //縱坐標自增(總不能原地旋轉吧)form = (form + 1) % 4; //方塊的形態自增(下一次顯示方塊時就相當于旋轉了)}break;case ESC: //Esc鍵system("cls"); //清空屏幕color(7);CursorJump(COL, ROW / 2);printf(" 游戲結束 ");CursorJump(COL, ROW / 2 + 2);exit(0); //結束程序case 's':case 'S': //暫停system("pause>nul"); //暫停(按任意鍵繼續)break;case 'r':case 'R': //重新開始system("cls"); //清空屏幕main(); //重新執行主函數}}}shape = nextShape, form = nextForm; //獲取下一個方塊的信息DrawSpace(nextShape, nextForm, COL + 3, 3); //將右上角的方塊信息用空格覆蓋} } //從文件讀取最高分 void ReadGrade() {FILE* pf = fopen("俄羅斯方塊最高得分記錄.txt", "r"); //以只讀方式打開文件if (pf == NULL) //打開文件失敗{pf = fopen("俄羅斯方塊最高得分記錄.txt", "w"); //以只寫方式打開文件(文件不存在可以自動創建該文件)fwrite(&grade, sizeof(int), 1, pf); //將max寫入文件(此時max為0),即將最高歷史得分初始化為0}fseek(pf, 0, SEEK_SET); //使文件指針pf指向文件開頭fread(&max, sizeof(int), 1, pf); //讀取文件中的最高歷史得分到max當中fclose(pf); //關閉文件pf = NULL; //文件指針及時置空 } //更新最高分到文件 void WriteGrade() {FILE* pf = fopen("俄羅斯方塊最高得分記錄.txt", "w"); //以只寫方式打開文件if (pf == NULL) //打開文件失敗{printf("保存最高得分記錄失敗\n");exit(0);}fwrite(&grade, sizeof(int), 1, pf); //將本局游戲得分寫入文件當中(更新最高歷史得分)fclose(pf); //關閉文件pf = NULL; //文件指針及時置空 }

    游戲代碼詳解

    游戲框架構建

    首先我們定義一下界面的大小,我們這里定義游戲區的行數和列數。

    #define ROW 29 //游戲區行數 #define COL 20 //游戲區列數

    我這里將方塊堆積的區域稱為游戲區,將按鍵提示以及方塊提示的區域稱為提示區。

    我們還需要一個結構體,該結構體記錄界面的每個位置是否有方塊,若有方塊還需記錄該位置方塊的顏色。

    struct Face {int data[ROW][COL + 10]; //用于標記指定位置是否有方塊(1為有,0為無)int color[ROW][COL + 10]; //用于記錄指定位置的方塊顏色編碼 }face;

    其次,我們還需要一個結構體,該結構體當中存儲著一個4行4列的二維數組,這個二維數組就用于存儲單個方塊的基本信息。(眾所周知,4行4列的二維數組可以容納下游戲當中的每一種方塊)

    而俄羅斯方塊當中有7種基本形狀的方塊,而每種方塊通過旋轉后又可以得到3種方塊,共28種。

    因此,我們可以用該結構體定義一個7行4列的二維數組存儲這28個方塊的信息。

    struct Block {int space[4][4]; }block[7][4]; //用于存儲7種基本形狀方塊的各自的4種形態的信息,共28種

    做到這里框架已經基本構建好了,為了提高代碼的可讀性,我們再根據需要用到的按鍵的鍵碼值對其進行宏定義。

    #define DOWN 80 //方向鍵:下 #define LEFT 75 //方向鍵:左 #define RIGHT 77 //方向鍵:右#define SPACE 32 //空格鍵 #define ESC 27 //Esc鍵

    隱藏光標

    光標的作用在于提醒使用者,你接下來的輸入將會在該位置出現。但在進行游戲時我們并不需要用到光標,光標在那里一閃一閃的顯然是不行的,這時我們需要將光標隱藏。

    //隱藏光標 void HideCursor() {CONSOLE_CURSOR_INFO curInfo; //定義光標信息的結構體變量curInfo.dwSize = 1; //如果沒賦值的話,隱藏光標無效curInfo.bVisible = FALSE; //將光標設置為不可見HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //獲取控制臺句柄SetConsoleCursorInfo(handle, &curInfo); //設置光標信息 }

    其中,關鍵結構CONSOLE_CURSOR_INFO在其頭文件當中的內容如下:

    設置光標信息函數在其頭文件中的聲明如下:

    光標跳轉

    在屏幕上進行輸出時,我們需要光標先移動到目標位置再進行輸出,因此,光標跳轉函數也是必不可少的。

    //光標跳轉 void CursorJump(int x, int y) {COORD pos; //定義光標位置的結構體變量pos.X = x; //橫坐標設置pos.Y = y; //縱坐標設置HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //獲取控制臺句柄SetConsoleCursorPosition(handle, pos); //設置光標位置 }

    其中,關鍵結構COORD在其頭文件當中的內容如下:

    設置光標位置函數在其頭文件中的聲明如下:

    初始化界面

    初始化界面完成基本信息的打印,包括由白色方塊構成的邊界和按鍵提示語句。

    對照最終效果圖片,看著代碼很好理解,但是需要注意兩點

  • 一個小方塊在cmd命令窗口當中占兩個單位的橫坐標、一個單位的縱坐標。
  • 光標跳轉函數CursorJump接收的是光標將要跳至的橫縱坐標。
  • 例如,想要將光標跳轉到 i 行 j 列(這里所說的行和列都是以一個方塊為單位),就等價于讓光標跳轉到坐標(2*j,i)處。

    //初始化界面 void InitInterface() {color(7); //顏色設置為白色for (int i = 0; i < ROW; i++){for (int j = 0; j < COL + 10; j++){if (j == 0 || j == COL - 1 || j == COL + 9){face.data[i][j] = 1; //標記該位置有方塊CursorJump(2 * j, i);printf("■");}else if (i == ROW - 1){face.data[i][j] = 1; //標記該位置有方塊printf("■");}elseface.data[i][j] = 0; //標記該位置無方塊}}for (int i = COL; i < COL + 10; i++){face.data[8][i] = 1; //標記該位置有方塊CursorJump(2 * i, 8);printf("■");}CursorJump(2 * COL, 1);printf("下一個方塊:");CursorJump(2 * COL + 4, ROW - 19);printf("左移:←");CursorJump(2 * COL + 4, ROW - 17);printf("右移:→");CursorJump(2 * COL + 4, ROW - 15);printf("加速:↓");CursorJump(2 * COL + 4, ROW - 13);printf("旋轉:空格");CursorJump(2 * COL + 4, ROW - 11);printf("暫停: S");CursorJump(2 * COL + 4, ROW - 9);printf("退出: Esc");CursorJump(2 * COL + 4, ROW - 7);printf("重新開始:R");CursorJump(2 * COL + 4, ROW - 5);printf("最高紀錄:%d", max);CursorJump(2 * COL + 4, ROW - 3);printf("當前分數:%d", grade); }

    初始化方塊信息

    上面說到俄羅斯方塊有7種基本形狀,便是以下7種:

    我們先將這7種基本形狀的方塊信息存儲在各自的第0種形態處,如下:

    然后取第0種形態順時針旋轉后得到第1種形態,取第1種形態順時針旋轉后得到第2種形態,取第2種形態順時針旋轉后得到第3種形態。這7種形狀都按此方法操作,最終得到全部28種方塊信息,如下:

    在旋轉過程中,一個方塊順時針旋轉一次后其位置變換規律如下:

    //初始化方塊信息 void InitBlockInfo() {//“T”形for (int i = 0; i <= 2; i++)block[0][0].space[1][i] = 1;block[0][0].space[2][1] = 1;//“L”形for (int i = 1; i <= 3; i++)block[1][0].space[i][1] = 1;block[1][0].space[3][2] = 1;//“J”形for (int i = 1; i <= 3; i++)block[2][0].space[i][2] = 1;block[2][0].space[3][1] = 1;for (int i = 0; i <= 1; i++){//“Z”形block[3][0].space[1][i] = 1;block[3][0].space[2][i + 1] = 1;//“S”形block[4][0].space[1][i + 1] = 1;block[4][0].space[2][i] = 1;//“O”形block[5][0].space[1][i + 1] = 1;block[5][0].space[2][i + 1] = 1;}//“I”形for (int i = 0; i <= 3;i++)block[6][0].space[i][1] = 1;int temp[4][4];for (int shape = 0; shape < 7; shape++) //7種形狀{for (int form = 0; form < 3; form++) //4種形態(已經有了一種,這里每個還需增加3種){//獲取第form種形態for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){temp[i][j] = block[shape][form].space[i][j];}}//將第form種形態順時針旋轉,得到第form+1種形態for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){block[shape][form + 1].space[i][j] = temp[3 - j][i];}}}} }

    顏色設置

    這里的顏色設置函數所接收的參數c(0~6),代表7種形狀的方塊,每種方塊對應自己的顏色,所對應的顏色可以自己設置。

    //顏色設置 void color(int c) {switch (c){case 0:c = 13; //“T”形方塊設置為紫色break;case 1:case 2:c = 12; //“L”形和“J”形方塊設置為紅色break;case 3:case 4:c = 10; //“Z”形和“S”形方塊設置為綠色break;case 5:c = 14; //“O”形方塊設置為黃色break;case 6:c = 11; //“I”形方塊設置為淺藍色break;default:c = 7; //其他默認設置為白色break;}SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); //顏色設置//注:SetConsoleTextAttribute是一個API(應用程序編程接口) }

    設置顏色函數在其頭文件中的聲明如下:

    畫出方塊

    方塊的信息有了,接下來就是將方塊在屏幕上顯示出來。該函數的作用是,將第shape種形狀的第form種形態的方塊打印在屏幕的指定位置處。

    所給x和y,指的是方塊信息當中第一行第一列的方塊的打印位置。

    //畫出方塊 void DrawBlock(int shape, int form, int x, int y) {for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){if (block[shape][form].space[i][j] == 1) //如果該位置有方塊{CursorJump(2 * (x + j), y + i); //光標跳轉到指定位置printf("■"); //輸出方塊}}} }

    空格覆蓋

    無論是游戲區方塊的移動,還是提示區右上角下一個方塊的顯示,都需要方塊位置的變換,而在變化之前肯定是要先將之前打印的方塊用空格進行覆蓋,然后再打印變化后的方塊。

    在覆蓋方塊時特別需要注意的是,要覆蓋一個小方塊需要用兩個空格。

    //空格覆蓋 void DrawSpace(int shape, int form, int x, int y) {for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){if (block[shape][form].space[i][j] == 1) //如果該位置有方塊{CursorJump(2 * (x + j), y + i); //光標跳轉到指定位置printf(" "); //打印空格覆蓋(兩個空格)}}} }

    合法性判斷

    其實在方塊移動過程中,無時無刻都在判斷方塊下一次變化后的位置是否合法,只有合法才會允許該變化的進行。

    所謂非法,就是指該方塊進行了該變化后落在了本來就有方塊的位置。

    //合法性判斷 int IsLegal(int shape, int form, int x, int y) {for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){//如果方塊落下的位置本來就已經有方塊了,則不合法if ((block[shape][form].space[i][j] == 1) && (face.data[y + i][x + j] == 1))return 0; //不合法}}return 1; //合法 }

    判斷得分與結束

    判斷得分:
    從下往上判斷,若某一行方塊全滿,則將改行方塊數據清空,并將該行上方的方塊全部下移,下移結束后返回1,表示還需再次調用該函數進行判斷,因為被下移的行并沒有進行判斷,可能還存在滿行。

    判斷結束:

  • 直接判斷游戲區最上面的一行當中是否有方塊存在,若存在方塊,則游戲結束。
  • 游戲結束后,除了給出游戲結束提示語之外,如果玩家本局游戲分數大于歷史最高記錄,則需要更新最高分到文件當中。
  • 游戲結束后詢問玩家是否再來一局。
  • //判斷得分與結束 int JudeFunc() {//判斷是否得分for (int i = ROW - 2; i > 4; i--){int sum = 0; //記錄第i行的方塊個數for (int j = 1; j < COL - 1; j++){sum += face.data[i][j]; //統計第i行的方塊個數}if (sum == 0) //該行沒有方塊,無需再判斷其上的層次(無需再繼續判斷是否得分)break; //跳出循環if (sum == COL - 2) //該行全是方塊,可得分{grade += 10; //滿一行加10分color(7); //顏色設置為白色CursorJump(2 * COL + 4, ROW - 3); //光標跳轉到顯示當前分數的位置printf("當前分數:%d", grade); //更新當前分數for (int j = 1; j < COL - 1; j++) //清除得分行的方塊信息{face.data[i][j] = 0; //該位置得分后被清除,標記為無方塊CursorJump(2 * j, i); //光標跳轉到該位置printf(" "); //打印空格覆蓋(兩個空格)}//把被清除行上面的行整體向下挪一格for (int m = i; m >1; m--){sum = 0; //記錄上一行的方塊個數for (int n = 1; n < COL - 1; n++){sum += face.data[m - 1][n]; //統計上一行的方塊個數face.data[m][n] = face.data[m - 1][n]; //將上一行方塊的標識移到下一行face.color[m][n] = face.color[m - 1][n]; //將上一行方塊的顏色編號移到下一行if (face.data[m][n] == 1) //上一行移下來的是方塊,打印方塊{CursorJump(2 * n, m); //光標跳轉到該位置color(face.color[m][n]); //顏色設置為還方塊的顏色printf("■"); //打印方塊}else //上一行移下來的是空格,打印空格{CursorJump(2 * n, m); //光標跳轉到該位置printf(" "); //打印空格(兩個空格)}}if (sum == 0) //上一行移下來的全是空格,無需再將上層的方塊向下移動(移動結束)return 1; //返回1,表示還需調用該函數進行判斷(移動下來的可能還有滿行)}}}//判斷游戲是否結束for (int j = 1; j < COL - 1; j++){if (face.data[1][j] == 1) //頂層有方塊存在(以第1行為頂層,不是第0行){Sleep(1000); //留給玩家反應時間system("cls"); //清空屏幕color(7); //顏色設置為白色CursorJump(2 * (COL / 3), ROW / 2 - 3);if (grade>max){printf("恭喜你打破最高記錄,最高記錄更新為%d", grade);WriteGrade();}else if (grade == max){printf("與最高記錄持平,加油再創佳績", grade);}else{printf("請繼續加油,當前與最高記錄相差%d", max - grade);}CursorJump(2 * (COL / 3), ROW / 2);printf("GAME OVER");while (1){char ch;CursorJump(2 * (COL / 3), ROW / 2 + 3);printf("再來一局?(y/n):");scanf("%c", &ch);if (ch == 'y' || ch == 'Y'){system("cls");main();}else if (ch == 'n' || ch == 'N'){CursorJump(2 * (COL / 3), ROW / 2 + 5);exit(0);}else{CursorJump(2 * (COL / 3), ROW / 2 + 4);printf("選擇錯誤,請再次選擇");}}}}return 0; //判斷結束,無需再調用該函數進行判斷 }

    游戲主體邏輯函數

    主體邏輯:

  • 在打印當前下落的方塊前,先隨機獲取下一次將要下落的方塊,并打印到提示區的右上角。
  • 將當前下落的方塊首先打印到游戲區頂部,給定一定的時間間隔,若在該時間內鍵盤未被敲擊,則方塊下落一格,方塊下落前需先判斷下落后的合法性。
  • 若在給定時間間隔內鍵盤被敲擊,則根據所敲擊的按鍵給出相應反饋。
  • 若方塊落到底部,則調用“判斷得分與結束”函數進行判斷。
  • 若游戲未結束,則循環進行以上步驟。
  • //游戲主體邏輯函數 void StartGame() { int shape = rand() % 7, form = rand() % 4; //隨機獲取方塊的形狀和形態while (1){int t = 0;int nextShape = rand() % 7, nextForm = rand() % 4; //隨機獲取下一個方塊的形狀和形態int x = COL / 2 - 2, y = 0; //方塊初始下落位置的橫縱坐標color(nextShape); //顏色設置為下一個方塊的顏色DrawBlock(nextShape, nextForm, COL + 3, 3); //將下一個方塊顯示在右上角while (1){color(shape); //顏色設置為當前正在下落的方塊DrawBlock(shape, form, x, y); //將該方塊顯示在初始下落位置if (t == 0){t = 15000; //這里t越小,方塊下落越快(可以根據此設置游戲難度)}while (--t){if (kbhit() != 0) //若鍵盤被敲擊,則退出循環break;}if (t == 0) //鍵盤未被敲擊{if (IsLegal(shape, form, x, y + 1) == 0) //方塊再下落就不合法了(已經到達底部){//將當前方塊的信息錄入face當中//face:記錄界面的每個位置是否有方塊,若有方塊還需記錄該位置方塊的顏色。for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){if (block[shape][form].space[i][j] == 1){face.data[y + i][x + j] = 1; //將該位置標記為有方塊face.color[y + i][x + j] = shape; //記錄該方塊的顏色數值}}}while (JudeFunc()); //判斷此次方塊下落是否得分以及游戲是否結束break; //跳出當前死循環,準備進行下一個方塊的下落}else //未到底部{DrawSpace(shape, form, x, y); //用空格覆蓋當前方塊所在位置y++; //縱坐標自增(下一次顯示方塊時就相當于下落了一格了)}}else //鍵盤被敲擊{char ch = getch(); //讀取keycodeswitch (ch){case DOWN: //方向鍵:下if (IsLegal(shape, form, x, y + 1) == 1) //判斷方塊向下移動一位后是否合法{//方塊下落后合法才進行以下操作DrawSpace(shape, form, x, y); //用空格覆蓋當前方塊所在位置y++; //縱坐標自增(下一次顯示方塊時就相當于下落了一格了)}break;case LEFT: //方向鍵:左if (IsLegal(shape, form, x - 1, y) == 1) //判斷方塊向左移動一位后是否合法{//方塊左移后合法才進行以下操作DrawSpace(shape, form, x, y); //用空格覆蓋當前方塊所在位置x--; //橫坐標自減(下一次顯示方塊時就相當于左移了一格了)}break;case RIGHT: //方向鍵:右if (IsLegal(shape, form, x + 1, y) == 1) //判斷方塊向右移動一位后是否合法{//方塊右移后合法才進行以下操作DrawSpace(shape, form, x, y); //用空格覆蓋當前方塊所在位置x++; //橫坐標自增(下一次顯示方塊時就相當于右移了一格了)}break;case SPACE: //空格鍵if (IsLegal(shape, (form + 1) % 4, x, y + 1) == 1) //判斷方塊旋轉后是否合法{//方塊旋轉后合法才進行以下操作DrawSpace(shape, form, x, y); //用空格覆蓋當前方塊所在位置y++; //縱坐標自增(總不能原地旋轉吧)form = (form + 1) % 4; //方塊的形態自增(下一次顯示方塊時就相當于旋轉了)}break;case ESC: //Esc鍵system("cls"); //清空屏幕color(7);CursorJump(COL, ROW / 2);printf(" 游戲結束 ");CursorJump(COL, ROW / 2 + 2);exit(0); //結束程序case 's':case 'S': //暫停system("pause>nul"); //暫停(按任意鍵繼續)break;case 'r':case 'R': //重新開始system("cls"); //清空屏幕main(); //重新執行主函數}}}shape = nextShape, form = nextForm; //獲取下一個方塊的信息DrawSpace(nextShape, nextForm, COL + 3, 3); //將右上角的方塊信息用空格覆蓋} }

    注意: 這里只是概括性的說明了俄羅斯方塊的主體邏輯,代碼當中還有大量注釋以供大家理解。

    從文件讀取最高分

    首先需要使用fopen函數打開“俄羅斯方塊最高記錄.txt”文件,若是第一次運行該代碼,則會自動創建該文件,并將歷史最高記錄設置為0,之后讀取文件當中的歷史最高記錄存儲在max變量當中,并關閉文件即可。

    //從文件讀取最高分 void ReadGrade() {FILE* pf = fopen("俄羅斯方塊最高得分記錄.txt", "r"); //以只讀方式打開文件if (pf == NULL) //打開文件失敗{pf = fopen("俄羅斯方塊最高得分記錄.txt", "w"); //以只寫方式打開文件(文件不存在可以自動創建該文件)fwrite(&grade, sizeof(int), 1, pf); //將max寫入文件(此時max為0),即將最高歷史得分初始化為0}fseek(pf, 0, SEEK_SET); //使文件指針pf指向文件開頭fread(&max, sizeof(int), 1, pf); //讀取文件中的最高歷史得分到max當中fclose(pf); //關閉文件pf = NULL; //文件指針及時置空 }

    更新最高分到文件

    首先使用fopen函數打開“俄羅斯方塊最高記錄.txt”,然后將本局游戲的分數grade寫入文件當中即可(覆蓋式)。

    //更新最高分到文件 void WriteGrade() {FILE* pf = fopen("俄羅斯方塊最高得分記錄.txt", "w"); //以只寫方式打開文件if (pf == NULL) //打開文件失敗{printf("保存最高得分記錄失敗\n");exit(0);}fwrite(&grade, sizeof(int), 1, pf); //將本局游戲得分寫入文件當中(更新最高歷史得分)fclose(pf); //關閉文件pf = NULL; //文件指針及時置空 }

    主函數

    主函數里面就是依次調用以上函數,但有三點需要說明

  • 全局變量grade需要在主函數內初始化為0,不能在全局范圍初始化為0,因為當玩家按下R鍵進行重玩時我們需要將當前分數grade重新設置為0。
  • 隨機數的生成起點建議設置在主函數當中。
  • 主函數當中的#pragma語句是用于消除類似以下警告的:
  • int max, grade; //全局變量 int main() { #pragma warning (disable:4996) //消除警告max = 0, grade = 0; //初始化變量system("title 俄羅斯方塊"); //設置cmd窗口的名字system("mode con lines=29 cols=60"); //設置cmd窗口的大小HideCursor(); //隱藏光標ReadGrade(); //從文件讀取最高分到max變量 InitInterface(); //初始化界面InitBlockInfo(); //初始化方塊信息srand((unsigned int)time(NULL)); //設置隨機數生成的起點StartGame(); //開始游戲return 0; }

    總結

    以上是生活随笔為你收集整理的俄罗斯方块(C语言实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    久久久久久毛片 | 欧美日韩国产精品爽爽 | 日韩电影一区二区在线观看 | 天天射网| 天天爽人人爽夜夜爽 | 不卡视频国产 | 毛片网在线观看 | 在线观看色网站 | 福利视频区 | 天天操天天色天天射 | 天天干,夜夜操 | 天天操夜操 | 中文字幕区| 91精品夜夜 | 色天天综合网 | 欧美最猛性xxxxx(亚洲精品) | 99精品一级欧美片免费播放 | 丝袜美腿亚洲综合 | 成人免费av电影 | 午夜视频在线观看网站 | 亚洲 欧美 变态 国产 另类 | 四虎天堂 | 日日夜夜添 | 91人人澡人人爽人人精品 | 久久久久久久久毛片 | 在线有码中文字幕 | 免费观看一级一片 | 欧美激情xxxx性bbbb | 成人av资源| 国产精品色婷婷视频 | 天天草av | 日韩av片免费在线观看 | 久久污视频 | 狠狠色丁香九九婷婷综合五月 | 欧美精品免费一区二区 | 色诱亚洲精品久久久久久 | 欧美一进一出抽搐大尺度视频 | 亚洲综合在线五月 | 国产精品亚洲片夜色在线 | 日韩激情视频在线 | 久久精品中文字幕一区二区三区 | 97电影在线观看 | 日本高清中文字幕有码在线 | 久草在线视频精品 | 西西444www大胆无视频 | 亚洲精品视频久久 | 久久色中文字幕 | 中文字幕在线观看免费高清电影 | 国产99在线免费 | 久av电影| 国产高清视频在线免费观看 | 国产亚洲精品精品精品 | 在线中文字母电影观看 | 激情久久久 | 国产精品成人国产乱 | 天天摸天天操天天爽 | 免费黄色在线 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 人人射人人爽 | 美女久久久久久 | 午夜久久 | 91成人网页版 | 国产精品久久久久久久久久久久午夜 | 丁香视频全集免费观看 | 最新91在线视频 | 亚洲国产精品人久久电影 | 成人av电影免费在线播放 | 天天亚洲 | 精品在线观看国产 | 色在线网站 | 天堂网一区二区 | 精品福利视频在线 | 免费观看版 | 最近中文字幕在线中文高清版 | 天天曰夜夜爽 | 超碰官网| 黄色大片视频网站 | 色婷婷狠 | 国产精品久久久影视 | 四虎在线永久免费观看 | 欧美黑人xxxx猛性大交 | 欧美在一区| 亚洲视频网站在线观看 | 欧美视频在线观看免费网址 | 四虎国产精品永久在线国在线 | 中文字幕在线网址 | 国产精品麻豆99久久久久久 | 最新av网址在线观看 | 日本久久成人 | 日韩va在线观看 | 亚洲精品自拍视频在线观看 | 天天色天天干天天色 | 色国产在线 | 亚洲免费国产 | 免费观看www视频 | av成人在线看 | 免费又黄又爽 | 成人av在线影视 | 亚洲精品在线电影 | 亚洲午夜久久久综合37日本 | 久久精品国产99 | 免费视频99 | 国产专区视频在线 | 中文字幕麻豆 | 日韩欧美中文 | 久久国产精品免费一区二区三区 | 天堂av在线免费 | 欧洲成人av | 色综合久久久久久中文网 | 黄色在线免费观看网址 | 久久激情小视频 | 91成年视频 | 天天艹天天干天天 | 在线观看va | 色狠狠操 | 黄色成人在线 | 婷五月天激情 | 综合在线色 | 国产精品视频永久免费播放 | 97色婷婷成人综合在线观看 | 久久成熟 | 国产成人a v电影 | 久久久久亚洲精品中文字幕 | 日日夜精品 | 夜夜高潮夜夜爽国产伦精品 | 久久久久久久久久久高潮一区二区 | 久久96国产精品久久99漫画 | 成人av资源网 | 五月天婷婷在线观看视频 | 欧美日韩成人一区 | 亚洲天堂va| av在线免费观看不卡 | 天天摸天天操天天爽 | 青青草在久久免费久久免费 | 国产亚洲午夜高清国产拍精品 | 久久综合射 | 中文字幕 二区 | 手机成人在线电影 | 国产一级免费片 | 色综合久久久久久久 | 亚洲资源网 | 日本最新中文字幕 | 成人av直播| 久草干| 999成人网| 91中文字幕在线观看 | 中文字幕人成乱码在线观看 | 国产玖玖精品视频 | 亚洲视频1 | 欧美日韩观看 | 亚洲天天摸日日摸天天欢 | 亚洲美女视频网 | 亚洲天天摸日日摸天天欢 | 国产精品成人免费一区久久羞羞 | 日韩专区在线 | 一区二区三区四区五区在线 | 色a综合 | 99久热在线精品视频成人一区 | 久久久久久久久久久久99 | 亚洲精品在线电影 | 中文超碰字幕 | 91视频免费观看 | 久草视频免费看 | 五月天六月婷婷 | av一区二区三区在线播放 | 中文字幕在线高清 | 日韩精品极品视频 | 久久99精品一区二区三区三区 | 国产精品大全 | 久久久久久久久久久电影 | 午夜av在线播放 | 韩国视频一区二区三区 | 超碰激情在线 | 国产视频91在线 | 欧美激情综合色 | 亚洲动漫在线观看 | 婷婷久久亚洲 | 亚洲 成人 一区 | 色视频网站免费观看 | 亚洲精品日韩在线观看 | 狠狠操狠狠操 | 91九色在线视频观看 | 国产精品视频内 | 中文字幕乱码电影 | 日韩三级中文字幕 | 毛片网在线 | 久草国产在线观看 | 日韩和的一区二在线 | www色,com| 三级av网| 久久99欧美 | 久久97久久97精品免视看 | 中文字幕在线一区二区三区 | 一区二区 久久 | 黄色大片中国 | 久久超碰在线 | av在线免费不卡 | 亚洲资源在线 | 国产一区在线看 | 亚洲精品小视频 | 一区二区三区手机在线观看 | 午夜 久久 tv| 亚洲日本韩国一区二区 | 天天色婷婷 | 69av久久 | 夜夜躁狠狠躁日日躁 | 不卡的av| 久久精品三级 | 8x成人免费视频 | 色婷婷av国产精品 | 国产精品123| 亚洲国产成人av网 | 日韩xxxx视频 | 在线观看黄a| 久久资源总站 | 成人h动漫在线看 | 欧美日韩在线视频观看 | 免费观看v片在线观看 | 国产免费高清 | 伊人久久精品久久亚洲一区 | 午夜精品视频在线 | 久久久午夜影院 | 韩国av一区二区 | 91资源在线免费观看 | www.午夜视频 | 973理论片235影院9 | 成年人免费观看在线视频 | 中文字幕在线免费看 | 中文字幕一区二区三区四区 | 久久免费播放 | 午夜婷婷在线观看 | 国产一级黄色片免费看 | 黄色软件在线观看免费 | 亚洲精品久久久久久久蜜桃 | 国产你懂的在线 | 一级片黄色片网站 | 在线观看免费成人av | 在线免费观看的av网站 | 九九热re| 中文字幕免费高清 | 欧美成人精品欧美一级乱 | 中文字幕中文字幕在线中文字幕三区 | 一区二区三区韩国免费中文网站 | 国产中文字幕精品 | 公与妇乱理三级xxx 在线观看视频在线观看 | 天天爱天天舔 | 在线一二区 | 在线观看视频黄 | 国产精品一区二区久久国产 | 天天鲁一鲁摸一摸爽一爽 | 福利视频一区二区 | 在线观看中文字幕视频 | 婷婷视频在线 | 一区二区三区四区精品 | 444av| 久久神马影院 | 欧美一级裸体视频 | 日韩精品在线播放 | 日韩在线观看网址 | 亚洲精品午夜久久久久久久 | 在线99 | 在线观看视频亚洲 | 国产亚洲综合性久久久影院 | 日韩av片无码一区二区不卡电影 | 久久99精品久久久久婷婷 | 天天干夜夜擦 | 日本一区二区不卡高清 | 亚洲精品黄色在线观看 | 最近中文字幕国语免费高清6 | 亚洲婷婷综合色高清在线 | 亚洲精品乱码 | 国产精久久 | 精品99免费视频 | 久久激情小视频 | 亚洲精品国产精品国产 | 日本女人的性生活视频 | 九九免费在线看完整版 | av成人资源 | 欧美日韩二区在线 | 国产自产在线视频 | 久久久久女教师免费一区 | 看黄色91| www.天天操| 国产成人av网 | 亚洲影院一区 | 亚洲天堂网在线视频 | 亚洲蜜桃av| 国产日产精品久久久久快鸭 | 天堂黄色片 | 日韩欧美网址 | 国产999视频 | 最近中文字幕mv免费高清在线 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 日韩高清一区在线 | 欧美五月婷婷 | 久久久久免费精品视频 | 91看片黄色 | 国产精品成人免费一区久久羞羞 | 久久er99热精品一区二区三区 | 亚洲国产电影在线观看 | 在线成人一区 | 久久这里只有精品久久 | 亚洲精品国产精品久久99 | 亚洲欧洲精品久久 | 在线观看国产永久免费视频 | 午夜精品久久久久久久99水蜜桃 | 国产999精品久久久久久麻豆 | 久久国产精品小视频 | 日韩色一区二区三区 | 精品一区二区三区久久久 | 激情综合五月天 | www.色午夜,com| 99re久久资源最新地址 | 午夜三级理论 | 婷婷五天天在线视频 | 色窝资源 | 国产一区二区中文字幕 | 91九色精品| 久久精品视频在线观看免费 | 四虎影视成人永久免费观看视频 | 国产福利一区二区三区在线观看 | 99免费观看视频 | 久久精品视频国产 | 国产精品ssss在线亚洲 | 亚洲dvd| 狠狠综合久久 | 亚洲无线视频 | 九九久久免费视频 | 99热九九这里只有精品10 | 99这里只有精品99 | 亚洲成人精品国产 | 日韩精品一区二区三区三炮视频 | 中国一级片免费看 | 在线国产黄色 | 一区二区欧美在线观看 | 国产色在线视频 | 日韩视频二区 | 黄色免费观看网址 | 五月天中文字幕mv在线 | 97超级碰 | 日韩在线一二三区 | 午夜丁香网 | 主播av在线 | 精品不卡av| 欧洲精品视频一区 | 日韩欧美国产激情在线播放 | 四虎影视精品永久在线观看 | 日韩欧美一区二区三区视频 | 免费日韩一区二区三区 | 啪啪小视频网站 | 91九色国产 | 综合色播 | 国产资源精品 | 日韩av播放在线 | 91试看 | 午夜久久美女 | 欧美日韩国产三级 | 国产91精品一区二区麻豆网站 | 亚洲国产精品第一区二区 | 亚洲2019精品| 精品久久网 | a级国产片 | 又黄又刺激又爽的视频 | 国产午夜精品一区二区三区欧美 | 久久久久久久久久免费视频 | 国产在线一区二区 | 国产一级淫片免费看 | 国产精品 久久 | 伊人婷婷综合 | 麻豆精品在线 | 国产一级视频 | 一区二区网 | 91探花系列在线播放 | 久久99精品国产99久久6尤 | 韩国精品在线观看 | 国产精品综合av一区二区国产馆 | 久久久久亚洲精品国产 | 亚洲国产激情 | 久草在在线视频 | 麻豆视频www| 激情久久综合网 | 91视频亚洲 | 国产精品毛片久久久久久久 | 亚洲免费视频观看 | 国产精品入口传媒 | 久久国产热 | 日韩欧美在线视频一区二区 | 免费在线观看日韩视频 | 99操视频| 黄色成人影院 | 91福利视频久久久久 | 久久婷婷色 | 91片网| 亚洲国产日韩在线 | 亚洲 av网站| 亚洲成人网在线 | 久草在线 | 不卡的av片 | 国产精品入口麻豆www | 国产精品自产拍在线观看蜜 | 国产又黄又猛又粗 | 久久人人插 | 国产精品99久久久久久小说 | 天天操天天干天天爽 | 99在线热播精品免费 | 五月天久久激情 | av综合av | 国产成人精品久 | 久久综合综合久久综合 | 精品在线一区二区三区 | 美女网站免费福利视频 | 午夜影院在线观看18 | 久久手机看片 | 天天操夜夜摸 | 日韩天天操 | 亚洲精品视频中文字幕 | 国产破处精品 | 亚洲视频一区二区三区在线观看 | 亚洲视频在线免费观看 | 在线免费视频a | 欧美性做爰猛烈叫床潮 | .国产精品成人自产拍在线观看6 | 成 人 黄 色 视频播放1 | 亚洲欧美日韩国产一区二区三区 | 日日干夜夜操视频 | 日韩欧美一区二区在线观看 | 国产中文字幕国产 | 激情网在线视频 | 日韩高清片 | 四虎国产精品成人免费4hu | 在线久久 | 天天透天天插 | 欧美日韩视频在线 | 天天看天天干天天操 | 国产精品女教师 | 日韩h在线观看 | 成人毛片一区 | 日韩精品在线免费播放 | 欧美日韩不卡一区 | 国产69久久| 免费在线观看国产精品 | 色吧av色av | 成人宗合网 | 欧美精品一区二区蜜臀亚洲 | 久久人人爽人人爽人人 | 久久人人97超碰精品888 | 国内精品久久久久影院男同志 | 最新亚洲视频 | 在线播放国产精品 | 久久久亚洲国产精品麻豆综合天堂 | 九九热久久免费视频 | 999在线视频 | 日韩 在线a | 99九九99九九九视频精品 | 欧美极品在线播放 | 国产成人在线综合 | 久久久免费观看视频 | 成人在线免费看视频 | 欧洲精品久久久久毛片完整版 | 国产91精品久久久久 | 亚洲高清免费在线 | 伊人宗合网 | av在线播放网址 | 婷婷网站天天婷婷网站 | 午夜精品久久久久久久久久 | 99色视频在线| 久久国产精品一区二区 | 国产原创av片 | 中文字幕在线免费97 | 天天操天天干天天操天天干 | 99综合久久 | 在线视频久| 韩国av免费看 | 国产永久免费高清在线观看视频 | 天天色天天操综合网 | 国产高清免费视频 | 粉嫩av一区二区三区四区在线观看 | 夜夜爽88888免费视频4848 | 久久久久久免费 | av免费网站观看 | 国产在线精品区 | 天堂激情网 | 日韩欧美在线不卡 | 91成人在线免费观看 | 免费亚洲成人 | 久草com| 欧美精品中文 | 99久久99久久精品免费 | 日韩高清精品一区二区 | 六月婷婷久香在线视频 | 国产福利精品一区二区 | 69av免费视频 | 99精品免费网 | 免费手机黄色网址 | 国产免费视频一区二区裸体 | 国内视频在线 | 国产高清中文字幕 | 美女网站视频免费黄 | 玖玖在线观看视频 | 久久人人爽 | 91麻豆文化传媒在线观看 | 亚洲国产精品成人综合 | 国产免费午夜 | 在线免费成人 | 日韩中午字幕 | 欧美999| 国产精品成人av电影 | 久久综合九色综合久99 | 国产淫片| 9在线观看免费高清完整 | 日韩精品电影在线播放 | 在线视频专区 | 手机成人av在线 | 射综合网 | 国产精品久久久久一区二区三区共 | 日本大尺码专区mv | 久久9999久久免费精品国产 | 日本三级在线观看中文字 | 亚洲精品视频第一页 | 欧美aaa视频| 在线免费观看成人 | 黄污视频网站 | 91丨九色丨高潮 | 人人澡av | av网站免费看 | 天天在线免费视频 | 国产毛片在线 | 成年人网站免费观看 | 国产香蕉久久精品综合网 | 午夜丁香网| 一级黄色在线视频 | av资源网在线播放 | 国产一区二区精品 | 国产精品视频免费观看 | 亚洲国产一区在线观看 | 亚洲黄色免费 | 狠狠操导航 | 看片黄网站| 99精品黄色片免费大全 | 久久久久久免费 | 精品美女视频 | 99视频在线免费播放 | 久久婷婷综合激情 | 人人爽人人干 | 日本aaa在线观看 | 精品国产一区二区三区久久久蜜臀 | 99国产视频 | 丝袜+亚洲+另类+欧美+变态 | 免费观看www视频 | 国产精品久久久久久久久久久久久久 | 国产精品久久 | 最近中文字幕高清字幕免费mv | 日韩欧美国产视频 | 国产破处在线播放 | 99色免费 | 婷婷av资源| 日韩欧美成 | 国产成人一区二区三区久久精品 | 人人干狠狠操 | 欧美一级特黄aaaaaa大片在线观看 | 国产在线更新 | 国产精品第 | 国产精品久久久久高潮 | 国产日本在线观看 | 久久a国产 | 欧美在线视频二区 | 五月天欧美精品 | 一区中文字幕电影 | 一色屋精品视频在线观看 | 永久av免费在线观看 | 日日操天天操狠狠操 | 国产视频一区二区三区在线 | 日韩精品免费一区二区三区 | 久久久久久网 | 在线看不卡av | 国产日产精品一区二区三区四区的观看方式 | www.在线观看av | 99精品热 | 激情综合色播五月 | 天天插综合 | 在线免费视频你懂的 | 在线观看日韩精品 | 丁香五婷 | 黄色的网站在线 | 在线观看成人毛片 | 又黄又刺激又爽的视频 | .国产精品成人自产拍在线观看6 | av网站有哪些| 亚洲精品成人网 | 日韩精品不卡在线观看 | 国产成人99av超碰超爽 | 77国产精品| 日韩精品一区二区三区外面 | 久久精品成人欧美大片古装 | 奇米网444 | 亚洲精品美女久久17c | 精品国产一区二区三区久久久 | 国产不卡免费 | 不卡国产在线 | 国产99久久精品一区二区300 | 毛片网在线播放 | 日韩1级片 | 久草久| 91高清视频免费 | 特级毛片爽www免费版 | 激情 一区二区 | 99亚洲视频 | 狠狠操欧美 | 国产一区二区三精品久久久无广告 | 亚洲专区在线视频 | 免费看一及片 | 亚洲日b视频 | 精品视频免费看 | 麻豆成人精品 | 国产剧情一区二区 | 久久社区视频 | 综合天天色 | 亚洲涩涩涩涩涩涩 | 欧美日韩另类在线观看 | 日韩欧美一区二区三区在线观看 | 国产精品久久久一区二区 | 黄色三级久久 | 亚洲免费一级电影 | 97国产一区 | 99视频在线精品国自产拍免费观看 | 色com| 91亚色视频在线观看 | 国产原创在线观看 | 国产亚洲激情视频在线 | 国产伦理久久 | 国产精品久久艹 | 一区二区三区在线不卡 | 亚洲伊人成综合网 | 国语自产偷拍精品视频偷 | 精品国产欧美一区二区三区不卡 | 久久人人爽人人片 | 日韩 在线a | 欧美五月婷婷 | 午夜精品视频福利 | 色五月色开心色婷婷色丁香 | 中文字幕免费不卡视频 | 国产精品日韩 | 999久久久久久久久6666 | 免费成人av在线 | 国产综合在线观看视频 | 免费亚洲电影 | 久久国产精品久久久久 | 久久97超碰 | 成人av免费播放 | 久久精品亚洲一区二区三区观看模式 | 久久99精品久久久久久秒播蜜臀 | 天天干夜夜 | 在线小视频你懂得 | 黄色成人av| 欧美色婷婷 | 国产一区二区三区免费视频 | 日韩午夜小视频 | 中文字幕永久免费 | 国产美女在线观看 | 狠狠狠狠狠狠 | 91在线观看欧美日韩 | 在线国产激情视频 | 日韩一区二区三免费高清在线观看 | 国产精品午夜久久久久久99热 | 国产区 在线 | 视频在线一区二区三区 | 色妞色视频一区二区三区四区 | 99久久精品免费看 | 国产精品久久久久久久久久久免费 | 97精品国产91久久久久久 | 99精品国产兔费观看久久99 | 国产一级在线免费观看 | 正在播放国产91 | 国产一级性生活视频 | 国产一级电影在线 | 一区二区网 | 三级av免费 | 午夜视频在线观看网站 | 99色| 日本在线观看一区二区 | www天天操 | 黄色免费网站 | 天天操天 | 久久久久欠精品国产毛片国产毛生 | 91久久国产露脸精品国产闺蜜 | 中文字幕第一页在线视频 | 免费看色网站 | 99久久精品国产观看 | www.久久com | 国产精品久久久一区二区 | 婷婷色中文字幕 | 天天干,天天射,天天操,天天摸 | 97在线观| 国产精成人品免费观看 | 国产91丝袜在线播放动漫 | 久久国产免费 | 黄色片网站大全 | 久久久精品亚洲 | 欧美在线视频一区二区三区 | 中文字幕在线影视资源 | 最近更新中文字幕 | 夜夜躁天天躁很躁波 | 日韩中文字幕一区 | 偷拍区另类综合在线 | 中国一级片在线 | 91视频高清 | 视频成人免费 | a精品视频 | 日韩av影视在线 | 久久婷婷国产色一区二区三区 | 精品久久一 | 色com| 亚洲精品中文字幕视频 | 日韩在线高清 | 国产精品电影一区 | 国产精品九九视频 | 亚洲最大的av网站 | 国产在线不卡视频 | 久久国产午夜精品理论片最新版本 | 免费国产黄线在线观看视频 | 亚洲精品毛片一级91精品 | 五月天丁香视频 | 99麻豆久久久国产精品免费 | 十八岁免进欧美 | 国产免费黄色 | 国产在线高清精品 | 久草免费新视频 | 国产黄a三级三级 | 91看片成人 | 国产成人一区二区三区影院在线 | 探花视频免费在线观看 | 欧美精品乱码久久久久久按摩 | 免费一级片在线观看 | 五月天久久婷 | 在线色资源 | 久久小视频 | 国产成人黄色av | 亚洲精品一区二区三区新线路 | 黄色一级在线观看 | 99人成在线观看视频 | 国产97视频 | 超碰97免费 | 免费精品人在线二线三线 | 91精品国自产在线 | 91麻豆国产 | 婷婷深爱网| 成人蜜桃| 黄色日视频 | 国产日韩精品一区二区三区 | 亚洲欧美日韩在线一区二区 | 国产视频1区2区 | 狠狠操狠狠干天天操 | 日韩在线观看av | 99久久久久久久久久 | 精品91久久久久 | 国产麻豆剧果冻传媒视频播放量 | 国产精品第一页在线 | 天天操夜操视频 | 美女网站一区 | 国产在线a| 国产成人一区二区三区在线观看 | 婷婷色中文字幕 | 91成人短视频在线观看 | 激情五月***国产精品 | 午夜免费福利视频 | 在线观看av中文字幕 | 久久成人国产精品一区二区 | 国产91精品在线播放 | 色视频网站在线观看一=区 a视频免费在线观看 | 国产综合精品一区二区三区 | 日本久久久精品视频 | av线上免费观看 | 久久在线免费 | 99久久精品国产亚洲 | 91在线播放国产 | 西西444www | 18国产精品白浆在线观看免费 | 国产婷婷久久 | 蜜臀久久99静品久久久久久 | 国产精品露脸在线 | 91精品国自产在线观看欧美 | 蜜臀av麻豆 | 中文字幕一区二区三区在线视频 | 99精品乱码国产在线观看 | 欧美一级片免费观看 | 正在播放国产精品 | 国产999视频在线观看 | 久久久九九 | 国产精品欧美久久久久三级 | 久久免费av电影 | 在线中文字幕视频 | 欧美性天天 | 日韩国产欧美视频 | 国产在线视频一区二区三区 | 久青草影院| 在线免费av网 | 国产精品国产亚洲精品看不卡 | 国产免费精彩视频 | 久久国产精品99久久久久久进口 | av免费在线网 | 超碰人人射 | 一区三区视频在线观看 | 久久香蕉影视 | 亚洲污视频 | 亚洲国产丝袜在线观看 | 免费高清av在线看 | 国产69精品久久99的直播节目 | 日韩色在线观看 | 91看成人 | 国产精品日韩在线观看 | 一级欧美一级日韩 | 国产1区2区 | 91精品国产一区二区三区 | 国产人成看黄久久久久久久久 | 欧美不卡视频在线 | 91亚洲精品久久久久图片蜜桃 | 精品国产欧美一区二区三区不卡 | av中文字幕网站 | 91激情视频在线观看 | 日韩xxxxxxxxx| 黄色电影在线免费观看 | 国产日产av | 国产偷在线 | 国产片免费在线观看视频 | 日本在线精品视频 | 开心综合网 | 欧美日韩在线观看一区 | 在线日韩av| 四虎在线观看 | 插久久 | 久久免费视频在线观看30 | 久久精品婷婷 | 国产精品欧美久久 | 国产精品久久久久久高潮 | 国产精品成人在线观看 | 日韩精品一区在线播放 | 国产亚洲精品美女久久 | 日韩动漫免费观看高清完整版在线观看 | 中文字幕 国产专区 | 91高清完整版在线观看 | 毛片网站观看 | 日韩在线免费不卡 | 久久免费a | 国产精品久久久久久五月尺 | 免费观看成人 | 日韩久久精品一区二区 | 久久综合久久综合久久 | 在线亚洲精品 | 丝袜足交在线 | 亚洲最大av在线播放 | 97国产超碰| 999视频在线播放 | 天堂激情网 | 欧美伦理一区二区三区 | 亚洲有 在线| 亚洲黄色免费电影 | 国产精品ⅴa有声小说 | 91亚洲影院 | 亚洲国产精品va在线看 | 国产色啪 | 精品一二| 国产xxxx | 成人资源在线观看 | 天天干夜夜爽 | 精品美女在线观看 | 国产午夜三级 | 天天天在线综合网 | 日韩中文字幕免费看 | 亚洲资源在线网 | 免费在线观看污网站 | 又污又黄网站 | 亚洲在线不卡 | 五月婷婷av在线 | 91免费看黄色 | 狠狠色狠狠色综合日日92 | 蜜臀aⅴ国产精品久久久国产 | 国产高清中文字幕 | 成人在线播放av | 久久99国产精品二区护士 | 激情欧美一区二区三区免费看 | avwww在线 | 色中色亚洲 | 毛片网在线 | 久久超级碰 | 国产精品1000 | 亚洲综合导航 | 亚洲精品小视频在线观看 | 久久久69| 九九热免费在线观看 | 日韩精品久久久久久 | 久久综合免费视频影院 | 亚洲精品资源 | 中文字幕在线观看网站 | 中文在线a在线 | 又黄又爽又刺激的视频 | 97精品国自产拍在线观看 | 欧美91精品久久久久国产性生爱 | 亚洲毛片视频 | 亚洲国产精品久久久久婷婷884 | 久久字幕 | 国产精品av在线 | 久久久国产精品免费 | 天堂在线视频中文网 | 91视频麻豆视频 | 男女视频久久久 | 中文字幕av全部资源www中文字幕在线观看 | 精品在线播放视频 | 丁香激情网 | 日日夜夜狠狠操 | 免费男女羞羞的视频网站中文字幕 | 久在线观看视频 | 久草视频免费在线播放 | 免费视频你懂得 | 日韩成年视频 | 国产色 在线| 中文字幕丝袜美腿 | 久久成人国产精品 | 日本少妇久久久 | 久久国产经典视频 | 成年人免费在线播放 | 国产1区2区3区精品美女 | 午夜av不卡| h视频在线看 | 国产精品剧情在线亚洲 | a黄在线观看 | 日韩在线观看网址 | 国产视频久久久 | 91av资源网 | 最新国产精品亚洲 | 欧美a影视 | 国产91精品一区二区麻豆网站 | 91在线免费视频观看 | 国产成人精品亚洲精品 | 在线成人国产 | 久久久久久久国产精品影院 | 国产原创在线 | 日b视频国产 | 久久电影网站中文字幕 | 天堂av在线7 | 亚洲日本一区二区在线 | 天天摸天天操天天爽 | 玖玖在线精品 | 欧美日本一二三 | 国产资源在线观看 | 久久成人国产精品 | 日韩欧美视频在线 | 久久久久婷 | 久久激情综合网 | 国产香蕉97碰碰碰视频在线观看 | 五月天婷亚洲天综合网鲁鲁鲁 | 亚洲欧美视频在线播放 | 亚洲三级在线 | 久久经典视频 | 少妇bbw搡bbbb搡bbb | 夜夜操狠狠干 | 极品久久久久 | av色综合网 | 夜夜爽88888免费视频4848 | 摸阴视频 | 久久理论视频 | 久久无码av一区二区三区电影网 | 欧洲性视频 | 国产日韩精品视频 | 人人干狠狠干 | 九九综合久久 | 日韩电影在线视频 | 成x99人av在线www | 国产打女人屁股调教97 | 日韩高清国产精品 | 国产亚洲精品久久久久久网站 | 日韩视频免费看 | 毛片黄色一级 | 国产另类av | 久草在线一免费新视频 | av久久久久久 | 麻豆一二三精选视频 | 夜夜骑日日 | 成人精品在线 | 97视频在线观看播放 | 亚洲精品一区二区网址 | 中文字幕一区二区在线播放 | 99久久久久久久久 | 香蕉网在线观看 | 国产片免费在线观看视频 | 国产在线视频导航 | 日本精品一二区 | 六月婷操| 日本公妇在线观看高清 | 91精品视频在线观看免费 | 天天操天天干天天爽 | 黄色一区二区在线观看 | av一级一片 | 九色精品 | 狠狠躁夜夜a产精品视频 | 午夜精品久久久久久久久久久 | 国产日产精品久久久久快鸭 | 日韩欧美在线观看一区二区三区 | 久久免费毛片 |