Pythonを使ってハングマンゲームを作成する方法

自分で書いたゲームで遊びたい気分ですか?その場合、あなたは正しい場所にいます。ハングマンは人気の単語当てゲームで、あなたは最小限の労力で自分のバージョンを作成することができます。

このゲームは、ホイール・オブ・フォーチュン、レターボックス、パーティタイムなどのテレビ番組やシリーズでよく知られており、完璧なエンターテイナーです。そしてPythonは、ハングマンのクローンを作成するために使用するのに便利な言語です。

ハングマンゲームの遊び方

ハングマンは、1人のプレイヤーが単語を考え、もう1人のプレイヤーが推測の回数を決めて文字を提案することで単語を推測しようとする有名なゲームです。1人のプレイヤー(この場合はプログラム)が、単語の各文字を表す一連のダッシュと、開始点としての文字を表示します。もう1人のプレイヤー(またはユーザー)は、単語に含まれる文字を1つずつ推測します。

推測した文字がターゲットの単語に含まれている場合、プログラムはダッシュをその文字で埋めます。そうでない場合、プレイヤーは1回のチャンスを失い、プログラムは棒人間の要素を棒として描きます。合計7回のチャンスで、ユーザーが単語を正しく推測するとゲームに勝ちます。そうでない場合、プログラムは棒人間の描画を完了します。

お気に入りの単語のリストを作成したり、Mieliestronkの58,000語以上の英語の単語のリストのようなものをダウンロードすることができます。また、Pythonでインタラクティブなクイズゲームやテキストベースのアドベンチャーゲームなど、他の楽しいテキストベースのゲームを探求して作成することもできます。

ハングマンゲームの構築方法

このハングマンゲームのソースコードは、単語リストファイルとともに、このGitHubリポジトリにあり、自由に使用することができます。

randomモジュールをインポートし、get_random_word_from_wordlist()という関数を定義して、ファイルからランダムな単語を選択します。テキストファイルには、一般的な名詞、場所、動物、映画などの名前が含まれている場合があります。角括弧[]を使用してリストを定義します。

withステートメントを使用してファイルをオープンし、モードを'r'として渡して読み取り専用モードを示します。これにより、エラーが発生した場合でも、ブロックの最後にファイルが自動的に閉じられます。hangman_wordlist.txtファイルを見ると、すべての行に1つの単語があることがわかります。つまり、ファイルは改行文字で各単語を区切ります。

改行のエスケープ文字(\n)をsplit()関数に渡して、以前に定義したリストに各単語を格納します。random.choice()を使用してリストからランダムな単語を返します。

import random
def get_random_word_from_wordlist():
wordlist = []
with open("hangman_wordlist.txt", 'r') as file:
wordlist = file.read().split("\n")
word = random.choice(wordlist)
return word

次に、ランダムに選択された単語をパラメータとして受け取るget_some_letters()という関数を定義します。この関数は、ユーザーに空白のダッシュ(_)と一部の文字のシーケンスを表示します。

単語に含まれるすべての文字を格納するための空のリストlettersを定義します。temp変数を使用して、単語の長さに等しい数の空白のダッシュを含む文字列を格納します。list()を使用して文字列を文字のリストに変換し、その文字を反復処理します。まだ存在しない場合は、append()を使用してリストに文字を追加します。

random.choice()を使用して、空白のダッシュと一緒にユーザーに表示するランダムな文字を選択します。enumerateを使用して単語の文字を反復処理し、各文字のインデックスを追跡します。

ランダムに選択された文字が見つかったら、空白のダッシュをその文字で置き換えます。join()を使用して文字のリストを完全な文字列に統一し、それを返します。

def get_some_letters(word):
letters = []
temp = '_' * len(word)
for char in list(word):
if char not in letters:
letters.append(char)
character = random.choice(letters)
for num, char in enumerate(list(word)):
if char == character:
templist = list(temp)
templist[num] = char
temp = ''.join(templist)
return temp

パラメータとしてチャンスの数を取得するdraw_hangman()という関数を定義します。この関数は、吊るされた男の姿を提供します。チャンスの数が減り続けるにつれて、生き残るチャンスも減ります。使い果たされると、図が完成し、ゲームが終了します。

def draw_hangman(chances):
if chances == 6:
print("________ ")
print("| | ")
print("| ")
print("| ")
print("| ")
print("| ")
elif chances == 5:
print("________ ")
print("| | ")
print("| 0 ")
print("| ")
print("| ")
print("| ")
elif chances == 4:
print("________ ")
print("| | ")
print("| 0 ")
print("| / ")
print("| ")
print("| ")
elif chances == 3:
print("________ ")
print("| | ")
print("| 0 ")
print("| /| ")
print("| ")
print("| ")
elif chances == 2:
print("________ ")
print("| | ")
print("| 0 ")
print("| /|\ ")
print("| ")
print("| ")
elif chances == 1:
print("________ ")
print("| | ")
print("| 0 ")
print("| /|\ ")
print("| / ")
print("| ")
elif chances == 0:
print("________ ")
print("| | ")
print("| 0 ")
print("| /|\ ")
print("| / \ ")
print("| ")

プログラムのメインロジックを定義するstart_hangman_game()という関数を宣言します。get_random_word_from_wordlist()関数を呼び出してランダムな単語を取得し、get_some_letters()関数を用いてユーザーに表示するシーケンスを取得します。

チャンスの数を7に設定し、foundという変数をfalseで初期化します。推測された文字が単語に含まれている場合、これはtrueに設定されます。

def start_hangman_game():
word = get_random_word_from_wordlist()
temp = get_some_letters(word)
chances = 7
found = False

ユーザーが単語を正しく推測するか、チャンスを使い果たしたら終了するループを宣言します。シーケンス、単語の文字数、残りのチャンスを表示してゲームを開始します。ユーザーに文字を推測してもらい、input()関数を使って受け取ります。文字の長さとアルファベットであるかどうかをチェックして、ユーザー入力を検証します。

while True:
if chances == 0:
print(f"Sorry! You Lost, the word was: {word}")
print("Better luck next time")
break
print("=== Guess the word ===")
print(temp, end='')
print(f"\t(word has {len(word)} letters)")
print(f"Chances left: {chances}")
character = input("Enter the character you think the word may have: ")
if len(character) > 1 or not character.isalpha():
print("Please enter a single alphabet only")
continue

入力が有効な場合、その文字が単語に含まれているかどうかを確認し、前に見たプロセスを使って置き換え、foundの値を更新します。文字が含まれていない場合は、チャンスの数を減らします。含まれている場合は、foundの値を初期値のfalseに戻します。

空白のダッシュが残っていない場合は、ユーザーが勝ったことを推測回数とともに表示します。それ以外の場合は、残りのチャンスの数に応じて首吊り男のグラフィックを表示します。

else:
for num, char in enumerate(list(word)):
if char == character:
templist = list(temp)
templist[num] = char
temp = ''.join(templist)
found = True
if found:
found = False
else:
chances -= 1
if '_' not in temp:
print(f"\nYou Won! The word was: {word}")
print(f"You got it in {7 - chances} guess")
break
else:
draw_hangman(chances)
print()

ハングマンゲームをプレイするための関数を定義します。ユーザーがyesと入力したらstart_hangman_game()関数を呼び出し、それ以外の場合は適切なメッセージでゲームを終了します。無効な入力がされた場合は、ユーザーに再度入力するよう求めます。

print("===== Welcome to the Hangman Game =====")
while True:
choice = input("Do you wanna play hangman? (yes/no): ")
if 'yes' in choice.lower():
start_hangman_game()
elif 'no' in choice.lower():
print('Quitting the game...')
break
else:
print("Please enter a valid choice.")
print("\n")

ハングマンゲームの出力

ゲームに勝つと、以下の出力が表示されます:

ゲームに負けた場合、以下の出力が表示されます:

Pythonを使ってゲームを作成する

Pythonを使って、コマンドラインゲームとグラフィカルゲームの両方を作成することができます。Pythonを使って作成できる興味深いコマンドラインゲームには、数字当てゲーム、マジック8ボールゲーム、マッドリブ、じゃんけん、テキストアドベンチャーゲームなどがあります。

Pythonを使って作成できる楽しいグラフィカルゲームには、三目並べ、迷路、ヘビ、パックマン、メモリ、ライフなどがあります。これらのゲームの最も良い点は、Pythonの標準ライブラリだけで作成できることです。