Pythonを使って簡単な2D宝探しゲームを作る方法をご紹介します。このゲームは、プログラミング初心者の方でも理解しやすく、さらにPythonの基本的な概念を学ぶのに最適です。
このゲームでは、5×5のグリッド(マス目)の中に隠された宝物を見つけ出すことが目標です。プレイヤーは座標を入力し、その位置が宝物の場所かどうかを確認します。宝物が見つからない場合は、宝物までの距離がヒントとして表示されます。
- 2次元リスト(グリッド)の操作
- 関数の定義と使用
- ランダム値の生成
- ユーザー入力の処理
- 条件分岐
- ループ処理
- 数学的計算
- 文字列フォーマット
- デバッグ技術
Pythonの学習をより深めたい方へ:「【2024年最新版】Python講座で学べるプログラミングスクール10選を徹底比較」では、Python講座を提供する優秀スクールの比較と選び方をご紹介しています。自分に合ったスクールを見つけたい方は、ぜひチェックしてください。
それでは、コードを見ながら詳しく解説していきましょう。
【Python】初心者でも簡単!2D宝探しゲーム プログラムコード全体像
import random
def create_grid(size):
return [[' ' for _ in range(size)] for _ in range(size)]
def place_treasure(grid):
x, y = random.randint(0, len(grid)-1), random.randint(0, len(grid)-1)
grid[y][x] = 'T'
return x, y
def print_grid(grid, show_treasure=False):
for row in grid:
print('|' + '|'.join(cell if cell != 'T' or show_treasure else ' ' for cell in row) + '|')
size = 5
grid = create_grid(size)
treasure_x, treasure_y = place_treasure(grid)
attempts = 0
while True:
print_grid(grid)
x = int(input(f"X座標を入力してください (0-{size-1}): "))
y = int(input(f"Y座標を入力してください (0-{size-1}): "))
attempts += 1
if x == treasure_x and y == treasure_y:
print(f"おめでとうございます!{attempts}回で宝物を見つけました。")
break
else:
distance = abs(x - treasure_x) + abs(y - treasure_y)
print(f"宝物まであと{distance}マスです。")
print_grid(grid, show_treasure=True)
ゲームの遊び方
- STEP1プログラムを実行すると、5×5のグリッドが表示されます。
- STEP2X座標(0-4)を入力し、Enterキーを押します。
- STEP3Y座標(0-4)を入力し、Enterキーを押します。
- STEP4入力した座標が宝物の位置でない場合、宝物までの距離が表示されます。
- STEP52-4の手順を、宝物を見つけるまで繰り返します。
- STEP6宝物を見つけると、何回目の試行で見つけたかが表示され、ゲームが終了します。
ゲーム結果
まずはゲームを楽しんでください!
【Python】初心者でも簡単!2D宝探しゲーム プログラムの詳細解説
それでは、コードを詳しく解説していきましょう。
- 必要なモジュールのインポート
- グリッドの作成
- 宝物の配置
- グリッドの表示
- ゲームの初期設定
- メインゲームループ
1. 必要なモジュールのインポート
import random
- import random:Pythonの標準ライブラリであるrandomモジュールをインポートします。
- このモジュールは、乱数生成や、リストからのランダムな要素の選択などの機能を提供します。
- 今回のゲームでは、宝物の位置をランダムに決定するために使用します。
2. グリッドの作成
def create_grid(size):
return [[' ' for _ in range(size)] for _ in range(size)]
- def create_grid(size):はcreate_gridという名前の関数を定義します。この関数はsizeというパラメータを受け取ります。
- reiturn [[‘‘ for _ in range(size)] for _ in range(size)]:]
- これは二重のリスト内包表記です。
- 外側の[…for _ in range(size)]は、size回繰り返してリストを作成します。これが行を表します。
- 内側の[‘‘ for _ in range(size)]は、各行にsize個の空白文字 ‘ ‘を持つリストを作成します。これが列を表します。
- _はPythonの慣習で、ループ変数を使用しない場合に用います。
- 結果として、size×sizeの2次元リスト(グリッド)が作成されます。各要素は空白文字で初期化されています。
3. 宝物の配置
def place_treasure(grid):
x, y = random.randint(0, len(grid)-1), random.randint(0, len(grid)-1)
grid[y][x] = 'T'
return x, y
- def place_trasure(grid):はplace_treasure という名前の関数を定義します。この関数はgrid(グリッド)を引数として受け取ります。
- x, y = random.randint(0, len(grid)-1), random.randint(0, len(drid)-1):
- random.randint(a, b)は、a以上b以下のランダムな整数を返します。
- len(grid)-1は、グリッドの最大インデックスを表します(0から始まるため、-1しています)。
- この行で xとyの座標をランダムに選択しています。
- grid[y][x] = ‘T’は選択された選択されたランダムな位置に宝物を表す’T’を配置します。
- return x, yは宝物の位置(x, y)を返します。これにより、後でこの位置を参照できます。
4. グリッドの表示
def print_grid(grid, show_treasure=False):
for row in grid:
print('|' + '|'.join(cell if cell != 'T' or show_treasure else ' ' for cell in row) + '|')
- def print_grid(grid, show_treausure=False):はprint_grid関数を定義します。gridとshow_treasure(デフォルトはFalse)を引数として受け取ります。
- for row in grid:はグリッドの各行に対してループを実行します。
- print(‘ | ‘ + …+ ‘ |’)は各行を
|
で囲んで表示します。 - ‘ | ‘.join(…)は各セルの間に
|
を挿入します。 - cell if cell != ‘T’ or show_treasure else ‘‘ for cell in row:
- これは条件付きリスト内包表記です。
- cell != ‘T’ or show_treasureが真の場合、セルの内容をそのまま表示します。
- それ以外の場合(つまり、セルが’T’でshow_treasurがFalseの場合)、空白を表示します。
- これにより、ゲーム中は宝物を隠し、ゲーム終了時に宝物の位置を表示できます。
5. ゲームの初期設定
size = 5
grid = create_grid(size)
treasure_x, treasure_y = place_treasure(grid)
attempts = 0
- size = 5はグリッドのサイズを5×5に設定します。
- grid = create_grid(size):createでcreate_grid関数を呼び出して、5×5のグリッドを作成します。
- treaure_x, treasur_y = place_treaure(grid):_treasure treaure_x, treasur_y = place関数を呼び出して宝物を配置し、その位置をtreasur_xとtreasur_yに保存します。
- attempts = 0:プレイヤーの試行回数を記録する変数を初期化します。
6. メインゲームループ
while True:
print_grid(grid)
x = int(input(f"X座標を入力してください (0-{size-1}): "))
y = int(input(f"Y座標を入力してください (0-{size-1}): "))
attempts += 1
if x == treasure_x and y == treasure_y:
print(f"おめでとうございます!{attempts}回で宝物を見つけました。")
break
else:
distance = abs(x - treasure_x) + abs(y - treasure_y)
print(f"宝物まであと{distance}マスです。")
print_grid(grid, show_treasure=True)
- while True:無限ループを開始します。これは、宝物が見つかるまでゲームを続けるためです。
- print_grid(grid):現在のグリッドの状態を表示します。
- x = int(input(f”X座標を入力してください (0-{size-1}): “))
- プレイヤーにX座標の入力を求めます。
- input()関数は文字列を返すので、int()を使って整数に変換します。
- f文字列を使用して、有効な座標範囲を動的に表示します。
- y = int(input(f”Y座標を入力してください (0-{size-1}): “)):\
- Y座標についても同様です。
- attempts += 1:試行回数を1増やします。
- if x == treasure_x and y == treasure_y: :プレイヤーが宝物の位置を当てたかチェックします。
- 当たった場合、成功メッセージを表示し、breakでループを抜けます。
- else: 宝物が見つからなかった場合の処理です。
- distance = abs(x – treasure_x) + abs(y – treasure_y):
- abs()関数は絶対値を返します。
- この計算はマンハッタン距離と呼ばれ、グリッド上の2点間の距離を表します。
- 計算された距離をヒントとして表示します。
- ループが終了したら、print_grid(grid, show_treasure=True)で宝物の位置を表示します。
- random.randint()を使用して、予測不可能な要素をゲームに追加しています。
- これは、ゲームの再現性を低くし、毎回新鮮な体験を提供するのに役立ちます。
一見、複雑そうに感じますが、
何がどの動きに使われているかを確認しながら作ってみましょう。
【Python】初心者でも簡単!2D宝探しゲーム 発展的な課題
このゲームを基礎として、以下のような機能を追加してみるのも面白いでしょう。
- グリッドのサイズをプレイヤーが選択できるようにする
- 複数の宝物を配置する
- 移動回数の制限を設ける
- グラフィカルユーザーインターフェース(GUI)を追加する
- 難易度レベルを追加する(例:Easy, Normal, Hard)
今回、ゲームを作ってきてさらに難易度設定、Tkinterの使用方法など、ゲームにもっと面白い機能を作ってみたいときはプログラミングスクールで学ぶのもよい選択肢です。こちらの記事ではPythonの講座を集めたスクールを紹介しています「【2024年最新版】Python講座で学べるプログラミングスクール10選を徹底比較」のでPython講座を提供する優秀スクールの比較と選び方の参考にしてください。自分に合ったスクールを見つけたい方は、ぜひチェックしてください。
【Python】初心者でも簡単!2D宝探しゲーム | コピペで気軽にチャレンジ!まとめ
- 2次元リスト(グリッド)の操作: このゲームでは、2次元リストを使用してグリッドを表現しています。これにより、2次元データ構造の扱い方を学ぶことができます。
- 関数の定義と使用: create_grid(), place_treasure(), print_grid()などの関数を定義し、使用しています。これにより、コードの再利用性と可読性が向上します。
- ランダム値の生成: rondomモジュールを使用して、宝物の位置をランダムに決定しています。これは、ゲームやシミュレーションでよく使用される技術です。
- ユーザー入力の処理: input()関数を使用して、プレイヤーからの入力を受け取り、処理しています。
- 条件分岐: if文を使用して、プレイヤーの入力が正解かどうかを判断しています。
- ループ処理: whileループを使用して、ゲームの進行を制御しています。
- 数学的計算: マンハッタン距離(abs(x – treasure_x) + abs(y – treasure_y))を計算して、宝物までの距離を求めています。
- 文字列フォーマット: f文字列を使用して、動的に文字列を生成しています。
- デバッグ技術: print_grid()関数のshow_treasureパラメータを使用することで、開発中にデバッグしやすくなっています。
この2D宝探しゲームは、Pythonの基本的な概念を学ぶのに最適なプロジェクトです。グリッドの操作、ランダム値の生成、ユーザー入力の処理など、プログラミングの重要な要素を含んでいます。
このゲームを通じて、プログラミングの楽しさを体験しながら、実用的なスキルを磨くことができます。コードをコピー&ペーストして実行するだけでなく、自分なりにアレンジを加えてみることをお勧めします。例えば、グリッドのサイズを変更したり、複数の宝物を配置したり、グラフィカルインターフェースを追加したりすることで、さらに面白いゲームに発展させることができるでしょう。
この小さなプロジェクトを足掛かりに、より複雑で面白いプログラムの開発に挑戦してみてください。楽しみながら学ぶことが、プログラミング上達の近道です。