Answer the question
In order to leave comments, you need to log in
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 ... #******************* ИМПОРТ КАТАЛОГОВ *******************************************************************************************
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
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 questionAsk a Question
731 491 924 answers to any question