Ternick
@Ternick

Бот для угадывания числа в диапазоне от 0 до 100?

Библиотека game_lib :
import random
import os.path
import os

global KEY_GENERATE
KEY_GENERATE = random.randint(0, 100)	

def human_game():

	try:
		print("Игра началась !")
		INPUT_KEY = int(input("Введите число :\n"))
		return INPUT_KEY
	except ValueError:
		print("Введите именно число !")


def validator_number(INPUT_KEY):
	
	global KEY_GENERATE
	if KEY_GENERATE == INPUT_KEY:
		return True
	else:
		return False

def validator_sign(INPUT_KEY):

	global KEY_GENERATE
	if KEY_GENERATE > INPUT_KEY:
		VALUE = "+"
		return VALUE
	else:
		VALUE1 = "-"
		return VALUE1


Бот который я пытался сделать, он должен угадывать число в диапазоне от 0 до 100. Но почему то выпадает много ошибок на счёт бесконечной рекурсии (обращения к циклу) и с недавнего изменения кода стала выпадать ошибка UnboundLocalError: local variable 'THE_SECOND_NUMBER' referenced before assignment.
Вот сама функция или бот :
import game_lib

def g1(attemps_value, value_id, dict_id):

	dict_attemps = {
	-4 : -4,
	-3 : -3,
	-2 : -2,
	-1 : -1,
	0 : 0,
	1 : 5,
	2 : 10,
	3 : 15,
	4 : 20,
	}
	START_NUMBER = 50
	if value_id == 0:
		print("Бот начал свою работу !")
		CHECK_FIRST_RESULT = game_lib.validator_number(START_NUMBER)
		print(START_NUMBER)
		if CHECK_FIRST_RESULT == True:
			attemps_value += 1
			print("Бот закончил свою работу и угадал загаданное число !\nЧисло попыток затраченных ботом на угадывание числа: " + str(attemps_value) + " !")
		else:
			CHECK_ERROR_SIGN = game_lib.validator_sign(START_NUMBER)
			if CHECK_ERROR_SIGN == str("+"):
				attemps_value += 1
				dict_id += 1
				print("Загаданное число больше введённого ботом !")
				g1(attemps_value, 1, dict_id)
			elif CHECK_ERROR_SIGN == str("-"):
				attemps_value += 1
				dict_id -= 1
				print("Загаданное число меньше введённого ботом !")
				g1(attemps_value, 1, dict_id)
			else:
				print("Неопознонная ошибка !")

	elif value_id == 1:
		THE_SECOND_NUMBER = START_NUMBER + dict_attemps[dict_id]
		CHECK_FIRST_RESULT = game_lib.validator_number(THE_SECOND_NUMBER)
		print(THE_SECOND_NUMBER)
		if CHECK_FIRST_RESULT == True:
			attemps_value += 1
			print("Бот закончил свою работу и угадал загаданное число !\nЧисло попыток затраченных ботом на угадывание числа: " + str(attemps_value) + " !")
		else:
			CHECK_ERROR_SIGN = game_lib.validator_sign(THE_SECOND_NUMBER)
			if CHECK_ERROR_SIGN == str("+"):
				attemps_value += 1
				dict_id += 1
				print("Загаданное число больше введённого ботом !")
				g1(attemps_value, 2, dict_id)
			elif CHECK_ERROR_SIGN == str("-"):
				attemps_value += 1
				dict_id -= 1
				print("Загаданное число меньше введённого ботом !")
				g1(attemps_value, 2, dict_id)
			else:
				print("Неопознонная ошибка !")

	elif value_id == 2:
		THE_THIRD_NUMBER = THE_SECOND_NUMBER + dict_attemps[dict_id]
		CHECK_FIRST_RESULT = game_lib.validator_number(THE_THIRD_NUMBER)
		print(THE_THIRD_NUMBER)
		if CHECK_FIRST_RESULT == True:
			attemps_value += 1
			print("Бот закончил свою работу и угадал загаданное число !\nЧисло попыток затраченных ботом на угадывание числа: " + str(attemps_value) + " !")
		else:
			CHECK_ERROR_SIGN = game_lib.validator_sign(THE_THIRD_NUMBER)
			if CHECK_ERROR_SIGN == str("+"):
				attemps_value += 1
				dict_id += 1
				print("Загаданное число больше введённого ботом !")
				g1(attemps_value, 3, dict_id)
			elif CHECK_ERROR_SIGN == str("-"):
				attemps_value += 1
				dict_id -= 1
				print("Загаданное число меньше введённого ботом !")
				g1(attemps_value, 3, dict_id)
			else:
				print("Неопознонная ошибка !")

	elif value_id == 3:
		THE_FOURTH_NUMBER = THE_THIRD_NUMBER + dict_attemps[dict_id]
		CHECK_FIRST_RESULT = game_lib.validator_number(THE_FOURTH_NUMBER)
		print(THE_FOURTH_NUMBER)
		if CHECK_FIRST_RESULT == True:
			attemps_value += 1
			print("Бот закончил свою работу и угадал загаданное число !\nЧисло попыток затраченных ботом на угадывание числа: " + str(attemps_value) + " !")
		else:
			CHECK_ERROR_SIGN = game_lib.validator_sign(THE_FOURTH_NUMBER)
			if CHECK_ERROR_SIGN == str("+"):
				attemps_value += 1
				dict_id += 1
				print("Загаданное число больше введённого ботом !")
				g1(attemps_value, 4, dict_id)
			elif CHECK_ERROR_SIGN == str("-"):
				attemps_value += 1
				dict_id -= 1
				print("Загаданное число меньше введённого ботом !")
				g1(attemps_value, 4, dict_id)
			else:
				print("Неопознонная ошибка !")

	elif value_id == 4:
		THE_FIFTH_NUMBER = THE_FOURTH_NUMBER + dict_attemps[dict_id]
		CHECK_FIRST_RESULT = game_lib.validator_number(THE_FIFTH_NUMBER)
		print(THE_FIFTH_NUMBER)
		if CHECK_FIRST_RESULT == True:
			attemps_value += 1
			print("Бот закончил свою работу и угадал загаданное число !\nЧисло попыток затраченных ботом на угадывание числа: " + str(attemps_value) + " !")
		else:
			CHECK_ERROR_SIGN = game_lib.validator_sign(THE_FIFTH_NUMBER)
			if CHECK_ERROR_SIGN == str("+"):
				attemps_value += 1
				dict_id += 1
				print("Загаданное число больше введённого ботом !")
				g1(attemps_value, 5, dict_id)
			elif CHECK_ERROR_SIGN == str("-"):
				attemps_value += 1
				dict_id -= 1
				print("Загаданное число меньше введённого ботом !")
				g1(attemps_value, 5, dict_id)
			else:
				print("Неопознонная ошибка !")

	elif value_id == 5:
		THE_SIXTH_NUMBER = THE_FIFTH_NUMBER + dict_attemps[dict_id]
		CHECK_FIRST_RESULT = game_lib.validator_number(THE_SIXTH_NUMBER)
		print(THE_SIXTH_NUMBER)
		if CHECK_FIRST_RESULT == True:
			attemps_value += 1
			print("Бот закончил свою работу и угадал загаданное число !\nЧисло попыток затраченных ботом на угадывание числа: " + str(attemps_value) + " !")
		else:
			CHECK_ERROR_SIGN = game_lib.validator_sign(THE_SIXTH_NUMBER)
			if CHECK_ERROR_SIGN == str("+"):
				attemps_value += 1
				dict_id += 1
				print("Загаданное число больше введённого ботом !")
				g1(attemps_value, 1, 1)
			elif CHECK_ERROR_SIGN == str("-"):
				attemps_value += 1
				dict_id -= 1
				print("Загаданное число меньше введённого ботом !")
				g1(attemps_value, 1, -1)
			else:
				print("Неопознонная ошибка !")

g1(0, 0, 0)

Так же он почему то косолапит цифры:
y5gdjKdDbWo.jpg
А если заглянуть в бота он подавно не должен складывать так числа потому что там идёт словарь .
  • Вопрос задан
  • 982 просмотра
Решения вопроса 1
Мне кажется сделал что-то интересное... Попробуй.
def get_n():
    try:
        number = int(input("Введите число от 0 до 100: "))
        if 0 <= number <= 100:
            return number
    except ValueError:
        pass
    print("Вы ввели неправильное число!")
    return get_n()


def bot(n=0, r=0, d=50):
    print(f"Бот пробует число {n}, это его {r} попытка.")
    if n == number:
        print(f"Бот угадал число, число было {n}, и затратил на это {r} попыток.")
    else:
        if n < number:
            bot(n + d, r + 1, d)
        else:
            bot(n - d, r + 1, int(d / 2) if int(d / 2) > 0 else 1)


number = get_n()
bot()

Единственное - иногда он повторяет значения.
UPD: Решить эту проблему можно заменив:
bot(n + d, r + 1, d)
на:
bot(n + d, r + 1, d - 1 if d - 1 > 0 else 1)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы