C语言数组实现打砖块游戏:从基础到完整代码

林见深
林见深
发布时间:2026-10-15 | 4人浏览过
原创

本文介绍利用C语言二维数组技术在命令行环境中构建简易打砖块游戏的方法。内容涵盖画布网格定义、球体移动反弹、挡板左右控制及砖块碰撞检测等核心逻辑,并附带完整的可运行代码示例。

项目目标与原理

本教程旨在展示如何利用简单的数据结构(二维数组)和循环结构在终端模拟经典打砖块游戏。核心思路是将控制台屏幕映射为一个网格坐标系,用不同的整数值代表不同的游戏元素:

  • 0:空白区域
  • 1:小球
  • 2:挡板
  • 3:砖块

游戏主循环不断执行“更新状态”、“清除屏幕”、“重新绘制”三个步骤,配合定时器控制刷新频率,形成动态视觉效果。

准备条件与头文件

由于涉及Windows控制台的特殊操作,需要引入以下库:

  1. <stdio.h>:标准输入输出
  2. <stdlib.h>:系统函数(如exit)
  3. <conio.h>:非阻塞键盘读取(kbhit/getch)
  4. <cwindow.h>或对应的Windows API头文件:用于光标定位(SetConsoleCursorPosition)

注意:代码中使用了GetStdHandle和CROOD结构体,这通常依赖于Windows环境。若在Linux下编译需替换为相应的Termios或ncurses库操作。

第一步:定义画布与全局变量

使用预处理指令定义屏幕尺寸,并声明全局变量以存储坐标和速度。

#define High 15 // 高度
#define Width 20 // 宽度

// 游戏状态数组
canvas[High][Width] = {0};

// 小球参数
int ball_x, ball_y;
int ball_vx, ball_vy;

// 挡板参数
int position_x, position_y;
int ridus; // 挡板半宽
int left, right; // 挡板左右边界索引

此处canvas数组充当了游戏的内存帧缓冲,所有显示内容均由此生成。

第二步:初始化游戏数据

在startup()函数中重置所有参数。小球置于顶部中间,挡板置于底部中央。

void startup() {
    // 小球初始化
    ball_x = 0;
    ball_y = Width / 2;
    ball_vx = 1; 
    ball_vy = 1;
    canvas[ball_x][ball_y] = 1; // 标记小球位置

    // 挡板初始化
    ridus = 5;
    position_x = High - 1;
    position_y = Width / 2;
    left = position_y - ridus;
    right = position_y + ridus;
    
    // 绘制初始挡板
    for(int k = left; k <= right; k++) {
        canvas[position_x][k] = 2;
    }
}

第三步:实现渲染逻辑 (show)

利用gotoxy(0, 0)将光标移回左上角,遍历二维数组并将数字转换为字符输出。

void show() {
    gotoxy(0, 0);
    for(int i = 0; i < High; i++) {
        for(int j = 0; j < Width; j++) {
            if (canvas[i][j] == 0) printf(" ");
            else if (canvas[i][j] == 1) printf("O"); // 小球
            else if (canvas[i][j] == 2) printf("*"); // 挡板
            else if (canvas[i][j] == 3) printf("#"); // 砖块
        }
        printf("|\n"); // 行分隔符
    }
    // 底部边框
    for(int j = 0; j < Width; j++) printf("-");
}

第四步:更新物理状态

在updateWithoutInput中处理小球运动、边界反弹及碰撞检测。

4.1 清理旧位置并移动

先将原坐标设为0,计算新坐标。若新坐标超出边界(0或High-1),则反向速度分量。

4.2 砖块与挡板碰撞

检测小球下一步位置的数组值:
- 若为3(砖块),将其清零并反弹。
- 若小球到达High-2行(挡板上方),检查Y轴坐标是否在[left, right]区间内。若在则反弹,否则游戏结束。

4.3 延迟控制

调用sleep(50)控制帧率,防止程序运行过快导致无法观察。

第五步:处理用户输入

通过kbhit()检测按键,使用getch()获取非回显字符。分别处理'A'(左移)和'D'(右移)。

void updateWithInput() {
    char input;
    if(kbhit()) {
        input = getch();
        if(input == 'a' && left > 0) {
            // 清除旧挡板右边缘
            canvas[position_x][right] = 0;
            position_y--; 
            left = position_y - ridus;
            right = position_y + ridus;
            // 绘制新挡板左边缘
            canvas[position_x][left] = 2;
        }
        if(input == 'd' && right < Width - 1) {
             // 类似逻辑,向右移动...
        }
    }
}

完整代码汇总

将上述模块组合至main函数的死循环中即可运行。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h> // 需包含正确的头文件以支持SetConsoleCursorPosition

// ... (变量与宏定义同上) ...

int main() {
    startup();
    while(1) {
        show();
        updateWithoutInput();
        updateWithInput();
    }
    return 0;
}

注意事项与排错

  1. 编译错误:代码中cwindow.h并非标准库,若编译报错请确保引入了<windows.h>并正确调用了API。
  2. 变量名修正:原文中砖块行数使用的是high/4(小写),需改为大写High以匹配宏定义。
  3. 初始数组赋值:全局数组应使用{0}而非[0]进行初始化。
  4. 平台限制:该代码强依赖Windows控制台API,跨平台移植需修改底层IO部分。

以上就是使用C语言数组实现打砖块游戏的详细内容,更多关于C语言小游戏开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表