c语言别踩白块儿游戏源码(附带源码)
一、项目背景详细介绍
“别踩白块儿”游戏源自手机端的热门休闲游戏,核心玩法是:
玩家控制手指(或小球)在向下滚动的方块区域内移动,只踩黑块不踩白块,否则游戏结束。
将其移植到 C 语言控制台中,可以用字符代替方块,通过键盘操作来实现玩家移动和判定逻辑。这类游戏在教学中非常适合:
-
训练二维数组和矩阵操作能力
每行可以用数组存储方块状态(0=白块,1=黑块)。 -
学习主循环与实时输入
使用_kbhit()+_getch()实现实时键盘输入,而不是阻塞程序。 -
强化随机数生成与难度控制
黑块生成可随机,随着得分增加下落速度加快。 -
理解碰撞检测与游戏状态管理
玩家移动到白块 → 游戏结束。
因此,这是一个典型的控制台字符游戏,逻辑清晰、容易扩展,同时非常适合作为 C 语言课程设计或博客示例项目。
二、项目需求详细介绍
2.1 功能需求
-
游戏区域为 4列 N行(列固定4,行可根据控制台调整)。
-
每行随机生成一个黑块,其余为白块。
-
玩家用 A/D 或左右方向键移动控制当前行位置。
-
玩家踩到白块 → 游戏结束。
-
游戏分数随踩到黑块数增加。
-
游戏速度随得分逐渐加快。
2.2 操作需求
| 按键 | 功能 |
|---|---|
| A / ← | 左移 |
| D / → | 右移 |
| Q | 退出游戏 |
2.3 非功能需求
-
使用标准 C 语言编写。
-
控制台字符显示,便于教学。
-
支持非阻塞键盘输入。
-
代码结构清晰,便于扩展和讲解。
三、相关技术详细介绍
-
二维数组管理游戏区域
游戏区域每行存储四个方块状态:0=白块,1=黑块。 -
随机黑块生成
使用rand()随机选择每行黑块列位置。 -
玩家位置管理
用变量记录玩家当前列位置,控制其左右移动。 -
实时键盘输入
使用_kbhit()+_getch()捕获玩家按键,实现不阻塞主循环。 -
游戏主循环设计
循环执行:生成新行 → 玩家输入 → 更新界面 → 检测碰撞 → 延时。 -
速度控制与难度递增
根据得分减少延时,使游戏越来越快。
四、实现思路详细介绍
-
初始化游戏
-
清空游戏区域
-
初始化玩家位置在最底行中间
-
初始化得分、速度等参数
-
-
主循环
-
每次循环生成新行黑块
-
更新整个区域的方块下落
-
检测玩家是否踩到白块
-
显示游戏界面
-
延时控制游戏速度
-
-
玩家输入处理
-
左右移动(列值 + / - 1)
-
边界检测
-
Q退出
-
-
游戏结束判定
-
玩家踩到白块
-
或手动退出
-
-
分数显示
-
实时更新,显示当前得分和最高分。
-
五、完整实现代码
/************************************************************
* 文件名:dont_step_white.c
* 项目:C语言实现别踩白块儿游戏(控制台版)
************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#define ROW 20 // 游戏区域行数
#define COL 4 // 游戏区域列数
/* 游戏区域数组:0=白块,1=黑块 */
int map[ROW][COL];
/* 玩家列位置 */
int playerPos = 1;
/* 得分 */
int score = 0;
/* 游戏结束标志 */
int gameOver = 0;
/* 延时(控制速度) */
int speed = 400;
/* 函数声明 */
void initGame();
void drawMap();
void updateMap();
void handleInput();
void gotoxy(int x,int y);
int main() {
srand((unsigned)time(NULL));
initGame();
while (!gameOver) {
handleInput();
updateMap();
drawMap();
Sleep(speed);
}
system("cls");
printf("游戏结束!\n");
printf("你的得分:%d\n", score);
return 0;
}
/* 初始化游戏 */
void initGame() {
for(int i=0;i<ROW;i++)
for(int j=0;j<COL;j++)
map[i][j] = 0;
playerPos = 1;
score = 0;
gameOver = 0;
speed = 400;
}
/* 绘制游戏界面 */
void drawMap() {
system("cls");
printf("别踩白块儿 分数: %d\n", score);
for(int i=0;i<ROW;i++){
for(int j=0;j<COL;j++){
if(i == ROW-1 && j == playerPos)
printf("[P]"); // 玩家位置
else
printf("%s", map[i][j] ? "[#]" : "[ ]");
}
printf("\n");
}
printf("按A/D或←/→移动, Q退出\n");
}
/* 更新游戏区域 */
void updateMap() {
// 检测玩家踩到白块
if(map[ROW-1][playerPos]==0) {
gameOver = 1;
return;
} else {
score++;
if(score%10==0 && speed>100)
speed -=20; // 难度递增
}
// 下移方块
for(int i=ROW-1;i>0;i--)
for(int j=0;j<COL;j++)
map[i][j] = map[i-1][j];
// 生成新行黑块
int blackIndex = rand()%COL;
for(int j=0;j<COL;j++)
map[0][j] = (j==blackIndex) ? 1 : 0;
}
/* 处理玩家输入 */
void handleInput() {
if(_kbhit()){
char ch = _getch();
if(ch=='a' || ch=='A')
if(playerPos>0) playerPos--;
if(ch=='d' || ch=='D')
if(playerPos<COL-1) playerPos++;
if(ch=='q' || ch=='Q')
gameOver = 1;
// 方向键支持
if(ch==0 || ch==224){
ch=_getch();
if(ch==75) if(playerPos>0) playerPos--; // ←
if(ch==77) if(playerPos<COL-1) playerPos++; // →
}
}
}
/* 光标定位函数(可选) */
void gotoxy(int x,int y){
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
六、代码详细解读
-
initGame
初始化游戏区域、玩家位置、得分和速度。 -
drawMap
清屏后绘制整个游戏区域,显示黑块、白块以及玩家位置。 -
updateMap
实现:
-
玩家踩到白块判定游戏结束
-
下移所有方块
-
生成新行黑块
-
分数增加及难度递增
-
handleInput
实时处理玩家键盘输入,支持A/D或方向键移动,Q退出。 -
gotoxy
可选函数,用于精确定位光标显示,增强界面效果。
七、项目详细总结
本项目实现了一个控制台版“别踩白块儿”游戏”,涵盖了:
-
二维数组动态更新
-
玩家实时输入处理
-
游戏主循环逻辑
-
碰撞判定与游戏结束条件
-
难度递增设计
非常适合 C 语言课程设计、课堂演示和博客教学。
八、项目常见问题及解答
Q1:为什么要用 _kbhit()?
A:保证游戏循环不会因等待输入而暂停,实现实时操作。
Q2:游戏速度如何控制?
A:通过 Sleep(speed) 实现,下落速度随得分递增。
Q3:如何支持更多列?
A:修改 COL 宏定义并调整界面输出即可。
九、扩展方向与性能优化
-
增加多行黑块随机生成多个黑块
-
增加暂停功能
-
增加排行榜和最高分保存
-
使用 EasyX / SDL 制作图形版
-
增加背景音乐或提示音
更多推荐

所有评论(0)