Skip to main content

へびゲーム


体験入学会プログラミング体験教材

はじめに

本日は体験入学会にお越しいただきありがとうございます。
プログラミング初心者向けの体験授業として、C++を使った「スネークゲーム」を完成させます。
コード中の TODO マークに沿って穴埋めし、動くゲームを作りましょう。


HEBIGAMEを動かしてみよう

まずはいったん遊んでみよう
  • スペースキーでスタート
  • キーボードのアローキー(⬆️⬇️⬅️➡️)で方向転換
  • エサを食べると成長するよ!
  • 自分の体を食べちゃったり、壁に当たるとゲームオーバー
  • スペースキーでリスタート



Step 1: 背景色設定

しよう(TODO #1)

ゲーム画面の最初に呼ばれる Stage クラスのコンストラクタ内で、


①バックグラウンドカラーSetBackgroundColor 関数を使って画面背景色を設定します。

// TODO #1: ここに背景色を設定するRGBを入れてください
SetBackgroundColor( ____, ____, ____ );
  • 各値は 0〜255 の範囲で指定します。
  • 見やすい色(例:空色など)を選びましょう。

ヒント

色見本:コンピュータ内の色の表現(RGB)

50 SetBackgroundColor(132, 255, 255); は淡いシアン(空色)です。


133


Step 2: ステージ描画

しよう(TODO #2)

Stage::Draw() 内で、先ほど作ったグリッド状ステージを描画する関数呼び出します。

void Stage::Draw()
{
    // TODO #2: ここにステージ描画関数を呼び出すコードを追加してください
    ____();
    
    if (!snake || !food)
        return;
    // 以下、蛇とフード、スコア描画...
}

ヒント

DrawStageGrid(); を呼び出します。



Step 3: スネーク作成しよう(TODO #3)

コンストラクタ内で snake ポインタに新しい Snake オブジェクトを生成します。

// TODO #3: Snakeオブジェクトを生成しよう
snake = ____;

ヒント

54

new Snake() でインスタンス化します。


Step 3.5: 移動タイマーを設定しよう(TODO #3.5)

スネークの移動間隔を決めるタイマーを設定します。

// TODO #3.5: スネークの移動間隔を設定しよう
SetMoveTimer( ____ );

ヒント

定数 MOVETIME を使いましょう。



Step 4: フード作成しよう(TODO #4)

コンストラクタ内で food ポインタに新しい Food オブジェクトを生成します。

// TODO #4: Foodオブジェクトを生成しよう
food = ____;

ヒント

55

new Food();


4.1

151

を使います。//snake->Draw();


Step //food->Draw();

コメント解除



4.5

835: コメント解除

food->SpawnRandom();


キーボードの設定

入力を処理しよう(TODO #5)


Stage::Update() 内で矢印キーを押したときにスネークの進行方向を変更します。

if (Input::IsKeyDown(KEY_INPUT_UP))
    

snake->SetDirection(UP) ____ );

if (Input::IsKeyDown(KEY_INPUT_DOWN))

snake->SetDirection(DOWN) ____ );

if (Input::IsKeyDown(KEY_INPUT_LEFT))

snake->SetDirection(LEFT) ____ );

if (Input::IsKeyDown(KEY_INPUT_RIGHT))

snake->SetDirection(RIGHT) ____ );

ヒント

Direction::UP, DOWN, LEFT, RIGHT を使います。


Step 6: ヘビを伸ばそう(TODO #6)

スネークがフードを食べたら、体を伸ばすメソッドを呼び出します。

if (snake->GetHeadPos() == food->GetPosition()) {
    // TODO #6: ヘビを伸ばす

124

関数を呼び出そう snake->Grow(____();

GrawSnake()にする?


⑦スコア描画

146

DrawScore( food->SpawnRandom();


// スコア加算へ(TODO #8) }

ヒント

Snake クラスの Grow() メソッドを呼び出します。


Step 7: スコアを描画しよう(TODO #7)

127Stage::Draw() 内で画面上にスコアを表示します。

AddScore(

// TODO #7: スコアを描画しよう
DrawScore();

ヒント

すでに用意した DrawScore() を呼び出します。


Step 8: スコアを加算しよう(TODO #8)


フードを食べたときにスコアを増加させます。

if (snake->GetHeadPos() == food->GetPosition()) {
    // ヘビを伸ばす
    // TODO #8: スコアを加算しよう
    Score::AddScore( ____ );
    food->SpawnRandom();
}

ヒント

1 回のフード取得につき 1 点加算しましょう。


Step 9: 壁との当たり判定をしよう(TODO #9)

Stage::Update() 内でスネークがステージ外に出たらゲームオーバーにします。

ivec3 pos = snake->GetBody()[0].GetPosition();
// TODO #9: 壁に当たったかチェックして、当たったら死亡処理を呼ぼう
if ( CheckHitWall( vec3(pos.x, 0, pos.z) ) ) {
    snake->SetDeath();
}

ヒント

101CheckHitWall() を使って判定します。


Step 10: フードをスポーンしよう(TODO #4.5)

CheckHitWall(pos)ステージ読み込み後にフードをランダムな位置に配置します。

if (food) {
    // TODO #4.5: フードをランダムにスポーンさせよう
    food->____();
}

ヒント

SpawnRandom() メソッドを呼び出します。


Step 11: フードを更新しよう(TODO #11)

Stage::Update() 内でフードのアニメーション更新を呼び出します。

// TODO #11: フードの更新処理を呼び出そう
food->____();

ヒント

Update() メソッドを呼び出します。


以上でスネークゲームの基本機能が完成します!
コードをビルドして、動作を確認してみましょう。1 つずつクリアしながら進めてください。

Step 12: ゲームオーバー時のシーン切り替え(TODO #12)

スネークが死亡したときに、別のシーンへ切り替えます。

if (!snake->IsAlive())
{
    // TODO #12: 死亡時にシーンを切り替えるコードを追加しよう
    SceneManager::ChangeScene();
}

ヒント

  • SceneManager クラスの ChangeScene() メソッドを呼び出します。
  • 遷移先のシーンはあらかじめ設定されていることを確認してください。

以上で、全 12 ステップの穴埋め教材が完成です! コードをビルドし、ゲームオーバー時にも正しくシーンが切り替わるか確認してみましょう。 コードをビルドして、動作を確認してみましょう。1 つずつクリアしながら進めてください。


⑩シーン変化

117

"RESULT"

URL

https://github.com/youetsux/HEBIGAME_TAIKEN.git