Как добавить повторяющиеся буквы в пустой список с циклом for - PullRequest
1 голос
/ 02 марта 2020

Я пытаюсь создать простую игру "HangMan", чтобы улучшить свои слабые python навыки класса

, но я столкнулся с проблемой ..

Когда в слове есть 2 из те же буквы (например, «Тест») он добавит только первую букву, а не в мою вторую для l oop, есть ли способ проверить, есть ли дубликаты, использующие a для l oop?

edit: попытался добавить код, но он не работал, поэтому я публикую его изображение Вот код:

print("HANGMAN!!!!")

val = input("Enter a word ")
lst = []
lst2 = []
class Hangman:
    def __init__(self, val, lst, lst2):

        self.val = val
        self.lst = lst
        self.lst2 = lst2
        print("The word has", len(self.val), 'letters')
        z = len(self.val)
        for n in range(z):
            self.lst2.append('_')
        print(self.lst2)

        #print(list(val))
        self.lst = list(val)
        #print(self.lst)

    def guess_time(self):

        res = input("Please enter a letter: ")

        y = 0
        for x in self.lst:
            if x == res:
                print(self.lst.index(x))
                new_lst = self.lst.index(x)
                print("Correct letter")
                self.lst2.pop(new_lst)
                self.lst2.insert(self.lst.index(x), res)
                print('inserting the letter at', self.lst.index(x))
                #Here is the problem if the word has 2 of the same letters

            y += 1
        print(self.lst2)

h = Hangman(val,lst, lst2)
i = 6
while i > 1:
    h.guess_time()
    i -= 1
    print("You have ", i, 'tries left')
    if i == 1:
        print("GoodBye")

Ответы [ 3 ]

0 голосов
/ 02 марта 2020

используйте функцию enumerate, чтобы получить индекс и значение одновременно из списка. И вместо удаления / удаления буквы лучше заменить ее другой буквой, или символом, или цифрой (которая не входит в слово / список), и когда значение / буква совпадает, тогда для этого индекса добавьте значение в self.lst2[index]=res

вот код

def guess_time(self):

    res = input("Please enter a letter: ")

    y = 0
    for index, value in enumerate(self.lst):
        if res==value:
            print(index)
            self.lst[index] = '~'
            print('correct letter')
            self.lst2[index]=res
            break

    y += 1
    print(self.lst2)
0 голосов
/ 02 марта 2020

Вы можете хранить каждую букву в нижнем регистре и индекс в формате:

print("HANGMAN!!!!")

val = input("Enter a word ")
lst = []
class Hangman:
    def __init__(self, val):

        self.val = val
        self.letter_index = {} # also you can use a defaultdict if you are familiar with
        for i, l in enumerate(self.val):
            if l in self.letter_index:
                self.letter_index[l.lower()].append(i)
            else:
                self.letter_index[l.lower()] = [i]

        print("The word has", len(self.val), 'letters')
        self.lst = ['_'] * len(self.val)

        print(self.lst)


    def guess_time(self):

        res = input("Please enter a letter: ").lower()

        y = 0
        if res in self.letter_index:      
            for i in self.letter_index[res]:  # you may want to pop the key
                print("Correct letter")
                print('inserting the letter at', i)
                self.lst[i] = self.val[i]

        print(self.lst)

        if '_' not in self.lst:
            print('Congratulations you won!')
            return True

        return False

h = Hangman(val)
i = 6
done = False
while not done and i > 1:
    done = h.guess_time()
    i -= 1

    if not done:
        print("You have ", i, 'tries left')
        if i == 1:
            print("GoodBye")

вывод:

HANGMAN!!!!
Enter a word Test
The word has 4 letters
['_', '_', '_', '_']
Please enter a letter: t
Correct letter
inserting the letter at 0
Correct letter
inserting the letter at 3
['T', '_', '_', 't']
You have  5 tries left
Please enter a letter: e
Correct letter
inserting the letter at 1
['T', 'e', '_', 't']
You have  4 tries left
Please enter a letter: s
Correct letter
inserting the letter at 2
['T', 'e', 's', 't']
Congratulations you won!
0 голосов
/ 02 марта 2020

Попробуйте что-то вроде этого:

for i, x in enumerate(self.lst):
    if x.upper() == res.upper():
        print('Correct letter')
        self.lst2[i] = x.upper()
    else:
        print('Incorrect letter')

Также:

  • lst и lst2 не нужно передавать в __init__ method.
  • Вам никогда не понадобится self.val.
  • Не рекомендуется вводить данные и печатать их внутри таких функций.
  • y ничего не делает.
  • Технически списки также не нужны, но вы можете использовать их.

Таким образом, вы можете изменить программу следующим образом:

class Hangman:
    def __init__(self, val):
        self.lst = list(v.upper() for v in val)
        self.lst2 = ['_'] * len(val)

    def guess_time(self, letter):
        success = False
        for i, x in enumerate(self.lst):
            if x == letter.upper():
                self.lst2[i] = x
                success = True
        return success

    def solved(self):
        return self.lst == self.lst2

def main():
    word = input('Enter a word: ')
    guesses = 6
    hangman = Hangman(word)
    print(f'The word has {len(word)} letters')
    print(''.join(hangman.lst2))
    for guess in range(guesses):
        letter = input('Please enter a letter: ')
        s = hangman.guess_time(letter)
        if s:
            print('Correct')
        else:
            print('Incorrect')
        print(f'You have {guesses - guess - 1} guesses remaining')
        print(''.join(hangman.lst2))
        if hangman.solved():
            print('Well done!')
            break
    print('Goodbye')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...