下面是一个简单的C语言俄罗斯方块小游戏的示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

#define WIDTH 10
#define HEIGHT 20

int board[HEIGHT][WIDTH] = {0};
int currentPiece[4][4] = {0};
int currentX = 0;
int currentY = 0;

void drawBoard();
void drawPiece();
void clearPiece();
void rotatePiece();
int checkCollision(int newX, int newY, int newPiece[4][4]);

int main() {
    int gameOver = 0;
    int key = 0;

    // 设置控制台窗口大小
    HWND console = GetConsoleWindow();
    RECT r;
    GetClientRect(console, &r);
    MoveWindow(console, r.left, r.top, 400, 600, TRUE);

    // 游戏循环
    while (!gameOver) {
        // 处理键盘输入
        if (_kbhit()) {
            key = _getch();
            switch (key) {
                case 'a':
                    if (!checkCollision(currentX - 1, currentY, currentPiece)) {
                        currentX--;
                    }
                    break;
                case 'd':
                    if (!checkCollision(currentX + 1, currentY, currentPiece)) {
                        currentX++;
                    }
                    break;
                case 's':
                    if (!checkCollision(currentX, currentY + 1, currentPiece)) {
                        currentY++;
                    }
                    break;
                case 'w':
                    rotatePiece();
                    break;
                case 'q':
                    gameOver = 1;
                    break;
            }
        }

        // 清除当前方块
        clearPiece();

        // 更新方块位置
        if (!checkCollision(currentX, currentY + 1, currentPiece)) {
            currentY++;
        } else {
            // 固定方块到游戏板上
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {
                    if (currentPiece[i][j] != 0) {
                        board[currentY + i][currentX + j] = 1;
                    }
                }
            }

            // 消除满行
            for (int i = HEIGHT - 1; i >= 0; i--) {
                int rowFull = 1;
                for (int j = 0; j < WIDTH; j++) {
                    if (board[i][j] == 0) {
                        rowFull = 0;
                        break;
                    }
                }
                if (rowFull) {
                    for (int k = i; k > 0; k--) {
                        for (int j = 0; j < WIDTH; j++) {
                            board[k][j] = board[k - 1][j];
                        }
                    }
                    i++;
                }
            }

            // 生成新的方块
            currentX = WIDTH / 2 - 2;
            currentY = 0;
            int pieceIndex = rand() % 7;
            int pieces[7][4][4] = {
                {{0,0,0,0},
                {1,1,1,1},
                {0,0,0,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},
                {1,1,0,0},
                {0,1,1,0},
                {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,0,1,1},
                {0,0,0,0}},

                {{0,0,0,0},
                {0,1,0,0},
                {1,1,1,0},
                {0,0,0,0}},

                {{0,0,0,0},
                {0,0,1,0},
                {1,1,1,0},
                {0,0,0,0}}
            };
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {
                    currentPiece[i][j] = pieces[pieceIndex][i][j];
                }
            }

            // 检查游戏结束
            if (checkCollision(currentX, currentY, currentPiece)) {
                gameOver = 1;
            }
        }

        // 绘制游戏界面
        drawBoard();
        drawPiece();

        // 控制帧率
        Sleep(100);
    }

    printf("Game Over!\n");
    return 0;
}

void drawBoard() {
    system("cls");

    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            if (board[i][j] == 1) {
                printf("*");
            } else {
                printf(" ");
            }
        }
        printf("\n");
    }
}

void drawPiece() {
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            if (currentPiece[i][j] != 0) {
                board[currentY + i][currentX + j] = 1;
            }
        }
    }
}

void clearPiece() {
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            if (currentPiece[i][j] != 0) {
                board[currentY + i][currentX + j] = 0;
            }
        }
    }
}

void rotatePiece() {
    int tempPiece[4][4] = {0};
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            tempPiece[i][j] = currentPiece[i][j];
        }
    }

    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            currentPiece[i][j] = tempPiece[3 - j][i];
        }
    }

    if (checkCollision(currentX, currentY, currentPiece)) {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                currentPiece[i][j] = tempPiece[i][j];
            }
        }
    }
}

int checkCollision(int newX, int newY, int newPiece[4][4]) {
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            if (newPiece[i][j] != 0) {
                if (newY + i >= HEIGHT || newX + j < 0 || newX + j >= WIDTH || board[newY + i][newX + j] == 1) {
                    return 1;
                }
            }
        }
    }
    return 0;
}

这个示例代码使用了Windows系统的conio.h和windows.h头文件来实现控制台窗口和键盘输入的功能。在游戏循环中,根据键盘输入移动和旋转方块,并根据方块的位置判断是否发生碰撞。游戏结束时,输出"Game Over!"并结束程序的运行。

请注意,这只是一个简单的示例代码,并没有实现游戏的所有功能和特性。你可以根据自己的需求对代码进行修改和扩展

写c语言俄罗斯方块小游戏

原文地址: https://www.cveoy.top/t/topic/hYQH 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录