C++ 编写的俄罗斯方块

164 阅读2分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情

使用 C++ 编写的俄罗斯方块的代码

#include <iostream>
#include <vector>
#include <ctime>
​
using namespace std;
​
const int HEIGHT = 20;
const int WIDTH = 10;
​
vector<vector<int>> gameBoard(HEIGHT, vector<int>(WIDTH, 0));
​
enum Shape { I, J, L, O, S, T, Z };
​
class Block {
public:
    Shape shape;
    int x, y;
    Block() {
        shape = (Shape)(rand() % 7);
        x = WIDTH / 2;
        y = 0;
    }
    void moveLeft() { x--; }
    void moveRight() { x++; }
    void moveDown() { y++; }
};
​
bool checkCollision(Block block) {
    for (int i = 0; i < 4; i++) {
        int newX = block.x + dx[block.shape][i];
        int newY = block.y + dy[block.shape][i];
        if (newX < 0 || newX >= WIDTH || newY >= HEIGHT) {
            return true;
        }
        if (gameBoard[newY][newX] != 0) {
            return true;
        }
    }
    return false;
}
​
void rotateBlock(Block& block) {
    Shape newShape = block.shape;
    int newRotation = (block.rotation + 1) % 4;
    int x = block.x;
    int y = block.y;
    for (int i = 0; i < 4; i++) {
        int newX = x + dx[newShape][newRotation];
        int newY = y + dy[newShape][newRotation];
        if (newX < 0 || newX >= WIDTH || newY >= HEIGHT) {
            return;
        }
        if (gameBoard[newY][newX] != 0) {
            return;
        }
    }
    block.shape = newShape;
    block.rotation = newRotation;
}
​
void addBlockToBoard(Block block) {
    for (int i = 0; i < 4; i++) {
        int newX = block.x + dx[block.shape][i];
        int newY = block.y + dy[block.shape][i];
        gameBoard[newY][newX] = block.shape + 1;
    }
}
​
void printBoard() {
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            cout << gameBoard[i][j] << " ";
        }
        cout << endl;
    }
}
​
int main() {
    srand(time(0));
    Block block;
    while (!checkCollision(block)) {
        printBoard();
        char input;
        cin >> input;
        if (input == 'a') {
            block.moveLeft();
        } else if (input == 'd') {
            block.moveRight();
        } else if (input == 's') {
            block.moveDown();
        } else if (input == 'r') {
            rotateBlock(block);
        }
        if (checkCollision(block)) {
            addBlockToBoard(block);
            block = Block();
        }
    }
    cout << "Game Over!" << endl;
    return 0;
}
​

该代码是一个简单的俄罗斯方块游戏,使用标准输入来控制方块的移动:a 表示左移,d 表示右移,s 表示下移,r 表示旋转。游戏的逻辑是:如果当前方块碰撞,则将方块加入游戏板,并创建一个新的方块。当方块不能继续下移时,游戏结束。

在使用 C++ 编写俄罗斯方块代码时需要注意以下几个问题:

  1. 界面的设计:俄罗斯方块游戏需要具有良好的界面设计,开发者需要使用适当的图形库来实现界面的绘制。
  2. 数据结构的选择:俄罗斯方块游戏中需要存储很多方块的信息,因此开发者需要选择合适的数据结构来存储这些信息。
  3. 方块的随机生成:俄罗斯方块游戏中需要随机生成方块,因此开发者需要使用适当的随机数生成算法来实现。
  4. 游戏逻辑的实现:俄罗斯方块游戏具有复杂的游戏逻辑,开发者需要细心地设计和实现游戏的各种逻辑。
  5. 代码的可读性:为了方便后期的维护和升级,开发者需要注意代码的可读性和可维护性。

总体来说,在使用 C++ 编写俄罗斯方块代码时需要考虑到代码的可维护性、程序的正确性、运行效率等多方面的因素。