今回は、Pythonを使って簡単なテキストベースの迷路ゲームを作る方法をご紹介します。このゲームは初心者の方でも理解しやすく、プログラミングの基本概念を学ぶのに最適です。さらに、完成したゲームで遊ぶことで、論理的思考力も鍛えられます。それでは、さっそく始めましょう!
- 2次元リスト: 迷路の表現方法として、2次元リストの使い方
- 関数: print_maze()やmaze_game()など、機能ごとに関数を分けることの利点を理解できます。
- ループ: whileループを使って、ゲームを継続的に実行する方法
- 条件分岐: if文を使って、様々な状況に対応する方法
- ユーザー入力の処理: input()関数を使って、ユーザーからの入力を受け取り、処理する方法
- 座標系: (x, y)座標を使って、プレイヤーの位置を管理する方法
- 文字列操作: lower()メソッドを使って、入力を小文字に変換する方法
Pythonの学習をより深めたい方へ:「【2024年最新版】Python講座で学べるプログラミングスクール10選を徹底比較」では、Python講座を提供する優秀スクールの比較と選び方をご紹介しています。自分に合ったスクールを見つけたい方は、ぜひチェックしてください。
【Python】初心者でも簡単!迷路ゲームテキスト版 ゲームの概要
このゲームは、テキストで表現された迷路をプレイヤーが攻略していくシンプルなものです。プレイヤーは「P」で表され、スタート地点「S」からゴール「E」を目指します。「#」は壁を、空白は通路を表しています。
ゲームの全体イメージ画像
【Python】初心者でも簡単!迷路ゲームテキスト版 コードの解説
全体のコードは複雑に見えますが、1つひとつ解説します。
まずはコピペでゲームを遊んでみましょう
まずは、ゲームのコード全体を見てみましょう。その後、各部分の詳細な説明に移ります。
maze = [
["S", "#", "#", "#", "#"],
[" ", " ", " ", "#", "#"],
["#", "#", " ", " ", " "],
["#", "#", "#", "#", " "],
["#", "#", "#", "#", "E"]
]
def print_maze(maze, player_pos):
for i, row in enumerate(maze):
for j, cell in enumerate(row):
if (i, j) == player_pos:
print("P", end=" ")
else:
print(cell, end=" ")
print()
def maze_game():
player_pos = (0, 0)
print("迷路ゲームを始めます! 'S'がスタート、'E'がゴールです。")
print("移動コマンド: w(上), s(下), a(左), d(右), q(終了)")
while True:
print_maze(maze, player_pos)
move = input("移動方向を入力してください: ").lower()
if move == 'q':
print("ゲームを終了します。")
break
new_pos = player_pos
if move == 'w' and player_pos[0] > 0:
new_pos = (player_pos[0] - 1, player_pos[1])
elif move == 's' and player_pos[0] < len(maze) - 1:
new_pos = (player_pos[0] + 1, player_pos[1])
elif move == 'a' and player_pos[1] > 0:
new_pos = (player_pos[0], player_pos[1] - 1)
elif move == 'd' and player_pos[1] < len(maze[0]) - 1:
new_pos = (player_pos[0], player_pos[1] + 1)
if maze[new_pos[0]][new_pos[1]] != "#":
player_pos = new_pos
if maze[player_pos[0]][player_pos[1]] == "E":
print("ゴールに到達しました!おめでとうございます!")
break
maze_game()
- STEP1ゲームを開始すると、現在の迷路の状態が表示されます。
- STEP2プレイヤー(”P”)を操作して、スタート(”S”)からゴール(”E”)を目指します。
- STEP3移動コマンドを入力して、プレイヤーを動かします。
- ・”w”: 上に移動
- ・”s”: 下に移動
- ・”a”: 左に移動
- ・”d”: 右に移動
- ・”q”: ゲームを終了
- 壁(”#”)にぶつかると、移動できません。
- ゴール(”E”)に到達すると、ゲームクリアです!
- いつでも “q” を入力してゲームを終了できます。
では、このコードを部分ごとに詳しく見ていきましょう。
1.迷路の定義
maze = [
["S", "#", "#", "#", "#"],
[" ", " ", " ", "#", "#"],
["#", "#", " ", " ", " "],
["#", "#", "#", "#", " "],
["#", "#", "#", "#", "E"]
]
この部分では、迷路の構造を2次元リストで定義しています。各文字の意味は以下の通りです。
- “S”: スタート地点
- “E”: ゴール地点
- “#”: 壁
- ” “: 通路
2次元リストを使うことで、簡単に迷路の形を表現できます。
2.迷路の表示関数
def print_maze(maze, player_pos):
for i, row in enumerate(maze):
for j, cell in enumerate(row):
if (i, j) == player_pos:
print("P", end=" ")
else:
print(cell, end=" ")
print()
この関数は、現在の迷路の状態とプレイヤーの位置を表示します。
- enumerate()関数を使って、各行と列のインデックスを取得します。
- プレイヤーの位置と一致する場合は “P” を表示し、それ以外はセルの内容をそのまま表示します。
- end=” “を使って、各セルの間にスペースを入れています。
- 各行の終わりでprint()を呼び出し、次の行に移動します。
3.メインゲーム関数
maze_game() 関数は、ゲームの主要な部分を担っています。この関数を小さな部分に分けて、詳しく見ていきましょう。
def maze_game():
# 1. ゲームの初期化
player_pos = (0, 0)
print("迷路ゲームを始めます! 'S'がスタート、'E'がゴールです。")
print("移動コマンド: w(上), s(下), a(左), d(右), q(終了)")
# 2. メインゲームループ
while True:
# 3. 迷路の表示
print_maze(maze, player_pos)
# 4. プレイヤーの入力受付
move = input("移動方向を入力してください: ").lower()
# 5. ゲーム終了の確認
if move == 'q':
print("ゲームを終了します。")
break
# 6. 新しい位置の計算
new_pos = player_pos
if move == 'w' and player_pos[0] > 0:
new_pos = (player_pos[0] - 1, player_pos[1])
elif move == 's' and player_pos[0] < len(maze) - 1:
new_pos = (player_pos[0] + 1, player_pos[1])
elif move == 'a' and player_pos[1] > 0:
new_pos = (player_pos[0], player_pos[1] - 1)
elif move == 'd' and player_pos[1] < len(maze[0]) - 1:
new_pos = (player_pos[0], player_pos[1] + 1)
# 7. プレイヤーの移動
if maze[new_pos[0]][new_pos[1]] != "#":
player_pos = new_pos
# 8. ゴール到達の確認
if maze[player_pos[0]][player_pos[1]] == "E":
print("ゴールに到達しました!おめでとうございます!")
break
# 9. ゲームの実行
maze_game()
それでは、各部分について詳しく説明していきます。
関数は細かく分けて解説していますのでゆっくりと見ていきましょう
3-1. ゲームの初期化
player_pos = (0, 0)
print("迷路ゲームを始めます! 'S'がスタート、'E'がゴールです。")
print("移動コマンド: w(上), s(下), a(左), d(右), q(終了)")
- プレイヤーの初期位置を設定します。
(0, 0)
は迷路の左上隅を示します。 - ゲームの説明文を表示し、プレイヤーに移動コマンドを教えます。
3-2. メインゲームループ
while True:
# ゲームのメインロジック
- while Trueは無限ループを作ります。これにより、プレイヤーが終了するまでゲームが続きます。
3-3. 迷路の表示
print_maze(maze, player_pos)
- 各ターンの開始時に、現在の迷路の状態を表示します。
- print_maze()関数を呼び出し、迷路とプレイヤーの位置を渡します。
3-4. プレイヤーの入力受付
move = input("移動方向を入力してください: ").lower()
- プレイヤーからの入力を受け付けます。
- lower()メソッドを使って、入力を小文字に変換します。これにより、大文字で入力されても正しく処理できます。
3-5. ゲーム終了の確認
if move == 'q':
print("ゲームを終了します。")
break
- プレイヤーが ‘q’ を入力した場合、ゲームを終了します。
- break文でwhileループを抜け出し、ゲームを終了します。
3-6. 新しい位置の計算
この部分は、プレイヤーの入力に基づいて新しい位置を計算する重要な処理です。まず、コード全体を見てみましょう。
new_pos = player_pos
if move == 'w' and player_pos[0] > 0:
new_pos = (player_pos[0] - 1, player_pos[1])
elif move == 's' and player_pos[0] < len(maze) - 1:
new_pos = (player_pos[0] + 1, player_pos[1])
elif move == 'a' and player_pos[1] > 0:
new_pos = (player_pos[0], player_pos[1] - 1)
elif move == 'd' and player_pos[1] < len(maze[0]) - 1:
new_pos = (player_pos[0], player_pos[1] + 1)
では、この処理を詳しく解説していきます。
プレイヤーの位置を計算する場所です。
ここはさらに細かく分けて解説しています。
座標系の扱い方や境界条件のチェック方法を見ていきましょう
1.座標系の理解:
- プレイヤーの位置 player_posは
(行, 列)
の形式でリストの中に保存されています。 - player_pos[0]は行(縦方向)を、player_pos[1]は列(横方向)を表します。
- 迷路の左上が (0. 0)で、右に行くほど列の値が大きくなり、下に行くほど行の値が大きくなります。
2.初期設定:
new_pos = player_pos
- まず、新しい位置 new_posを現在の位置 player_posと同じに設定します。
- これは、移動が無効な場合(例:壁にぶつかる)にプレイヤーが元の位置にとどまるようにするためです。
3.上方向への移動 (‘w’):
if move == 'w' and player_pos[0] > 0:
new_pos = (player_pos[0] - 1, player_pos[1])
- ‘w’ が入力され、かつ現在の行が0より大きい(つまり、最上行でない)場合に実行されます。
- 行の値を1減らします(上に移動するため)。列の値は変わりません。
- player_pos[0] > 0のチェックにより、迷路の上端を超えないようにしています。
4.下方向への移動 (‘s’):
elif move == 's' and player_pos[0] < len(maze) - 1:
new_pos = (player_pos[0] + 1, player_pos[1])
- ‘s’ が入力され、かつ現在の行が迷路の最下行でない場合に実行されます。
- 行の値を1増やします(下に移動するため)。列の値は変わりません。
- player_pos[0] < len(maze) – 1のチェックにより、迷路の下端を超えないようにしています。
5.左方向への移動 (‘a’):
elif move == 'a' and player_pos[1] > 0:
new_pos = (player_pos[0], player_pos[1] - 1)
- ‘a’ が入力され、かつ現在の列が0より大きい(つまり、最左列でない)場合に実行されます。
- 列の値を1減らします(左に移動するため)。行の値は変わりません。
- player_pos[1] > 0のチェックにより、迷路の左端を超えないようにしています。
6.右方向への移動 (‘d’):
elif move == 'd' and player_pos[1] < len(maze[0]) - 1:
new_pos = (player_pos[0], player_pos[1] + 1)
- ‘d’ が入力され、かつ現在の列が迷路の最右列でない場合に実行されます。
- 列の値を1増やします(右に移動するため)。行の値は変わりません。
- player_pos[1] < len(maze[0]) – 1のチェックにより、迷路の右端を超えないようにしています。
この処理によって、以下のことが保証されます。
- プレイヤーは迷路の枠内でのみ移動できます。
- 無効な移動(迷路の外に出ようとする)は無視され、プレイヤーは元の位置にとどまります。
- 各方向キー(w, s, a, d)に対して適切な移動が行われます。
この部分は、2次元配列(リストのリスト)の操作と条件分岐を組み合わせた良い例となっています。プログラミング初心者の方にとっては、座標系の扱い方や境界条件のチェック方法を学ぶ良い機会となるでしょう。
3-7. プレイヤーの移動
if maze[new_pos[0]][new_pos[1]] != "#":
player_pos = new_pos
- 新しい位置が壁(”#”)でない場合のみ、プレイヤーの位置を更新します。
- これにより、プレイヤーが壁を通り抜けることを防ぎます。
3-8. ゴール到達の確認
if maze[player_pos[0]][player_pos[1]] == "E":
print("ゴールに到達しました!おめでとうございます!")
break
- プレイヤーの現在位置がゴール(”E”)かどうかを確認します。
- ゴールに到達した場合、おめでとうメッセージを表示してゲームを終了します。
3-9. ゲームの実行
maze_game()
- 最後に、maze_game()関数を呼び出してゲームを開始します。
この詳細な解説により、初心者の方々もゲームの仕組みをより深く理解できるでしょう。各部分が何を行っているのか、そしてそれがゲーム全体にどのように貢献しているのかが明確になります。
【Python】初心者でも簡単!迷路ゲームテキスト版 発展させるアイデア
このゲームをベースに、さらに機能を追加して発展させることもできます。以下にいくつかのアイデアを紹介します。
- ランダムな迷路生成機能を追加する
- 複数のレベルや難易度を実装する
- タイマーやスコアシステムを導入する
- グラフィカルなインターフェースを追加する(PyGame等を使用)
- 迷路エディタ機能を追加し、プレイヤーが自分で迷路を作れるようにする
これらの機能を追加することで、プログラミングスキルをさらに向上させることができます。
今回、迷路ゲームを作ってきてインターフェースなどをもっと面白い機能を作ってみたいときはプログラミングスクールで学ぶのもよい選択肢でしょう。こちらの記事ではPythonの講座を集めたスクールを紹介しています「【2024年最新版】Python講座で学べるプログラミングスクール10選を徹底比較」のでPython講座を提供する優秀スクールの比較と選び方の参考にしてください。自分に合ったスクールを見つけたい方は、ぜひチェックしてください。
【Python】初心者でも簡単!迷路ゲームテキスト版のコード解説 | コピペで気軽にチャレンジ! まとめ
このシンプルな迷路ゲームを通じて、以下のような重要なプログラミングの概念を学ぶことができます。
さらに、このゲームを通じて論理的思考力も鍛えられます。迷路を解くためには、先を見通す力や問題解決能力が必要となります。
- 2次元リスト
- 関数
- ループ
- 条件分岐
- ユーザー入力の処理
- 座標系
- 文字列操作
この記事では、Pythonを使って簡単なテキストベースの迷路ゲームを作成する方法を学びました。初心者の方でも理解しやすいコードを通じて、プログラミングの基本概念を学ぶことができます。
このゲームを作成し、プレイすることで、プログラミングスキルだけでなく、論理的思考力も養うことができます。ぜひ、まずはこのコードをコピーして実行してみてください。そして、自分なりにアレンジを加えて、オリジナルの迷路ゲームを作ってみましょう!
お疲れ様でした!
このゲームを発展させるのもよい学習になりますね。
楽しんで挑戦してみてくださいね!