Pythonでハングマンと言う推理ゲームを作る方法を1から解説する

スポンサーリンク

この記事では、Python言語で独自のハングマンゲームを作成する手順を学びます。

スポンサーリンク

ハングマンについて

ハングマンは、隠された単語を探し出すことが目的の推理ゲームです。

不正解の場合、プレイヤーに残されたチャンスは減少します。

残されたチャンスは、吊るされた男の形で表現されます。

そして、すべてのヒーローの仕事は、命を救うことです。

Pythonで作るハングマンゲームのデモプレイ

Pythonでハングマンゲーム – デモのゲームプレイ

デザインハングマン

ゲームロジックを作成するセクションに進む前に、まず、どのようなプレイヤーに対してゲームがどのように見えるかを把握する必要があります。

このゲームには、2つの特別なデザイン要素があります。

  • ハングマン(吊るし人) – 吊るし人という文脈で、プレイヤーに視覚的な補助を提供する必要があります。
  • 単語の表示 – ゲーム開始時に、単語を文字ではなく空白で表示する必要があります。

ハングマンデザイン

ご存知のように、不正解の後には、吊るされた男の体の新しいパーツが表示される。

これを実現するために、体のパーツをリストに格納します。

# Stores the hangman's body values
hangman_values = ['O','/','|','','|','/','']
 
# Stores the hangman's body values to be shown to the player
show_hangman_values = [' ', ' ', ' ', ' ', ' ', ' ', ' ']

このハングマンの値を処理する関数を以下に示す。

# Functuion to print the hangman
def print_hangman(values):
    print()
    print(" +--------+")
    print(" |       | |")
    print(" {}       | |".format(values[0]))
    print(" {}{}{}      | |".format(values[1], values[2], values[3]))
    print(" {}       | |".format(values[4]))
    print(" {} {}      | |".format(values[5],values[6]))
    print("          | |")
    print("  _______________|_|___")
    print("  `````````````````````")
    print()

下の動画は、ゲームで可能なすべてのハングマンの状態を表示している。

間違うたびに体のパーツが追加され、体が完成すると負けとなる。

すべてのハングマン状態ビデオに表示されている最後の状態は、プレイヤーが完全な単語を推測した後、絞首台から脱出するハングマンを表しています。

# Function to print the hangman after winning
def print_hangman_win():
    print()
    print(" +--------+")
    print("          | |")
 
    print("          | |")
    print(" O       | |")
    print(" /|      | |")
    print(" |       | |")
    print("  ______/_______|_|___")
    print("  `````````````````````")
    print()

上記の関数 'print_hangman_win()' は、プレイヤーが勝ったときに脱出したハングマンを表示する処理を行います。

ワード表示

ゲーム開始時には、空白だけが表示されていなければならない。

各プレイヤーが入力した後、表示する必要があるものを操作する必要がある。

# Stores the letters to be displayed
word_display = []

初期状態では、リスト 'word_display' には、隠された単語の各アルファベットに対応するアンダースコアが含まれている。

このリストを表示するために、以下の関数が使われる。

# Function to print the word to be guessed
def print_word(values):
    print()
    print(" ", end="")
    for x in values:
        print(x, end="")
    print()

Data-set for words

この部分では、想像力を自由に働かせることができます。

.csvファイルからインポートしたり、データベースから抽出したりと、単語のリストにアクセスする方法はいろいろあります。

このチュートリアルをシンプルにするために、いくつかのカテゴリーと単語をハードコーディングすることにします。

# Types of categories
topics = {1: "DC characters", 2:"Marvel characters", 3:"Anime characters"}
 
# Words in each category
dataset = {"DC characters":["SUPERMAN", "JOKER", "HARLEY QUINN", "GREEN LANTERN", "FLASH", "WONDER WOMAN", "AQUAMAN", "MARTIAN MANHUNTER", "BATMAN"],
             "Marvel characters":["CAPTAIN AMERICA", "IRON MAN", "THANOS", "HAWKEYE", "BLACK PANTHER", "BLACK WIDOW"],
             "Anime characters":["MONKEY D. LUFFY", "RORONOA ZORO", "LIGHT YAGAMI", "MIDORIYA IZUKU"]
             }

ここで使用されるデータ構造を理解しましょう。

  • トピック’`- このPythonの辞書は、各カテゴリに数値を提供します。これはさらに、カテゴリベースのメニューを実装するために使用される。
  • 'dataset' – このPython辞書には、各カテゴリに含まれる単語のリストが含まれています。プレイヤーがカテゴリを選択した後、ここから単語を選ぶことになっています。

ゲームループ

プレイヤーの一連の動きに依存するゲームには、必ずゲームループが必要です。

このループは、プレイヤーの入力を管理したり、ゲームデザインを表示したり、ゲームロジックの他の重要な部分を担当します。

# The GAME LOOP
while True:

このゲームループの中では、次のようなことを行います。

ゲームメニュー

ゲームメニューは、プレイヤーにゲームコントロールの概念を提供する役割を担っている。

プレイヤーは、自分の興味に基づいてカテゴリーを決定します。

# Printing the game menu
print()
print("-----------------------------------------")
print(" GAME MENU")
print("-----------------------------------------")
for key in topics:
    print("Press", key, "to select", topics[key])
print("Press", len(topics)+1, "to quit")   
print()

ゲームメニューを作成する際には、ゲームを終了するオプションを常に提供することが望ましい。

プレイヤーのカテゴリー選択を処理する

ゲーム開発者は、その技量にかかわらず、常にプレイヤーの入力を細心の注意を払って扱わなければなりません。

プレイヤーの誤入力でゲームがクラッシュするようなことがあってはならない。

# Handling the player category choice
try:
    choice = int(input("Enter your choice = "))
except ValueError:
    clear()
    print("Wrong choice!!! Try again")
    continue
 
# Sanity checks for input
if choice > len(topics)+1:
    clear()
    print("No such topic!!! Try again.")
    continue   
 
# The EXIT choice  
elif choice == len(topics)+1:
    print()
    print("Thank you for playing!")
    break

いくつかのサニティチェックを行った後、ゲームプレイのための単語を選ぶ準備ができました。

Note: 'clear()' 関数は端末をクリアする役割を担っています。

これは、Pythonの組み込みライブラリ 'os' を利用しています。

ゲームプレイワードを選ぶ

Python内蔵のライブラリ 'random' を使って、特定のカテゴリリストからランダムに単語を選びます。

# The topic chosen
chosen_topic = topics[choice]
 
# The word randomly selected
ran = random.choice(dataset[chosen_topic])
 
# The overall game function
hangman_game(ran)

単語を選んだら、ゲームロジックのセクションに入ります。

ハングマンのゲームロジック

関数 'hangman()' はゲーム全体の機能を含んでいます。

これには、間違った推測を保存したり、残りのチャンス数を減らしたり、ハングマンの特定の状態を表示したりすることが含まれます。

# Function for each hangman game
def hangman_game(word):
 
    clear()
 
    # Stores the letters to be displayed
    word_display = []
 
    # Stores the correct letters in the word
    correct_letters = []
 
    # Stores the incorrect guesses made by the player
    incorrect = []
 
    # Number of chances (incorrect guesses)
    chances = 0
 
    # Stores the hangman's body values
    hangman_values = ['O','/','|','','|','/','']
 
    # Stores the hangman's body values to be shown to the player
    show_hangman_values = [' ', ' ', ' ', ' ', ' ', ' ', ' ']

上記のコードには、ハングマンゲームを円滑に機能させるために必要な、すべての基本的なデータ構造と変数が含まれています。

必要なコンポーネントを初期化する

ゲームを作る上で最も重要なことの1つは、ゲームコンポーネントの初期状態です。

# Loop for creating the display word
for char in word:
    if char.isalpha():
        word_display.append('_')
        correct_letters.append(char.upper())
    else:
        word_display.append(char)

単語の表示構造は、このゲームでは1つ1つ異なるので、初期化する必要があります。

便宜上、正しい文字を格納するコンテナを、同じループの中で初期化します。

注:このバージョンのハングマンゲームは、アルファベットの推測のみをサポートしています。

もし読者が数字や特殊文字のような他の要素を推測する機能を追加したい場合は、ここで変更を加える必要があります。

インナーゲームループ

このインナーゲームループは、ハングマンゲームのシングルゲームプレイのフローを制御する役割を担っている。

適切な表示、キャラクター入力の処理、必要なデータ構造の更新など、ゲームの重要な側面が含まれる。

# Inner Game Loop          
while True:
 
    # Printing necessary values
    print_hangman(show_hangman_values)
    print_word(word_display)           
    print()
    print("Incorrect characters : ", incorrect)
    print()

対戦相手の手の入力

このパートでは、プレーヤーとゲームとのやりとりを扱います。

入力は、ゲームロジックに実装する前に、いくつかのシナリオについてチェックする必要があります。

  • 有効な長さ – 1文字を受け入れるので、プレイヤーがいたずらで複数の文字を入力した場合に備えて、チェックする必要があります。
  • アルファベットは?- 先に述べたように、このバージョンのハングマンゲームはアルファベットの推測のみをサポートしています。
  • すでに試されたアルファベット – 配慮深いプログラマーである我々は、プレイヤーが間違った、すでに試されたアルファベットを入力した場合に通知しなければならない。
# Accepting player input
inp = input("Enter a character = ")
if len(inp) != 1:
    clear()
    print("Wrong choice!! Try Again")
    continue
 
# Checking whether it is a alphabet
if not inp[0].isalpha():
    clear()
    print("Wrong choice!! Try Again")
    continue
 
# Checking if it already tried before  
if inp.upper() in incorrect:
    clear()
    print("Already tried!!")
    continue   

プレイヤーの動きを管理する

プレイヤーの動きを管理している間に、2つの状況だけに出くわすことは明らかです。

  • 不正確なアルファベット – 不正確な移動に対して、我々は不正確な文字のリストとハングマン表示を更新する(ボディパーツを追加する)。
# Incorrect character input
if inp.upper() not in correct_letters:
     
    # Adding in the incorrect list
    incorrect.append(inp.upper())
     
    # Updating the hangman display
    show_hangman_values[chances] = hangman_values[chances]
    chances = chances + 1
     
    # Checking if the player lost
    if chances == len(hangman_values):
        print()
        clear()
        print(" GAME OVER!!!")
        print_hangman(hangman_values)
        print("The word is :", word.upper())
        break
  • 正しいアルファベット – 有能なプレイヤーが正しいアルファベットを入力した場合、我々は単語表示を更新します。
# Correct character input
else:
 
    # Updating the word display
    for i in range(len(word)):
        if word[i].upper() == inp.upper():
            word_display[i] = inp.upper()
 
    # Checking if the player won       
    if check_win(word_display):
        clear()
        print(" Congratulations! ")
        print_hangman_win()
        print("The word is :", word.upper())
        break

正しいアルファベットが入力されるたびに勝敗を確認することは、ゲーム開発者の最善の利益となる。

これは厳密なルールではないので、読者は自分なりの終盤のチェックを実装することができる。

完全なるコード

以下は、上で説明したハングマンゲームの完全なコードと実行中のコードです。

import random
import os
 
# Funtion to clear te terminal
def clear():
    os.system("clear")
 
# Functuion to print the hangman
def print_hangman(values):
    print()
    print(" +--------+")
    print(" |       | |")
    print(" {}       | |".format(values[0]))
    print(" {}{}{}      | |".format(values[1], values[2], values[3]))
    print(" {}       | |".format(values[4]))
    print(" {} {}      | |".format(values[5],values[6]))
    print("          | |")
    print("  _______________|_|___")
    print("  `````````````````````")
    print()
 
# Function to print the hangman after winning
def print_hangman_win():
    print()
    print(" +--------+")
    print("          | |")
 
    print("          | |")
    print(" O       | |")
    print(" /|      | |")
    print(" |       | |")
    print("  ______/_______|_|___")
    print("  `````````````````````")
    print()
 
# Function to print the word to be guessed
def print_word(values):
    print()
    print(" ", end="")
    for x in values:
        print(x, end="")
    print()
 
# Function to check for win
def check_win(values):
    for char in values:
        if char == '_':
            return False
    return True    
 
# Function for each hangman game
def hangman_game(word):
 
    clear()
 
    # Stores the letters to be displayed
    word_display = []
 
    # Stores the correct letters in the word
    correct_letters = []
 
    # Stores the incorrect guesses made by the player
    incorrect = []
 
    # Number of chances (incorrect guesses)
    chances = 0
 
    # Stores the hangman's body values
    hangman_values = ['O','/','|','','|','/','']
 
    # Stores the hangman's body values to be shown to the player
    show_hangman_values = [' ', ' ', ' ', ' ', ' ', ' ', ' ']
 
    # Loop for creating the display word
    for char in word:
        if char.isalpha():
            word_display.append('_')
            correct_letters.append(char.upper())
        else:
            word_display.append(char)
 
    # Game Loop        
    while True:
 
        # Printing necessary values
        print_hangman(show_hangman_values)
        print_word(word_display)           
        print()
        print("Incorrect characters : ", incorrect)
        print()
 
 
        # Accepting player input
        inp = input("Enter a character = ")
        if len(inp) != 1:
            clear()
            print("Wrong choice!! Try Again")
            continue
 
        # Checking whether it is a alphabet
        if not inp[0].isalpha():
            clear()
            print("Wrong choice!! Try Again")
            continue
 
        # Checking if it already tried before  
        if inp.upper() in incorrect:
            clear()
            print("Already tried!!")
            continue   
 
        # Incorrect character input
        if inp.upper() not in correct_letters:
             
            # Adding in the incorrect list
            incorrect.append(inp.upper())
             
            # Updating the hangman display
            show_hangman_values[chances] = hangman_values[chances]
            chances = chances + 1
             
            # Checking if the player lost
            if chances == len(hangman_values):
                print()
                clear()
                print(" GAME OVER!!!")
                print_hangman(hangman_values)
                print("The word is :", word.upper())
                break
 
        # Correct character input
        else:
 
            # Updating the word display
            for i in range(len(word)):
                if word[i].upper() == inp.upper():
                    word_display[i] = inp.upper()
 
            # Checking if the player won       
            if check_win(word_display):
                clear()
                print(" Congratulations! ")
                print_hangman_win()
                print("The word is :", word.upper())
                break
        clear()
     
 
if __name__ == "__main__":
 
    clear()
 
    # Types of categories
    topics = {1: "DC characters", 2:"Marvel characters", 3:"Anime characters"}
 
    # Words in each category
    dataset = {"DC characters":["SUPERMAN", "JOKER", "HARLEY QUINN", "GREEN LANTERN", "FLASH", "WONDER WOMAN", "AQUAMAN", "MARTIAN MANHUNTER", "BATMAN"],
                 "Marvel characters":["CAPTAIN AMERICA", "IRON MAN", "THANOS", "HAWKEYE", "BLACK PANTHER", "BLACK WIDOW"],
                 "Anime characters":["MONKEY D. LUFFY", "RORONOA ZORO", "LIGHT YAGAMI", "MIDORIYA IZUKU"]
                 }
     
    # The GAME LOOP
    while True:
 
        # Printing the game menu
        print()
        print("-----------------------------------------")
        print(" GAME MENU")
        print("-----------------------------------------")
        for key in topics:
            print("Press", key, "to select", topics[key])
        print("Press", len(topics)+1, "to quit")   
        print()
         
        # Handling the player category choice
        try:
            choice = int(input("Enter your choice = "))
        except ValueError:
            clear()
            print("Wrong choice!!! Try again")
            continue
 
        # Sanity checks for input
        if choice > len(topics)+1:
            clear()
            print("No such topic!!! Try again.")
            continue   
 
        # The EXIT choice  
        elif choice == len(topics)+1:
            print()
            print("Thank you for playing!")
            break
 
        # The topic chosen
        chosen_topic = topics[choice]
 
        # The word randomly selected
        ran = random.choice(dataset[chosen_topic])
 
        # The overall game function
        hangman_game(ran)

まとめ

最初は、ハングマンゲームを作るのは大変な作業に思えるかもしれませんが、このチュートリアルが読者の誤解を解くことができれば幸いです。

ご質問やご批判がありましたら、お気軽に下のコメント欄にご記入ください。

Pythonで端末ベースのゲームを開発することについてもっと学びたい場合は、MinesweeperやTic-tac-toeのような他のゲームをチェックアウトすることができます

タイトルとURLをコピーしました