#これまでに学習したこと
For Loop, While Loop, if/else, Lists, Strings, Range, Module...etc.
を使用して簡単なゲームを作ってみよう!ということで、アルゴリズムを書きました。せっかくなのでwebアプリとしてブラウザで楽しめるようにフレームワークに移植し、改変してみました(予定)。
##Mission>> Hangman game
正解wordの中に入っている文字を当てていくゲーム。
フリーサイト→ https://hangmanwordgame.com/?fca=1&success=0#/
外れたら、Hangman(首つり人間)の絵がどんどん書き足されていき、絵が完成するまでにすべての単語を推測し、当てることが出来なかったらGAMEOVERとなる。なお、推測できる文字は1度に1アルファベットのみで、途中で単語が分かったとしてもwordに使用されるアルファベット全てを入力&推測しないと正解にはさせない仕様。昔からあるゲームで、ヴィクトリア朝時代にまで遡れるらしい...
詳細はwikiへ→ https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%B0%E3%83%9E%E3%83%B3_(%E3%82%B2%E3%83%BC%E3%83%A0)
ゲーム原型として以下のような出力をするプログラムを作成しました。
・与えられた単語の中からランダムに正解ワードが選定される
・文字数は最初にヒントとして空欄「 _ (アンダースコア)」で与えられる
・すべての空欄がアルファベットで埋まるまで永遠に入力を聞いてくる
→ これでは勝敗がつくゲームではないので次に回数制限を設けて手直ししたものが2番目のコード。
苦戦したところは相変わらず、__型変換__ですね・・・。
import random
#正解リストを作成
word_list = ["centos", "kali", "ubuntu"]
#正解リストから正解を1つランダムに決める
chosen_word = random.choice(word_list)
select = list(chosen_word)
#入力前の変数に「_」を文字数分セット
ans = []
for _ in range(len(chosen_word)):
ans += "_"
#正解ワードの文字数ヒント表示
print("The word is ", " ".join(ans), "\n")
#check関数を作成
def check():
#標準入力した文字が正解ワードに含まれていればそのindexを取り出す
if guess in select:
index = [i for i, x in enumerate(select) if x == guess]
for y in index:
#取り出したindexをint型変換
idx = int(y)
#ansリストから該当indexの「_」を削除
del ans[y]
#ansリストの該当indexに正解した標準入力を追加
ans.insert(idx,guess)
#ans2はリストなので結合してstr型変換
currans = " ".join(ans)
print(currans)
else:
#標準入力した文字が正解ワードに含まれていない場合以下を出力
print("No exist in this word")
#すべての「_」が文字で埋まるまでcheck関数を回す
while "_" in ans:
guess =str(input("Input an alphabet you guess: "))
print("")
#check関数の呼び出し
check()
#すべての空欄(_)が文字列で埋まった場合、以下を出力
else:
print("\nYou got it!!")
[i for i, x in enumerate(select) if x == guess]
→ if直後の条件に一致した場合、該当の値を持つindexを返す
次に回数制限を設けたver.
#check関数まで上記と同じ
#初期値、最大試行回数の指定
times = 1
max_times = 5
#check関数を回す条件・範囲を指定
while times < max_times:
guess =str(input("Input an alphabet you guess: "))
#試行回数、残り試行回数の表示
print(f"Challenge {times} times :: Remain {int(max_times)-int(times)} times")
print("")
#回数のインクリメント
times += 1
#check関数の呼び出し
check()
#空欄(_)がある場合、負け
if "_" in ans:
print("\nYou lose...")
#全て当てられて空欄(_)がない場合、勝ち!
else:
print("\nYou won !!")
##Mission>> 図を挿入したい!
では図を入れてみます。
#check関数まで上記と同じ
times = 1
max_times = 6
lives = 6
stages = ['''
+---+
| |
O |
/|\ |
/ \ |
|
=========
''', '''
+---+
| |
O |
/|\ |
/ |
|
=========
''', '''
+---+
| |
O |
/|\ |
|
|
=========
''', '''
+---+
| |
O |
/| |
|
|
=========''', '''
+---+
| |
O |
| |
|
|
=========
''', '''
+---+
| |
O |
|
|
|
=========
''', '''
+---+
| |
|
|
|
|
=========
''']
while times < max_times:
guess =str(input("Input an alphabet you guess: "))
print(f"Challenge {times} times :: Remain {int(max_times)-int(times)} times\n")
print("")
check()
print(stages[lives])
times += 1
if "_" in ans:
print("\nYou lose...")
else:
print("\nYou won !!")
上記のように複数行にわたって図を入れたい場合は「'''」(トリプルコーテーション)を使います。
##Mission>> webアプリ化したい!
今回はスマホからも遊べるように、herokuにデプロイできる__Flask__で作ってみます!
まずHerokuのアカウント作成から→ https://signup.heroku.com/dc