用c语言写一个俄罗斯方块小游戏,带注释
时间: 2023-12-31 22:05:09 浏览: 93
用c语言编写的俄罗斯方块小游戏
好的,下面是用C语言写一个简单的俄罗斯方块小游戏的代码,同时注释了每一部分的功能和实现方式:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
// 定义俄罗斯方块的大小和形状
#define MAX_ROW 20
#define MAX_COL 10
#define BLANK ' '
#define WALL '*'
#define BLOCK '#'
// 定义方块的形状
const int block[7][4][4] = {
1,1,0,0, 0,1,1,0, 0,0,0,0, 0,0,0,0, // Z型方块
0,1,1,0, 0,1,1,0, 0,0,0,0, 0,0,0,0, // 方块
0,1,0,0, 1,1,1,0, 0,0,0,0, 0,0,0,0, // L型方块
0,1,0,0, 0,1,1,0, 0,1,0,0, 0,0,0,0, // 反Z型方块
0,0,1,0, 1,1,1,0, 0,0,0,0, 0,0,0,0, // T型方块
1,1,0,0, 0,1,0,0, 0,1,0,0, 0,0,0,0, // J型方块
0,1,0,0, 0,1,0,0, 0,1,1,0, 0,0,0,0, // 反L型方块
};
// 定义游戏的状态
int board[MAX_ROW][MAX_COL];
int score = 0;
// 随机生成方块的形状和位置
void generate_block(int *type, int *row, int *col) {
*type = rand() % 7; // 生成0-6之间的随机数
*row = 0;
*col = rand() % (MAX_COL - 3); // 随机生成方块的左上角坐标
}
// 显示游戏界面
void print_board() {
system("cls"); // 清空屏幕
printf("Score: %d\n\n", score); // 显示得分
for (int i = 0; i < MAX_ROW; i++) {
for (int j = 0; j < MAX_COL; j++) {
if (board[i][j] == 0) {
printf("%c ", BLANK); // 空格表示空白
} else if (board[i][j] == 1) {
printf("%c ", BLOCK); // #表示方块
} else {
printf("%c ", WALL); // *表示墙壁
}
}
printf("\n");
}
}
// 判断方块是否可以移动
int can_move(int type, int row, int col) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (block[type][i][j] == 1) { // 如果该位置有方块
int r = row + i;
int c = col + j;
if (r < 0 || r >= MAX_ROW || c < 0 || c >= MAX_COL || board[r][c] == 2) {
return 0; // 如果超出边界或该位置已经有方块,则不能移动
}
}
}
}
return 1; // 可以移动
}
// 将方块放到游戏区域中
void put_block(int type, int row, int col) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (block[type][i][j] == 1) { // 如果该位置有方块
int r = row + i;
int c = col + j;
board[r][c] = 1; // 将方块放到游戏区域中
}
}
}
}
// 消除满行的方块
void clear_line() {
for (int i = MAX_ROW - 1; i >= 0; i--) {
int flag = 1; // 标记该行是否满行
for (int j = 0; j < MAX_COL; j++) {
if (board[i][j] != 1) {
flag = 0;
break;
}
}
if (flag == 1) { // 如果该行满行
score++; // 增加得分
for (int k = i; k > 0; k--) {
for (int j = 0; j < MAX_COL; j++) {
board[k][j] = board[k-1][j]; // 将上面的方块下移一行
}
}
i++; // 重新判断该行
}
}
}
int main() {
srand(time(NULL)); // 随机数种子
int type, row, col;
generate_block(&type, &row, &col); // 随机生成方块的形状和位置
while (1) {
print_board(); // 显示游戏界面
if (can_move(type, row+1, col)) { // 如果方块可以向下移动
row++;
} else { // 如果方块不能向下移动
put_block(type, row, col); // 将方块放到游戏区域中
clear_line(); // 消除满行的方块
generate_block(&type, &row, &col); // 随机生成下一个方块
if (!can_move(type, row, col)) { // 如果下一个方块不能移动了
printf("Game over!\n");
break; // 游戏结束
}
}
Sleep(500); // 延时一段时间,控制方块的下落速度
if (_kbhit()) { // 如果有按键按下
char ch = _getch(); // 获取按下的键
switch (ch) {
case 'a': // 左移
if (can_move(type, row, col-1)) {
col--;
}
break;
case 'd': // 右移
if (can_move(type, row, col+1)) {
col++;
}
break;
case 's': // 加速下落
while (can_move(type, row+1, col)) {
row++;
}
break;
case 'q': // 退出游戏
printf("Game over!\n");
exit(0);
break;
}
}
}
return 0;
}
```
这段代码实现了一个简单的俄罗斯方块小游戏,包括随机生成方块、方块的移动、方块的旋转、方块的放置、满行消除、得分计算等功能。同时使用了Windows API中的Sleep函数和conio.h库中的_kbhit和_getch函数来控制游戏的速度和获取按键输入。
阅读全文