遊びながら学ぶ:スイカ割りゲームを作ろう

遊びながら学ぶ:スイカ割りゲームを作ろう

Pythonの基本的な制御構文であるwhile文やif文を使って、
簡単なスイカ割りゲームを作ってみましょう。ゲームを作ることで、
「どのように繰り返し処理を行うのか」「条件分岐をどう使うのか」を
実践的に学ぶことができます。初心者の方でも理解しやすいように、
一つひとつのステップを丁寧に解説します。

ゲームの概要

今回作るスイカ割りゲームは、プレイヤーが目隠しをしてスイカを割る感覚を
コンピューター上で体験するシンプルなものです。実際には、以下のような流れで進行します。

  1. コンピューター側で「スイカの位置」をランダムに決める。
  2. プレイヤーは「前」「後ろ」「右」「左」などのコマンドを入力しながら、スイカに近づく。
  3. スイカのある位置まで移動したら勝利とする。
  4. もし特定のターン内に辿り着けなければゲームオーバー。

このシンプルなロジックによって、while文(繰り返し処理)とif文(条件分岐)が
どのように組み合わされるかを体験できます。応用として、難易度設定やヒントの出し方などを
改良していくことも可能です。

ゲーム作成で学べるポイント

このゲームを作ることで、主に以下のポイントを学習できます。

  • while文の使い方:条件を満たすまで繰り返す仕組みを理解する。
  • if文の使い方:条件分岐を利用して分かれ道を制御する方法を理解する。
  • 変数や演算子の活用:ゲーム進行に必要な座標や残りターン数を管理する。
  • ランダム要素の導入randomモジュールを使ったランダム化の実装。
  • ユーザー入力処理input()関数でプレイヤーからのコマンドを取得する。

それでは実際にコードを書いていきましょう。

ソースコード全体

以下に、ゲーム全体のコード例を示します。while文とif文が
どのように組み合わさっているかを見ながら、読み解いてみてください。


import random

def suika_game():
    print("=== スイカ割りゲームへようこそ! ===")
    print("あなたは目隠しをしています。スイカの位置を推測して移動し、スイカを割りましょう。")
    print("移動コマンド:'w'で前進, 's'で後退, 'd'で右へ移動, 'a'で左へ移動")
    print("ある程度正しい方向へ移動したらスイカを割れるでしょう。頑張ってください!")
    
    # スイカの位置をランダムに設定(2次元平面上)
    watermelon_x = random.randint(-5, 5)
    watermelon_y = random.randint(-5, 5)
    
    # プレイヤーの初期位置
    player_x = 0
    player_y = 0
    
    # ターン数を決める(最大10ターン)
    turn_limit = 10
    current_turn = 1
    
    while current_turn = turn_limit:
        print(f"\n=== ターン {current_turn} / {turn_limit} ===")
        print(f"現在の位置: (x={player_x}, y={player_y})")
        
        move = input("次の移動 (w/s/d/a) を入力してください: ")
        
        if move == "w":
            player_y += 1
        elif move == "s":
            player_y -= 1
        elif move == "d":
            player_x += 1
        elif move == "a":
            player_x -= 1
        else:
            print("無効なコマンドです。'w', 's', 'd', 'a' のいずれかを入力してください。")
            # 無効コマンドの場合はターンを消費せず、同じターンのやり直しとする
            continue
        
        # プレイヤーがスイカの位置に到達したかをチェック
        if player_x == watermelon_x and player_y == watermelon_y:
            print("スイカを割りました!おめでとうございます!")
            break
        
        # ヒントを与える
        # スイカとプレイヤーとの距離によってメッセージを出す
        distance_x = abs(player_x - watermelon_x)
        distance_y = abs(player_y - watermelon_y)
        if distance_x + distance_y  3:
            print("かなり近いです!もう少し!")
        elif distance_x + distance_y  6:
            print("そこそこ近づいています。")
        else:
            print("まだ少し遠いようです。")
        
        current_turn += 1
    
    else:
        # whileの条件を抜けてもbreakされなかった場合の処理
        print("残念!ターン数の上限に達してしまいました。スイカを割れずにゲームオーバー。")

# メイン処理
if __name__ == "__main__":
    suika_game()

コードの解説

上記のコードでは、while current_turn <= turn_limit: の部分で
「プレイヤーが指定ターン数(ここでは最大10ターン)を超えるまでゲームを続ける」処理を行っています。
その中で、if/elifを使い、プレイヤーの入力した移動コマンドに応じて
player_xplayer_y を更新しています。もし想定外のコマンドが入力された場合は
continue を用いて、同じターンを繰り返すようにしています。

ゲーム終了の条件は以下の2つです。

  1. プレイヤーの位置がスイカの位置と一致(player_x == watermelon_x and player_y == watermelon_y
  2. ターン数が上限に達してしまう(current_turn > turn_limit になったとき)

プレイヤーがスイカの位置と一致したときはbreakでループを抜け出し、
「スイカを割った」ことを通知します。それ以外のケースでは、ターンを消費しながら
プレイヤーの移動を繰り返し、最後まで到達できなかったらゲームオーバーという流れになっています。

また、プレイヤーの移動とスイカの位置の距離をdistance_xdistance_y から計算し、
その合計に応じて「まだ遠い」「そこそこ近い」「かなり近い」というメッセージを表示することで、
単純なゲームながらもヒントを与える工夫を加えています。

改良のアイデア

  • 難易度設定:ターン数の上限を変更したり、スイカの移動をランダムで行う。
  • 3次元フィールド:x, yに加えてz座標を追加し、移動の選択肢を増やす。
  • グラフィカル表示:コンソールではなく、Pygameなどを使って視覚的に楽しめるゲームにする。
  • スコア機能:クリアまでのターン数や移動回数をスコア化し、ランキングを作る。

このように、基本的なロジックを一度作ってしまえば、さまざまな拡張が可能です。
自分なりの工夫を加えて、面白いスイカ割りゲームを完成させてみてください。

まとめ

今回はwhile文とif文を使った簡単なスイカ割りゲームの作り方を紹介しました。
このゲームのポイントは、繰り返し処理と条件分岐を上手く組み合わせることで、
ユーザーの行動や状況に応じた動きをプログラムに反映していることです。

Pythonの基礎となる繰り返し処理や条件分岐は、ゲームだけでなくあらゆる分野で活用されます。
今回のサンプルを足がかりに、ぜひ自由なアイデアで改良を加えてみてください。
次はヒントの出し方を工夫したり、ユーザーインターフェイスを改善するなど、
応用範囲は無限に広がっています。ゲーム開発を通じてPythonの楽しさをもっと味わっていただければ幸いです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です