dos俄罗斯方块代码并生成exe文件
时间: 2023-12-06 21:39:39 浏览: 33
以下是一个简单的 DOS 俄罗斯方块游戏的代码示例:
```
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define WIDTH 10
#define HEIGHT 20
#define BLOCK_SIZE 4
#define START_X 4
#define START_Y 0
#define SHAPE_COUNT 7
int shapes[SHAPE_COUNT][BLOCK_SIZE][BLOCK_SIZE] = {
// I shape
{
{0, 0, 0, 0},
{1, 1, 1, 1},
{0, 0, 0, 0},
{0, 0, 0, 0}
},
// J shape
{
{1, 0, 0, 0},
{1, 1, 1, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}
},
// L shape
{
{0, 0, 1, 0},
{1, 1, 1, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}
},
// O shape
{
{1, 1, 0, 0},
{1, 1, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}
},
// S shape
{
{0, 1, 1, 0},
{1, 1, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}
},
// T shape
{
{0, 1, 0, 0},
{1, 1, 1, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}
},
// Z shape
{
{1, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}
}
};
int board[WIDTH][HEIGHT] = {0};
void draw_block(int x, int y, int shape) {
int i, j;
for (i = 0; i < BLOCK_SIZE; i++) {
for (j = 0; j < BLOCK_SIZE; j++) {
if (shapes[shape][i][j]) {
gotoxy(x + j * 2, y + i);
printf("■");
}
}
}
}
void erase_block(int x, int y, int shape) {
int i, j;
for (i = 0; i < BLOCK_SIZE; i++) {
for (j = 0; j < BLOCK_SIZE; j++) {
if (shapes[shape][i][j]) {
gotoxy(x + j * 2, y + i);
printf(" ");
}
}
}
}
int check_collision(int x, int y, int shape) {
int i, j;
for (i = 0; i < BLOCK_SIZE; i++) {
for (j = 0; j < BLOCK_SIZE; j++) {
if (shapes[shape][i][j]) {
if (board[x + j][y + i] || x + j < 0 || x + j >= WIDTH || y + i >= HEIGHT) {
return 1;
}
}
}
}
return 0;
}
void rotate_shape(int shape) {
int temp[BLOCK_SIZE][BLOCK_SIZE];
int i, j;
for (i = 0; i < BLOCK_SIZE; i++) {
for (j = 0; j < BLOCK_SIZE; j++) {
temp[j][BLOCK_SIZE - 1 - i] = shapes[shape][i][j];
}
}
for (i = 0; i < BLOCK_SIZE; i++) {
for (j = 0; j < BLOCK_SIZE; j++) {
shapes[shape][i][j] = temp[i][j];
}
}
}
void clear_board() {
int i, j;
for (i = 0; i < WIDTH; i++) {
for (j = 0; j < HEIGHT; j++) {
board[i][j] = 0;
}
}
}
void draw_board() {
int i, j;
for (i = 0; i < WIDTH; i++) {
for (j = 0; j < HEIGHT; j++) {
gotoxy(i * 2, j);
if (board[i][j]) {
printf("■");
} else {
printf(" ");
}
}
}
}
void clear_lines() {
int i, j, k;
int full;
for (j = 0; j < HEIGHT; j++) {
full = 1;
for (i = 0; i < WIDTH; i++) {
if (!board[i][j]) {
full = 0;
break;
}
}
if (full) {
for (k = j; k > 0; k--) {
for (i = 0; i < WIDTH; i++) {
board[i][k] = board[i][k - 1];
}
}
j--;
}
}
}
int main() {
int block_x = START_X, block_y = START_Y;
int shape = rand() % SHAPE_COUNT;
int rotation = 0;
int key;
int speed = 10;
int score = 0;
clock_t last_tick, current_tick;
srand(time(NULL));
clrscr();
clear_board();
draw_board();
while (1) {
if (kbhit()) {
key = getch();
if (key == 'a' && !check_collision(block_x - 1, block_y, shape)) {
erase_block(block_x, block_y, shape);
block_x--;
draw_block(block_x, block_y, shape);
}
if (key == 'd' && !check_collision(block_x + 1, block_y, shape)) {
erase_block(block_x, block_y, shape);
block_x++;
draw_block(block_x, block_y, shape);
}
if (key == 'w') {
int new_rotation = (rotation + 1) % 4;
int temp_x = block_x, temp_y = block_y;
erase_block(block_x, block_y, shape);
rotate_shape(shape);
if (!check_collision(block_x, block_y, shape)) {
rotation = new_rotation;
} else {
shapes[shape][0][0] = shapes[shape][0][1] = shapes[shape][1][0] = shapes[shape][1][1] = 0;
if (!check_collision(block_x, block_y, shape)) {
rotation = new_rotation;
} else {
shapes[shape][0][0] = shapes[shape][0][1] = shapes[shape][1][0] = shapes[shape][1][1] = 1;
shapes[shape][0][2] = shapes[shape][2][0] = shapes[shape][2][2] = 1;
if (!check_collision(block_x, block_y, shape)) {
rotation = new_rotation;
} else {
shapes[shape][0][2] = shapes[shape][2][0] = shapes[shape][2][2] = 0;
rotate_shape(shape);
rotate_shape(shape);
rotate_shape(shape);
}
}
}
draw_block(block_x, block_y, shape);
}
if (key == 's') {
speed = 1;
}
}
current_tick = clock();
if ((double)(current_tick - last_tick) / CLOCKS_PER_SEC >= 1.0 / speed) {
last_tick = current_tick;
if (!check_collision(block_x, block_y + 1, shape)) {
erase_block(block_x, block_y, shape);
block_y++;
draw_block(block_x, block_y, shape);
} else {
int i, j;
for (i = 0; i < BLOCK_SIZE; i++) {
for (j = 0; j < BLOCK_SIZE; j++) {
if (shapes[shape][i][j]) {
board[block_x + j][block_y + i] = 1;
}
}
}
clear_lines();
block_x = START_X;
block_y = START_Y;
shape = rand() % SHAPE_COUNT;
rotation = 0;
if (check_collision(block_x, block_y, shape)) {
gotoxy(0, HEIGHT + 1);
printf("GAME OVER!");
return 0;
}
draw_block(block_x, block_y, shape);
score++;
gotoxy(WIDTH * 2 + 4, 0);
printf("SCORE: %d", score);
speed = 10;
}
}
}
return 0;
}
```
使用以下命令将代码编译为可执行文件:
```
gcc -o tetris.exe tetris.c
```
这将生成一个名为 `tetris.exe` 的可执行文件。运行它即可开始玩 DOS 俄罗斯方块游戏。