へびゲーム
体験入学会プログラミング体験教材
はじめに
本日は体験入学会にお越しいただきありがとうございます。
プログラミング初心者向けの体験授業として、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();
⑤キーボードの設定
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