请帮我用c语言写一个俄罗斯方块代码
十一 发布于:2024-01-14 23:00:57
以下是一个简单的俄罗斯方块游戏的C语言代码示例:
#include
#include
#include
#include
#define WIDTH 10
#define HEIGHT 20
int board[HEIGHT][WIDTH] = {0};
int currentPiece[4][4] = {0};
int currentX = 0;
int currentY = 0;
void drawBoard() {
int i, j;
for (i = 0; i < HEIGHT; i++) {
for (j = 0; j < WIDTH; j++) {
if (board[i][j] == 0) {
printf(\" \");
} else {
printf(\"*\");
}
}
printf(\"\
\");
}
}
int checkCollision(int x, int y) {
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (currentPiece[i][j] != 0 && (board[y + i][x + j] != 0 || x + j < 0 || x + j >= WIDTH || y + i >= HEIGHT)) {
return 1;
}
}
}
return 0;
}
void mergePiece() {
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (currentPiece[i][j] != 0) {
board[currentY + i][currentX + j] = 1;
}
}
}
}
void rotatePiece() {
int tempPiece[4][4];
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
tempPiece[i][j] = currentPiece[i][j];
}
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
currentPiece[i][j] = tempPiece[3 - j][i];
}
}
}
void clearLines() {
int i, j;
for (i = HEIGHT - 1; i >= 0; i--) {
int lineFull = 1;
for (j = 0; j < WIDTH; j++) {
if (board[i][j] == 0) {
lineFull = 0;
break;
}
}
if (lineFull) {
int k;
for (k = i; k > 0; k--) {
for (j = 0; j < WIDTH; j++) {
board[k][j] = board[k - 1][j];
}
}
for (j = 0; j < WIDTH; j++) {
board[0][j] = 0;
}
}
}
}
void generatePiece() {
int pieces[7][4][4] = {
{{1, 1, 1, 1}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}},
{{1, 1, 1, 0}, {1, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}},
{{1, 1, 1, 0}, {0, 0, 1, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}},
{{1, 1, 0, 0}, {1, 1, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}},
{{1, 1, 0, 0}, {0, 1, 1, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}},
{{0, 1, 1, 0}, {1, 1, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}},
{{1, 1, 0, 0}, {1, 1, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}
};
int randomPiece = rand() % 7;
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
currentPiece[i][j] = pieces[randomPiece][i][j];
}
}
currentX = WIDTH / 2 - 2;
currentY = 0;
}
int main() {
int gameOver = 0;
int key;
srand(time(NULL));
generatePiece();
while (!gameOver) {
system(\"cls\");
drawBoard();
if (checkCollision(currentX, currentY + 1)) {
mergePiece();
clearLines();
generatePiece();
if (checkCollision(currentX, currentY)) {
gameOver = 1;
}
} else {
currentY++;
}
if (_kbhit()) {
key = _getch();
switch (key) {
case 'a':
if (!checkCollision(currentX - 1, currentY)) {
currentX--;
}
break;
case 'd':
if (!checkCollision(currentX + 1, currentY)) {
currentX++;
}
break;
case 's':
if (!checkCollision(currentX, currentY + 1)) {
currentY++;
}
break;
case 'w':
rotatePiece();
if (checkCollision(currentX, currentY)) {
rotatePiece();
rotatePiece();
rotatePiece();
}
break;
case 'q':
gameOver = 1;
break;
}
}
Sleep(100);
}
system(\"cls\");
printf(\"Game Over!\
\");
return 0;
}
这个代码使用了Windows的conio.h和windows.h库来实现控制台界面和键盘输入。你可以在Windows环境下编译和运行这个代码。