こんにちは!
ENHANCERのPengです!
今回はPythonを使って、「ハングマン(Hangman)」という言葉あてゲームを作っていこうと思います!
ハングマン(Hangman)とは
そもそも「ハングマン」をご存じでしょうか。
日本ではあまり馴染みのないゲームかもしれません。
ハングマンは相手の考えた単語を当てるゲームです。
大まかなゲームの流れを紹介します。
まず、プレイヤー1はある単語を選び、文字の数だけアンダーバー「_」を表示します。
プレイヤー2はプレイヤー1が考えた単語を当てていくのですが、文字を間違っていくたびにプレイヤー1はハングマン(吊られている人)の絵を書き足していきます。
回答の文字が用意した単語に含まれていた場合、プレイヤー1はその文字を_の上に書き足していきます。
プレイヤー2が単語を当てる前にハングマンの絵が完成してしまったら、プレイヤー1の勝利です。
逆に、ハングマンが完成する前に単語を当てることができれば、プレイヤー2の勝利です。
イメージとしてはこんな感じです↑
この例ではPengという単語を当てられる前にハングマンが完成しているため、プレイヤー1の勝利です。
簡単に言うと、
相手の考えた単語を正解できればこちらの勝ち、
正解できずにハングマンが完成してしまったら相手の勝ちです!
描かれる絵が首吊状態であるため少し残酷ですね、、。
だから日本では流行っていないのかもしれません。。。
それはともかく、このゲームをPythonを使って作ってみようというわけです。
なんだかワクワクしてきましたね!!
それでは早速ご紹介します!
今回作っていくハングマン
今回作るハングマンは以下の要領でやってきます。
- 相手から単語を与えられるわけではなく、自分で用意したいくつかの単語リストの中から、ランダムで正解の単語が選ばれるようにする。
- 5回文字を間違えるとハングマンが完成する。
- 「1文字を予想してね!」という但し書きを表示させる。
- 正解の単語の数だけ_を表示する。
- 勝った場合は「あなたの勝ち!」、負けた場合は「あなたの負け!正解は” ”」と表示する。
少し長いので二部作となっています。
今回は1~3までを進めていきます!
ハングマンを作る
先ほど提示した要領に従ってハングマンを作っていきます。
まずは関数の定義とハングマンの絵をリストとして定義していきましょう。
def hangman():
stages = ["",
"__________ ",
"| | ",
"| 0 ",
"| /|\ ",
"| / \ ",
"| "
]
これで、ハングマンのリストは完成です。
これを相手の間違いとともに一行ずつ表示していくことでハングマンが完成します。
続いて、間違った数をカウントするwrongという変数、正解の単語のリストを作成していきます。
def hangman():
stages = ["",
"__________ ",
"| | ",
"| 0 ",
"| /|\ ",
"| / \ ",
"| "
]
wrong = 0
lis = ["cat", "dog", "penguin", "bird", "fish", "panda"]
ここで、要領1.の通り、このリストの中からランダムに単語を提示し、アルファベットの数だけ”_”を作らなければなりません。
リストの中からランダムな単語を取り出すために、ここではrandomモジュールをインポートして、その中のrandintメソッドを使います。
def hangman():
#random モジュールをranとして呼び出す
import random as ran
stages = ["",
"__________ ",
"| | ",
"| 0 ",
"| /|\ ",
"| / \ ",
"| "
]
wrong = 0
#正解の単語のリストを作成する。ここは自分の好きな単語で!
lis = ["cat", "dog", "penguin", "bird", "fish", "panda"]
#randomモジュールのrandintメソッドを使って、
#リストのインデックス番号の中のランダムな数字を作る
num = ran.randint(0, 5)
#wordという変数にリストの中のランダムなインデックス番号の単語を代入
word = lis[num]
#correctという変数に正解の単語をリストとして代入
correct = list(word)
#boardという変数に正解の単語数分の"_"を代入
board = ["_"] * len(word)
#winという変数にFlaseを代入。後々使う。
win = False
print("ハングマンへようこそ!")
これで第一段階は終了です!
ここで使ったrandomモジュールやrandintメソッドについてはこちらの記事にまとめてありますので、もしわからなければご確認ください!
さあ、ここからはゲームを進めていくループ処理を定義していきましょう。
while wrong < len(stages) - 1:
#\nは改行を表す
print("\n")
msg = "1文字を予想してね!"
char = input(msg)
#入力された文字が正解だった場合
if char in correct:
cind = correct.index(char)
#正解した場所の_を正解した単語に置き換える
board[cind] = char
#これにより単語の重複にも対応できるようにする
correct[cind] = '$'
#入力された文字が間違っていた場合
else:
wrong += 1
このループはゲームの勝敗が決定するまで回り続けます。whileはTRUEである限り回り続けるんでしたね。
すなわち、このループは最初の行wrong < len(stages) - 1
がTRUEである限り回り続けます。
間違った文字を入力した回数(wrong)が、先ほど作ったハングマンのステージのリストの長さ(len(stages)
)と同じ数となってしまったら、このループは終了することになります。
ここで、stages
から1を引いているのは、今回作ったstages
のリストの0番目は、空白で(” “)、そこからハングマンが描かれていくためです。
そしてその下のコマンドで、「一行改行した後、”1文字を予想してね!”という言葉とともに文字を入力する場所を設けろ(input)」と命令しています。
ifの条件文は回答の単語(char)が正解のリスト(collect)の中に含まれていた場合に動作します。
次の行では、正解した単語のインデックス番号をcindに代入し、次の行でそのインデックス番号に相当する「_」をその単語に変換させています。
そして、正解の単語リスト(collect)の中で、回答の単語が二つ以上あった場合を想定し、correct[cind] = '$'
で正解の単語のリストから、回答があった単語を$に変換しています。
else文では回答が間違っていた場合、wrongを+1するように命令しています。
ここで出てきたif条件文に関しては、次の記事にまとめてあります!
次回の記事では
次回でハングマンは完成します!
次回の最後には今回のコードをまとめたものも掲載する予定なのでお楽しみに!
ENHANCER Peng
“Pythonで簡単なゲームを作ろう!(ハングマン)~前編~” への2件の返信