C語言實現簡單反彈球消磚塊遊戲

反彈球消磚塊,是一款很簡單的打磚塊遊戲,控制你的擋板擋住彈球,打掉上面的磚塊,本篇博客中,主要使用printf與scanf函數實現消磚塊遊戲

整體思路

主函數

int main()
{
    startup();//初始化
    while (1)
    {
        show();//顯示畫面  
        updateWitoutIput();//與用戶輸入無關的更新  //更新數據
        updateWithInput(); //與用戶輸入有關的更新  //輸入
    }
    return 0;
}

輔助函數

void gotoxy(int x, int y) //將光標調整到(x,y)的位置  代替清屏函數
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle, pos);
}
void HideCursor()    //隱藏光標
{
    CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

全局變量的定義

#define HIGH 20  //遊戲界面高度
#define WIDTH 30  // 遊戲界面寬度
#define V 1  //小球的速度
#define RIDUS 5  //擋板的半徑

int ball_x, ball_y;  //小球的坐標
int ball_vx, ball_vy;  //小球的速度
int position_x, position_y;  //擋板的中心位置
int left, right;  //擋板的左右位置
int ball_number;  //反彈小球的次數
int block_x, block_y;  //磚塊的坐標
int score;  //消除磚塊的個數

數據的初始化

//初始化小球
ball_x = HIGH / 2; //高度
ball_y = WIDTH / 2; //寬度
ball_vx = V;  //小球的縱向速度
ball_vy = V;  //小球的橫向速度

//初始化擋板
position_x = HIGH / 2;
position_y = WIDTH / 2;  //擋板的中心位置
left = position_y - RIDUS;//擋板的左位置
right = position_y + RIDUS;  //擋板的右位置

//初始化磚塊
block_x = 0; //高度
block_y = WIDTH / 2;  //寬度
score = 0;

顯示畫面

循環不斷輸出遊戲的界面, 0 表示小球, B 表示磚塊, * 表示擋板

for (i = 0; i < HIGH + 1; i++) //行
{
    for (j = 0; j < WIDTH; j++) //列
    {
        if (i == ball_x && j == ball_y)//輸出小球
        {
            printf("0");
        }
        else if (i == block_x && j == block_y)//輸出磚塊
        {
            printf("B");
        }
        else if (i == HIGH)  //下邊界 -1,否則循環走不到high和width
        {
            printf("-");
        }
        else if (j == WIDTH - 1) //右邊界  
        {
            printf("|");
        }
        else if (i == HIGH - 1 && j >= left && j <= right)  //輸出擋板
        {
            printf("*");
        }
        else
        {
            printf(" ");
        }
    }
}
printf("反彈次數:%d\n", ball_number);
printf("消除磚塊的個數:%d\n", score);

與用戶無關的更新

判斷遊戲勝負

if (ball_x == HIGH - 2) //到達擋板上方
{
    if (ball_y >= left && ball_y <= right) //被擋板擋住
    {
        ball_number++;
    }
    else  //沒被擋板擋住
    {
        printf("遊戲失敗!\n");
        exit(0);  //直接結束
    }
}

消除磚塊得分

if (ball_x == block_x && ball_y == block_y)
{
    score++;
    block_y = rand() % WIDTH;
}

改變小球的位置

ball_x = ball_x + ball_vx;
ball_y = ball_y + ball_vy;
//為瞭使小球在反彈和結束時能夠真缺判斷,所以小球下反彈邊界應該在擋板的前一行,小球右反彈邊界應該在右邊界的前一列
if (ball_x >= HIGH - 2 || ball_x <= 0)  //遇到任意一個邊界即發生變化  
    ball_vx = -ball_vx;
if (ball_y >= WIDTH -2 || ball_y <= 0)  //-1保證下球再使小球遇到邊界時反彈但不會消失
    ball_vy = -ball_vy;

與用戶輸入有關的更新

input = _getch();
if (input == 'a')
    position_y--;
if (input == 'd')
    position_y++;
left = position_y - RIDUS;//擋板的左位置
right = position_y + RIDUS;  //擋板的右位置

完整代碼

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>

//全局變量的定義
#define HIGH 20  //遊戲界面高度
#define WIDTH 30  // 遊戲界面寬度
#define V 1  //小球的速度
#define RIDUS 5  //擋板的半徑

int ball_x, ball_y;  //小球的坐標
int ball_vx, ball_vy;  //小球的速度
int position_x, position_y;  //擋板的中心位置
int left, right;  //擋板的左右位置
int ball_number;  //反彈小球的次數
int block_x, block_y;  //磚塊的坐標
int score;  //消除磚塊的個數

void gotoxy(int x, int y) //將光標調整到(x,y)的位置  代替清屏函數
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle, pos);
}
void HideCursor()//隱藏光標函數
{
    CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void startup()//數據的初始化
{
    //初始化小球
    ball_x = HIGH / 2; //高度
    ball_y = WIDTH / 2; //寬度
    ball_vx = V;  //小球的縱向速度
    ball_vy = V;  //小球的橫向速度

    //初始化擋板
    position_x = HIGH / 2;
    position_y = WIDTH / 2;  //擋板的中心位置
    left = position_y - RIDUS;//擋板的左位置
    right = position_y + RIDUS;  //擋板的右位置

    //初始化磚塊
    block_x = 0; //高度
    block_y = WIDTH / 2;  //寬度
    score = 0;

}

void show()//顯示畫面
{
    //system("cls"); 
    gotoxy(0, 0);

    int i, j;
    for (i = 0; i < HIGH + 1; i++)
    {
        for (j = 0; j < WIDTH; j++)
        {
            if (i == ball_x && j == ball_y)
            {
                printf("0");
            }
            else if (i == block_x && j == block_y)
            {
                printf("B");
            }
            else if (i == HIGH)
            {
                printf("-");
            }
            else if (j == WIDTH - 1)
            {
                printf("|");
            }
            else if (i == HIGH - 1 && j >= left && j <= right)
            {
                printf("*");
            }
            else
            {
                printf(" ");
            }
        }
        printf("\n");
    }
    printf("反彈次數:%d\n", ball_number);
    printf("消除磚塊的個數:%d\n", score);
}

void updateWitoutIput()
{
    if (ball_x == HIGH - 2)
    {
        if (ball_y >= left && ball_y <= right)
        {
            ball_number++;
        }
        else
        {
            printf("遊戲失敗!\n");
            exit(0);
        }
    }
    if (ball_x == block_x && ball_y == block_y)
    {
        score++;
        block_y = rand() % WIDTH;
    }

    ball_x = ball_x + ball_vx;
    ball_y = ball_y + ball_vy;
    if (ball_x >= HIGH - 2 || ball_x <= 0)
        ball_vx = -ball_vx;
    if (ball_y >= WIDTH -2 || ball_y <= 0)
        ball_vy = -ball_vy;

    Sleep(150);    //睡眠時間
}


void updateWithInput()//與用戶輸入有關的更新
{
    char input;
    if (_kbhit())
    {
        input = _getch();
        if (input == 'a')
            position_y--;
        if (input == 'd')
            position_y++;
        left = position_y - RIDUS;
        right = position_y + RIDUS;
    }
}
int main()
{
    srand((unsigned)time(NULL));
    startup();//初始化
    HideCursor();
    while (1)
    {
        show();//顯示畫面  
        updateWitoutIput();//與用戶輸入無關的更新
        updateWithInput(); //與用戶輸入有關的更新
    }
    return 0;
}

效果演示

總結

雖然完成瞭一個簡單的消磚塊遊戲,但是很多的功能都未能實現,如磚塊的個數、遊戲暫停和結束後的開始等等,任需要繼續的努力。

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持LevelAH。

推薦閱讀: