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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

C项目实践--俄罗斯方块(2)

發(fā)布時(shí)間:2025/3/21 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C项目实践--俄罗斯方块(2) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在VS中新建win32 Application Proj,選擇Empty ,完成TetrisWin項(xiàng)目創(chuàng)建。新建tetris.c和tetris.h兩個(gè)文件,打開tetris.h文件。

首先要包括的是可能要用到的頭文件,那在這里要用到是什么頭文件呢? 本系統(tǒng)是開發(fā)一個(gè)游戲,那么游戲的話就需要有和用戶進(jìn)行交互的游戲界面,那就需要繪圖操作,那么就會(huì)用到windows的繪圖函數(shù)庫(kù),所以第一步就是要包括這個(gè)windows頭文件,但是要注意我們現(xiàn)在是在頭文件tetris.h中來(lái)包含這個(gè)頭文件,這里就需要注意使用#ifndef 宏來(lái)進(jìn)行包含處理,因?yàn)閠etris.h最終會(huì)被包含在實(shí)現(xiàn)文件中去,但是不確定實(shí)現(xiàn)文件的頭部是否也會(huì)包含這個(gè)windows庫(kù)頭文件,如果包括了的話我們就沒有必要再包括了,否則就會(huì)引發(fā)重定義錯(cuò)誤,所以在頭文件中要包括什么庫(kù)的頭文件時(shí),最好用#ifndef宏先判斷是否已包含了該頭文件,只有在沒有包括的情況下再去包含該頭文件,此時(shí)才不會(huì)報(bào)重定義的錯(cuò)誤。具體實(shí)現(xiàn)如下:

//header infor #ifndef WIN_H_H #define WIN_H_H #include <Windows.h> #endif

因?yàn)橛螒蛑兄挥?種游戲方塊,所以可以聲明為一個(gè)枚舉類型,同時(shí)也有利于在游戲中為了方便的直到當(dāng)前方塊形狀和下一個(gè)方塊形狀。具體實(shí)現(xiàn)如下:

//self_definition enum typedef enum tetris_shape{ ZShape = 0, SShape, LineShape, TShape, SquareShape, LShape, MirroredLShape }shape;

接下來(lái)根據(jù)要實(shí)現(xiàn)的功能模塊聲明相應(yīng)的處理函數(shù)。具體實(shí)現(xiàn)如下:

//function declaraction int maxX(); //取得當(dāng)前方塊的最大x坐標(biāo) int minX(); //取得當(dāng)前方塊的最小x坐標(biāo) void turn_left(); //將當(dāng)前方塊逆時(shí)針旋轉(zhuǎn)90度 void turn_right(); //將當(dāng)前方塊順時(shí)針旋轉(zhuǎn)90度 int out_of_table();//檢查當(dāng)前方塊是否超出桌面的范圍 void transform(); //旋轉(zhuǎn)當(dāng)前方塊 int leftable(); //判斷當(dāng)前方塊能否左移 int rightable(); //判斷當(dāng)前方塊能否右移 int downable(); //判斷當(dāng)前方塊能否下移 void move_left(); //向左移動(dòng)當(dāng)前方塊 void move_right(); //向右移動(dòng)當(dāng)前方塊 ? //operation function int add_to_table();//將當(dāng)前方塊固定到桌面上,若返回0,表示游戲結(jié)束 void remove_full();//刪除桌面上填滿的行 ? //control function void new_game(); //創(chuàng)建一個(gè)新游戲 void run_game(); //運(yùn)行游戲 void next_shape(); //將下一個(gè)方塊設(shè)為當(dāng)前方塊,并設(shè)置下一個(gè)方塊 int random(int seed);//取得一個(gè)隨機(jī)數(shù),例如random(7)將返回一個(gè)0-6之間的隨機(jī)數(shù) ? //paint function void paint(); //將內(nèi)存位圖輸出到窗口上 void draw_table(); //繪制游戲桌面 ? //other functions void key_down(WPARAM wParam); //處理鍵盤按下事件 void resize(); //改變窗口大小時(shí)調(diào)用的函數(shù) void intialize();//初始化 void finalize(); //結(jié)束時(shí),釋放資源 ? //callback function //回調(diào)函數(shù),用來(lái)處理windows消息 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

上面基本上把需要用到的處理函數(shù)都已聲明完畢,接下來(lái)打開tetris.c文件來(lái)實(shí)現(xiàn)相應(yīng)的功能,首先需要包含一些頭文件,1.系統(tǒng)中需要用到sprintf()這樣函數(shù)來(lái)格式化輸出一些字符到相應(yīng)的變量中,所以需要包含stdio.h文件,同時(shí)需要使用當(dāng)前時(shí)間作為rand()種子來(lái)獲取隨機(jī)數(shù),所以需要包含time.h文件,當(dāng)然還需要包含tetris.h文件,具體實(shí)現(xiàn)如下:

//Header Info #include <time.h> #include <stdio.h> #include "tetris.h"

接下來(lái)需要定義一些常量,包括游戲開始結(jié)束時(shí)的提示信息以及相應(yīng)的顏色值等,具體定義如下:

//constant definition #define APP_NAME "TETRIS" #define APP_TITLE "Tetris Game" #define GAMEOVER "GAME OVER" ? #define SHAPE_COUNT 7 //形狀的個(gè)數(shù) #define BLOCK_COUNT 4 //每個(gè)形狀由幾個(gè)小表格構(gòu)成 #define MAX_SPEED 5 //速度級(jí)別 #define COLUMS 20 //游戲桌面表格的列數(shù) #define ROWS 30 //游戲桌面表格的行數(shù) ? //7種顏色 #define RED RGB(255,0,0) #define YELLOW RGB(255,255,0) #define GRAY RGB(128,128,128) #define BLACK RGB(0,0,0) #define WHITE RGB(255,255,255) #define STONE RGB(192,192,192) ? #define CHARS_IN_LINE 14 //提示信息的一行有多少個(gè)字符 #define SCORE "SCORE %4d" //得分格式化

接下來(lái)定義一些全局變量:

//global variables definition char score_char[CHARS_IN_LINE] = {0}; //聲明一個(gè)接收得分情況的字符數(shù)組 char* press_enter = "Press Enter Key..."; char* help[] = //幫助提示信息 { "Press space or up key to transform shape.", "Press left or right key to move shape.", "Press down key to speed up.", "Press enter key to pause game.", "Enjoy it. :-)", 0 };

接下來(lái)把游戲狀態(tài)定義為一個(gè)枚舉類型,便于對(duì)其進(jìn)行操作,具體實(shí)現(xiàn)如下:

//enum the state of game enum game_state { game_start, game_run, game_pause, game_over }state = game_start;

之前我們把游戲的7種方塊定義成了一個(gè)枚舉類型,那么我們會(huì)通過(guò)這些枚舉變量的相應(yīng)的值來(lái)判斷目前是哪種方塊,同時(shí)我們要為這些方塊涂上不同的顏色,所以我們最好也把這些顏色定義為一個(gè)數(shù)組,這樣到時(shí)候要為某個(gè)方塊涂上對(duì)應(yīng)顏色的時(shí)候也只需要根據(jù)當(dāng)前方塊的枚舉變量值做為數(shù)組的下標(biāo)值來(lái)確定相應(yīng)的顏色方案,所以下面來(lái)定義顏色數(shù)組:

//color of Rectangle COLORREF shape_color[] = { RGB(255,0,0), RGB(0,255,0), RGB(0,0,255), RGB(255,255,0), RGB(0,255,255), RGB(255,0,255), RGB(255,255,255) };

接下來(lái)定義表示7種方形相對(duì)坐標(biāo)的三維數(shù)組,具體實(shí)現(xiàn)如下:

//SEVEN SHAPE OF RECTANGLE int shape_coordinate[SHAPE_COUNT][BLOCK_COUNT][2] = { {{0,-1},{0,0},{-1,0},{-1,1}}, {{0,-1},{0,0},{1,0},{1,1}}, {{0,-1},{0,0},{0,1},{0,2}}, {{-1,0},{0,0},{1,0},{0,1}}, {{0,0},{1,0},{0,1},{1,1}}, {{-1,-1},{0,-1},{0,0},{0,1}}, {{1,-1},{0,-1},{0,0},{0,1}} };

接下來(lái)還需要定義一些輔助變量如記錄得分的變量score,如當(dāng)前方塊的最左邊的坐標(biāo)位置等以及相應(yīng)的繪圖變量,具體定義和說(shuō)明如下:

int score = 0; //得分 ? //shape next = 0; //shape current = 0; shape next = ZShape; //下一個(gè)方塊 shape current = ZShape; //當(dāng)前方塊 ? int current_coordinate[4][2] = {0}; //當(dāng)前方塊的每一部分的坐標(biāo),初始化為0 int table[ROWS][COLUMS] = {0}; //游戲桌面,初始化為全0,表示桌面上還沒有方塊 int shapex = 0; //當(dāng)前方塊的x坐標(biāo) int shapey = 0; //當(dāng)前方塊的y坐標(biāo) int speed = 0; //方塊下移的速度 clock_t start = 0; //每一幀的開始時(shí)間 clock_t finish = 0; //每一幀的結(jié)束時(shí)間 ? //windows paint function HWND gameWND; //window窗口句柄 HBITMAP memBM; //內(nèi)存位圖 HBITMAP memBMOld; //內(nèi)存原始位圖 HDC memDC; //內(nèi)存DC RECT clientRC; //客戶區(qū)矩形區(qū)域 HBRUSH blackBrush; //黑色畫筆 HBRUSH stoneBrush; //深灰色畫筆 HBRUSH shapeBrush[SHAPE_COUNT]; //方塊畫筆,7種方塊,每種一個(gè) HPEN grayPen; //灰色畫筆 HFONT bigFont; //大字體,用來(lái)顯示游戲名稱及"GAME OVER" HFONT smallFont; //小字體用來(lái)顯示幫助信息等

目前,該聲明的變量都已經(jīng)聲明完畢, 接下來(lái)就開始根據(jù)相應(yīng)的功能實(shí)現(xiàn)其處理函數(shù)

1.取最大坐標(biāo)

函數(shù)名稱:maxX

函數(shù)功能:取得當(dāng)前方塊的最大x坐標(biāo)。具體實(shí)現(xiàn)如下:

//main functions //對(duì)比當(dāng)前方塊的BLOCK_COUNT個(gè)小塊 //選擇它們最大的x坐標(biāo) int maxX() { int i =0; int x = current_coordinate[i][0]; int m = x; for(i = 1; i< BLOCK_COUNT; i++) { x = current_coordinate[i][0]; if(m < x) { m = x; } } return m; }

2.取最小坐標(biāo)

函數(shù)名稱:minX

函數(shù)功能:取得當(dāng)前方塊的最小x坐標(biāo)。具體實(shí)現(xiàn)如下:

int minX() { int i = 0; int x = current_coordinate[i][0]; int m = x; for(i = 1;i<BLOCK_COUNT;i++) { x = current_coordinate[i][0]; if(m > x) { m = x; } } return m; }

3.逆時(shí)針旋轉(zhuǎn)方塊

函數(shù)名稱:turn_left

函數(shù)功能:將當(dāng)前方塊逆時(shí)針旋轉(zhuǎn)90度。具體實(shí)現(xiàn)如下:

//逆時(shí)針旋轉(zhuǎn)90度 //旋轉(zhuǎn)公式 x' = y; y' = -x void turn_left() { int i = 0; int x, y; for(i = 0; i < 4; i++) { x = current_coordinate[i][0]; y = current_coordinate[i][1]; current_coordinate[i][0] = y; current_coordinate[i][1] = -x; } }

4.順時(shí)針旋轉(zhuǎn)方塊

函數(shù)名稱:turn_right

函數(shù)功能:將當(dāng)前方塊順時(shí)針旋轉(zhuǎn)90度。旋轉(zhuǎn)公式:x' = –y , y' = x; 具體實(shí)現(xiàn)如下:

//順時(shí)針旋轉(zhuǎn) void turn_right() { int i = 0; int x, y; for(i = 0; i< 4; i++) { x = current_coordinate[i][0]; y = current_coordinate[i][1]; current_coordinate[i][0] = -y; current_coordinate[i][1] = x; } }

5.檢測(cè)方塊是否越界

函數(shù)名稱:out_of_table

函數(shù)功能:檢查當(dāng)前方塊是否超出桌面范圍。具體實(shí)現(xiàn)如下:

//檢測(cè)是否越界 int out_of_table() { int i = 0; int x , y; for(i = 0; i < 4; i++) { //shapex,shapey的值在生成一個(gè)新的方塊時(shí)設(shè)定,它們是方塊生成時(shí)最左邊的初始邊界坐標(biāo)點(diǎn)值 //current_coordinate[i][]值是相對(duì)應(yīng)shapex,shapey的偏移值 //所以直接檢測(cè)shapex + current_coordiante[][]值就是其目前在游戲桌面上的坐標(biāo)值 x = shapex + current_coordinate[i][0]; y = shapey + current_coordinate[i][1]; //如果x值為負(fù)值,則表示游戲方塊已經(jīng)超出了游戲桌面的最左邊的表示邊界 //如果x值大于COLUMS-1表示超出了游戲桌面的最右邊表示邊界 //如果y值大于游戲桌面最下面的表示邊界,則表示超出了游戲邊界 if(x < 0 || x > (COLUMS-1)|| y > (ROWS - 1)) { return 1; } //table[ROWS][COLUMS]表示為table[y][x]本身是初始化為全0的,如果由值不是0 表示 //當(dāng)前方形已經(jīng)運(yùn)行到某個(gè)方形上面了,則也表示越界 if(table[y][x]) { return 1; } } //方形沒有越界則返回0,否則返回1 return 0; }

6.旋轉(zhuǎn)方塊

函數(shù)名稱:transform

函數(shù)功能:旋轉(zhuǎn)當(dāng)前方塊。具體實(shí)現(xiàn)如下:

//旋轉(zhuǎn)當(dāng)前方塊 void transform() { //如果是田字形的方塊則不需要旋轉(zhuǎn)變化 if(current == SquareShape) { return ; } //默認(rèn)順時(shí)針旋轉(zhuǎn) turn_right(); //如果順時(shí)針旋轉(zhuǎn)出現(xiàn)越界情況則 //進(jìn)行逆時(shí)針旋轉(zhuǎn) if(out_of_table()) { turn_left(); } }

7.判斷方塊能否向左移動(dòng)

函數(shù)名稱:leftable

函數(shù)功能:判斷當(dāng)前方塊能否向左移動(dòng),能移動(dòng)則返回1,否則返回0.具體實(shí)現(xiàn)如下:

//判斷能否向左移動(dòng) int leftable() { int i = 0; int x , y; for(i = 0; i < 4; i++) { //shapex,shapey 是初始化生成方形時(shí)最左邊的x,y坐標(biāo)值 //current_coordinate是方形的相對(duì)偏移位置 //x,y為目前方形中某個(gè)方塊的實(shí)際坐標(biāo)值 x = shapex + current_coordinate[i][0]; y = shapey + current_coordinate[i][1]; //如果發(fā)生越界則返回0,否則返回1 //x <= 0 判斷x是否越過(guò)左邊界 //判斷table[y][x-1] == 1,表示以當(dāng)前坐標(biāo)值x,y所在點(diǎn)為基準(zhǔn) //向左探測(cè)一小方塊,看這個(gè)小方塊是否被已有的方形占用了 //如果占用了則它的值為1,否則為0,如果為1,則表示目前方形已經(jīng) //落到了另一個(gè)已經(jīng)存在的方形上了,發(fā)生了重疊,那這也是越界了 if(x <= 0 || table[y][x-1] == 1) { return 0; } } return 1; }

8.判斷方塊能否向右移動(dòng)

函數(shù)名稱:rightable

函數(shù)功能:判斷當(dāng)前方塊能否向右移動(dòng),能移動(dòng)則返回1,否則返回0.具體實(shí)現(xiàn)如下:

//判斷能否向右移動(dòng) int rightable() { int i = 0; int x, y ; for(i = 0; i < 4; i++) { x = shapex + current_coordinate[i][0]; y = shapey + current_coordinate[i][1]; //x>=(COLUMS -1)判斷是否越過(guò)右邊界 //判斷table[y][x+1] 表示以當(dāng)前坐標(biāo)值x,y所在點(diǎn)為基準(zhǔn) //向右探測(cè)一小方塊,看這個(gè)小方塊是否被已有的方形占用了 //如果占用了則它的值為1,否則為0,如果為1,則表示目前方形已經(jīng) //落到了另一個(gè)已經(jīng)存在的方形上了,發(fā)生了重疊,那這也是越界了 if(x >= (COLUMS -1) || table[y][x+1] == 1) { return 0; } } return 1; }

9.判斷方塊能否向下移動(dòng)

函數(shù)名稱:downable

函數(shù)功能:判斷當(dāng)前方塊能否向下移動(dòng),能移動(dòng)則返回1,否則返回0.具體實(shí)現(xiàn)如下:

int downable() { int i = 0; int x , y; for(i = 0; i<4;i++) { x = shapex + current_coordinate[i][0]; y = shapey + current_coordinate[i][1]; if(y >= (ROWS -1) || table[y+1][x] == 1) { return 0; } } return 1; }

10.向左或右移動(dòng)當(dāng)前方塊

函數(shù)名稱:move_left /move_right

函數(shù)功能:向左/右移動(dòng)當(dāng)前方塊。具體實(shí)現(xiàn)如下:

void move_left() { if(leftable()) { //shapex是方塊最左邊的坐標(biāo)位置點(diǎn)x的值,--表示 //當(dāng)前方形整體左移一個(gè)單位 shapex--; } } ? void move_right() { if(rightable()) { //shapex是方塊最左邊的坐標(biāo)位置點(diǎn)x的值,++表示 //當(dāng)前方形整體右移一個(gè)單位 shapex++; } }

11.向下移動(dòng)當(dāng)前方塊

函數(shù)名稱:move_down

函數(shù)功能:向下移動(dòng)當(dāng)前方塊。具體實(shí)現(xiàn)如下:

void move_down() { //如果可以向下移動(dòng),則 //shapey++,表示當(dāng)前方形整體下移一個(gè)單位 if(downable()) { shapey++; }else{ //如果不能往下移動(dòng)則繼續(xù)判斷 //如果是可以添加到當(dāng)前游戲桌面上,則自己添加 if(add_to_table()) { //添加完畢之后調(diào)用remove_full()函數(shù)來(lái)檢測(cè)是否 //有滿行的,如果有則清除掉 //然后繼續(xù)生成下一個(gè)方形,將其作為當(dāng)前方形 remove_full(); next_shape(); }else{ //如果既不能往下移動(dòng),也不能把他添加到游戲桌面上 //則表示越界,那就結(jié)束游戲 state = game_over; } } }

12.將當(dāng)前方塊固定到桌面上

函數(shù)名稱:add_to_table
函數(shù)功能:將當(dāng)前方塊固定到桌面上,若返回0,則表示游戲結(jié)束。具體實(shí)現(xiàn)如下:

//將當(dāng)前方塊添加到桌面上,若返回0則表示游戲結(jié)束,否則添加成功 int add_to_table() { int i = 0; int x ,y; for(i = 0; i< 4; i++) { //獲取當(dāng)前方形其中的小方塊的具體坐標(biāo)點(diǎn)值 x = shapex + current_coordinate[i][0]; y = shapey + current_coordinate[i][1]; //判斷是否越界或已經(jīng)有其它方塊存在,如果沒有則置1表示添加成功 if(y < 0 || table[y][x] == 1) { return 0; } table[y][x] = 1; } ? return 1; }

13.刪除填滿的行

函數(shù)名稱:remove_full

函數(shù)功能:刪除桌面上填滿的行。具體實(shí)現(xiàn)如下:

//刪除桌面上填滿的行 void remove_full() { int c = 0; int i,j; //首先定位到最底下那一行 for(i = ROWS -1; i>0;i--) { c = 0; //然后將當(dāng)前行的所有值相加 for(j = 0; j < COLUMS;j++) { c += table[i][j]; } //如果所有值相加的結(jié)果等于列數(shù)目,則表示當(dāng)前行是滿行 if(c == COLUMS) { //void *memmove( void* dest, void* src,count ); //memmove是從src所指內(nèi)存區(qū)域復(fù)制count個(gè)字節(jié)到dest所指內(nèi)存區(qū)域 //memmove有個(gè)特性,如果目標(biāo)區(qū)域dest和源區(qū)域src有重疊的話,memmove //能夠保證源串在被覆蓋之前將重疊區(qū)域的字節(jié)拷貝到目標(biāo)區(qū)域中 //這里我們正是利用了memmove的這個(gè)特性完成滿行的刪除工具和刪除后其上面的未滿行 //向下移動(dòng)的工作 memmove(table[1],table[0],sizeof(int)*COLUMS*i); //將table[0]清空 memset(table[0],0,sizeof(int)*COLUMS); score++;//分?jǐn)?shù)加1 speed = (score /100)%MAX_SPEED; //變速 i++; } else if(c == 0) { break; } } }

刪除滿行中利用了<windows.h>中的庫(kù)函數(shù)memmove保證疊加區(qū)域復(fù)制正確的特性,例如

#define ROWS 5

#define COLUMS 2

int table[ROWS][COLUMS] = {

{0,0},

{1,1},

{0,1},

{1,1},

{1,0}

};

利用memmove(table[1],table[0],sizeof(int)*COLUMS*i)它完成的功能是,是從table[0]地址處開始復(fù)制COLUMS*i個(gè)int字節(jié)個(gè)數(shù)據(jù)將其放到以table[1]地址開始的地方,具體操作如圖:

memset(table[0],0,sizeof(int)*COLUMS); 即把table[0]那一行清空,因?yàn)樗亲钌厦婺且恍?#xff0c;所以只要有滿行被刪除,那么最上面那一行永遠(yuǎn)都應(yīng)該是空的。

14.創(chuàng)建新游戲

函數(shù)名稱:new_game

函數(shù)功能:創(chuàng)建一個(gè)新游戲。具體實(shí)現(xiàn)如下:

//創(chuàng)建新游戲 void new_game() { //將桌面表格全部置零,清空桌面上殘余的方形 memset(table,0,sizeof(int)*COLUMS*ROWS); start = clock(); //初始化時(shí)鐘 next = (shape)random(SHAPE_COUNT); //初始化下一個(gè)方形 score = 0; //得分初始化為0 speed = 0; //速度初始化為0 }

15.運(yùn)行游戲

函數(shù)名稱:run_game

函數(shù)功能:運(yùn)行游戲。具體實(shí)現(xiàn)如下:

//運(yùn)行游戲 void run_game() { finish = clock(); if((finish - start) > (MAX_SPEED-speed)*100)//設(shè)定方形跳動(dòng)的時(shí)間間隔 { move_down(); //向下移動(dòng) start = clock();//重新記錄下一次跳動(dòng)的開始時(shí)間 InvalidateRect(gameWND,NULL,TRUE);//刷新整個(gè)客戶區(qū),重新跳動(dòng)之后的圖形 } }

16.操作當(dāng)前方塊

函數(shù)名稱:next_shape

函數(shù)功能:將下一個(gè)方形設(shè)為當(dāng)前的方塊,并隨機(jī)生成下一個(gè)方塊。具體實(shí)現(xiàn)如下:

void next_shape() { current = next; //將下一個(gè)方形設(shè)置為當(dāng)前方形 memcpy(current_coordinate,shape_coordinate[next],sizeof(int)*BLOCK_COUNT*2); //shapex的值為方塊放在游戲桌面正中央位置時(shí)其最左邊的x值 //shapey值為0 shapex = (COLUMS - ((maxX()-minX())))/2; shapey = 0; //隨機(jī)生成下一個(gè)方塊 next = (shape)random(SHAPE_COUNT); }

17.取隨機(jī)數(shù)

函數(shù)名稱:random

函數(shù)功能:取得一個(gè)隨機(jī)數(shù),例如,random(7)將返回一個(gè)0-6之間的隨機(jī)數(shù)。具體實(shí)現(xiàn)如下:

int random(int seed) { if( 0 == seed) { return 0; } srand((unsigned)time(NULL));//以當(dāng)前時(shí)間作為srand的seed //srand()函數(shù)就是給rand()提供種子seed。如果srand()中的形參每次都是同一個(gè)值 //那么每次運(yùn)行rand()產(chǎn)生的隨機(jī)數(shù)也是一樣的, 所以為了rand()每次產(chǎn)生不一樣的隨機(jī)數(shù) //通常把當(dāng)前時(shí)間作為srand()的參數(shù),這樣就可以得到不一樣的srand()參數(shù),從而rand()也 //就產(chǎn)生不一樣的種子 return (rand() % seed); }

18.繪圖

函數(shù)名稱:paint

函數(shù)功能:將內(nèi)存位圖輸出到窗口上。具體實(shí)現(xiàn)如下:

//paint func void paint() { PAINTSTRUCT ps; HDC hdc; draw_table(); /* *BeginPaint函數(shù)為指定窗口做繪圖工作前的相關(guān)準(zhǔn)備工作,將繪圖有關(guān)的信息填充到 *一個(gè)PAINTSTRUCT結(jié)構(gòu)中。原型如下: * HDC BeginPaint( * HWND hwnd, //[輸入]被重繪的窗口句柄 * LPPAINTSTRUCT lpPaint //[輸出]指向一個(gè)用來(lái)接收繪圖信息的PAINTSTRUCT結(jié)構(gòu) * ) * 返回值: 如果函數(shù)成功,則返回值是指定窗口的"顯示設(shè)備描述表"句柄。 * 否則返回值為NULL,表明沒有得到顯示設(shè)備的內(nèi)容。 * [注] * BeginPaint函數(shù)自動(dòng)設(shè)置顯示設(shè)備內(nèi)容的剪切區(qū)域,而排除任何更新區(qū)域外的區(qū)域。該 * 更新區(qū)域可以通過(guò) InvalidateRect 或 InvalidateRgn 函數(shù)來(lái)設(shè)置,也可以是系統(tǒng)在改 * 變大小,移動(dòng),創(chuàng)建,滾動(dòng)后設(shè)置的。如果更新區(qū)域被標(biāo)記為可擦除的,BeginPaint將發(fā) * 生一個(gè)WM_ERASEBKGND消息給窗口。如果窗口類有一個(gè)自己的背景刷,那么BeginPaint將 * 使用這個(gè)刷子來(lái)擦除更新區(qū)域的背景。 * BeginPaint與EndPaint只能配對(duì)使用,不能單獨(dú)使用,BeginPaint返回一個(gè)用來(lái)繪圖的客 * 戶區(qū)的顯示設(shè)備內(nèi)容的HANDLE, 而EndPaint則終止繪畫請(qǐng)求,并釋放設(shè)備內(nèi)容。 * 需要注意的是BeginPaint和 EndPaint只能在響應(yīng)WM_PAINT消息時(shí)使用,而且只能調(diào)用一次 * * 如果被繪畫的客戶區(qū)中有一個(gè)caret(caret:插入符。是窗口客戶區(qū)中的一個(gè)閃爍的線,塊, * 或位圖。插入符通常表示文本或圖形將被插入的地方。即一閃一閃的光標(biāo)),BeginPaint將 * 自動(dòng)隱藏該符號(hào),而保證它不被擦除。 */ hdc = BeginPaint(gameWND,&ps); //BOOL BitBlt(HDC hdcDest, int nXDest,int nYDest, int nWidth,int nHeight, HDC hdcSrc // ,int nXSrc, int nYSrc,DWORD dwRop); 如果dwRop 是SRCCOPY 則表示將源hdcSrc //內(nèi)存位圖原樣拷貝到目標(biāo)hdcDest處。 BitBlt(hdc,clientRC.left,clientRC.top,clientRC.right,clientRC.bottom,memDC,0,0,SRCCOPY); EndPaint(gameWND,&ps); }

19.繪制游戲桌面

函數(shù)名稱:draw_table

函數(shù)功能:繪制游戲桌面

處理流程:首先用黑色矩形填充桌面背景區(qū),接著判斷游戲的狀態(tài),如果是開始狀態(tài),用黃色字顯示游戲開始畫面,如果是結(jié)束狀態(tài),用紅色字顯示 GAME OVER ; 如果是游戲運(yùn)行狀態(tài),則依次繪制游戲桌面,當(dāng)前方塊,下一個(gè)方塊,得分和游戲幫助等。具體實(shí)現(xiàn)如下:

//繪制游戲桌面 void draw_table() { HBRUSH hBrushOld; HPEN hPenOld; HFONT hFontOld; RECT rc; int x0,y0,w; int x,y,i,j; char* str; ? w = clientRC.bottom /(ROWS + 2); //設(shè)置一個(gè)方塊的寬度 x0 = y0 = w; //用黑色矩形填充桌面背景區(qū) FillRect(memDC,&clientRC,blackBrush); if(state == game_start || state == game_over) { // 繪制游戲開始或結(jié)束的標(biāo)題界面 memcpy(&rc,&clientRC,sizeof(RECT)); rc.bottom = rc.bottom / 2; hFontOld = (HFONT)SelectObject(memDC,bigFont); SetBkColor(memDC,BLACK); //如果游戲是開始狀態(tài),則用黃色字顯示游戲開始界面 if(state == game_start) { str = APP_TITLE; SetTextColor(memDC,YELLOW); }else{ //如果游戲是結(jié)束狀態(tài),則用紅色字顯示 GAME OVER str = GAMEOVER; SetTextColor(memDC,RED); } ? DrawText(memDC,str,strlen(str),&rc,DT_SINGLELINE | DT_CENTER| DT_BOTTOM); SelectObject(memDC,hFontOld); ? //提示信息 hFontOld = (HFONT)SelectObject(memDC,smallFont); rc.top = rc.bottom; rc.bottom = rc.bottom*2; if(state == game_over) { SetTextColor(memDC,YELLOW); sprintf(score_char,SCORE,score); DrawText(memDC,score_char,strlen(score_char),&rc,DT_SINGLELINE|DT_CENTER|DT_TOP); } ? SetTextColor(memDC,STONE); DrawText(memDC,press_enter,strlen(press_enter),&rc,DT_SINGLELINE|DT_CENTER|DT_VCENTER); SelectObject(memDC,hFontOld); ? return; } ? //畫桌面上殘留的方塊 hBrushOld = (HBRUSH)SelectObject(memDC,stoneBrush); for(i = 0; i < ROWS; i++) { for(j = 0; j < COLUMS; j++) { if(table[i][j] == 1) { x = x0 + j*w; y = y0 + i*w; Rectangle(memDC,x,y,x+w+1,y+w+1); } } } ? SelectObject(memDC,hBrushOld); ? //畫當(dāng)前的方塊 hBrushOld = (HBRUSH)SelectObject(memDC,shapeBrush[current]); for(i = 0; i < 4; i++) { //取得當(dāng)前方形中某一單元在桌面上的實(shí)際坐標(biāo)值 x = x0 + (current_coordinate[i][0] + shapex)*w; y = y0 + (current_coordinate[i][1] + shapey)*w; if(x < x0 || y < y0) { continue; } //繪制實(shí)心矩形 Rectangle(memDC,x,y,x+w+1,y+w+1); } SelectObject(memDC,hBrushOld); //畫桌面上的表格線條 hPenOld = (HPEN)SelectObject(memDC,grayPen); for(i = 0; i<= ROWS; i++) { /*MoveToEx(memDC,x0+i*w,y0,NULL);*/ MoveToEx(memDC,x0,y0+i*w,NULL); LineTo(memDC,x0+COLUMS*w,y0+i*w); } for(i = 0; i <= COLUMS; i++) { MoveToEx(memDC,x0+i*w,y0,NULL); LineTo(memDC,x0+i*w,y0+ROWS*w); } SelectObject(memDC,hPenOld); ? //畫玩家得分 x0= x0+COLUMS*w +3*w;//設(shè)置得分字樣在桌面上的偏移位置 y0=y0+w; hFontOld = (HFONT)SelectObject(memDC,smallFont);//選擇字體 SetTextColor(memDC,YELLOW);//設(shè)置字體顏色 sprintf(score_char,SCORE,score); /*sprintf(score_char,SCORE,shapex);*/ /*sprintf(score_char,SCORE,table[29][0]);*/ TextOut(memDC,x0,y0,score_char,strlen(score_char));//繪制得分 //畫下一個(gè)方塊 y0 += w; SetTextColor(memDC,STONE); TextOut(memDC,x0,y0,"NEXT",4); x0 = x0 + w; y0 += 2*w; hBrushOld = (HBRUSH)SelectObject(memDC,shapeBrush[next]); for(i = 0; i < 4; i++) { x = x0 + shape_coordinate[next][i][0]*w; y = y0 + shape_coordinate[next][i][1]*w; Rectangle(memDC,x,y,x+w+1,y+w+1); } ? SelectObject(memDC,hBrushOld); //打印幫助信息 x0 = (COLUMS + 2)*w; y0 += 4*w; SetTextColor(memDC,GRAY); i = 0; while(help[i]) { TextOut(memDC,x0,y0,help[i],strlen(help[i])); y0 += w; i++; } SelectObject(memDC,hFontOld); }

20.處理按鍵

函數(shù)名稱:key_down

函數(shù)功能:處理鍵盤按下事件。

處理流程:1.如果游戲狀態(tài)不是運(yùn)行狀態(tài),按回車鍵是進(jìn)行暫停/開始游戲的切換鍵。2.游戲運(yùn)行狀態(tài),按向上鍵或空格鍵旋轉(zhuǎn)當(dāng)前方塊,按向左鍵左移當(dāng)前方塊,按向右鍵右移當(dāng)前方塊,按向下鍵下移當(dāng)前方塊。按回車鍵,來(lái)回切換暫停/開始游戲。具體實(shí)現(xiàn)如下:

//按鍵事件處理 void key_down(WPARAM wParam) { //如果游戲狀態(tài)處理非運(yùn)行狀態(tài),按下回車鍵,則開始游戲 if(state != game_run) { if(wParam == VK_RETURN) { switch(state) { case game_start: next_shape(); state = game_run; break; case game_pause: state = game_run; break; case game_over: new_game(); next_shape(); state = game_run; break; } } } else //在游戲運(yùn)行狀態(tài)下,響應(yīng)鍵盤事件 { switch(wParam) { case VK_SPACE: //空格鍵/向上鍵則旋轉(zhuǎn)當(dāng)前方塊 case VK_UP: transform(); break; case VK_LEFT: //左向鍵左移當(dāng)前方塊 move_left(); break; case VK_RIGHT: //右向鍵右移當(dāng)前方塊 move_right(); break; case VK_DOWN: //下向鍵下移當(dāng)前方塊 move_down(); break; case VK_RETURN://回車鍵暫停當(dāng)前游戲 state = game_pause; break; } } //重繪客戶區(qū) InvalidateRect(gameWND,NULL,TRUE); }

21.改變窗口大小

函數(shù)名稱:resize

函數(shù)功能:改變窗口大小時(shí)調(diào)用的函數(shù)。具體實(shí)現(xiàn)如下:

void resize() { HDC hdc; LOGFONT lf; hdc = GetDC(gameWND); GetClientRect(gameWND,&clientRC); SelectObject(memDC,memBMOld); DeleteObject(memBM); //重新創(chuàng)建合適的內(nèi)存位圖 memBM = CreateCompatibleBitmap(hdc,clientRC.right,clientRC.bottom); memBMOld = (HBITMAP)SelectObject(memDC,memBM); //重新創(chuàng)建合適的大字體和小字體 DeleteObject(bigFont); memset(&lf,0,sizeof(LOGFONT)); lf.lfWidth = (clientRC.right - clientRC.left) / CHARS_IN_LINE; lf.lfHeight = (clientRC.bottom - clientRC.top) /4; lf.lfItalic = 1; lf.lfWeight = FW_BOLD; bigFont = CreateFontIndirect(&lf); ? DeleteObject(smallFont); lf.lfHeight = clientRC.bottom / (ROWS + 2); lf.lfWidth = lf.lfHeight / 2; lf.lfItalic = 0; lf.lfWeight = FW_NORMAL; smallFont = CreateFontIndirect(&lf); ? ReleaseDC(gameWND, hdc); }

22.處理消息

函數(shù)名稱:WndProc

函數(shù)功能:回調(diào)函數(shù),用來(lái)處理Windows消息。具體實(shí)現(xiàn)如下:

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_SIZE: //響應(yīng)改變窗口大小的消息 resize(); return 0; case WM_ERASEBKGND: //響應(yīng)重繪背景的消息 return 0; case WM_PAINT: //相應(yīng)繪制消息 paint(); return 0; case WM_KEYDOWN: //相應(yīng)按鍵消息 key_down(wParam); return 0; case WM_DESTROY: //響應(yīng)銷毀窗口的消息 PostQuitMessage(0); return 0; } //其它消息用Windows默認(rèn)的消息處理函數(shù)處理 return DefWindowProc(hwnd, message,wParam,lParam); }

23.初始化

函數(shù)名稱:initialize

函數(shù)功能:初始化內(nèi)存位圖,畫筆,字體等資源。具體實(shí)現(xiàn)如下:

void initialize() { LOGFONT lf; HDC hdc; int i; ? hdc = GetDC(gameWND); GetClientRect(gameWND,&clientRC); //取得窗口客戶區(qū)大小 memDC = CreateCompatibleDC(hdc); //創(chuàng)建內(nèi)存DC //創(chuàng)建內(nèi)存位圖 memBM = CreateCompatibleBitmap(hdc, clientRC.right,clientRC.bottom); //將內(nèi)存位圖選入到內(nèi)存DC中 memBMOld = (HBITMAP)SelectObject(memDC,memBM); //創(chuàng)建黑色畫筆和深灰色畫筆 blackBrush = CreateSolidBrush(BLACK); stoneBrush = CreateSolidBrush(STONE); //創(chuàng)建每個(gè)方塊所對(duì)應(yīng)顏色的畫筆 for(i = 0; i < SHAPE_COUNT;i++) { shapeBrush[i] = CreateSolidBrush(shape_color[i]); } grayPen = CreatePen(PS_SOLID,1,GRAY);//創(chuàng)建灰色畫筆 memset(&lf,0,sizeof(LOGFONT)); //創(chuàng)建大字體 lf.lfWidth = (clientRC.right - clientRC.left) / CHARS_IN_LINE; lf.lfHeight = (clientRC.bottom - clientRC.top) /4; lf.lfItalic = 1; lf.lfWeight = FW_BOLD; bigFont = CreateFontIndirect(&lf); //創(chuàng)建小字體 lf.lfHeight = clientRC.bottom / (ROWS + 2); lf.lfWidth = lf.lfHeight / 2; lf.lfItalic = 0; lf.lfWeight = FW_NORMAL; smallFont = CreateFontIndirect(&lf); ReleaseDC(gameWND,hdc); }

24.釋放資源

函數(shù)名稱:finalize

函數(shù)功能:游戲結(jié)束時(shí)調(diào)用該函數(shù)釋放initialize中創(chuàng)建的資源。具體實(shí)現(xiàn)如下:

void finalize() { int i = 0; DeleteObject(blackBrush); DeleteObject(stoneBrush); for(i = 0; i < SHAPE_COUNT; i++) { DeleteObject(shapeBrush[i]); } ? DeleteObject(grayPen); DeleteObject(bigFont); DeleteObject(smallFont); SelectObject(memDC,memBMOld); DeleteObject(memBM); DeleteDC(memDC); }

25.系統(tǒng)入口函數(shù)

函數(shù)名稱:WinMain

函數(shù)功能:Windows程序入口,類似于DOS程序的main函數(shù)。具體實(shí)現(xiàn)如下:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance,PSTR szCmdLine,int iCmdShow) { MSG msg; //聲明一個(gè)消息結(jié)構(gòu)體變量 WNDCLASS wndclass; //聲明一個(gè)窗口類變量 ? //初始化窗口信息 wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = APP_NAME; //注冊(cè)窗口類 RegisterClass(&wndclass); //創(chuàng)建窗口 gameWND = CreateWindow(APP_NAME, APP_TITLE, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL,NULL, hInstance,NULL); //初始化游戲基本資源 initialize(); //顯示窗口 ShowWindow(gameWND, iCmdShow); UpdateWindow(gameWND); //刷新窗口 //創(chuàng)建游戲 new_game(); for(;;)//進(jìn)入消息循環(huán) { if(state == game_run) { run_game(); } ? if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) { if(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); }else{ break; } } } ? finalize(); ? return msg.wParam; } 至此游戲的基本功能已經(jīng)實(shí)現(xiàn)。

5.系統(tǒng)操作過(guò)程

F5游戲運(yùn)行后,首先進(jìn)入歡迎主界面,如圖:

在歡迎主界面中按任意鍵進(jìn)入游戲,游戲界面如圖:

游戲結(jié)束界面如圖:

6.總結(jié)與Bug記錄

Bug.1

//畫桌面上的表格線條
??? hPenOld = (HPEN)SelectObject(memDC,grayPen);
??? for(i = 0; i<= ROWS; i++)
??? {
???? ?? /*MoveToEx(memDC,x0+i*w,y0,NULL);*/
??????? MoveToEx(memDC,x0,y0+i*w,NULL);
??????? LineTo(memDC,x0+COLUMS*w,y0+i*w);
??? }

Bug.2

顯示出了SCORE字樣但是沒有顯示得分情況,

將#define SCORE "SCORE? %4"改成:#define SCORE "SCORE? %4d"

Bug.3

方塊旋轉(zhuǎn)有問(wèn)題

void turn_right()
{
??? int i = 0;
??? int x, y;
??? for(i = 0; i< 4; i++)
??? {
??????? x = current_coordinate[i][0];
??????? y = current_coordinate[i][1];
?? ???? current_coordinate[i][0] = -y; //沒有寫
??????? current_coordinate[i][1] = x;
??? }
}

轉(zhuǎn)載于:https://www.cnblogs.com/AI-Algorithms/p/3428487.html

總結(jié)

以上是生活随笔為你收集整理的C项目实践--俄罗斯方块(2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

又湿又紧又大又爽a视频国产 | 国产婷婷精品 | 9在线观看免费高清完整 | 日日夜夜狠狠干 | 欧美91精品久久久久国产性生爱 | 91成人精品一区在线播放69 | 99久久夜色精品国产亚洲 | 最近中文字幕免费观看 | 精品自拍sae8—视频 | 日韩在线观看高清 | 中文字幕日韩一区二区三区不卡 | www在线观看视频 | 成人黄色大片在线免费观看 | 在线激情影院一区 | 夜色资源网 | 亚洲天天在线日亚洲洲精 | 亚洲成色777777在线观看影院 | 久久人人干 | 久久精品美女 | 色综合综合 | 国产成人精品久久久久蜜臀 | 狠狠的干 | 一区二区激情视频 | 综合铜03| 日本精品在线看 | 精品国产免费看 | 人人讲下载 | 国产二区免费视频 | 国产成人在线播放 | 有没有在线观看av | 91九色porny在线 | 免费三级黄色 | 日韩av影视在线观看 | 91视频这里只有精品 | 色婷婷精品大在线视频 | 国产伦理久久精品久久久久_ | 成人三级视频 | 中文av日韩| 日韩亚洲在线视频 | 在线亚洲人成电影网站色www | 成人免费视频视频在线观看 免费 | 在线观看黄色小视频 | av免费网站在线观看 | 日本性视频 | 91精品国产一区 | 成人免费毛片aaaaaa片 | 久久高清国产 | 亚洲精品中文在线 | 999久久久 | 天天操天天综合网 | 91porny九色在线播放 | 日韩天堂在线观看 | 欧美久久久久久久久久久久 | 一级理论片在线观看 | 97精品国产97久久久久久春色 | 又黄又爽又无遮挡免费的网站 | 丁香网五月天 | 久久只有精品 | 免费视频 三区 | 狠狠色香婷婷久久亚洲精品 | 久久久国产精品视频 | www.超碰97.com| 不卡国产在线 | 日韩 在线 | 日韩午夜精品福利 | 国产香蕉视频在线观看 | 97电影手机版 | 国产精品嫩草影院9 | 丁香婷婷基地 | 日本精品一二区 | 成年人视频在线免费观看 | 97精产国品一二三产区在线 | 久久97久久 | 亚洲欧美成人综合 | 日韩欧美视频在线免费观看 | 91在线操 | 国产一区福利在线 | 天天射天天色天天干 | 在线看片一区 | 国产成人精品一区二区三区福利 | 国产视频18 | 6699私人影院| 香蕉视频91 | 日本高清中文字幕有码在线 | 国产精品福利一区 | 不卡的一区二区三区 | 四虎在线免费视频 | 伊人狠狠操 | 亚洲精品一区中文字幕乱码 | 国产精品va最新国产精品视频 | 超碰国产在线观看 | 国产一区二区三区免费在线观看 | 成人蜜桃 | 久久人人爽 | 日韩免费在线网站 | 欧美视频www | 99久在线精品99re8热视频 | 免费久久久久久 | 九九九热精品免费视频观看网站 | 91精品久久久久久 | 国产成人在线一区 | 啪啪动态视频 | 97免费在线观看视频 | 久久黄色影院 | 精品女同一区二区三区在线观看 | 在线欧美a | 久久国产精品偷 | 中文字幕在线看视频国产 | av成年人电影 | 国产麻豆精品一区二区 | 中文字幕国产一区 | 亚洲国产精品va在线看黑人动漫 | 日日干天天射 | 亚洲成av人片在线观看www | 久久久久久久久久久久久久av | 日韩精品中字 | 91久久精品日日躁夜夜躁国产 | 中文字幕在线影院 | 1024久久 | 99久久99热这里只有精品 | 91成人久久 | 九九久久久久久久久激情 | 久久综合狠狠综合 | 亚洲综合在线一区二区三区 | 国产精品久久久久久久久久三级 | 久草精品视频在线观看 | 国产精品一区二区在线播放 | 在线观看中文av | 久久精品久久综合 | 久久黄页 | 激情中文字幕 | 91久久国产露脸精品国产闺蜜 | 在线三级中文 | 91网页版免费观看 | 国产专区视频在线 | 成人午夜电影网站 | 免费看一级特黄a大片 | 亚洲精品毛片一级91精品 | 久久久久久在线观看 | 亚洲精品资源在线观看 | 国产精品麻豆99久久久久久 | 久久精品人人做人人综合老师 | 久热精品国产 | 国产一区在线精品 | 亚洲欧美日韩精品久久奇米一区 | 有码中文字幕 | 亚洲高清av| 久久五月激情 | 国产成人一二三 | 一级免费观看 | 日韩欧美高清一区二区 | 91污视频在线观看 | av 在线观看 | 四虎在线观看网址 | 91日韩在线播放 | japanesefreesexvideo高潮 | 国产精品久久久久高潮 | 黄色电影在线免费观看 | 国内成人综合 | 国产精品视频大全 | 伊人久久国产 | 亚洲成av人片在线观看香蕉 | 国产午夜小视频 | 亚洲国产一区av | 91在线色 | 97色婷婷人人爽人人 | 亚洲国产成人精品在线观看 | 久久精品一二三区白丝高潮 | 成人永久免费 | 国产四虎影院 | 成年人在线观看免费视频 | 狠狠躁日日躁狂躁夜夜躁av | 狠狠色伊人亚洲综合网站野外 | 国产在线观看你懂得 | 毛片一区二区 | 中文网丁香综合网 | 丁香花中文在线免费观看 | av免费电影在线 | 精品免费观看视频 | 亚洲午夜久久久影院 | 91中文字幕在线视频 | 午夜在线观看影院 | 欧美一级乱黄 | 国产精品久久久久久久久软件 | 免费看的黄色的网站 | 日韩免费三区 | 国产九九精品视频 | 日日爱网站 | 亚洲精品久久在线 | 久久成人免费电影 | 国产精品久久久亚洲 | 日韩夜夜爽 | 九九视频这里只有精品 | 中文字幕亚洲精品在线观看 | 日韩大片在线观看 | 91成人精品 | 欧美激情精品久久久久久变态 | 国产精品毛片一区视频播 | 狠狠躁夜夜av | 综合网成人 | 成人在线视频你懂的 | 久久久免费观看 | 欧美精品在线免费 | www.狠狠操.com | av在线短片 | 91成人精品一区在线播放 | 欧美一级片在线观看视频 | 久久精品久久精品久久 | 激情视频在线观看网址 | 久久a v视频| 麻豆视频入口 | 五月天六月婷 | 黄色片网站av | www色,com | 日本精品久久久久中文字幕5 | 99久久国产免费,99久久国产免费大片 | 青青视频一区 | 伊人婷婷久久 | 成人毛片一区 | 国产综合片 | 欧美日韩在线观看不卡 | 久久国产精品一区二区三区四区 | 日韩欧美视频在线免费观看 | 久久久久久久久久毛片 | 久久综合色一综合色88 | 成人免费观看视频大全 | 日韩亚洲在线视频 | 2019中文字幕网站 | 亚洲精品国产精品国自 | 久久99精品久久久久久久久久久久 | 超碰人人国产 | 国产一区免费观看 | 欧美日韩不卡在线观看 | 久久久久国产精品午夜一区 | 久久久国产一区二区三区四区小说 | 精品视频中文字幕 | 麻豆国产精品永久免费视频 | 日韩黄色大片在线观看 | 在线观看国产福利片 | 国产精品私人影院 | 国产人成看黄久久久久久久久 | 日韩在线首页 | 欧美久久久久久久 | 天天操狠狠操 | 狠狠狠狠狠狠天天爱 | 精品国精品自拍自在线 | 日韩中字在线 | 玖玖在线观看视频 | 成人午夜剧场在线观看 | 日韩在线中文字幕 | 国产精品福利在线播放 | 久热电影| 色婷婷播放 | 久久综合九色综合欧美就去吻 | 99九九99九九九视频精品 | 97成人在线观看视频 | 久久久久久久久久久黄色 | 天天天在线综合网 | 日日躁天天躁 | 天天爱天天操天天爽 | 精品你懂的 | 激情图片qvod| 婷婷久久一区二区三区 | www.色午夜 | www99精品 | 在线99视频 | 成人av高清在线 | 亚州欧美视频 | 国产精品久久久久久久免费 | 久久国产精品久久国产精品 | 亚洲九九爱 | 97视频人人免费看 | 欧美韩日在线 | zzijzzij亚洲日本少妇熟睡 | 国产在线传媒 | 久久久精品 | 日韩欧美高清不卡 | 国产精品在线看 | 91在线免费播放视频 | av中文字幕日韩 | 色噜噜在线观看 | 午夜在线免费视频 | 国产91小视频 | 在线观看视频一区二区三区 | 国产 亚洲 欧美 在线 | 亚洲视频www | 国产亚洲精品久久久久久久久久久久 | 日韩精品一区二区三区在线视频 | 人人爽人人澡人人添人人人人 | 在线观看91久久久久久 | 日韩专区在线观看 | 国产一卡久久电影永久 | 97人人澡人人爽人人模亚洲 | 亚洲精品短视频 | 免费成人在线观看视频 | av不卡中文字幕 | 久久精品亚洲精品国产欧美 | av综合在线观看 | 最近2019中文免费高清视频观看www99 | 欧美日韩一区三区 | 黄色a视频 | 国产女人40精品一区毛片视频 | 狠狠久久综合 | 日韩精品不卡在线观看 | 综合久久婷婷 | 美女网站在线播放 | 免费国产在线精品 | 在线91播放 | 久久综合久久八八 | 免费久久99精品国产婷婷六月 | 欧美韩日精品 | 2021国产精品视频 | 综合色播 | 久久婷亚洲五月一区天天躁 | 久射网 | 久久se视频 | 美女av免费 | 久草在线观看视频免费 | 在线你懂的视频 | 日韩色高清 | 激情开心色| 精品久久久久久久久久久久久久久久 | 国产亚洲精品美女久久 | 99久久精品免费 | 鲁一鲁影院 | 麻豆传媒在线免费看 | 久久99精品久久只有精品 | 在线成人免费电影 | 韩日av在线 | 毛片的网址 | 亚洲视频1区2区 | 一本一本久久a久久精品综合小说 | 国产 欧美 在线 | 超碰av免费| 午夜久草| 国产精品久久久久久超碰 | 美女视频黄是免费的 | 成人精品久久久 | 婷色| 亚洲免费一级电影 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 麻豆视频大全 | 97精品国产一二三产区 | 免费黄色av电影 | 91麻豆视频 | 五月婷婷综 | 免费的国产精品 | 天天操天天爱天天干 | 欧美日韩亚洲第一页 | 麻豆传媒在线免费看 | 97视频免费观看2区 亚洲视屏 | 欧美久久久久久久久久久 | 黄色毛片视频免费 | 国内精品久久久久影院日本资源 | 狠狠狠色丁香婷婷综合久久五月 | 三级黄免费看 | 精品人妖videos欧美人妖 | 91成人小视频 | 国产成人av免费在线观看 | 操久久免费视频 | 又黄又爽又湿又无遮挡的在线视频 | 在线观看网站你懂的 | 最近免费中文字幕mv在线视频3 | 丁香婷婷基地 | 中文字幕 欧美性 | 婷婷av电影 | 人人澡人人爽欧一区 | 一区二区三区播放 | 国产一区二区三区网站 | 亚洲理论影院 | 久久精品免费看 | 亚洲精品免费在线观看 | 狠狠操操 | 欧美最猛性xxx | 国产成人精品网站 | 日本成人中文字幕在线观看 | 欧美精品国产综合久久 | 精品麻豆 | 99视频免费在线观看 | 欧美日韩另类在线观看 | 日日爱视频| 天天久久综合 | 中文字幕欲求不满 | 久久人人添人人爽添人人88v | 亚洲激情电影在线 | 九九免费在线观看视频 | 韩国三级在线一区 | 丁香婷婷激情 | 国产视频在线看 | 久久久久久久久久影视 | 日本性动态图 | 国产精品亚州 | a国产精品| 欧美乱码精品一区 | 国产精品国产亚洲精品看不卡 | 精品一二三区视频 | 操操色 | 久久九精品 | 久久久久亚洲精品男人的天堂 | www夜夜| 成人一级免费电影 | 日韩在线免费观看视频 | 亚洲人成在线观看 | 日日草天天干 | 亚洲男男gaygayxxxgv | 天天干天天插 | 久久精品久久99精品久久 | 日韩欧美第二页 | 狠狠色丁香九九婷婷综合五月 | 国产精品99久久久精品 | 免费在线黄色av | 日本系列中文字幕 | 日韩中文在线电影 | 精品1区2区3区 | 国产精品一区二区三区久久 | 免费色视频网站 | 成人av一二三区 | 午夜视频不卡 | 天天射狠狠干 | 色天天久久 | 91最新地址永久入口 | 久草在线| 综合伊人久久 | 手机看片国产 | 日韩激情网| 日韩区欠美精品av视频 | 国产精品久久久久久99 | 日本69hd| 国产小视频精品 | 亚洲精品在线视频观看 | 国产福利91精品张津瑜 | 免费在线播放av电影 | japanese黑人亚洲人4k | av成人亚洲 | 色偷偷888欧美精品久久久 | 日本性生活一级片 | 992tv在线观看| 草在线视频| japanesefreesexvideo高潮 | 五月婷婷伊人网 | 国产中文字幕国产 | 国产高清无av久久 | 免费在线观看成人av | 久久夜靖品| av免费片 | 亚洲资源网 | 一二区电影 | 97爱爱爱| 欧美日韩亚洲精品在线 | 久草视频免费在线播放 | 蜜桃麻豆www久久囤产精品 | 爱爱一区 | 偷拍区另类综合在线 | av网址aaa | 91福利试看| 香蕉网在线播放 | 成人cosplay福利网站 | 中文字幕在线播放一区二区 | 成人资源在线观看 | 99精品观看| 91正在播放 | 久久久96 | 久久午夜精品影院一区 | 黄色片免费看 | 久爱综合| 国产日韩精品一区二区 | 久久久久综合精品福利啪啪 | 久久久久一区二区三区四区 | 国内精品小视频 | 日本黄色黄网站 | 国产精品黄色av | 三级a视频 | 亚洲三级黄色 | www操操| 精品久久网站 | 一区二区三区影院 | 一区二区视频在线观看免费 | 成人在线黄色电影 | 99久久夜色精品国产亚洲 | av免费福利 | 乱男乱女www7788 | 欧美日韩视频在线 | 69成人在线| 五月激情在线 | 日韩3区| 成人毛片100免费观看 | 国产精品手机在线 | 日韩精品一区二区三区免费视频观看 | 亚洲一区二区视频在线播放 | 91激情视频在线观看 | 亚洲,播放 | 国产在线高清视频 | 色资源在线| 欧美成人基地 | 亚洲影院国产 | 久久午夜网 | 免费国产一区二区视频 | 欧美日韩国产成人 | 久99久精品视频免费观看 | av成人亚洲| 日韩av视屏 | 国产伦精品一区二区三区无广告 | 开心婷婷色 | 日日夜夜精品视频天天综合网 | 天天操夜夜操国产精品 | 91精品视频导航 | 成人国产精品一区二区 | 在线亚洲午夜片av大片 | 免费久久99精品国产 | 美女视频永久黄网站免费观看国产 | 97激情影院 | 99精品国产成人一区二区 | 高清色免费 | 在线最新av | 国产精品永久免费在线 | 久久免费视频在线观看6 | 在线观看黄色大片 | 91在线www| 六月激情网 | 久久免费99精品久久久久久 | 99国产在线视频 | 91在线成人 | 日韩黄色av网站 | 色窝资源 | 欧美日韩啪啪 | 久久国产精品久久w女人spa | 香蕉在线视频观看 | 欧美动漫一区二区三区 | 精品亚洲一区二区三区 | 免费视频一区二区 | 成人黄色国产 | 亚洲乱亚洲乱亚洲 | 在线观看日本高清mv视频 | 国产日韩欧美在线播放 | sesese图片| 国产麻豆精品久久一二三 | 黄色aa久久| 亚洲一区二区三区毛片 | 国产96在线观看 | 久久国产精彩视频 | 亚洲电影毛片 | 人人艹视频 | 91探花在线| 国产成人精品一区二区三区免费 | 久久久2o19精品 | 在线视频欧美日韩 | 久久在线影院 | av片免费播放 | 久碰视频在线观看 | 久久夜色精品国产欧美乱 | 91网址在线观看 | 精品久久国产精品 | 五月综合激情婷婷 | 亚洲综合激情 | 国产日产精品久久久久快鸭 | 女人高潮一级片 | 国产在线不卡 | 在线91色| 狠狠婷婷 | 欧美aaa视频| 久久九九网站 | aa级黄色大片 | 国产18精品乱码免费看 | 精品国产一区二区三区久久久 | 亚洲天堂网视频在线观看 | 久艹视频免费观看 | 一区二区三区在线免费播放 | 久久久久国产精品www | 久久久黄色av | 久草网免费 | 国产99在线免费 | 91久久精品日日躁夜夜躁国产 | 久久久久久久久亚洲精品 | 中国一级片在线观看 | 国产色啪 | 久久超级碰视频 | 欧美做受xxx | 97夜夜澡人人爽人人免费 | 亚洲五月综合 | 热久久免费视频精品 | 在线观看播放av | 国产精品久久免费看 | 久久激情小视频 | 超碰在线公开免费 | 成人影片在线免费观看 | 国产亚洲精品久久久久久 | 日韩视频一区二区在线观看 | 免费久久99精品国产 | 99精品视频网站 | 91porny九色91啦中文 | www178ccom视频在线 | 午夜精品一二区 | 国产视频日韩视频欧美视频 | 国产美女黄网站免费 | 国产黄色免费 | 91在线视频播放 | 国产成人av在线 | 天天干天天玩天天操 | 日韩一区二区三区在线看 | 国产精品一级视频 | 国产免费观看久久 | av高清一区二区三区 | 成人中文字幕在线观看 | 国产视频资源 | 欧美激情操 | 日韩欧美高清一区二区 | 人人干人人超 | 人人爽夜夜爽 | 国产另类av | 在线视频观看你懂的 | se婷婷| 激情综合五月网 | 18国产精品福利片久久婷 | 欧美久久久久久久久久久久久 | 91av电影在线观看 | 日韩欧美在线免费观看 | 国产成人高清 | 在线欧美中文字幕 | 日韩婷婷 | 欧美视频xxx | 99久久精品国产观看 | 美女网站在线免费观看 | 日韩二区精品 | 婷婷久久婷婷 | 久久久久久久久久久影视 | 99在线免费观看视频 | 成人一区二区三区在线 | 麻豆国产在线视频 | av一区二区三区在线观看 | 国产手机在线播放 | 日韩免费电影网站 | 精品亚洲免费 | 日日日爽爽爽 | 在线国产片 | 成人av免费网站 | 免费观看www7722午夜电影 | 特级毛片在线观看 | av免费片 | 亚洲成人欧美 | 1000部18岁以下禁看视频 | 射久久久 | 麻豆久久精品 | 日韩精品一区二区三区高清免费 | 精品福利av | 人人插人人舔 | 亚洲片在线 | 国产一区二区久久精品 | 久久理伦片 | 麻豆精品视频在线观看免费 | 久久精品看片 | 美女网站视频久久 | 国产精品18久久久久久久 | 在线观看视频亚洲 | 日本精品久久 | 在线中文字幕av观看 | 亚洲综合小说 | www.av免费| 99精品国产在热久久下载 | 国产字幕在线播放 | 日韩欧美精选 | 91干干干| 成人一级电影在线观看 | 国内精品久久久久久久久久久久 | 在线视频免费观看 | 国产精品第一 | 久久亚洲综合国产精品99麻豆的功能介绍 | 伊人婷婷综合 | 在线日本看片免费人成视久网 | 午夜 免费 | 久久久精品免费看 | 久草免费新视频 | 亚洲精品自在在线观看 | 欧美日韩高清一区二区三区 | 中文字幕一区二区三区久久 | 国产资源中文字幕 | 最近日本字幕mv免费观看在线 | 久久综合九九 | 免费看亚洲毛片 | 色wwww| 超碰97人人爱| 久久综合欧美精品亚洲一区 | 久草亚洲视频 | 在线a视频 | 精品久久久久久久久亚洲 | 91大神精品视频 | 91观看视频 | 欧美日韩国产一二三区 | 午夜精品电影一区二区在线 | 国产在线中文字幕 | 国产在线a视频 | 久久超级碰视频 | 久久精彩视频 | 欧美日韩不卡在线观看 | 国产免费又爽又刺激在线观看 | 99久久久国产精品免费99 | 久久久久婷 | 国产综合片 | 最近中文国产在线视频 | 精品久久一区二区 | 精品久久综合 | 日韩欧美一区二区在线观看 | 狠狠操操网 | 日韩理论片在线 | 天操夜夜操 | 国产精品美女久久久久久久 | 中文字幕国产视频 | 国产不卡在线播放 | 日韩高清一区在线 | 黄色网址a | 日韩视频一区二区在线 | 久久视频在线观看免费 | 国产这里只有精品 | 特级毛片爽www免费版 | 久久99久久99精品免观看软件 | 精品久久久久一区二区国产 | 精品国产伦一区二区三区观看说明 | 免费精品久久久 | 日日骑| 免费在线观看av网站 | 伊人婷婷在线 | a午夜在线 | 国产精品日韩久久久久 | 麻豆视频在线看 | 在线免费视频 你懂得 | 亚洲精品乱码久久久久久按摩 | 黄色网www | 日日成人网| 国产在线2020| 黄色软件在线观看视频 | 国产精品乱码一区二三区 | 超碰人人舔 | 国产在线视频一区二区三区 | 九九精品视频在线观看 | 黄色一级免费 | 在线精品观看国产 | 久草精品视频在线播放 | 五月婷婷狠狠 | 九九九在线观看视频 | 精品女同一区二区三区在线观看 | 玖玖在线看 | 青草草在线 | 99在线视频播放 | 99精品久久只有精品 | 久久精品免费播放 | 99精品国产高清在线观看 | 中文字幕第一页在线vr | 最新av免费在线观看 | 欧美性色综合 | 24小时日本在线www免费的 | 中文字幕第一页在线视频 | 日韩精品视频在线观看网址 | 欧美日韩免费在线观看视频 | 天天操天天操天天操天天操 | 久久久久久久久久久久久久电影 | 天天综合色 | 首页av在线 | 蜜臀aⅴ国产精品久久久国产 | 亚洲网站在线 | 久久综合色影院 | 亚洲精品av中文字幕在线在线 | 伊人永久 | www日韩欧美 | 中文资源在线播放 | 亚洲少妇xxxx | 日b视频在线观看网址 | 天天操天天操一操 | av高清网站在线观看 | 91精品一区二区三区久久久久久 | 久久久久www | 麻豆传媒视频在线 | 一级性视频 | 亚洲精品乱码白浆高清久久久久久 | 国产在线欧美在线 | 欧美精品久久久久 | 久久久一本精品99久久精品 | 久久久久久久久久久网 | a久久久久 | 久久久99精品免费观看乱色 | 99国产免费网址 | 在线免费国产视频 | 久久婷婷开心 | 久久国产精品一区二区三区四区 | 婷婷国产在线 | 国产精品女主播一区二区三区 | 亚洲片在线观看 | a级国产乱理论片在线观看 特级毛片在线观看 | 婷婷激情5月天 | 久久精品国产99国产 | 欧美日韩国产三级 | 欧美日韩国产一二三区 | 在线观看中文字幕网站 | av网站在线观看播放 | 欧美激情视频三区 | 中文字幕在线看片 | 黄色免费在线视频 | 手机在线看片日韩 | 99久久er热在这里只有精品15 | 丰满少妇高潮在线观看 | 九九免费观看全部免费视频 | 99亚洲精品 | av在线电影网站 | 亚洲一区二区视频在线 | 色综合久久中文字幕综合网 | 亚洲v精品 | 色综合国产 | 亚洲涩综合 | 涩涩伊人 | 在线 国产 亚洲 欧美 | 在线观看91精品国产网站 | 久草在线中文视频 | 免费国产一区二区视频 | 欧美日韩视频在线观看免费 | 不卡国产在线 | 久久久久免费精品国产小说色大师 | 韩国精品福利一区二区三区 | 久久久久99精品成人片三人毛片 | 国产91勾搭技师精品 | 日韩专区在线播放 | 国产精品高清在线 | 亚洲性视频 | avhd高清在线谜片 | 一区二区亚洲精品 | 欧日韩在线 | 波多野结衣电影一区二区三区 | 日韩一区二区三区高清免费看看 | 亚洲高清激情 | 久久久精品 一区二区三区 国产99视频在线观看 | 国色天香第二季 | 日韩在线观看你懂的 | 欧美最猛性xxxxx(亚洲精品) | 久久国产精品一区二区 | 日本特黄特色aaa大片免费 | 亚洲天堂在线观看完整版 | 国产精品九九九九九九 | 狠狠天天| 激情久久伊人 | 青青视频一区 | 亚洲成av人片在线观看香蕉 | 在线av资源 | 日韩精品在线视频免费观看 | 天天干夜夜爽 | 日韩在观看线 | 中文字幕在线高清 | 日日夜夜天天久久 | 国产亚洲精品电影 | 久久久在线观看 | 日韩高清免费无专码区 | 欧美淫aaa免费观看 日韩激情免费视频 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 99热官网| 日本久久中文字幕 | 天堂网一区二区三区 | 免费在线成人 | 天无日天天操天天干 | 欧美少妇xxx| 黄色在线成人 | 久久久久人人 | 91麻豆国产福利在线观看 | 国产精品 9999 | 天天干天天操天天射 | 国色天香第二季 | 成人久久免费 | 狠狠干网 | 九九精品视频在线看 | 天天综合网国产 | 欧美日韩国产高清视频 | 欧美日本一区 | 欧美日韩中文字幕在线视频 | 国产精品免费一区二区三区在线观看 | 精品专区 | 国产欧美三级 | 久久视奸| 成人黄色在线电影 | 极品中文字幕 | 在线你懂的视频 | www.黄色小说.com | 九九影视理伦片 | 色欧美成人精品a∨在线观看 | 成年人av在线播放 | 日韩久久精品一区 | 曰韩精品 | 亚洲成av人电影 | 亚洲影视资源 | 欧美黄色成人 | 黄色av成人在线 | 免费av网站在线 | 久久久www免费电影网 | 欧美日韩三级在线观看 | 亚洲va欧美va | 免费看的国产视频网站 | 久久久久久国产精品亚洲78 | 日韩专区在线观看 | 久久综合精品国产一区二区三区 | 欧美一级免费黄色片 | 亚州精品视频 | 国产亚洲精品久久久网站好莱 | 欧美日产一区 | 国产精品久久久久久久免费观看 | 日韩免费高清在线观看 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 99久久久久久久 | 国产精品岛国久久久久久久久红粉 | 亚洲精品国产成人av在线 | 激情在线五月天 | 毛片无卡免费无播放器 | 999视频精品 | 日韩中文在线视频 | 丁香六月久久综合狠狠色 | 久章草在线 | 国产在线高清视频 | 国产精品欧美激情在线观看 | 免费黄a大片 | 日韩欧美一区二区三区黑寡妇 | 国产精品自产拍 | www视频在线播放 | 成人黄在线 | 激情久久婷婷 | 天天天色综合 | 日韩高清免费在线观看 | 丁香九月婷婷综合 | 黄色av电影在线观看 | 成人av免费在线播放 | 午夜10000| 色99网| 91.精品高清在线观看 | 久久国产电影 | 久久免费视频一区 | 久久黄色精品视频 | 久久久久久久久久久影院 | h视频在线看 | 又黄又爽又色无遮挡免费 | 97在线观看免费视频 | 91自拍视频在线 | 日韩免费 | 一本—道久久a久久精品蜜桃 | 国产视频精品免费播放 | 欧美日韩久久 | 狠狠的干狠狠的操 | 欧美激情视频一区二区三区免费 | 国产精品综合在线 | 日日夜夜天天人人 | 国产在线观看你懂得 | 色妞色视频一区二区三区四区 | 狠狠色丁香久久婷婷综合丁香 | 激情av一区二区 | 欧美整片sss | 国产高清不卡 | 久久国产电影 | 婷婷色5月 | 国产一区二区不卡视频 | 亚洲综合日韩在线 | 国产色小视频 | 成年人免费av | 99r国产精品 | 成人av电影在线观看 | 午夜狠狠干 | 91看片淫黄大片在线播放 | 91在线一区 | 欧美成人xxx | 欧美激情操| 在线观看不卡视频 | 中文字幕在线观看完整版 | av在线免费观看不卡 | 99在线高清视频在线播放 | 91激情在线视频 | 波多野结衣视频一区二区三区 | 日本公妇在线观看 | 色福利网 | 久久久久久久久久伊人 | 国产精品丝袜久久久久久久不卡 | 一区二区三区国 | 欧美亚洲一区二区在线 | 人人爽人人乐 | 久久综合久久综合九色 | 日韩av视屏| 99热精品久久 | 免费电影一区二区三区 | 在线观看色视频 | 黄色网在线播放 | 毛片美女网站 | 欧美性色黄大片在线观看 | 欧美综合色 | 国产精品99久久久精品免费观看 | aaa亚洲精品一二三区 | 国产精品av在线免费观看 | 国产精品久久久久久久妇 | 日韩免费福利 | 日韩久久在线 | 久久久久久视频 | 午夜免费在线观看 | 久久伊人色综合 | 久久精彩| 中文字幕一区二区三区久久 | 17婷婷久久www| 天天操天天干天天操天天干 | 国产精品igao视频网入口 | 伊人五月天婷婷 | 日韩色av色资源 |