c语言俄罗斯方块daim
时间: 2023-10-26 16:16:23 浏览: 135
以下是一个简单的 C 语言实现俄罗斯方块的代码示例:
```
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
#define ROW 20 // 地图行数
#define COL 10 // 地图列数
int map[ROW][COL] = {0}; // 地图数组,0表示空格,1表示方块
int box[4][4] = {0}; // 方块数组
int cur_x = 0, cur_y = 0; // 当前方块的位置
int score = 0; // 得分
// 初始化方块类型
void init_box() {
int box_type = rand() % 7; // 随机获取方块类型
switch (box_type) {
case 0:
box[0][1] = box[1][1] = box[1][0] = box[1][2] = 1;
break;
case 1:
box[0][0] = box[0][1] = box[1][1] = box[1][2] = 1;
break;
case 2:
box[0][1] = box[1][0] = box[1][1] = box[2][0] = 1;
break;
case 3:
box[0][0] = box[1][0] = box[1][1] = box[2][1] = 1;
break;
case 4:
box[0][1] = box[1][0] = box[1][1] = box[2][1] = 1;
break;
case 5:
box[0][1] = box[1][1] = box[1][2] = box[2][2] = 1;
break;
case 6:
box[0][2] = box[1][0] = box[1][1] = box[2][1] = 1;
break;
}
}
// 在地图上显示方块
void show_box() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (box[i][j] == 1) {
map[cur_x + i][cur_y + j] = 1;
}
}
}
}
// 消除满行
void clear_line() {
int full = 0;
for (int i = 0; i < ROW; i++) {
int flag = 1;
for (int j = 0; j < COL; j++) {
if (map[i][j] == 0) {
flag = 0;
break;
}
}
if (flag == 1) {
full++;
for (int j = i; j > 0; j--) {
for (int k = 0; k < COL; k++) {
map[j][k] = map[j - 1][k];
}
}
for (int j = 0; j < COL; j++) {
map[0][j] = 0;
}
}
}
if (full > 0) {
score += full * 100;
printf("得分:%d\n", score);
}
}
// 判断是否可以移动或旋转方块
int can_move(int dx, int dy) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (box[i][j] == 1) {
if (cur_x + i + dx < 0 || cur_x + i + dx >= ROW
|| cur_y + j + dy < 0 || cur_y + j + dy >= COL
|| map[cur_x + i + dx][cur_y + j + dy] == 1) {
return 0;
}
}
}
}
return 1;
}
// 移动方块
void move_box(int dx, int dy) {
if (can_move(dx, dy)) {
cur_x += dx;
cur_y += dy;
}
}
// 旋转方块
void rotate_box() {
int temp[4][4] = {0};
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
temp[i][j] = box[i][j];
}
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
box[i][j] = temp[3 - j][i];
}
}
if (!can_move(0, 0)) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
box[i][j] = temp[i][j];
}
}
}
}
// 显示地图
void show_map() {
system("cls");
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
if (map[i][j] == 0) {
printf(" ");
} else {
printf("■");
}
}
printf("\n");
}
}
int main() {
srand(time(NULL));
init_box();
while (1) {
show_map();
if (kbhit()) {
char c = getch();
switch (c) {
case 'a':
move_box(0, -1);
break;
case 'd':
move_box(0, 1);
break;
case 's':
move_box(1, 0);
break;
case 'w':
rotate_box();
break;
}
}
move_box(1, 0);
if (!can_move(1, 0)) {
show_box();
clear_line();
init_box();
cur_x = cur_y = 0;
}
Sleep(100);
}
return 0;
}
```
这份代码使用了 `map` 数组来表示地图,0 表示空格,1 表示方块,使用 `box` 数组来表示当前方块的形状,使用 `cur_x` 和 `cur_y` 表示当前方块的位置,使用 `score` 表示得分。在游戏循环中,先显示地图,然后根据用户的输入移动或旋转方块,然后向下移动方块,如果不能移动,则将方块写入地图中,然后检查是否有满行,如果有,则消除,并更新得分,最后初始化一个新的方块。游戏循环使用了 `Sleep` 函数来控制游戏速度。
阅读全文