質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.83%

Python ある英単語を構成する文字がリストに格納されているかをチェックしたい

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 307

takoyaki10

score 15

前提・実現したいこと

現在、Pythonを使用して英単語あてゲームを作っています。スタートボタンを押すとランダムに英単語が選ばれ、その英単語の文字数だけ目隠しとして"-"が実際に表示されます。プレイヤーがその英単語が持つ文字を入力すれば、"-"が外れ、正解した文字だけがプレイヤーに表示されるという仕組みです。

例:appleという英単語がランダムに選択されたとします。プレイヤーには " - - - - - "としか表示されず、英単語が持つ文字を正しく入力できれば、" - - - l - " や " a - - l - " のように開示されていきます。

プレイヤーが入力した文字がお題となる英単語に存在すれば、その文字を開示するというコードは書くことができました。しかし、そのコードでは、Enterキーを押すたびに入力した1文字しか開示されず、それ以前に正解した単語を継続して表示し続けることができませんでした。それを解決するために、正解した文字を全てalliputlettersというリストに一旦格納し、Enterキーを押すごとにお題の英単語に含まれる文字がalliputlettersに一つでも存在するかを調べ、存在すればそれらすべてを開示するという仕組みにしました。

質問内容
過去に正解した文字を継続して開示しながら、未だ正解していない文字はハイフンで隠しておきたいのですが、現在のコードでは、['- ', '- ', '- ', '- ', '- ']と、すべてハイフンで隠れた結果が返ってきます。
allinputlettersのvariables explorerを見ると、入力した正解の文字がちゃんと追加されていますが、correctlettersにはハイフンしか追加されていません。したがって、if n == any(allinputletters): に問題があると思いますが、解決の方法がわかりませんので、解決法やアドバイスをいただけないでしょうか。

発生している問題・エラーメッセージ

英単語のうち、正解した文字は表示され、それ以外はハイフンで隠されるべきところ、正解した文字があっても['- ', '- ', '- ', '- ', '- ']との結果が返ってくる。('- 'の数はお題の英単語の文字数と同じ数となります。)

該当のソースコード

def enterbtn_click():  #プレイヤーが文字を入力し、Enterボタンを押すと動く関数
    global inputletter
    global selectedword #前のコードですでにランダムに選択されたお題となる英単語
    inputletter = letterbox.get() #プレイヤーが入力した文字
    global wrongscore

    if inputletter in selectedword:
        for n in selectedword: 
            if n == inputletter: 
                allinputletters.append(n) 
# プレイヤーが入力した文字がお題となる英単語に存在するかどうかを調べ、存在すればalliputlettersというリストに追加する。

        for n in selectedword: 
            if n == any(allinputletters): 
                correctletters.append(n)
# プレイヤー入力してきた文字が格納されたリスト(alliputletters)に一つでもお題となる英単語に存在するかどうかを調べ、存在すればcorrectlettersというリストに格納。
            else:
                correctletters.append("- ") 
        wordshow.configure(text= str(correctletters)) 
# 存在しなければ"-"をCorrectlettersに追加し、どの文字を開示し、どの文字を-で表示するかという最終的な結果が格納されたcorrectlettersというリストを開示。

    else:
        if wrongscore < 8:
            wrongtypes.configure(text=wrongscore)
            wrongscore += 1
        else:
            wrongtypes.configure(text="GAME OVER")

試したこと

if n == any(allinputletters): に問題があると考えているので、様々工夫をしてみたがうまくいかなかった。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

完全に処理を書き換えましたが、だいたい以下のような流れでよいかと思います。

selectedword = 'apple'
allinputletters = ['- ' for _ in range(len(selectedword))] # まずは不正解記号を入れておく

while True:
    inputletter = input('input word:')

    # 正解
    if inputletter == selectedword:
        break

    for idx,c in enumerate(selectedword):
        if idx >= len(inputletter):
            break

        # 同じ位置に同じ文字がある
        if c == inputletter[idx]:
            allinputletters[idx] = c

    print(str(allinputletters))

"""
input word:all
['a', '- ', '- ', '- ', '- ']
input word:apl
['a', 'p', '- ', '- ', '- ']
input word:bbbbbb
['a', 'p', '- ', '- ', '- ']
input word:biihe
['a', 'p', '- ', '- ', 'e']
input word:appmm
['a', 'p', 'p', '- ', 'e']
input word:apple
"""

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/30 13:14

    ありがとうございました。少し自分なりにアレンジして解決できました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る