目录

基于C语言的控制台小游戏打砖块

基于C语言的控制台小游戏——打砖块

https://i-blog.csdnimg.cn/direct/a35a7fd34e4547c3b4feacf8cfe6dd42.png

开发一个基于文本的控制台程序来实现打砖块游戏,确实可以直接使用标准C语言库加上 ncurses 或在Windows上使用PDCurses来处理字符界面和键盘输入。 ncurses (及其Windows上的兼容版本PDCurses)主要用于提供一种方便的方式来处理复杂的屏幕绘制、窗口管理、键盘和鼠标输入等,特别适合于需要精细控制终端显示的应用程序。

对于这个简单的打砖块游戏示例,主要是为了展示如何在控制台环境中创建一个具有基本图形元素的游戏。在这种情况下, ncurses 或PDCurses的主要作用包括:

  • 简化输入处理 :允许非阻塞地读取键盘输入,这对于实时游戏非常重要。
  • 高效的屏幕更新 :通过缓冲区管理减少闪烁,并且只重绘发生变化的部分。
  • 支持移动光标、改变文本颜色等高级功能 :虽然在这个简单的例子中没有用到这些特性,但在更复杂的游戏或应用中可能会很有用。

如果不使用 ncurses 或PDCurses

如果不使用 ncurses 或PDCurses,你也可以直接使用标准输入输出函数如 printf()getch() (Windows下)或 getchar() 来实现类似的功能,但这可能需要手动处理更多细节,例如:

  • 手动处理屏幕刷新 :每次更新屏幕内容时都需要清除整个屏幕并重新打印所有内容。
  • 处理键盘输入 :在Windows系统中可以使用 conio.h 中的 _kbhit()_getch() 来检测按键输入;在Linux/Unix系统中,则可能需要用到 termios 库来设置终端为非规范模式以便读取单个字符而不需等待回车键。

这里是一个简化版的例子,不依赖于 ncurses 或PDCurses,适用于Windows平台(使用 conio.h ):

#include <stdio.h>
#include <stdlib.h>
#include <conio.h> // Windows下的非阻塞输入
#include <windows.h> // Sleep函数

#define WIDTH 40
#define HEIGHT 20
#define PADDLE_WIDTH 10

typedef struct {
    int x, y;
} Point;

Point ball = {WIDTH / 2, HEIGHT - 3};
Point paddle = {WIDTH / 2 - PADDLE_WIDTH / 2, HEIGHT - 1};
int dx = 1, dy = -1;
int bricks[HEIGHT / 2][WIDTH];
int score = 0;

void setup() {
    for (int i = 0; i < HEIGHT / 2; i++)
        for (int j = 0; j < WIDTH; j++)
            bricks[i][j] = (rand() % 3 == 0) ? 1 : 0; // 随机生成一些砖块
}

void draw() {
    system("cls"); // 清屏

    printf("Score: %d\n", score);

    for (int y = 0; y < HEIGHT; y++) {
        for (int x = 0; x < WIDTH; x++) {
            if (y == ball.y && x == ball.x) printf("O"); // 球
            else if (y == paddle.y && x >= paddle.x && x < paddle.x + PADDLE_WIDTH) printf("="); // 挡板
            else if (y < HEIGHT / 2 && bricks[y][x]) printf("#"); // 砖块
            else printf(" ");
        }
        printf("\n");
    }
}

void updateBallPosition() {
    ball.x += dx;
    ball.y += dy;

    // 碰撞检测
    if (ball.x <= 0 || ball.x >= WIDTH - 1) dx *= -1;
    if (ball.y <= 0) dy *= -1;
    if (ball.y == paddle.y && ball.x >= paddle.x && ball.x < paddle.x + PADDLE_WIDTH) dy *= -1;

    if (ball.y >= HEIGHT) { // 游戏结束
        printf("Game Over! Press any key to exit.");
        _getch();
        exit(0);
    }

    if (bricks[ball.y][ball.x]) { // 击中砖块
        bricks[ball.y][ball.x] = 0;
        dy *= -1;
        score++;
    }
}

void movePaddle(int direction) {
    paddle.x += direction;
    if (paddle.x < 0) paddle.x = 0;
    if (paddle.x > WIDTH - PADDLE_WIDTH) paddle.x = WIDTH - PADDLE_WIDTH;
}

int main() {
    setup();

    while (1) {
        if (_kbhit()) {
            char ch = _getch();
            if (ch == 'a') movePaddle(-1);
            else if (ch == 'd') movePaddle(1);
        }

        updateBallPosition();
        draw();
        Sleep(50); // 控制速度
    }

    return 0;
}

编译指令

gcc zhuankuai_game.c -o zhuankuai_game.exe -lconio

此代码展示了如何在不使用 ncurses 或PDCurses的情况下实现一个简单的打砖块游戏。请注意,由于不同操作系统之间的差异,特别是关于如何处理键盘输入和清屏命令,上述代码主要针对Windows平台。如果你希望在Linux或macOS上运行类似的程序,你需要相应地调整代码以适应不同的API和库。