0
from graphics import *
import random 

def hangman(word):
    returnStuff = {'again':0, '1st':1}

    alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
                'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

    win = GraphWin("Hangman", 800, 550)
    win.setBackground("yellow")

    titleText = Text(Point(400,50), 'HANGMAN')
    titleText.setSize(24)
    titleText.setStyle('bold')
    titleText.draw(win)

    #Building the hangman base
    base = Line(Point(120,350),Point(230,350))
    base.draw(win)
    stand = Line(Point(175,350),Point(175,150))
    stand.draw(win)
    stand2 = Line(Point(175,150),Point(250,150))
    stand2.draw(win)
    stand3 = Line(Point(250,150),Point(250,180))
    stand3.draw(win)

    #drawing the empty lines for the word
    x1 = 150
    x2 = 180
    l = 0
    print(word)
    while l< len(word):
        wordLine = Line(Point(x1, 420),Point(x2,420))
        wordLine.draw(win)
        l+=1
        x1+=40
        x2+=40

    guessCounter = 0
    textCheck = 0
    invalidText = Text(Point(600,100), 'You did not enter a valid letter.')
    invalidText.setTextColor('red')
    indexes = []
    while guessCounter < 6:
        #text entry box
        textEntry = Entry(Point(600,180),10)
        textEntry.draw(win)
        guessText = Text(Point(600,150), 'Guess a letter:')
        guessText.draw(win)
        #user has to click this box to confirm the letter
        enterBox = Rectangle(Point(580,200), Point(620,220))
        enterBox.setFill('white')
        enterBox.draw(win)
        clickText = Text(Point(600,210), 'Enter')
        clickText.draw(win)

        click = win.getMouse()
        x = click.getX()
        y = click.getY()

        if 580 < x < 620 and 200 < y < 220:
            guess = textEntry.getText().lower().strip()
            if guess not in alphabet:
                if textCheck == 0:
                    invalidText.draw(win)
                    textCheck = 1

            else:
                if textCheck == 1:
                    invalidText.undraw()
                    textCheck = 0
                for letter in word:
                    if letter == guess:
                        indexes.append(word.index(guess))
                        print(indexes)


    win.getMouse()

    win.close()

    return returnStuff 

#list with various words pertaining to nanotechnology
words = ['nanotechnology', 'science', 'nanometre' , 'strength', 'chemistry',
         'small', 'molecule', 'light' , 'weight', 'technology', 'materials',
         'property', 'physics', 'engineering', 'matter', 'waterloo', 'nanobot',
         'reaction', 'structure', 'cells']

#picks a random word from the list
word = random.choice(words)

#this variable ensures it opens the game the first time
initialCall = 1
#stores the returnValue for the first call
returnValue = hangman(word)

#sets the initialCall to 0 after first call 
if returnValue['1st']==1:
    initialCall=0

#Calls the game function again if user wishes
while initialCall == 1 or returnStuff['again'] == 1:
    returnValue = hangman(word)

Python グラフィックスで Hangman を作成しています。コードの巨大なブロックをお詫びします。すべて正常に動作します。役に立つに違いないと思いました。私が懸念しているコードの部分はこれです:

            else:
                if textCheck == 1:
                    invalidText.undraw()
                    textCheck = 0
                for letter in word:
                    if letter == guess:
                        indexes.append(word.index(guess))
                        print(indexes)

このコード ブロックは、ユーザーが推測した文字がアルファベットである場合に実行されます。次に、選択した単語の各文字を実行し、単語の文字が推測した文字と同じである場合は、インデックスを保存します。その文字を空のリストに入れて、空の行のどこに文字を描画するかをコンピューターに指示できるようにします。

単語に重複した文字がある場合を除いて、正常に機能します。たとえば、エンジニアリングには 3 つの es があります。残念ながら、.index() は文字が最初に表示されたときのインデックスのみを記録し、他の文字は無視します。最初の e だけの 3 つのインデックスではなく、その単語の 3 つの es すべてのインデックスを取得できるようにするための回避策は何ですか。テスト目的で、選択した単語と索引リストをコンソールに出力して、何が起こっているかを確認できるようにしました。そのため、実際に文字を推測する必要はありません。

4

1 に答える 1