2

Pythonでゲームという言葉を推測して書いています。それは私の学校のプロジェクトのためです。これでほぼ完了です。問題が 1 つあります。単語をマスクする方法がわかりません。たとえば、単語が猿の場合、プログラムは ------ と表示し、ユーザーが文字を推測すると、たとえば k と表示すると、プログラムは ---k-- と表示する必要があります。

残念ながら、特定の方法でコードを作成する必要があります。私は、すべての作業を行う他の関数を呼び出すだけのメイン関数を持つことになっています(ユーザーに文字を要求したり、推測された単語が正しいかどうかを確認したりする関数など)。このマスキング機能以外はすべて終了しました。

関数は と呼ばれmaskWord(state, word, guess)ます。これらの変数を保持する必要がありますが、それらは関数に渡されます。stateはマスクされた単語 (例: ------)、wordは推測される単語 (例: monkey)、guessはユーザーが推測した文字です。関数がマスクされた単語を更新すると、 が返されstateます。もう 1 つのルールは、グローバル変数を作成できないことです。渡される変数は、使用する必要があるものです。

ここに私が持っているものがあります:

def maskWord(state, word, guess)
  guessed = []
  guessed.append(guess)
  for guess in word:
    if guess in guessed:
      state += guess
    else: state += "-"
  return state

本当にうまくいきません。この関数を呼び出すメイン関数は while ループであるため、毎回guessed空文字列になります。

誰かがこれを手伝ってくれたら本当にありがたいです。私の先生は変数の使用のみを許可していたので、変数のみを使用してこの関数を記述できる必要があることはわかっています。

4

3 に答える 3

3

コメントを反映するように私の答えを修正しました。kjtlの答えよりも少し短いです。しかし、それは同じ概念に基づいており、状態を使用することによって...まあ、現在の状態:)

def maskWord(state, word, guess):
    state = list(state)
    for i in range(len(word)):
        if word[i] == guess:
             state[i] = guess
    return "".join(state)


# Lets test if it works..:
word = "electricity"
state = "-" * len(word)
tries = 0

play = True
while play:
    if tries == len(word)*2: 
        print "Fail..."; 
        play = False
    guess = raw_input("Guess: ")
    tries +=1
    state = maskWord(state, word, guess)
    print state
    if maskWord(state, word, guess) == word:  
        print "WIN, WIN!!"; 
        play = False
于 2013-03-04T06:40:05.600 に答える
2

有効な推測のコンテナーとして state を使用することで、SLAKY の回答を拡張しました。

def maskWord(state, word, guess):

    result = ''
    guessed = []
    character = ''
    for character in state:
        if not character == '-':
            if not character in guessed:
                guessed.append(character)

    if not guess in guessed:
        guessed.append(guess)

    for guess in word:
        if guess in guessed:
            result += guess
        else: 
            result += "-"

    # for debugging change to if True:
    if False:
        print 'state %s' % state
        print 'word %s' % word
        print 'guess %s' % guess
        print guessed

    return result


# Lets test if it works..:
import sys

word = "electricity"
state = ""
tries = 0

loop = True
while loop:
    if tries == len(word)*3: 
        print "Fail..."
        loop = False
    else:
        guess = raw_input("Guess: ")
        tries +=1
        state = maskWord(state, word, guess)
        print state
        if maskWord(state, word, guess) == word:    
            print "WIN, WIN!!"
            loop = False
于 2013-03-04T07:21:24.287 に答える
0

多分これはあなたを助けるかもしれません:

import random
import string
VOWELS = 'aeiou'
CONSONANTS = 'bcdfghjklmnpqrstvwxyz'
HAND_SIZE = 7
SCRABBLE_LETTER_VALUES = { 'a': 1, 'b': 3, 'c': 3, 'd': 2, 'e': 1, 'f': 4, 'g': 2,
    'h': 4, 'i': 1, 'j': 8, 'k': 5, 'l': 1, 'm': 3, 'n': 1, 'o': 1, 'p': 3, 'q': 10,
    'r': 1, 's': 1, 't': 1, 'u': 1, 'v': 4, 'w': 4, 'x': 8, 'y': 4, 'z': 10 }

def load_words():
    
print ("Loading word list from file...")
    
# making the file
    
words_file= open("N:\Problem Set 1\words.txt", 'r', 0)
    
# making the wordlist
   
 words = []
   
 for line in words_file:
        
words.append(line.strip().lower())
    
print ("  ", len(words), "words loaded.")
    
return words


def get_frequency_dict(sequence):
    
# freqs: dictionary (element_type -> int)
    
frequencies = {}
    for x in sequence:
        frequencies[x] = frequencies.get(x,0) + 1
    return frequencies


# -----------------------------------


def get_word_score(word, n):
    output = 0
    # Checking whether the latter is in the list
    for letter in word:
        output = output + SCRABBLE_LETTER_VALUES.get(letter)
    output = output * len(word)
    if len(word) == n:
        output = output + 50
    if output < 0:
        print "That's is a negative value!"
    return output
  


def display_hand(hand):
    # Displaying the hand
    for letter, frequency in hand.items():
        for i in range(frequency):
            print letter,
    print '\n'
            
def deal_hand(n):
    hand={}
    number_vowels = n / 3
    
    for i in range(number_vowels):
        z = VOWELS[random.randrange(0,len(VOWELS))]
        hand[z] = hand.get(z, 0) + 1
        
    for i in range(number_vowels, n):    
        z = CONSONANTS[random.randrange(0,len(CONSONANTS))]
        hand[z] = hand.get(z, 0) + 1
        
    return hand

# Updating the hand
def update_hand(hand, word):       
    for letter in word:
        if hand[letter] != 0:
            hand[letter] = hand.get(letter, 0) - 1 
    return hand

#If letter chosen is in hand then append
def is_valid_word(word, hand, words_file):
    handchosen = dict.copy(hand)
    first_hand =[]
    second_hand = []
    for letter in handchosen.keys():
        for f in range(handchosen[letter]):
            first_hand.append(letter)
    for letter in word:
        for s in handchosen:
            if s == letter and handchosen[letter] != 0:
                    handchosen[letter] = handchosen.get(letter, 0) - 1
    for letter in handchosen.keys():
        for f in range(handchosen[letter]):
            second_hand.append(letter)
    if words_file.count(word) > 0 and len(word) + len(second_hand) == len(first_hand):
        return True
    else:
        return False

# Play the hand
def play_hand(hand, words_file):
    print
    print
    print 'Hey welcome to the Wordgame!'
    print
    print "Press '.' when you want to end the game."
    print
    n = HAND_SIZE
    old_hand = hand.copy()
    print 'Initial hand:',
    display_hand(hand)
    print
    loop = 1
    while loop == 1:
        yourscore = 0
        numLetters = 1
        while numLetters > 0:
            quit = '.'
            word = raw_input('Please enter a valid word: ')  
            if word != quit:
                if is_valid_word(word, hand, words_file) == False:
                    print 'Invalid word. Please enter a valid word:' 
                else:
                    numLetters = 1
                    print 'You got points for:',word,'=',get_word_score(word, n)
                    yourscore = yourscore + get_word_score(word, n)
                    print 'The total score:', yourscore
                    updated_hand = update_hand(hand, word)
                    print 'Current Hand:',
                    display_hand(updated_hand)
                    print
                    hand = updated_hand
                    for num in dict.values(hand):
                        numLetters = num + numLetters
                    numLetters = numLetters - 1
                    print numLetters,'letters are still remaining.'
                    if numLetters == 0:
                        loop = 0
                    print
            else:
                numLetters,loop = 0,0
    print 'Lets see what the final score is: ', yourscore

#Play the game
def play_game(words_file):
    hand = deal_hand(HAND_SIZE) # random init
    while True:
        # Let the user make a choice
        A = raw_input('Enter n to deal a new hand, r to play the same hand or e to end game: ')
        if A == 'n':
            hand = deal_hand(HAND_SIZE)
            play_hand(hand.copy(), words_file)
            old_hand = hand.copy()
            print
        # User can take the same hand
        elif A == 'r':
            play_hand(old_hand, words_file)
        # Break
        elif A == 'e':
            break
        else:
            print "That is a invalid command."


if __name__ == '__main__':
    words_file = load_words()
    play_game(words_file)
于 2013-10-02T09:35:55.367 に答える