C语言数组实现打砖块游戏:从基础到完整代码
本文介绍利用C语言二维数组技术在命令行环境中构建简易打砖块游戏的方法。内容涵盖画布网格定义、球体移动反弹、挡板左右控制及砖块碰撞检测等核心逻辑,并附带完整的可运行代码示例。
项目目标与原理
本教程旨在展示如何利用简单的数据结构(二维数组)和循环结构在终端模拟经典打砖块游戏。核心思路是将控制台屏幕映射为一个网格坐标系,用不同的整数值代表不同的游戏元素:
0:空白区域1:小球2:挡板3:砖块
游戏主循环不断执行“更新状态”、“清除屏幕”、“重新绘制”三个步骤,配合定时器控制刷新频率,形成动态视觉效果。
准备条件与头文件
由于涉及Windows控制台的特殊操作,需要引入以下库:
<stdio.h>:标准输入输出<stdlib.h>:系统函数(如exit)<conio.h>:非阻塞键盘读取(kbhit/getch)<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;
}
注意事项与排错
- 编译错误:代码中
cwindow.h并非标准库,若编译报错请确保引入了<windows.h>并正确调用了API。 - 变量名修正:原文中砖块行数使用的是
high/4(小写),需改为大写High以匹配宏定义。 - 初始数组赋值:全局数组应使用
{0}而非[0]进行初始化。 - 平台限制:该代码强依赖Windows控制台API,跨平台移植需修改底层IO部分。
以上就是使用C语言数组实现打砖块游戏的详细内容,更多关于C语言小游戏开发的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













