最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C/C++實(shí)現(xiàn)俄羅斯方塊游戲

 更新時(shí)間:2022年02月16日 08:56:20   作者:霸道小明  
這篇文章主要介紹了如何利用C/C++實(shí)現(xiàn)經(jīng)典游戲之一的俄羅斯方塊,文中的實(shí)現(xiàn)步驟講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言和C++有一定的幫助,需要的可以參考一下

一、游戲效果展示

每個(gè)方塊的朝向使用二維數(shù)組表示

二、完整代碼

可以直接拷貝運(yùn)行

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

三、所需開(kāi)發(fā)環(huán)境

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

2)安裝easyX圖形庫(kù)

四、具體項(xiàng)目實(shí)現(xiàn)

①游戲歡迎界面 welcome( )

在游戲開(kāi)始前會(huì)有一個(gè)游戲歡迎頁(yè)面,整個(gè)頁(yè)面會(huì)持續(xù)大概三秒,之后便進(jìn)入游戲場(chǎng)景。在游戲歡迎頁(yè)面中,除了將顯示游戲名稱外,還要修改窗口標(biāo)題。

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

②游戲背景 initGameScreen( ) 

繪制游戲場(chǎng)景

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

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

將每個(gè)方塊的朝向用二維數(shù)組表示。此次共設(shè)計(jì)了五種方塊,每個(gè)方塊四種朝向,使用三維數(shù)組存儲(chǔ)每個(gè)剛快及其朝向。1代表該點(diǎn)是方格。

#define BLOCK_COUNT 5
#define BLOCK_WIDTH 5
#define BLOCK_HEIGHT 5
 
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 },
};

④新方塊表示nextBlock( )

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

/*****************************************
 * 功能:清空方塊提示框里的方塊
 * 輸入:
 *        無(wú)
 * 返回:
 *        無(wú)
 ****************************************/
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 - 方塊的坐標(biāo)(二維數(shù)組左上角位置)
 * 返回:
 *        無(wú)
 ****************************************/
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, "■");
            }
        }
    }
}
 
/*****************************************
 *功能:方塊提示框中產(chǎn)生新方塊
 *輸入:
 *        無(wú)
 *返回:
 *        無(wú)
 ****************************************/
void nextblock() {
    clearBlock();
    //產(chǎn)生隨機(jī)數(shù),隨機(jī)選擇方塊
    srand((unsigned)time(NULL));    //使用時(shí)間函數(shù)的返回值,來(lái)作為隨機(jī)種子
    NextIndex = rand() % BLOCK_COUNT;    //產(chǎn)生0~5的隨機(jī)數(shù)
    drawBlock(391, 71);
}

⑤設(shè)計(jì)游戲循環(huán)main( )

在游戲框中每次生成新方塊會(huì)進(jìn)入對(duì)新方塊降落處理,等處理完后便會(huì)循環(huán)

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

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

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

#define KEY_UP 87        //用戶操作
#define KEY_LEFT 65
#define KEY_RIGHT 68
#define KEY_DOWN 83
#define KEY_SPACE 32
 
/*****************************************
 * 功能:讀取用戶操作,時(shí)時(shí)更新降落的方塊
 * 輸入:
 *        無(wú)
 * 返回:
 *        無(wú)
 ****************************************/
void move() {
    //讀取用戶操作前判斷游戲是否結(jié)束
    failCheck();
    //持續(xù)向下降落
    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
        //方塊的固化處理,方塊固定后結(jié)束循環(huán),當(dāng)前一個(gè)方塊的move執(zhí)行完畢
            //to do
    }
}

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

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

/*****************************************
  *功能:判斷在指定位置向指定方向是否可以移動(dòng)
  *輸入:
  *        x,y - 方塊位置
  *        moveDir - 下一步想要移動(dòng)的方向
  *        blockDir - 當(dāng)前方塊的方向
  * 返回:
  *        true - 可以移動(dòng)
  *        false - 不可以移動(dòng)
  ****************************************/
bool moveable(int x0, int y0, move_dir_t moveDir, block_dir_t blockDir) {
    //計(jì)算方塊左上角在30×15的游戲區(qū)位置(第多少行, 第多少列)
    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) {
                //向下不能運(yùn)動(dòng)的條件:實(shí)心方塊已經(jīng)達(dá)到底部(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ùn)動(dòng)的條件:實(shí)心方塊已經(jīng)達(dá)到左邊界(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ùn)動(dòng)的條件:實(shí)心方塊已經(jīng)達(dá)到右邊界(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( )

游戲失敗檢測(cè),當(dāng)新繪制方塊無(wú)法向下移動(dòng)時(shí)則表明游戲失敗。

/*****************************
 *功能:檢測(cè)游戲是否結(jié)束
 *輸入:
 *        無(wú)
 * 返回:
 *        無(wú)
 *****************************/
void failCheck() {
    //游戲結(jié)束條件是頂部新被繪制出的方塊就要“固化”,頂部新繪制的方塊方向朝上,運(yùn)動(dòng)方向朝下
    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);
    }
}

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

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

/*****************************************
 * 功能:清除降落過(guò)程中的方塊
 * 輸入:
 *        x,y - 方塊的坐標(biāo)(二維數(shù)組左上角位置)
 *        block_dir_t - 方塊方向
 * 返回:
 *        無(wú)
 ****************************************/
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, "■");
            }
        }
    }
}

⑩判斷方塊旋轉(zhuǎn) rotatable( )

如果方塊在待轉(zhuǎn)方向可以向下運(yùn)動(dòng)則表明方塊可以旋轉(zhuǎn),因此這里只需少加利用moveable函數(shù)即可實(shí)現(xiàn)。

/*****************************************
 * 功能:判斷當(dāng)前方塊是否可以向指定方向旋轉(zhuǎn)
 * 輸入:
 *        x,y - 方塊位置(二維數(shù)組坐標(biāo))
 *        dir - 方塊旋轉(zhuǎn)方向
 * 返回:
 *        true - 可以旋轉(zhuǎn)
 *        false - 不可以旋轉(zhuǎn)
 ****************************************/
bool rotatable(int x, int y, block_dir_t dir) {
    //首先判斷是否可以繼續(xù)向下移動(dòng)
    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) {
            //不能旋轉(zhuǎn)條件:左右邊界越界或者已有方塊“阻擋”
            if (block[id][i][j] == 1 && (y2 + j < 0 || y2 + j >= 15 || visit[x2 + i][y2 + j] == 1)) {
                return false;
            }
        }
    }
    return true;
}

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

每次根據(jù)用戶操作繪制新的方塊

/*****************************************
 *功能:繪制下降過(guò)程中的方塊
 *輸入:
 *        x,y - 方塊的坐標(biāo)(二維數(shù)組左上角位置)
 *        block_dir_t - 方塊方向
 * 返回:
 *        無(wú)
 ****************************************/
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, "■");
            }
        }
    }
}

①②延時(shí)等待 wait ( )

每次 處理完用戶操作后會(huì)進(jìn)入延時(shí)等待,等待時(shí)長(zhǎng)會(huì)根據(jù)當(dāng)前方塊降落速度而定,在延時(shí)等待期間如果檢測(cè)到用戶有按鍵操作時(shí)則會(huì)結(jié)束等待。

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

①③固定方塊 mark( )

每次繪制出新方塊后判斷方塊是否還能繼續(xù)移動(dòng),如果不能移動(dòng)則表明方塊需要固化。

/*****************************************
 * 功能:方塊固定
 * 輸入:
 *        x,y - 方塊坐標(biāo)
 *        dir - 方塊朝向
 * 返回:
 *        無(wú)
 ****************************************/
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( )

將上述實(shí)現(xiàn)功能補(bǔ)充到操作框架中

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;    //定義當(dāng)前方塊降落速度
    //讀取用戶操作前判斷游戲是否結(jié)束
    failCheck();
    //持續(xù)向下降落
    while (1) {
        int curSpeed = speed;    //定義當(dāng)前方塊降落速度
        //清除方塊
        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);
        //方塊的固化處理,方塊固定后結(jié)束循環(huán),當(dāng)前一個(gè)方塊的move執(zhí)行完畢
        if (!moveable(x, y + k, MOVE_DOWN, blockDir)) {
            mark(x, y + k, blockDir);
            break;
        }
    }
}

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

當(dāng)對(duì)一個(gè)方塊下降操作結(jié)束后,在已固化方塊數(shù)組里查找“滿行”方塊,如果存在“滿行”方塊則要進(jìn)行清除操作,接著更新用戶分?jǐn)?shù)和等級(jí)。

/************************
 * 功能:檢查是否有滿行方塊
 * 輸入:
 *        無(wú)
 * 返回:
 *        無(wú)
 *************************/
void check() {
    int i, j;
    int clearLines = 0;
    for (i = 29; i >= 0; i--) {
        // 檢查第i行有沒(méi)有滿
        for (j = 0; j < 15 && visit[i][j]; j++);
        //執(zhí)行到此處時(shí),有兩種情況:
        // 1. 第i行沒(méi)有滿,即表示有空位 此時(shí) j<15
        // 2. 第i行已滿了,此時(shí) j>=15
        if (j >= 15) {
            // 此時(shí),第i行已經(jīng)滿了,就需要消除第i行
            down(i);  //消除第i行,并把上面的行都下移
            i++;  // 因?yàn)樽钔鈱拥难h(huán)中有 i--, 所以我們先i++, 使得下次循環(huán)時(shí),再把這一行檢查一下
            clearLines++;
        }
    }
    // 更新分?jǐn)?shù)
    addScore(clearLines);
 
    // 更新等級(jí)(更新等級(jí)提示,更新速度)
    updateGrade();
}
 
/*****************************************
 * 功能:消除第i行,并把上面的行都往下移
 * 輸入:
 *        無(wú)
 * 返回:
 *        無(wú)
 ****************************************/
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, "■");
    }
}

①⑥更新分?jǐn)?shù)和等級(jí) addScore( ) + updateGrade( )

根據(jù)清除方塊行數(shù)更新用戶分?jǐn)?shù)和等級(jí)。

/*****************************************
 * 功能:更新分?jǐn)?shù)
 * 輸入:
 *        無(wú)
 * 返回:
 *        無(wú)
 ****************************************/
void addScore(int lines) {
    char str[32];
    score += lines * 10;
    sprintf_s(str, 32, "%d", score);
    setcolor(RED);
    outtextxy(415, 310, str);
 
}
 
/*************************
 * 功能:更新等級(jí)
 * 輸入:
 *        無(wú)
 * 返回:
 *        無(wú)
 *************************/
void updateGrade() {
    //更新等級(jí)
    //假設(shè)50分一級(jí)
    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;
    }
}

代碼整合運(yùn)行

五 、不足之處

使用easyX繪圖,導(dǎo)入游戲圖片,從而使得游戲效果更為逼真

游戲戰(zhàn)績(jī)的保存

操作控制略有卡頓 

以上就是C/C++實(shí)現(xiàn)俄羅斯方塊游戲的詳細(xì)內(nèi)容,更多關(guān)于C/C++ 俄羅斯方塊的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 12個(gè)C語(yǔ)言必背實(shí)例分享

    12個(gè)C語(yǔ)言必背實(shí)例分享

    這篇文章主要和大家介紹12個(gè)C語(yǔ)言中必背的實(shí)例,文中的示例代碼講解詳細(xì),對(duì)我們了解和掌握C語(yǔ)言有一定的幫助,感興趣的小伙伴快跟隨小編一起了解一下
    2022-11-11
  • 詳解 linux c++的編譯器g++的基本使用

    詳解 linux c++的編譯器g++的基本使用

    這篇文章主要介紹了詳解 linux c++的編譯器g++的基本使用的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • C語(yǔ)言實(shí)現(xiàn)搶紅包程序代碼精簡(jiǎn)版

    C語(yǔ)言實(shí)現(xiàn)搶紅包程序代碼精簡(jiǎn)版

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)搶紅包程序代碼的精簡(jiǎn)版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • C/C++中多態(tài)性詳解及其作用介紹

    C/C++中多態(tài)性詳解及其作用介紹

    這篇文章主要介紹了C/C++中多態(tài)性(polymorphism)詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 詳解C++11 原始字符串字面量(Json字符串表達(dá)更方便)

    詳解C++11 原始字符串字面量(Json字符串表達(dá)更方便)

    原始字符串字面量(Raw String Literal)是C++11引入的一種字符串表示方式,用于簡(jiǎn)化字符串的定義,特別是當(dāng)字符串中包含大量特殊字符(如換行符、雙引號(hào)等)時(shí),這篇文章給大家介紹C++11原始字符串字面量(Json字符串表達(dá)更方便)的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2025-03-03
  • C++中幾種將整數(shù)轉(zhuǎn)換成二進(jìn)制輸出的方法總結(jié)

    C++中幾種將整數(shù)轉(zhuǎn)換成二進(jìn)制輸出的方法總結(jié)

    下面小編就為大家?guī)?lái)一篇C++中幾種將整數(shù)轉(zhuǎn)換成二進(jìn)制輸出的方法總結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • c++回溯法解決1到9之間插入加減或空使運(yùn)算結(jié)果為100

    c++回溯法解決1到9之間插入加減或空使運(yùn)算結(jié)果為100

    編寫一個(gè)在1,2,…,9(順序不能變)數(shù)字之間插入+或-或什么都不插入,使得計(jì)算結(jié)果總是100的程序,并輸出所有的可能性。例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 100
    2021-10-10
  • C++實(shí)現(xiàn)FTP綜合應(yīng)用詳解

    C++實(shí)現(xiàn)FTP綜合應(yīng)用詳解

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)FTP綜合應(yīng)用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++ 中const 類型限定符不兼容問(wèn)題

    C++ 中const 類型限定符不兼容問(wèn)題

    這篇文章主要介紹了C++ 中const 類型限定符不兼容問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • Qt線程池QThreadPool的使用詳解

    Qt線程池QThreadPool的使用詳解

    本文主要介紹了Qt線程池QThreadPool的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評(píng)論

阿图什市| 沙湾县| 彰化市| 福贡县| 当雄县| 商丘市| 石首市| 伊金霍洛旗| 上蔡县| 秭归县| 克山县| 永顺县| 洛宁县| 鹤岗市| 桂平市| 东明县| 大厂| 大悟县| 雷波县| 望谟县| 惠安县| 巫溪县| 高淳县| 建始县| 湟中县| 五寨县| 长兴县| 临夏市| 绥棱县| 仙桃市| 四会市| 富平县| 曲靖市| 永德县| 连南| 齐河县| 应城市| 崇左市| 容城县| 农安县| 山阳县|