以下是一个简单的俄罗斯方块的代码示例:

#include <stdio.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;

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,1,0},
      {0,0,1,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,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},
      {0,0,1,0},
      {1,1,1,0},
      {0,0,0,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("\n");
    }
}

int checkCollision() {
    int i, j;
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4; j++) {
            if (currentPiece[i][j] && (currentX + j >= WIDTH || currentX + j < 0 || currentY + i >= HEIGHT || board[currentY + i][currentX + j])) {
                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]) {
                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 newPiece() {
    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 i, j;
    
    srand(time(NULL));
    
    newPiece();
    
    while (!gameOver) {
        system("cls");
        
        if (_kbhit()) {
            char key = _getch();
            switch (key) {
                case 'a':
                    currentX--;
                    if (checkCollision()) {
                        currentX++;
                    }
                    break;
                case 'd':
                    currentX++;
                    if (checkCollision()) {
                        currentX--;
                    }
                    break;
                case 's':
                    currentY++;
                    if (checkCollision()) {
                        currentY--;
                        mergePiece();
                        clearLines();
                        newPiece();
                        if (checkCollision()) {
                            gameOver = 1;
                        }
                    }
                    break;
                case 'w':
                    rotatePiece();
                    if (checkCollision()) {
                        rotatePiece();
                        rotatePiece();
                        rotatePiece();
                    }
                    break;
                case 'q':
                    gameOver = 1;
                    break;
            }
        }
        
        if (!checkCollision()) {
            currentY++;
        }
        else {
            currentY--;
            mergePiece();
            clearLines();
            newPiece();
            if (checkCollision()) {
                gameOver = 1;
            }
        }
        
        drawBoard();
        Sleep(500);
    }
    
    printf("Game Over!\n");
    
    return 0;
}

在这个代码中,使用了一个二维数组来表示俄罗斯方块的游戏板,每个方块用1表示,空白处用0表示。drawBoard()函数用于绘制游戏板。checkCollision()函数用于检查当前方块是否与游戏板或边界发生碰撞。mergePiece()函数用于将当前方块合并到游戏板上。rotatePiece()函数用于旋转当前方块。clearLines()函数用于消除满行。newPiece()函数用于生成新的方块。

在主函数main()中,使用_kbhit()_getch()函数来获取玩家的键盘输入,根据输入移动方块或旋转方块。如果方块无法继续下落,将其合并到游戏板上并检查是否有满行需要消除,然后生成新的方块。如果新的方块无法放置在初始位置,则游戏结束

写一个简单的俄罗斯方块代码用c语言写

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

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