用c语言写出游戏俄罗斯方块的代码
时间: 2024-04-23 19:03:40 浏览: 7
以下是一个简单的用C语言写的俄罗斯方块游戏代码,供参考:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
#define WIDTH 12
#define HEIGHT 22
#define SPEED 50
int board[HEIGHT][WIDTH] = {0}; // 游戏面板
int block[4][4] = {0}; // 当前方块
int block_x = 5, block_y = 0; // 当前方块的位置
int score = 0; // 得分
// 初始化游戏面板
void init_board() {
int i, j;
for (i = 0; i < HEIGHT; i++) {
for (j = 0; j < WIDTH; j++) {
if (i == HEIGHT - 1 || j == 0 || j == WIDTH - 1) {
board[i][j] = 1;
}
}
}
}
// 随机生成一个方块
void generate_block() {
int type = rand() % 7;
switch (type) {
case 0:
block[1][1] = block[1][2] = block[2][1] = block[2][2] = 1;
break;
case 1:
block[1][0] = block[1][1] = block[1][2] = block[1][3] = 1;
break;
case 2:
block[1][1] = block[2][1] = block[2][2] = block[3][2] = 1;
break;
case 3:
block[1][2] = block[2][2] = block[3][1] = block[3][2] = 1;
break;
case 4:
block[1][2] = block[2][1] = block[2][2] = block[3][1] = 1;
break;
case 5:
block[1][2] = block[2][1] = block[2][2] = block[3][2] = 1;
break;
case 6:
block[1][1] = block[2][1] = block[3][1] = block[3][2] = 1;
break;
}
}
// 在游戏面板上显示当前方块
void show_block() {
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (block[i][j]) {
board[block_y + i][block_x + j] = 2;
}
}
}
}
// 在游戏面板上清除当前方块
void clear_block() {
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (block[i][j]) {
board[block_y + i][block_x + j] = 0;
}
}
}
}
// 判断当前方块是否能够下落
int can_fall() {
int i, j;
for (i = 3; i >= 0; i--) {
for (j = 0; j < 4; j++) {
if (block[i][j] && board[block_y + i + 1][block_x + j]) {
return 0;
}
}
}
return 1;
}
// 将当前方块固定在游戏面板上
void fix_block() {
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (block[i][j]) {
board[block_y + i][block_x + j] = 1;
}
}
}
}
// 消除满行
void clear_lines() {
int i, j, k, cnt;
for (i = HEIGHT - 2; i > 0; i--) {
cnt = 0;
for (j = 1; j < WIDTH - 1; j++) {
if (board[i][j]) {
cnt++;
}
}
if (cnt == WIDTH - 2) {
score += 10;
for (k = i; k > 0; k--) {
for (j = 1; j < WIDTH - 1; j++) {
board[k][j] = board[k - 1][j];
}
}
i++;
}
}
}
// 显示游戏面板和得分
void show_board() {
int i, j;
system("cls");
printf("Score: %d\n\n", score);
for (i = 0; i < HEIGHT; i++) {
for (j = 0; j < WIDTH; j++) {
switch (board[i][j]) {
case 0:
printf(" ");
break;
case 1:
printf("[]");
break;
case 2:
printf("()");
break;
}
}
printf("\n");
}
}
int main() {
srand(time(NULL));
init_board();
while (1) {
generate_block();
block_x = 5;
block_y = 0;
if (!can_fall()) {
break;
}
while (1) {
show_block();
show_board();
Sleep(SPEED);
clear_block();
block_y++;
if (!can_fall()) {
block_y--;
fix_block();
clear_lines();
break;
}
if (kbhit()) {
char c = getch();
if (c == 'a' && block_x > 1 && !board[block_y][block_x - 1] && !board[block_y + 1][block_x - 1] && !board[block_y + 2][block_x - 1] && !board[block_y + 3][block_x - 1]) {
block_x--;
} else if (c == 'd' && block_x < WIDTH - 5 && !board[block_y][block_x + 4] && !board[block_y + 1][block_x + 4] && !board[block_y + 2][block_x + 4] && !board[block_y + 3][block_x + 4]) {
block_x++;
} else if (c == 's') {
while (can_fall()) {
block_y++;
}
block_y--;
break;
} else if (c == 'q') {
exit(0);
}
}
}
}
show_board();
printf("\nGame Over!\n");
return 0;
}
```
需要注意的是,此代码只是一个简单的实现,可能存在一些 bug 和不足之处,需要进行改进和完善。