遊びながら学ぶ:スイカ割りゲームを作ろう
Pythonの基本的な制御構文であるwhile
文やif
文を使って、
簡単なスイカ割りゲームを作ってみましょう。ゲームを作ることで、
「どのように繰り返し処理を行うのか」「条件分岐をどう使うのか」を
実践的に学ぶことができます。初心者の方でも理解しやすいように、
一つひとつのステップを丁寧に解説します。
ゲームの概要
今回作るスイカ割りゲームは、プレイヤーが目隠しをしてスイカを割る感覚を
コンピューター上で体験するシンプルなものです。実際には、以下のような流れで進行します。
- コンピューター側で「スイカの位置」をランダムに決める。
- プレイヤーは「前」「後ろ」「右」「左」などのコマンドを入力しながら、スイカに近づく。
- スイカのある位置まで移動したら勝利とする。
- もし特定のターン内に辿り着けなければゲームオーバー。
このシンプルなロジックによって、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_x
や player_y
を更新しています。もし想定外のコマンドが入力された場合は
continue
を用いて、同じターンを繰り返すようにしています。
ゲーム終了の条件は以下の2つです。
- プレイヤーの位置がスイカの位置と一致(
player_x == watermelon_x and player_y == watermelon_y
) - ターン数が上限に達してしまう(
current_turn > turn_limit
になったとき)
プレイヤーがスイカの位置と一致したときはbreak
でループを抜け出し、
「スイカを割った」ことを通知します。それ以外のケースでは、ターンを消費しながら
プレイヤーの移動を繰り返し、最後まで到達できなかったらゲームオーバーという流れになっています。
また、プレイヤーの移動とスイカの位置の距離をdistance_x
と distance_y
から計算し、
その合計に応じて「まだ遠い」「そこそこ近い」「かなり近い」というメッセージを表示することで、
単純なゲームながらもヒントを与える工夫を加えています。
改良のアイデア
- 難易度設定:ターン数の上限を変更したり、スイカの移動をランダムで行う。
- 3次元フィールド:x, yに加えてz座標を追加し、移動の選択肢を増やす。
- グラフィカル表示:コンソールではなく、Pygameなどを使って視覚的に楽しめるゲームにする。
- スコア機能:クリアまでのターン数や移動回数をスコア化し、ランキングを作る。
このように、基本的なロジックを一度作ってしまえば、さまざまな拡張が可能です。
自分なりの工夫を加えて、面白いスイカ割りゲームを完成させてみてください。
まとめ
今回はwhile
文とif
文を使った簡単なスイカ割りゲームの作り方を紹介しました。
このゲームのポイントは、繰り返し処理と条件分岐を上手く組み合わせることで、
ユーザーの行動や状況に応じた動きをプログラムに反映していることです。
Pythonの基礎となる繰り返し処理や条件分岐は、ゲームだけでなくあらゆる分野で活用されます。
今回のサンプルを足がかりに、ぜひ自由なアイデアで改良を加えてみてください。
次はヒントの出し方を工夫したり、ユーザーインターフェイスを改善するなど、
応用範囲は無限に広がっています。ゲーム開発を通じてPythonの楽しさをもっと味わっていただければ幸いです。