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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

C语言实现俄罗斯方块

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

目錄

一、游戲效果展示

二、完整代碼,可以直接拷貝運行

三、所需開發環境

四、具體項目實現

①游戲歡迎界面 welcome( )

②游戲背景 initGameScreen( )?

③方塊表示 int block[ ][ ][ ]

④新方塊表示nextBlock( )

⑤設計游戲循環main( )

⑥搭建用戶操作框架move( )Ⅰ

⑦判斷方塊能否向指定方向移動 moveable( )

⑧游戲失敗檢查 failCheck( )

⑨清除下降過程中的方塊 clearBlock( )

⑩判斷方塊旋轉 rotatable( )

①①繪制下降過程中的方塊 drawBlock( )

①②延時等待 wait ( )

①③固定方塊 mark( )

①④用戶操作框架完善Ⅱ mov( )

①⑤消除方塊 check( ) + down( )

①⑥更新分數和等級 addScore( ) + updateGrade( )

?代碼整合運行

五 、不足之處


一、游戲效果展示

每個方塊的朝向使用二維數組表示

二、完整代碼,可以直接拷貝運行

#include<graphics.h> #include<stdio.h> #include<time.h> #include<conio.h> //kbhit()int score = 0; //總分 int rank = 0; //等級#define BLOCK_COUNT 5 #define BLOCK_WIDTH 5 #define BLOCK_HEIGHT 5#define UNIT_SIZE 20 //小方塊寬度#define START_X 130 //方塊降落框,方塊降落起始位置 #define START_Y 30#define KEY_UP 87 //用戶操作 #define KEY_LEFT 65 #define KEY_RIGHT 68 #define KEY_DOWN 83 #define KEY_SPACE 32#define MinX 30 //游戲左上角位置 #define MinY 30 int speed = 500; //方塊降落速度int NextIndex = -1; //下一個方塊 int BlockIndex = -1; //當前方塊typedef enum { //方塊朝向BLOCK_UP,BLOCK_RIGHT,BLOCK_LEFT,BLOCK_DOWN }block_dir_t;typedef enum { //方塊移動方向MOVE_DOWN,MOVE_LEFT,MOVE_RIGHT }move_dir_t;//方塊顏色 int color[BLOCK_COUNT] = {GREEN,CYAN,MAGENTA,YELLOW,BROWN }; int visit[30][15]; //訪問數組visit[i][j] = 1表示該位置有方塊 int markColor[30][15]; //對應位置顏色 int block[BLOCK_COUNT * 4][BLOCK_WIDTH][BLOCK_HEIGHT] = {// | 形方塊{ 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 },// L 形方塊{ 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 },// 田 形方塊{ 0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 },// T 形方塊{ 0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0 },// Z 形方塊{ 0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0 }, };/**************************** 功能:歡迎頁面* 輸入:* 無* 返回:* 無**************************/ void welcome() {//1.初始化畫布initgraph(550, 660);//2.設置窗口標題HWND window = GetHWnd();//獲得窗口,獲得當前窗口SetWindowText(window, _T("俄羅斯方塊 小明來嘍")); //設置標題//3.設置游戲初始頁面setfont(40, 0, _T("微軟雅黑")); //設置文本的字體樣式(高,寬(0表示自適應),字體)setcolor(WHITE); // 設置顏色outtextxy(205, 200, _T("俄羅斯方法"));setfont(20, 0, _T("楷體"));setcolor(WHITE); // 設置顏色outtextxy(175, 300, _T("編程,從俄羅斯方塊開始"));Sleep(3000); }/**************************** 功能:初始化游戲場景* 輸入:* 無* 返回:* 無**************************/ void initGameSceen() {char str[16]; //存放分數//1.清屏cleardevice();//2.畫場景rectangle(27, 27, 336, 635); //方塊降落框外框rectangle(29, 29, 334, 633); //方塊降落框內框rectangle(370, 50, 515, 195); //方塊提示框setfont(24, 0, _T("楷體")); //寫“下一個”setcolor(LIGHTGRAY); //灰色outtextxy(405, 215, _T("下一個:"));setcolor(RED); //寫分數outtextxy(405, 280, _T("分數:"));//按指定格式,將score寫入strsprintf_s(str, 16, "%d", score);//這里設置字符集為多字符,保證outtextxy可以寫出變量strouttextxy(415, 310, str);outtextxy(405, 375, _T("等級:")); //等級//按指定格式,將rank寫入strsprintf_s(str, 16, "%d", rank);//這里設置字符集為多字符,保證outtextxy可以寫出變量strouttextxy(415, 405, str);setcolor(LIGHTBLUE); //操作說明outtextxy(390, 475, "操作說明:");outtextxy(390, 500, "↑: 旋轉");outtextxy(390, 525, "↓: 下降");outtextxy(390, 550, "←: 左移");outtextxy(390, 575, "→: 右移");outtextxy(390, 600, "空格: 暫停"); }/****************************************** 功能:清空方塊提示框里的方塊* 輸入:* 無* 返回:* 無****************************************/ void clearBlock() {setcolor(BLACK);setfont(23, 0, "楷體");for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {int x = 391 + j * UNIT_SIZE;int y = 71 + i * UNIT_SIZE;outtextxy(x, y, "■");}} }/****************************************** 功能:清除降落過程中的方塊* 輸入:* x,y - 方塊的坐標(二維數組左上角位置)* block_dir_t - 方塊方向* 返回:* 無****************************************/ void clearBlock(int x, int y, block_dir_t blockDir) {setcolor(BLACK);// setfont(23, 0, "楷體");int id = BlockIndex * 4 + blockDir;for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {if (block[id][i][j] == 1) {int x2 = x + j * UNIT_SIZE;int y2 = y + i * UNIT_SIZE;outtextxy(x2, y2, "■");}}} }/****************************************** 功能:在提示框 與 降落框的起始位置畫方塊* 輸入:* x,y - 方塊的坐標(二維數組左上角位置)* 返回:* 無****************************************/ void drawBlock(int x, int y) {setcolor(color[NextIndex]);setfont(23, 0, "楷體");for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {if (block[NextIndex * 4][i][j] == 1) {int x2 = x + j * UNIT_SIZE;int y2 = y + i * UNIT_SIZE;outtextxy(x2, y2, "■");}}} }/******************************************功能:繪制下降過程中的方塊*輸入:* x,y - 方塊的坐標(二維數組左上角位置)* block_dir_t - 方塊方向* 返回:* 無****************************************/ void drawBlock(int x, int y, block_dir_t dir) {setcolor(color[BlockIndex]);setfont(23, 0, "楷體");int id = BlockIndex * 4 + dir;for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {if (block[id][i][j] == 1) {//擦除該方塊的第i行第j列outtextxy(x + j * UNIT_SIZE, y + i * UNIT_SIZE, "■");}}} }/******************************************功能:方塊提示框中產生新方塊*輸入:* 無*返回:* 無****************************************/ void nextblock() {clearBlock();//產生隨機數,隨機選擇方塊srand((unsigned)time(NULL)); //使用時間函數的返回值,來作為隨機種子NextIndex = rand() % BLOCK_COUNT; //產生0~5的隨機數drawBlock(391, 71); }/******************************************功能:判斷在指定位置向指定方向是否可以移動*輸入:* x,y - 方塊位置* moveDir - 下一步想要移動的方向* blockDir - 當前方塊的方向* 返回:* true - 可以移動* false - 不可以移動****************************************/ bool moveable(int x0, int y0, move_dir_t moveDir, block_dir_t blockDir) {//計算方塊左上角在30×15的游戲區位置(第多少行, 第多少列)int x = (y0 - MinY) / UNIT_SIZE;int y = (x0 - MinX) / UNIT_SIZE;int ret = 1;int id = BlockIndex * 4 + blockDir;if (moveDir == MOVE_DOWN) {for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {//向下不能運動的條件:實心方塊已經達到底部(x+i+1==30),或者底部已有方塊 if (block[id][i][j] == 1 &&(x + i + 1 == 30 || visit[x + i + 1][y + j] == 1)) {ret = 0;}}}}else if (moveDir == MOVE_LEFT) {for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {//向左不能運動的條件:實心方塊已經達到左邊界(y+j==0),或者左邊已有方塊if (block[id][i][j] == 1 &&(y + j <= 0 || visit[x + i][y + j - 1] == 1)) {ret = 0;}}}}else if (moveDir == MOVE_RIGHT) {for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {//向下不能運動的條件:實心方塊已經達到右邊界(y+j+1>=15),或者右邊已有方塊if (block[id][i][j] == 1 &&(y + j + 1 >= 15 || visit[x + i][y + j + 1] == 1)) {ret = 0;}}}}return ret; }/******************************功能:檢測游戲是否結束*輸入:* 無* 返回:* 無*****************************/ void failCheck() {//游戲結束條件是頂部新被繪制出的方塊就要“固化”,頂部新繪制的方塊方向朝上,運動方向朝下if (!moveable(START_X, START_Y, MOVE_DOWN, (block_dir_t)BLOCK_UP)) {setcolor(WHITE);setfont(45, 0, "隸體");outtextxy(75, 300, "Game Over!");Sleep(1000);system("pause");closegraph();exit(0);} }/*************************** 功能:延時等待* 輸入:** 返回:* 無*************************/ void wait(int interval) {int count = interval / 10;for (int i = 0; i < count; ++i) {Sleep(10);//如果休眠期間用戶有按鍵,則結束休眠if (_kbhit()) {return;}} }/****************************************** 功能:判斷當前方塊是否可以向指定方向旋轉* 輸入:* x,y - 方塊位置(二維數組坐標)* dir - 方塊旋轉方向* 返回:* true - 可以旋轉* false - 不可以旋轉****************************************/ bool rotatable(int x, int y, block_dir_t dir) {//首先判斷是否可以繼續向下移動if (!moveable(x, y, MOVE_DOWN, dir)) {return false;}int x2 = (y - MinY) / UNIT_SIZE;int y2 = (x - MinX) / UNIT_SIZE;int id = BlockIndex * 4 + dir;for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {//不能旋轉條件:左右邊界越界或者已有方塊“阻擋”if (block[id][i][j] == 1 && (y2 + j < 0 || y2 + j >= 15 || visit[x2 + i][y2 + j] == 1)) {return false;}}}return true; }/****************************************** 功能:* 輸入:** 返回:* 無****************************************/ void mark(int x, int y, block_dir_t dir) {int id = BlockIndex * 4 + dir;int x2 = (y - MinY) / UNIT_SIZE;int y2 = (x - MinX) / UNIT_SIZE;for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {if (block[id][i][j] == 1) {visit[x2 + i][y2 + j] = 1;markColor[x2 + i][y2 + j] = color[BlockIndex];}}} }/****************************************** 功能:讀取用戶操作,時時更新降落的方塊* 輸入:* 無* 返回:* 無****************************************/ void move() {int x = START_X; //方塊起始位置int y = START_Y;int k = 0;block_dir_t blockDir = (block_dir_t)BLOCK_UP;int curSpeed = speed; //定義當前方塊降落速度//讀取用戶操作前判斷游戲是否結束failCheck();//持續向下降落while (1) {int curSpeed = speed; //定義當前方塊降落速度//清除方塊clearBlock(x, k + y, blockDir);//判斷選擇的方向if (_kbhit()) {int key = _getch();if (key == KEY_SPACE) {system("pause");}else if (key == KEY_UP) {block_dir_t nextDir = (block_dir_t)((blockDir + 1) % 4);if (rotatable(x, y + k, nextDir)) {blockDir = nextDir;}}else if (key == KEY_LEFT) {if (moveable(x, y + k + 20, MOVE_LEFT, blockDir)) {x -= UNIT_SIZE;}}else if (key == KEY_RIGHT) {if (moveable(x, y + k + 20, MOVE_RIGHT, blockDir)) {x += UNIT_SIZE;}}else if (key == KEY_DOWN) {curSpeed = 50;}}k += 20;//繪制方塊drawBlock(x, y + k, blockDir);//休眠wait(curSpeed);//方塊的固化處理,方塊固定后結束循環,當前一個方塊的move執行完畢if (!moveable(x, y + k, MOVE_DOWN, blockDir)) {mark(x, y + k, blockDir);break;}} }/******************************************功能:繪制剛從頂部降落的方塊,更新提示框內的方塊,調用方塊降落函數move()*輸入:* 無* 返回:* 無****************************************/ void newblock() {BlockIndex = NextIndex;//繪制剛從頂部下降的方塊drawBlock(START_X, START_Y);//讓新出現方塊暫停一會Sleep(200);//右上角區域繪制下一個方塊nextblock();//方塊降落move(); }/****************************************** 功能:消除第i行,并把上面的行都往下移* 輸入:* 無* 返回:* 無****************************************/ void down(int x) {for (int i = x; i > 0; --i) {for (int j = 0; j < 15; ++j) {if (visit[i - 1][j] == 1) {visit[i][j] = 1;markColor[i][j] = markColor[i - 1][j];setcolor(markColor[i][j]);outtextxy(20 * j + MinX, 20 * i + MinY, "■");}else {visit[i][j] = 0;setcolor(BLACK);outtextxy(20 * j + MinX, 20 * i + MinY, "■");}}}//清除最頂層方格setcolor(BLACK);for (int j = 0; j < 15; ++j) {visit[0][j] = 0;outtextxy(20 * j + MinX, MinY, "■");} }/****************************************** 功能:更新分數* 輸入:* 無* 返回:* 無****************************************/ void addScore(int lines) {char str[32];score += lines * 10;sprintf_s(str, 32, "%d", score);setcolor(RED);outtextxy(415, 310, str);}/************************** 功能:更新等級* 輸入:* 無* 返回:* 無*************************/ void updateGrade() {//更新等級//假設50分一級rank = score / 50;char str[32];sprintf_s(str, 32, "%d", rank);setcolor(RED);outtextxy(415, 405, str);//更新速度if (speed <= 100) {speed = 100;}else {speed = 500 - rank * 20;} }/************************** 功能:檢查是否有滿行方塊* 輸入:* 無* 返回:* 無*************************/ void check() {int i, j;int clearLines = 0;for (i = 29; i >= 0; i--) {// 檢查第i行有沒有滿for (j = 0; j < 15 && visit[i][j]; j++);//執行到此處時,有兩種情況:// 1. 第i行沒有滿,即表示有空位 此時 j<15// 2. 第i行已滿了,此時 j>=15if (j >= 15) {// 此時,第i行已經滿了,就需要消除第i行down(i); //消除第i行,并把上面的行都下移i++; // 因為最外層的循環中有 i--, 所以我們先i++, 使得下次循環時,再把這一行檢查一下clearLines++;}}// 更新分數addScore(clearLines);// 更新等級(更新等級提示,更新速度)updateGrade(); }int main() {welcome();initGameSceen();//產生新方塊nextblock();// system("pause");Sleep(800);//初始化訪問數組memset(visit, 0, sizeof(visit));while (1) {newblock();//消除滿行,并更新分數和速度check();}system("pause");closegraph();return 0; }

三、所需開發環境

1)安裝VS2019,或VS其他版本

2)安裝easyX圖形庫

四、具體項目實現

①游戲歡迎界面 welcome( )

在游戲開始前會有一個游戲歡迎頁面,整個頁面會持續大概三秒,之后便進入游戲場景。在游戲歡迎頁面中,除了將顯示游戲名稱外,還要修改窗口標題。

/**************************** 功能:歡迎頁面* 輸入:* 無* 返回:* 無**************************/ void welcome() {//1.初始化畫布initgraph(550, 660);//2.設置窗口標題HWND window = GetHWnd();//獲得窗口,獲得當前窗口SetWindowText(window, _T("俄羅斯方塊 小明來嘍")); //設置標題//3.設置游戲初始頁面setfont(40, 0, _T("微軟雅黑")); //設置文本的字體樣式(高,寬(0表示自適應),字體)setcolor(WHITE); // 設置顏色outtextxy(205, 200, _T("俄羅斯方法"));setfont(20, 0, _T("楷體"));setcolor(WHITE); // 設置顏色outtextxy(175, 300, _T("編程,從俄羅斯方塊開始"));Sleep(3000); }

②游戲背景 initGameScreen( )?

?繪制游戲場景

/**************************** 功能:初始化游戲場景* 輸入:* 無* 返回:* 無**************************/ void initGameSceen() {char str[16]; //存放分數//1.清屏cleardevice();//2.畫場景rectangle(27, 27, 336, 635); //方塊降落框外框rectangle(29, 29, 334, 633); //方塊降落框內框rectangle(370, 50, 515, 195); //方塊提示框setfont(24, 0, _T("楷體")); //寫“下一個”setcolor(LIGHTGRAY); //灰色outtextxy(405, 215, _T("下一個:"));setcolor(RED); //寫分數outtextxy(405, 280, _T("分數:"));//按指定格式,將score寫入strsprintf_s(str, 16, "%d", score);//這里設置字符集為多字符,保證outtextxy可以寫出變量strouttextxy(415, 310, str);outtextxy(405, 375, _T("等級:")); //等級//按指定格式,將rank寫入strsprintf_s(str, 16, "%d", rank);//這里設置字符集為多字符,保證outtextxy可以寫出變量strouttextxy(415, 405, str);setcolor(LIGHTBLUE); //操作說明outtextxy(390, 475, "操作說明:");outtextxy(390, 500, "W: 旋轉");outtextxy(390, 525, "S: 下降");outtextxy(390, 550, "A: 左移");outtextxy(390, 575, "D: 右移");outtextxy(390, 600, "空格: 暫停");system("pause"); }

③方塊表示 int block[ ][ ][ ]

將每個方塊的朝向用二維數組表示。此次共設計了五種方塊,每個方塊四種朝向,使用三維數組存儲每個剛快及其朝向。1代表該點是方格。

#define BLOCK_COUNT 5 #define BLOCK_WIDTH 5 #define BLOCK_HEIGHT 5int block[BLOCK_COUNT * 4][BLOCK_WIDTH][BLOCK_HEIGHT] = {// | 形方塊{ 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 },// L 形方塊{ 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 },// 田 形方塊{ 0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 },// T 形方塊{ 0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0 },// Z 形方塊{ 0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0 }, };

④新方塊表示nextBlock( )

在方塊提示框中每次生成新方塊由兩個動作組成,首先是擦除方塊,接著是繪制新方塊。

/****************************************** 功能:清空方塊提示框里的方塊* 輸入:* 無* 返回:* 無****************************************/ void clearBlock() {setcolor(BLACK);setfont(23, 0, "楷體");for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {int x = 391 + j * UNIT_SIZE;int y = 71 + i * UNIT_SIZE;outtextxy(x, y, "■");}} }/****************************************** 功能:在提示框 與 降落框的起始位置畫方塊* 輸入:* x,y - 方塊的坐標(二維數組左上角位置)* 返回:* 無****************************************/ void drawBlock(int x, int y) {setcolor(color[NextIndex]);setfont(23, 0, "楷體");for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {if (block[NextIndex * 4][i][j] == 1) {int x2 = x + j * UNIT_SIZE;int y2 = y + i * UNIT_SIZE;outtextxy(x2, y2, "■");}}} }/******************************************功能:方塊提示框中產生新方塊*輸入:* 無*返回:* 無****************************************/ void nextblock() {clearBlock();//產生隨機數,隨機選擇方塊srand((unsigned)time(NULL)); //使用時間函數的返回值,來作為隨機種子NextIndex = rand() % BLOCK_COUNT; //產生0~5的隨機數drawBlock(391, 71); }

⑤設計游戲循環main( )

?在游戲框中每次生成新方塊會進入對新方塊降落處理,等處理完后便會循環

int main() {welcome();initGameSceen();//產生新方塊nextblock();Sleep(800);//初始化訪問數組memset(visit, 0, sizeof(visit));while (1) {newblock();}system("pause");closegraph();return 0; }/******************************************功能:繪制剛從頂部降落的方塊,更新提示框內的方塊,調用方塊降落函數move()*輸入:* 無* 返回:* 無****************************************/ void newblock() {BlockIndex = NextIndex;//繪制剛從頂部下降的方塊drawBlock(START_X, START_Y);//讓新出現方塊暫停一會Sleep(200);//右上角區域繪制下一個方塊nextblock();//方塊降落move(); }

⑥搭建用戶操作框架move( )Ⅰ

用戶操作框架:斷游戲是否結束 → 擦除當前方塊 → 用戶按鍵操作 → 繪制新的方塊 → 延時等待 → 方塊是否要固化(固化則則表明對當前方塊操作結束)。

#define KEY_UP 87 //用戶操作 #define KEY_LEFT 65 #define KEY_RIGHT 68 #define KEY_DOWN 83 #define KEY_SPACE 32/****************************************** 功能:讀取用戶操作,時時更新降落的方塊* 輸入:* 無* 返回:* 無****************************************/ void move() {//讀取用戶操作前判斷游戲是否結束failCheck();//持續向下降落while (1) {//清除方塊//to do//判斷選擇的方向if (_kbhit()) {int key = _getch();if (key == KEY_SPACE) {//to do}else if (key == KEY_UP) {//to do}else if (key == KEY_LEFT) {//to do}else if (key == KEY_RIGHT) {//to do}else if (key == KEY_DOWN) {//to do}}//繪制方塊//to do//休眠//to do//方塊的固化處理,方塊固定后結束循環,當前一個方塊的move執行完畢//to do} }

⑦判斷方塊能否向指定方向移動 moveable( )

當新方塊剛從頂部繪制時就碰到了“固化”方塊時則表明游戲結束,因此我們只需判斷方塊能否向下移動即可。這里先實現判斷方塊能否向指定方向移動功能。

/******************************************功能:判斷在指定位置向指定方向是否可以移動*輸入:* x,y - 方塊位置* moveDir - 下一步想要移動的方向* blockDir - 當前方塊的方向* 返回:* true - 可以移動* false - 不可以移動****************************************/ bool moveable(int x0, int y0, move_dir_t moveDir, block_dir_t blockDir) {//計算方塊左上角在30×15的游戲區位置(第多少行, 第多少列)int x = (y0 - MinY) / UNIT_SIZE;int y = (x0 - MinX) / UNIT_SIZE;int ret = 1;int id = BlockIndex * 4 + blockDir;if (moveDir == MOVE_DOWN) {for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {//向下不能運動的條件:實心方塊已經達到底部(x+i+1==30),或者底部已有方塊 if (block[id][i][j] == 1 &&(x + i + 1 == 30 || visit[x + i + 1][y + j] == 1)) {ret = 0;}}}}else if (moveDir == MOVE_LEFT) {for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {//向左不能運動的條件:實心方塊已經達到左邊界(y+j==0),或者左邊已有方塊if (block[id][i][j] == 1 &&(y + j <= 0 || visit[x + i][y + j - 1] == 1)) {ret = 0;}}}}else if (moveDir == MOVE_RIGHT) {for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {//向下不能運動的條件:實心方塊已經達到右邊界(y+j+1>=15),或者右邊已有方塊if (block[id][i][j] == 1 &&(y + j + 1 >= 15 || visit[x + i][y + j + 1] == 1)) {ret = 0;}}}}return ret; }

⑧游戲失敗檢查 failCheck( )

?游戲失敗檢測,當新繪制方塊無法向下移動時則表明游戲失敗。

/******************************功能:檢測游戲是否結束*輸入:* 無* 返回:* 無*****************************/ void failCheck() {//游戲結束條件是頂部新被繪制出的方塊就要“固化”,頂部新繪制的方塊方向朝上,運動方向朝下if (!moveable(START_X, START_Y, MOVE_DOWN, (block_dir_t)BLOCK_UP)) {setcolor(WHITE);setfont(45, 0, "隸體");outtextxy(75, 300, "Game Over!");Sleep(1000);system("pause");closegraph();exit(0);} }

⑨清除下降過程中的方塊 clearBlock( )

如果游戲未失敗,則表明用戶可以繼續操作,在讀取用戶操作前要先將降落框內的方塊清除。

/****************************************** 功能:清除降落過程中的方塊* 輸入:* x,y - 方塊的坐標(二維數組左上角位置)* block_dir_t - 方塊方向* 返回:* 無****************************************/ void clearBlock(int x, int y, block_dir_t blockDir) {setcolor(BLACK);// setfont(23, 0, "楷體");int id = BlockIndex * 4 + blockDir;for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {if (block[id][i][j] == 1) {int x2 = x + j * UNIT_SIZE;int y2 = y + i * UNIT_SIZE;outtextxy(x2, y2, "■");}}} }

⑩判斷方塊旋轉 rotatable( )

?如果方塊在待轉方向可以向下運動則表明方塊可以旋轉,因此這里只需少加利用moveable函數即可實現。

/****************************************** 功能:判斷當前方塊是否可以向指定方向旋轉* 輸入:* x,y - 方塊位置(二維數組坐標)* dir - 方塊旋轉方向* 返回:* true - 可以旋轉* false - 不可以旋轉****************************************/ bool rotatable(int x, int y, block_dir_t dir) {//首先判斷是否可以繼續向下移動if (!moveable(x, y, MOVE_DOWN, dir)) {return false;}int x2 = (y - MinY) / UNIT_SIZE;int y2 = (x - MinX) / UNIT_SIZE;int id = BlockIndex * 4 + dir;for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {//不能旋轉條件:左右邊界越界或者已有方塊“阻擋”if (block[id][i][j] == 1 && (y2 + j < 0 || y2 + j >= 15 || visit[x2 + i][y2 + j] == 1)) {return false;}}}return true; }

①①繪制下降過程中的方塊 drawBlock( )

? 每次根據用戶操作繪制新的方塊

/******************************************功能:繪制下降過程中的方塊*輸入:* x,y - 方塊的坐標(二維數組左上角位置)* block_dir_t - 方塊方向* 返回:* 無****************************************/ void drawBlock(int x, int y, block_dir_t dir) {setcolor(color[BlockIndex]);setfont(23, 0, "楷體");int id = BlockIndex * 4 + dir;for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {if (block[id][i][j] == 1) {//擦除該方塊的第i行第j列outtextxy(x + j * UNIT_SIZE, y + i * UNIT_SIZE, "■");}}} }

①②延時等待 wait ( )

每次 處理完用戶操作后會進入延時等待,等待時長會根據當前方塊降落速度而定,在延時等待期間如果檢測到用戶有按鍵操作時則會結束等待。

/*************************** 功能:延時等待* 輸入:** 返回:* 無*************************/ void wait(int interval) {int count = interval / 10;for (int i = 0; i < count; ++i) {Sleep(10);//如果休眠期間用戶有按鍵,則結束休眠if (_kbhit()) {return;}} }

①③固定方塊 mark( )

? 每次繪制出新方塊后判斷方塊是否還能繼續移動,如果不能移動則表明方塊需要固化。

/****************************************** 功能:方塊固定* 輸入:* x,y - 方塊坐標* dir - 方塊朝向* 返回:* 無****************************************/ void mark(int x, int y, block_dir_t dir) {int id = BlockIndex * 4 + dir;int x2 = (y - MinY) / UNIT_SIZE;int y2 = (x - MinX) / UNIT_SIZE;for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {if (block[id][i][j] == 1) {visit[x2 + i][y2 + j] = 1;markColor[x2 + i][y2 + j] = color[BlockIndex];}}} }

①④用戶操作框架完善Ⅱ mov( )

將上述實現功能補充到操作框架中

void move() {int x = START_X; //方塊起始位置int y = START_Y;int k = 0;block_dir_t blockDir = (block_dir_t)BLOCK_UP;int curSpeed = speed; //定義當前方塊降落速度//讀取用戶操作前判斷游戲是否結束failCheck();//持續向下降落while (1) {int curSpeed = speed; //定義當前方塊降落速度//清除方塊clearBlock(x, k + y, blockDir);//判斷選擇的方向if (_kbhit()) {int key = _getch();if (key == KEY_SPACE) {system("pause");}else if (key == KEY_UP) {block_dir_t nextDir = (block_dir_t)((blockDir + 1) % 4);if (rotatable(x, y + k, nextDir)) {blockDir = nextDir;}}else if (key == KEY_LEFT) {if (moveable(x, y + k + 20, MOVE_LEFT, blockDir)) {x -= UNIT_SIZE;}}else if (key == KEY_RIGHT) {if (moveable(x, y + k + 20, MOVE_RIGHT, blockDir)) {x += UNIT_SIZE;}}else if (key == KEY_DOWN) {curSpeed = 50;}}k += 20;//繪制方塊drawBlock(x, y + k, blockDir);//休眠wait(curSpeed);//方塊的固化處理,方塊固定后結束循環,當前一個方塊的move執行完畢if (!moveable(x, y + k, MOVE_DOWN, blockDir)) {mark(x, y + k, blockDir);break;}} }

①⑤消除方塊 check( ) + down( )

?當對一個方塊下降操作結束后,在已固化方塊數組里查找“滿行”方塊,如果存在“滿行”方塊則要進行清除操作,接著更新用戶分數和等級。

g

/************************** 功能:檢查是否有滿行方塊* 輸入:* 無* 返回:* 無*************************/ void check() {int i, j;int clearLines = 0;for (i = 29; i >= 0; i--) {// 檢查第i行有沒有滿for (j = 0; j < 15 && visit[i][j]; j++);//執行到此處時,有兩種情況:// 1. 第i行沒有滿,即表示有空位 此時 j<15// 2. 第i行已滿了,此時 j>=15if (j >= 15) {// 此時,第i行已經滿了,就需要消除第i行down(i); //消除第i行,并把上面的行都下移i++; // 因為最外層的循環中有 i--, 所以我們先i++, 使得下次循環時,再把這一行檢查一下clearLines++;}}// 更新分數addScore(clearLines);// 更新等級(更新等級提示,更新速度)updateGrade(); }/****************************************** 功能:消除第i行,并把上面的行都往下移* 輸入:* 無* 返回:* 無****************************************/ void down(int x) {for (int i = x; i > 0; --i) {for (int j = 0; j < 15; ++j) {if (visit[i - 1][j] == 1) {visit[i][j] = 1;markColor[i][j] = markColor[i - 1][j];setcolor(markColor[i][j]);outtextxy(20 * j + MinX, 20 * i + MinY, "■");}else {visit[i][j] = 0;setcolor(BLACK);outtextxy(20 * j + MinX, 20 * i + MinY, "■");}}}//清除最頂層方格setcolor(BLACK);for (int j = 0; j < 15; ++j) {visit[0][j] = 0;outtextxy(20 * j + MinX, MinY, "■");} }

①⑥更新分數和等級 addScore( ) + updateGrade( )

?根據清除方塊行數更新用戶分數和等級。

/****************************************** 功能:更新分數* 輸入:* 無* 返回:* 無****************************************/ void addScore(int lines) {char str[32];score += lines * 10;sprintf_s(str, 32, "%d", score);setcolor(RED);outtextxy(415, 310, str);}/************************** 功能:更新等級* 輸入:* 無* 返回:* 無*************************/ void updateGrade() {//更新等級//假設50分一級rank = score / 50;char str[32];sprintf_s(str, 32, "%d", rank);setcolor(RED);outtextxy(415, 405, str);//更新速度if (speed <= 100) {speed = 100;}else {speed = 500 - rank * 20;} }

?代碼整合運行

如果大家對這類小游戲文章剛興趣,小編又為大家準備了一篇推箱子游戲,歡迎大家瀏覽C語言實現推箱子游戲

五 、不足之處

  • 使用easyX繪圖,導入游戲圖片,從而使得游戲效果更為逼真
  • 游戲戰績的保存
  • 操作控制略有卡頓?
  • 總結

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

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

    亚洲最大的av网站 | 激情丁香综合五月 | 福利电影久久 | 欧美国产日韩一区二区三区 | 欧洲不卡av | 久久96国产精品久久99软件 | 国产无套精品久久久久久 | 在线视频日韩一区 | av电影在线观看完整版一区二区 | 日韩精品 在线视频 | 久久久久成人免费 | 国产成人av网站 | www.香蕉视频| 在线免费看黄网站 | 韩日在线一区 | 免费色黄 | 少妇bbbb| 久久精品99久久久久久2456 | 日日夜夜干| 国产精品一区久久久久 | 人人澡澡人人 | 999精品网| 91精品久久久久 | 久久成人免费电影 | 97爱| 亚洲精品美女久久17c | 日日夜夜操av | 日韩精品欧美精品 | 天天摸日日摸人人看 | 久草在线免费色站 | 日本中文字幕网 | 亚洲精品系列 | 国产精品久久久久久久久久三级 | 偷拍精品一区二区三区 | 国产一级片免费播放 | 久久久久人人 | 美女露久久 | 久久人人爽人人片av | 日韩欧美一区二区三区视频 | 亚州国产精品 | 91av在线视频免费观看 | 中文字幕免费高清在线观看 | 99久久99热这里只有精品 | 亚洲理论片在线观看 | 天天操天天干天天插 | 91免费高清 | 免费高清在线视频一区· | 国产精品亚洲人在线观看 | 啪啪精品 | 亚洲精品色视频 | 中文字幕一区av | 久久久久久久久久久久久国产精品 | 国产精品久久久久久吹潮天美传媒 | 免费国产在线精品 | 五月天婷婷免费视频 | 亚洲欧美日韩国产一区二区三区 | 一区二区三区在线免费 | 中文字幕色站 | 亚洲综合色视频在线观看 | 18岁免费看片 | 天天综合成人 | 日韩在线视频网 | 欧美一二三区在线观看 | 欧美日韩国产色综合一二三四 | 免费在线观看一区 | 国产九色视频在线观看 | 国产麻豆视频免费观看 | 精品免费观看视频 | 精品国产伦一区二区三区免费 | 亚洲精品美女久久久久 | 日日夜夜爱 | 丁香五婷| av丝袜在线 | 天天草综合 | 一区二区理论片 | 美女视频又黄又免费 | 在线观看成年人 | 韩国三级在线一区 | 99久久99久久精品国产片 | 韩国av不卡 | 色天天综合久久久久综合片 | 色天堂在线视频 | 亚洲人成综合 | 国产精品第十页 | 日韩av免费大片 | 天天草天天草 | 99久久er热在这里只有精品15 | 中文字幕日本电影 | 最新av网址在线 | 视频福利在线观看 | www.狠狠插.com | 国产91九色蝌蚪 | 久久久久久久免费看 | 精品久久久一区二区 | 欧美久久久久久久久中文字幕 | 久久综合在线 | 91精品啪在线观看国产81旧版 | 在线观看免费中文字幕 | 午夜在线国产 | 国产精品18久久久 | 精品中文字幕在线观看 | 色综合www| 免费精品久久久 | 日韩免费视频一区二区 | 国产精品毛片久久蜜 | 国产一级视频在线观看 | 在线国产一区 | 色夜视频 | 狠狠色噜噜狠狠狠狠 | 日日夜夜网站 | 高潮久久久 | 91视频在线观看下载 | 福利精品在线 | 国产午夜小视频 | 久久久久久久久久久久久久电影 | 97在线免费视频观看 | 国内精品免费久久影院 | 四虎国产精品免费 | 亚洲最新毛片 | 天天干天天操天天搞 | 91精品无人成人www | 97超碰人人澡 | 欧美一区二区视频97 | 亚洲国产精品人久久电影 | 丁香婷婷激情啪啪 | 日本黄色黄网站 | 97日日碰人人模人人澡分享吧 | 中字幕视频在线永久在线观看免费 | 亚洲婷婷免费 | 久久久久久久久电影 | 亚洲免费视频观看 | 久久女教师| 不卡视频在线 | 国产91丝袜在线播放动漫 | 日韩精品中文字幕一区二区 | 国产在线观看免费 | 久久免费av电影 | 免费成人结看片 | 天天玩天天操天天射 | www麻豆视频 | 狠狠色狠狠色综合日日小说 | 亚洲精品乱码久久久久久高潮 | 久久久免费精品国产一区二区 | 手机成人av | 99久久婷婷国产综合亚洲 | 免费亚洲成人 | 亚洲精品综合一二三区在线观看 | 日本特黄特色aaa大片免费 | 免费黄色看片 | 五月婷婷在线视频观看 | 国产中文字幕一区二区三区 | 中文字幕在线观看2018 | 久艹在线免费观看 | 婷婷亚洲最大 | 中文字幕有码在线 | 国产 视频 久久 | 国产五月色婷婷六月丁香视频 | 粉嫩aⅴ一区二区三区 | 亚洲精品高清视频在线观看 | 亚洲天堂香蕉 | 欧洲精品久久久久毛片完整版 | 韩国精品在线观看 | 免费国产在线精品 | 91麻豆精品国产91久久久久久久久 | 久久免费激情视频 | 激情五月婷婷综合网 | 国产第一福利 | 91麻豆精品久久久久久 | 国产精品福利一区 | 黄色一区三区 | 国产免费不卡av | 成人午夜电影久久影院 | 国产精品麻豆果冻传媒在线播放 | 日韩欧美xxx | 91成人午夜 | 激情av在线播放 | 欧美一级激情 | 欧美精品亚州精品 | 在线探花| 国产一区二区三精品久久久无广告 | www久久久久 | 色激情在线 | 久久久久久久久久久成人 | 一区二区三区中文字幕在线 | 激情五月开心 | 国产精品扒开做爽爽的视频 | 青青五月天| 国产成人l区 | 91.精品高清在线观看 | 中文字幕亚洲精品日韩 | 激情av资源 | 国产人免费人成免费视频 | 亚洲免费小视频 | 精品国产1区2区3区 国产欧美精品在线观看 | 婷婷免费在线视频 | 91丨九色丨国产在线 | 国产精品免费久久 | 久久久久国产精品免费网站 | 欧美a级成人淫片免费看 | 日韩视频一区二区三区在线播放免费观看 | 一级免费看| 天天天天天天天操 | 玖玖在线播放 | 麻豆一区二区 | 亚洲综合激情五月 | 亚洲一区视频在线播放 | 中文字幕在线观看一区二区三区 | 91亚州 | 99产精品成人啪免费网站 | 黄污在线看 | 中文字幕 在线 一 二 | 日韩一级成人av | 99久久99视频只有精品 | 国产一级久久久 | 久久久久久久久久免费视频 | 99精品久久只有精品 | 综合色中文 | 69精品视频在线观看 | 夜夜躁天天躁很躁波 | 成人在线免费视频观看 | 久久国产精品99久久人人澡 | 日日操操操| 精品国偷自产在线 | 在线免费日韩 | 蜜桃传媒一区二区 | 最近中文字幕在线播放 | 黄p网站在线观看 | 国产午夜亚洲精品 | 五月婷婷一区二区三区 | www.五月激情.com | 久久久久久久久久久久亚洲 | 91精品久久久久久综合五月天 | 久草剧场 | 手机看片中文字幕 | 91av欧美 | 丝袜精品视频 | 亚洲a在线观看 | 日本三级香港三级人妇99 | 精品自拍网 | 日韩三级中文字幕 | 亚洲jizzjizz日本少妇 | 99re6热在线精品视频 | 免费在线观看av的网站 | 亚洲精品免费看 | 黄色成人影视 | 最近中文字幕免费大全 | 国产九九在线 | av黄色亚洲 | 久久国产精品二国产精品中国洋人 | 欧美日韩一区二区视频在线观看 | 麻豆视频免费在线播放 | 国产最新在线视频 | 人人爽人人爽人人片av | 国产男男gay做爰 | www.神马久久 | 精品人人爽 | 国产日韩高清在线 | 奇米网444| 最新中文字幕在线观看视频 | 在线精品观看国产 | 最新国产视频 | 中文字幕 第二区 | 免费视频资源 | 国产1区2 | 国产在线播放一区 | 欧美一级黄色片 | 亚在线播放中文视频 | 精品免费视频 | 在线视频第一页 | 麻豆久久一区 | 91精品视频免费观看 | 久久久久国产成人免费精品免费 | 99久久er热在这里只有精品66 | 久久综合久久综合这里只有精品 | 国产精品麻豆99久久久久久 | 免费网站在线观看成人 | 精品在线视频观看 | 色综合天天综合网国产成人网 | 中文字幕av在线免费 | 久久精品一区二区 | 在线观看一区 | 久久艹综合 | 免费国产在线观看 | 天天射天天操天天色 | 免费精品在线视频 | 亚洲国产精品女人久久久 | 丁香激情综合国产 | 国产高清99| 九月婷婷综合网 | 国产黄色片一级三级 | 亚洲成人家庭影院 | 狠狠色丁香久久综合网 | 国产剧情一区在线 | 伊人电影在线观看 | 天天天在线综合网 | 成人av直播 | 伊人宗合网 | 免费观看91 | 麻豆国产网站 | 在线观看小视频 | 亚洲免费精彩视频 | 精品久久久久久亚洲综合网站 | 日韩最新理论电影 | 国产91在线看 | 一区二区网 | 国产精品一区一区三区 | 91精品国产91 | av一本久道久久波多野结衣 | 99久高清在线观看视频99精品热在线观看视频 | 久草男人天堂 | 国产精品久久久久久一区二区 | 天天射综合网视频 | 精品国产一区二区三区男人吃奶 | 中文 一区二区 | 久草久热| 99精品视频精品精品视频 | 91精品看片| 国内精品视频久久 | 亚洲一区二区黄色 | 国产在线视频一区二区三区 | 国产一区二区三区四区在线 | 九九热中文字幕 | 欧美日韩国产精品一区 | 国产一级黄色片免费看 | 麻豆国产电影 | 久草在线欧美 | 在线中文字幕观看 | 黄色视屏免费在线观看 | 2021av在线 | 人人爽人人爽人人爽 | 狠狠久久伊人 | 久久精品视频国产 | 精品国产一区二区三区四区在线观看 | 美女视频黄在线 | 久久日韩精品 | 成人a视频在线观看 | 日韩美女黄色片 | www.色午夜| 人人艹视频| 国产伦理一区二区 | 久久成人麻豆午夜电影 | 99热这里只有精品1 av中文字幕日韩 | 黄色a级片在线观看 | 五月天色中色 | 亚洲日本在线视频观看 | 久久视频一区 | 国产高清99| 一区二区三区在线看 | 免费在线色视频 | 久久久免费 | 亚洲精品中文在线资源 | 国产最顶级的黄色片在线免费观看 | 特级西西444www大胆高清无视频 | 精品国产一区二区三区不卡 | 国产成人精品一区二区三区网站观看 | 欧美精选一区二区三区 | 欧美激情精品久久久久久免费印度 | 亚洲一区网站 | 一区二区 不卡 | 色在线网 | 色在线最新 | 久久69精品久久久久久久电影好 | 99中文字幕视频 | a电影免费看| 亚洲精品视频中文字幕 | 色综合国产| 麻豆成人精品视频 | 欧美精品国产综合久久 | 国产破处视频在线播放 | 免费视频一区 | 精品久久综合 | 在线观看中文字幕 | 中文字幕精品三级久久久 | 日韩精品最新在线观看 | 一区二区三区中文字幕在线观看 | 久草爱视频 | 精品视频在线免费观看 | 男女激情麻豆 | 91在线麻豆 | 久久久久伊人 | 国产原创在线观看 | 九九免费精品视频在线观看 | 天天爽天天做 | 久草亚洲视频 | 99精品免费在线观看 | 亚洲国产视频a | 中文字幕永久 | 国产尤物一区二区三区 | 伊人五月天 | 久草视频首页 | 成人免费亚洲 | 成年人在线观看免费视频 | 美腿丝袜av| 91最新地址永久入口 | 日日夜夜综合网 | 欧美激情va永久在线播放 | 亚洲精品午夜国产va久久成人 | 国产男女免费完整视频 | 欧美久久久久久久久久久 | 精品一区二区影视 | 国产一级不卡毛片 | 亚洲经典视频在线观看 | 又黄又刺激视频 | 国产一区二区三区在线 | 亚州欧美视频 | 国产专区一 | 国产一区二区在线观看免费 | 天天干夜夜爽 | 亚洲一级片在线观看 | 成人动漫一区二区三区 | 色噜噜日韩精品一区二区三区视频 | 亚洲一区二区三区在线看 | 西西www4444大胆在线 | 婷婷激情5月天 | 狠狠伊人 | 在线观看亚洲专区 | 久久不卡日韩美女 | 日韩中文在线电影 | 4hu视频 | 天天操天天干天天摸 | 蜜臀久久99精品久久久久久网站 | 国产一区私人高清影院 | 最近日本韩国中文字幕 | 激情丁香在线 | 久久久成人精品 | 91大神精品视频 | 超碰人人91 | 日韩在线观看你懂得 | 欧美精品国产精品 | 中文字幕在线观看三区 | 国产精品mm | 国产精久久| 天天操天天草 | 精品亚洲视频在线观看 | 久久国产高清视频 | 一本一道波多野毛片中文在线 | 在线观看久久久久久 | 欧美aa在线 | 欧美日韩在线网站 | 亚洲激情在线观看 | 天堂av免费| 一区二区视频在线观看免费 | 日韩理论片 | 黄a在线看 | 成人免费一区二区三区在线观看 | 久久成人黄色 | 在线欧美中文字幕 | 最近日本韩国中文字幕 | 欧美精品一区二区免费 | www夜夜操com | 香蕉在线视频观看 | 国产裸体无遮挡 | 又色又爽的网站 | 亚洲精品高清视频 | 九九亚洲视频 | 91在线日韩 | 免费在线观看黄色网 | 最近中文字幕国语免费av | 91大神一区二区三区 | 中文字幕亚洲国产 | 国产麻豆视频在线观看 | 探花在线观看 | 成人在线播放网站 | 免费一级片在线 | 久久午夜免费观看 | 日韩,中文字幕 | 亚洲天天做 | 少妇性bbb搡bbb爽爽爽欧美 | 亚洲日本在线视频观看 | 久久看片网站 | av线上免费观看 | 亚洲九九九在线观看 | 国产精品一区二区三区在线免费观看 | 一级a毛片高清视频 | 精品欧美小视频在线观看 | 亚洲国产日韩一区 | 91在线中文字幕 | 黄色成年片 | 午夜电影av | 国产三级av在线 | 日韩理论电影在线观看 | 在线观看福利网站 | 91人人干| 欧美xxxxx在线视频 | 国产精品不卡一区 | 国产精品va最新国产精品视频 | 国产在线高清精品 | 99免费在线播放99久久免费 | 在线成人免费电影 | 欧美综合色在线图区 | 成人av免费在线观看 | 亚洲精品久久久久久久蜜桃 | 日韩亚洲在线视频 | 一区 二区电影免费在线观看 | 999精品| 四虎国产精品免费观看视频优播 | 在线播放视频一区 | 国产精品手机视频 | 久久看毛片 | 九九视频免费观看视频精品 | 亚洲人天堂 | 色综合中文字幕 | 婷婷激情五月综合 | 久久精品人人做人人综合老师 | 国产午夜视频在线观看 | 天天爱天天草 | 免费成人在线视频网站 | 欧美a级一区二区 | 91九色在线视频观看 | 色视频一区| 日本中文字幕高清 | 激情久久五月 | 999成人| 日韩网站视频 | 成人免费网站视频 | 2024av| 91黄站| 91成人网在线 | 国产特级毛片aaaaaa | 久久婷婷综合激情 | 日韩精品免费在线观看视频 | 欧美日韩在线观看一区二区 | 国产高清视频在线播放一区 | 在线亚洲小视频 | 久久在线精品 | 欧美 日韩 国产 成人 在线 | 欧美日性视频 | 亚洲精品无 | 一区二区三区日韩视频在线观看 | 天天操狠狠操网站 | 欧美日韩1区2区 | 亚洲黄色影院 | 91cn国产在线 | 日韩精品中文字幕在线 | 在线中文字幕网站 | 精品国产成人av | 精品国产伦一区二区三区观看方式 | 综合在线亚洲 | 国产精品久久久久久久久久久久久 | 五月婷婷综合色拍 | 四虎亚洲精品 | 国产看片免费 | 国产精品久久久久久久7电影 | 亚洲欧美国产精品 | 在线观看网站你懂的 | 97在线观看视频免费 | 欧美日本中文字幕 | 亚洲精品国产区 | 69av视频在线观看 | 在线观看视频在线 | 97视频免费在线观看 | 日本三级香港三级人妇99 | 日韩一区二区三区免费视频 | 91麻豆产精品久久久久久 | 久久精视频 | 在线播放一区二区三区 | 在线免费观看黄色大片 | 久久久www成人免费毛片 | 99国产成+人+综合+亚洲 欧美 | 久久婷婷视频 | 91在线www | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 久久久久久高潮国产精品视 | 99在线观看视频网站 | 国产精品久久一区二区三区不卡 | 在线不卡中文字幕播放 | 国产视频一区在线免费观看 | 久久精品三 | 果冻av在线| 国产精品大片免费观看 | 久久精品之 | 看污网站 | 蜜臀久久99精品久久久酒店新书 | 亚洲一区二区三区精品在线观看 | 99久久精品国产免费看不卡 | 欧美男男激情videos | 国产精品国产三级国产专区53 | 免费黄色在线网址 | 一级片黄色片网站 | 成人免费一区二区三区在线观看 | 波多野结衣久久精品 | 成人h动漫精品一区二 | 亚洲va综合va国产va中文 | 日韩久久精品 | 国产专区在线 | 黄色大片免费播放 | 91视频在线免费下载 | 日韩免费视频一区二区 | 免费看的黄色 | 97视频免费在线看 | 伊色综合久久之综合久久 | 九七人人干 | 国产片网站 | 五月天久久久久久 | 亚州av成人 | 在线视频免费观看 | 91看片在线免费观看 | 欧美一级性 | 久久草 | 91av短视频| 免费合欢视频成人app | 成人在线观看免费 | 日韩一三区 | 黄色在线免费观看网址 | 中文字幕av播放 | 午夜精品福利一区二区 | 国产色视频123区 | 婷婷激情在线观看 | 伊香蕉大综综综合久久啪 | 久久天天拍 | av中文字幕免费在线观看 | av成人免费在线 | 欧美激情综合五月色丁香小说 | 免费高清在线观看成人 | 狠狠插天天干 | 天天干天天操天天做 | 国产精品一区二区免费在线观看 | 免费日韩 精品中文字幕视频在线 | 亚洲一二区视频 | 精品一区精品二区高清 | 国产精品99久久久久久大便 | 国产在线v| 亚洲日韩中文字幕在线播放 | 91自拍视频在线 | 96看片| 午夜精品福利在线 | 国产精品成人免费 | 草草草影院 | 免费黄色av电影 | 二区视频在线 | 看片一区二区三区 | 成人久久18免费 | 狠狠操操网| 69亚洲精品 | 黄色三级在线观看 | 激情综合网五月激情 | 美女视频黄是免费的 | 一级做a爱片性色毛片www | 久草在线视频网站 | 国产精品自产拍在线观看中文 | 婷婷色中文 | 日韩城人在线 | 99热这里是精品 | 日韩欧美视频在线播放 | 精品一区二区三区久久 | 国产高清精品在线 | www.av免费| 国产精品婷婷午夜在线观看 | 99免费在线观看视频 | 日韩高清成人在线 | 99久久精品国产欧美主题曲 | 看片的网址 | 日本久久高清视频 | 国产日韩精品一区二区 | 看av免费网站 | 日韩av在线资源 | 亚洲国产日本 | 999毛片 | 中文字幕黄色网 | 精品视频久久 | 国产专区免费 | av高清一区二区三区 | 精品人人爽 | 一区中文字幕在线观看 | 久久超碰97| 亚洲精品女人久久久 | 中国一级片在线观看 | 亚洲精品在线视频观看 | 国产一区二区日本 | 欧美久久久久久久久 | 欧美日本啪啪无遮挡网站 | 欧美精品xxx| 亚洲综合导航 | 偷拍精偷拍精品欧洲亚洲网站 | 探花视频网站 | 国产精品久久久777 成人手机在线视频 | 亚洲九九九| 成人精品国产 | 国产精品热视频 | 黄色av一区二区 | 亚洲午夜精品在线观看 | 豆豆色资源网xfplay | 国产精品久久久av久久久 | 国产黄色特级片 | 精品1区2区| 人人操日日干 | 婷婷国产v亚洲v欧美久久 | 国产精品一区二区免费视频 | 天天色图 | 精品在线一区二区三区 | 五月开心六月伊人色婷婷 | 91麻豆传媒 | 国产高清免费视频 | 亚洲综合色视频 | 又黄又刺激又爽的视频 | 人人草人人做 | 91视频免费观看 | 中文字幕乱偷在线 | www.伊人色.com | 免费又黄又爽的视频 | 五月婷激情 | 免费在线观看成年人视频 | www日| 天天操天天操 | 国产成人久久精品一区二区三区 | 亚洲精品国产高清 | 91精品国产欧美一区二区成人 | 亚洲精品动漫成人3d无尽在线 | 久久a免费视频 | 日本黄色免费播放 | 中文亚洲欧美日韩 | 日日爽视频 | 黄色软件在线观看免费 | 狠狠操精品 | 日av免费| 黄色一级大片在线观看 | 亚洲日日夜夜 | 亚洲国产精品va在线 | 精品在线视频一区二区三区 | av电影免费在线 | 日韩国产高清在线 | 91久久精品日日躁夜夜躁国产 | 91精品老司机久久一区啪 | 亚洲激情综合 | 午夜婷婷综合 | 99在线精品视频在线观看 | 免费看片网站91 | 在线观看日韩免费视频 | 久久99国产精品 | 成年人免费在线观看 | 久久这里| 国产黄免费在线观看 | 丁香婷婷激情啪啪 | 欧美专区日韩专区 | 麻豆91精品91久久久 | 91成人精品一区在线播放 | 精品美女久久久久久免费 | 国产一级二级视频 | 色成人亚洲网 | 丁香五婷 | 欧洲av不卡 | 成人中文字幕在线 | 国产高清av免费在线观看 | 高清日韩一区二区 | 午夜美女福利直播 | 久久国产精品久久w女人spa | 超碰免费在线公开 | 黄a网站| 伊人婷婷网 | 四虎8848免费高清在线观看 | 91在线视频观看 | 欧美国产不卡 | 成人a视频片观看免费 | 国产91精品久久久久久 | 一区二区在线电影 | 成人观看| 久久精彩免费视频 | 人人澡人人模 | 国产美女精品在线 | 激情五月看片 | 亚洲精品在线一区二区 | 免费观看午夜视频 | 成人av播放| 三级黄色免费 | 区一区二区三区中文字幕 | 亚洲爱爱视频 | 欧美国产视频在线 | 色中色综合 | 99精品国产兔费观看久久99 | 香蕉免费在线 | 婷婷久久丁香 | 婷婷激情五月 | 国产一区私人高清影院 | 免费在线看v | 在线免费成人 | 日韩免费视频 | 夜夜操狠狠干 | 欧美91精品久久久久国产性生爱 | www.久久爱.cn| 久久久视屏 | 黄色免费网 | 成人a视频 | 狠狠色丁香婷婷综合最新地址 | 日韩av综合网站 | 免费a网址 | 日韩有码欧美 | 91久久国产自产拍夜夜嗨 | 久久久久久久久久久精 | 91视频亚洲 | 国产精品永久在线观看 | 日韩欧美在线观看一区二区 | 激情综合婷婷 | 亚洲 成人 一区 | 精品国产一区二区三区久久久久久 | av大片免费看| 久久激情视频网 | 黄色大片日本免费大片 | 色婷婷色 | 久久精品牌麻豆国产大山 | 国产不卡毛片 | 91在线一区二区 | 人人澡人人干 | 亚洲国产成人久久综合 | 亚洲精品tv | 午夜精品一区二区三区四区 | 午夜视频免费在线观看 | 激情视频网页 | 99精品视频在线免费观看 | 热久久最新地址 | 日韩午夜av | 久久精品国亚洲 | 四川bbb搡bbb爽爽视频 | 黄色小说在线观看视频 | 在线免费观看国产视频 | 日韩在线理论 | 麻豆国产电影 | 欧美极品裸体 | 黄色大全免费观看 | 国产高清在线观看av | 欧美日韩不卡在线视频 | 日韩免费av在线 | 亚洲精品国产视频 | 插综合网 | 狠狠操影视 | 久久男人影院 | 久久96国产精品久久99软件 | 夜色.com| 久久精品99久久久久久 | 91在线产啪| www.看片网站 | 免费电影一区二区三区 | 欧美日韩中文字幕在线视频 | 国产高清第一页 | 成人国产在线 | av日韩在线网站 | 18做爰免费视频网站 | 国产免费观看久久 | 黄色小说视频在线 | 久久久久久久久久久久国产精品 | 天天色欧美 | 超碰97国产精品人人cao | 亚洲国产精品人久久电影 | 久久九九精品久久 | 天天插狠狠干 | 日本精品一区二区在线观看 | 久久久久久97三级 | 国产精品久久久久久模特 | 日日夜夜天天射 | 国产精品精品国产婷婷这里av | 日韩免费观看一区二区 | 亚洲高清在线 | 911亚洲精品第一 | 中文字幕av最新 | 国产精品久久二区 | 成人网在线免费视频 | 91免费高清观看 | 手机av永久免费 | 国产婷婷vvvv激情久 | 国产精品毛片网 | 欧美最猛性xxxxx免费 | 亚洲综合激情五月 | 天天射天天射 | 黄色免费国产 | 久久国产a | 久久97精品 | 三级av网站| 99国产精品一区二区 | 国产一区视频在线观看免费 | 伊人六月 | 伊甸园永久入口www 99热 精品在线 | h视频在线看 | 91人人射 | 成人h电影| 亚洲无人区小视频 | 日韩一级黄色大片 | 一本一本久久a久久精品综合妖精 | 成人一级片视频 | 国产色在线 | 正在播放日韩 | 高清一区二区三区av | 在线成人观看 | 日韩精品最新在线观看 | 国产精品久久久久aaaa九色 | 天天插伊人 | 国产成人一区二区三区免费看 | 91香蕉视频黄 | 国产精品a成v人在线播放 | 99久久久国产精品 | 久久免费黄色网址 | 日韩天天综合 | 国产精品九九久久99视频 | 国产精品亚洲精品 | 2019中文在线观看 | 亚洲精品自拍视频在线观看 | 久久av观看 | 日韩久久精品一区二区 | www色,com | 精品美女在线视频 | 超碰99人人 | 色瓜| 久久天天躁狠狠躁亚洲综合公司 | 免费观看黄 | 亚洲欧美日韩在线一区二区 | 天天艹日日干 | 九九天堂| 一区在线观看 | 波多野结衣一区二区三区中文字幕 | 国产精品密入口果冻 | 亚洲天堂网视频在线观看 | av免费福利 | 色婷婷a| 九九热国产视频 | av丝袜在线 | 黄色大片网 | 九九九九九九精品任你躁 | 成人中文字幕在线观看 | 国产一区欧美二区 | 天天干天天操天天射 | av黄色av| 麻豆视频在线观看免费 | 黄色的视频网站 | 精品久久久影院 | 天天干一干 | 在线a亚洲视频播放在线观看 | 国产精品夜夜夜一区二区三区尤 | 欧美日韩视频免费看 | 亚洲一级电影视频 | 久久在线免费 | 97碰碰精品嫩模在线播放 | 视频一区视频二区在线观看 | 国产精品久久久久999 | 久久久久久久久久久网站 | 国产69精品久久99的直播节目 | 91大神免费在线观看 | 中文字幕在线免费看线人 | 久草视频免费播放 | 国产精品久久久久影视 | 一本一本久久a久久精品牛牛影视 | 久久这里只有精品久久 | 久久久久久久久久毛片 | 精品国产乱码 | 四虎www com| 国产第一页福利影院 | 成人午夜影视 | 久久久久成 | 亚洲国产免费 | 97视频免费在线观看 | 国精产品满18岁在线 | 在线观看黄色大片 | 成人av在线直播 | 在线免费中文字幕 | 免费av网址大全 | 天堂va在线高清一区 | 91网址在线观看 | 国外av在线 | 国产一级二级在线播放 | 国产精品网站一区二区三区 | 精品国产一区二区三区久久久蜜月 | 国产精品久久久久久久久久新婚 | 日韩a在线看 | 国内精品在线一区 | 亚洲免费在线看 | 成年人在线视频观看 | 中文字幕丝袜美腿 | 少妇bbb | 天天爱天天 | 久久精品专区 | www.亚洲精品视频 | 日韩在线免费小视频 | 国产精品99蜜臀久久不卡二区 | 天天躁日日躁狠狠躁av麻豆 | 亚洲精品视频在线观看网站 | 人人狠狠综合久久亚洲婷 | 国产粉嫩在线观看 | 91丨九色丨蝌蚪丨老版 | 精品一二三区视频 | 免费看成人片 | 99r在线 | 日本激情动作片免费看 | 成人在线黄色电影 | av黄色在线播放 | 色免费在线 | 久久精品99国产精品亚洲最刺激 | 日本精品视频网站 | 综合网久久| 久久久久久97三级 | 伊人黄 | 中文字幕高清免费日韩视频在线 | 国内精品久久久久影院日本资源 | 免费精品视频在线 | 久久免费成人精品视频 | 成人久久18免费 | 国产午夜三级一区二区三 | 园产精品久久久久久久7电影 | 国产视频2 | 天天插日日操 | 欧美一区影院 | av在线免费在线观看 |