[C++] 261 SDL : テトリス落下スピード選択 その1 ChatGPT

[M1 Mac, Monterey 12.6.3, clang 13.0.0, SDL 2.26.2, ChatGPT Plus, NO IDE]

これまで開発してきたテトリスはベーシック版として、多機能版を別に開発することにしました。

まずはテトロミノの落下スピードを調整できるようにします。ボタンを3つレンダリングしています。

ChatGPTにヘッダファイルを見せた上でコードの作成方法を聞いてみました。

Q: <Game.hは省略> 以上のGame.hを踏まえて落下スピードを3段階に設定するにはどうしたらよいですか?

Tetrisの落下スピードを3段階に設定する場合は、Gameクラス内に落下スピードを管理する変数を追加し、GameInput構造体にボタン入力を追加して、それに応じて落下スピードを変更するようにUpdatePlaying関数を修正する必要があります。

以下は、例としてUpdatePlaying関数を修正したコードです。ここでは、bSlow、bNormal、bFastの3つのフラグ変数をGameInput構造体に追加して、それぞれがtrueの場合に対応する落下スピードを設定しています。

void Game::UpdatePlaying(const GameInput& gameInput) {
    if (gameInput.bPause) {
        m_gameState = kGameState_TitleScreen;
        return;
    }

    // 落下スピードの設定
    int framesPerFallStep;
    if (gameInput.bSlow) {
        framesPerFallStep = 48;
    } else if (gameInput.bNormal) {
        framesPerFallStep = 32;
    } else {
        framesPerFallStep = 16;
    }

    // 落下フレーム数の計算
    m_framesUntilFall -= 1;
    if (m_framesUntilFall == 0) {
        m_framesUntilFall = framesPerFallStep;
        m_activeTetromino.m_pos.y += 1;
        if (CheckTetrominoCollision(m_activeTetromino)) {
            // 衝突した場合、テトロミノをフィールドに追加する
            AddTetronimoToField(m_field, m_activeTetromino);
            // 行を消去する
            int numLinesCleared = ClearFullLines(m_field);
            m_numLinesCleared += numLinesCleared;
            m_level = m_numLinesCleared / 10;
            // 新しいテトロミノをスポーンする
            if (!SpawnTetromino()) {
                m_gameState = kGameState_GameOver;
                return;
            }
        }
    }

    // 入力に応じた処理
    if (gameInput.bMoveLeft) {
        if (!CheckTetrominoCollision(m_activeTetromino, -1, 0)) {
            m_activeTetromino.m_pos.x -= 1;
        }
    }
    if (gameInput.bMoveRight) {
        if (!CheckTetrominoCollision(m_activeTetromino, 1, 0)) {
            m_activeTetromino.m_pos.x += 1;
        }
    }
    if (gameInput.bRotateClockwise) {
        if (!CheckTetrominoCollision(m_activeTetromino, 0, 0, 1)) {
            m_activeTetromino.m_rotation = (m_activeTetromino.m_rotation + 1) % Tetromino::kNumRotations;
        }
    }
    if (gameInput.bRotateAnticlockwise) {
        if (!CheckTetrominoCollision(m_activeTetromino, 0, 0, -1)) {
            m_activeTetromino.m_rotation = (m_activeTetromino.m_rotation + Tetrom