L
L
Lily Kammerer2021-09-15 13:37:05
Python
Lily Kammerer, 2021-09-15 13:37:05

Why does the "can only join an iterable" error occur when iterating through the loop again? And how to compare username with dictionary key name?

Hello. I am writing a terminal toy for guessing a number. The first problem arose at the login stage (when entering, he writes that there is no such user, although he exists, and then saves (that is, stupidly overwrites) him), so each game the user's points are finally reset. And the second, as for me, is more critical - at the end of the cycle (that is, when winning or losing), the user is prompted, roughly speaking, to exit the game, change the user, or continue the game with the current name. When choosing the last option, an error occurs when calculating points:

scoreN = ("".join(dic[key])) TypeError: can only join an iterable
although it did not appear in the original version. Also, there is no error if you change the username ...
Here is the code:
#******************* ИМПОРТ КАТАЛОГОВ *******************************************************************************************
import sys 
import json
import random
import msvcrt

#****************** ОБЪЯВЛЕНИЕ ГЛОБАЛЬНЫХ ПЕРЕМЕННЫХ И КЛАССОВ *******************************************************************
dic = {}
class Igrok():
    name = 'imya'
    score = 0
    i = 0
polsovatel = Igrok()
polsovatel.i = 0 
#polsovatel.name
chislo = '-1'
min = -1
max = -1
n = -1
z = -1
name = ' '
key = ' '

#****************** ФУНКЦИИ ******************************************************************************************************
#*** Ввод имени пользователя ***
def NewIgra():
    global polsovatel
    global name
    global dic
    polsovatel.name = input("Введите имя игрока ")
    Proverka()
    Random()

#*** Логика игры ***
def Logika():
    global polsovatel
    global name
    global chislo
    global z
    global dic
    global min
    global max
    print(polsovatel.name)#DEBAG
    while polsovatel.i!=(int(n)):
        if int(chislo) != int(z):
            try: # Отлавливаем ошибки ввода (а именно, буквам нет!)
                chislo = int(input("Введите загаданное число "))
            except ValueError:
                print("Ошибка ввода! ")
                chislo = input("Пожалуйста, введите ЧИСЛО еще раз ")
            if chislo < min or chislo > max: 
                print("Число выходит за пределы заданного вами диапазона!")
                chislo = input("Введите число еще раз ")
            if int(chislo) < int(z): 
                print("Слишком мало!")
                polsovatel.i+=1
                print(polsovatel.i)
            if int(chislo) > int(z):
                print("Слишком много!")
                polsovatel.i+=1
                print(polsovatel.i)
            if int(chislo) == int(z):
                key = polsovatel.name
                scoreN = ("".join(dic[key]))
                print(scoreN)#DEBAG
                print(dic[key]) #DEBAG
                polsovatel.score = int(scoreN) + (int(n)-polsovatel.i)*2
                scoreS = polsovatel.score - int(scoreN)
                dic[key] = polsovatel.score
                print(polsovatel.name, ", вы выиграли! Ваши очки за игру: ", scoreS)
                print("Ваше общее количество очков: ", polsovatel.score)
                print("Ваши очки сохранены!")
                print(dic[key])#DEBAG
                Exit()             
    else: 
        print("У вас закончиличь попытки, вы проиграли!")
        key = polsovatel.name
        if dic[key] >= 10:
            scoreN = ("".join(dic[key]))
            polsovatel.score = int(scoreN) - 10
            dic[key] = polsovatel.score
            print(polsovatel.name, " вы оштрафованы на 10 очков. Ваш баланс: ", polsovatel.score)
            print(dic[key]) #DEBAG
            Exit()

#*** Выход или продолжение игры ***          
def Exit():
    print ("\nНажмите <Esc> для закрытия окна или любую клавишу для продолжения игры")
    kay = ord(msvcrt.getch())
    if kay == 27:    # ESC
        print("Программа завершена")
        Save()
        sys.exit()
    PodMenu()

#*** Поиск и запись пользователя в базу ***
def Proverka(): #!
    global polsovatel
    global name
    global dic
    if name.find(polsovatel.name) != -1 : #Если имя пользователя есть в словаре начинаем игру
        print("Игра началась!")
    
    else:
        dic[polsovatel.name] = '0' #Если нет - добавляем
        print("Пользователь сохранен")
        print(dic)

#*** Выборы для подменю ***
def Punkt():
    try:
        punkt = int(input())
        if punkt == 1: Menu()
        if punkt == 2: Random()
        if punkt == 3: NewIgra()
        else:
            print("Такой пункт отсутствует! Повторите ввод!")
            Punkt()
    except ValueError:
        print("Не верный формат ввода! Введите ЧИСЛО для продолжения сценария")
        Punkt()

#*** Подменю ***
def PodMenu():
    print("Выберите что хотите сделать: ")
    print("Нажмите 1 для перехода в главное меню ")
    print("Нажмите 2 для продолжения игры с введенным именем пользователя ")
    print("Нажмите 3 для смены имени ")
    Punkt()
   
#*** Выгрузка***
def Slovar():
    global polsovatel
    global name
    global dic
    #Выгрузка таблицы очков из файла в словарь:
    with open('C:\\Users\\Professional\\Desktop\\Tokarev\\table.txt', 'r', encoding='utf-8') as file: #Читаем файл
        indata = file.read().splitlines() # read().splitlines() - чтобы небыло пустых строк

        """for line in indata: # Проходимся по каждой строчке
            key, *value = line.split() #Разбиваем строку по пробелам
            dic[key] = value # Добавляем в словарь
            name = (', '.join(list(dic))) #Конвертируем имена ключей в строку"""
        
        # проходим в цикле по списку строк
        for i in indata:
            # присваиваем переменным k и v левую и правую часть подстроки,
            # разделяя по символу ':'
            k, v = i.split(': ')
            # убираем лишние концевые пробелы
            v = v.strip()
            # определяем, является ли значение переменной v числом, и если да, то 
            # преобразуем к целому числу, иначе оставляем строкой
            v = int(v) if v.isdigit() else v
            # добавляем в словарь соответствующие пары ключ:значение
            dic[k] =  v
            print(list(dic)) #DEBAG

#*** Сохранение игры ***
def Save():
    global dic
    with open('C:\\Users\\Professional\\Desktop\\Tokarev\\table.txt', 'w', encoding='utf-8') as file: #Открываем файл на запись
        for key,val in dic.items():
            file.write('{}: {}\n'.format(key,val))

#************************************ Сама программа ******************************************

Slovar()
Menu()

Answer the question

In order to leave comments, you need to log in

1 answer(s)
O
o5a, 2021-09-15
@lidiya3001

So there join is not needed at all, you just store integers in this dic [key] .
join is used to combine sequences (list, tuple, letters from a string, etc.) into one string.
scoreN = dic[key]
and in similar places where the string is also replaced by a number:
dic[polsovatel.name] = 0

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question