Игра в города на python

Novomaster

Новичок
Пользователь
Май 10, 2022
4
0
1
Учу python "с нуля" на примере создания игры "В города".
Берутся пока только города России.
Застрял на нескольких проблемах:

# 1) В списке все города начинаются с заглавных букв.
При вводе игроком города с прописной буквы выдаёт ответ, что такого города не существует;

# 2) На букву "Й" есть всего один город - Йошкар-Ола. то есть если в игре первый раз город заканчивается на "Й", то соперник пишет "Йошкар-Ола" (при этом если написать "Йошкар-ола", "йошкар-ола", "йошкар-Ола" или "ЙОШКАР-ОЛА" , то такого города не существует).
А когда второй раз какой-либо город заканчивается на "Й", то ничего уже ввести нельзя, так как единственный город на "Й" - Йошкар-Ола - уже использовался в игре.
Надо сделать так, чтобы после использования города "Йошкар-Ола" далее в игре допускалось использование городов на букву "И" при необходимости писать город на "Й";

# 3) Нет городов на "Ё". Необходимо допустить, чтобы при необходимости написания города на "Ё" можно было писать города на "Е";

# 4) Нет городов на "Ы", "Ь" и "Ъ". Необходимо реализовать правило, при котором если город заканчивается на "Ы", "Ь" и "Ъ", то следующий город должен начинаться не на последнюю букву предыдущего города, а на предпоследнюю.

Буду очень благодарен за подсказки. Код прикрепляю. Спасибо.
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
1) Храни города в нижнем регистре, сравнивание будет работать нормально, а когда будешь выводить применяй метод capitalize
(прописные и заглавные - одно и тоже. Строчные и прописные - маленькие и большие)

2) Создать словарь, в нем хранить какие буквы проверять при отсутствии
Python:
chars = {"ё":["ё", 'е'], "й":["й", 'и']}
Python:
chars = {"ё":["ё", 'е'], "й":["й", 'и']}
first_char = chars.get(user_answer[-1]) or user_answer[-1]
for char in first_char:
    if candidates := list(filter(lambda x: x[0] == char, cities2)):
        cities2.remove(candidates[0])
        print('>>>>>>>>>> БОТ: ' + candidates[0])
        print('Вам на букву "' + candidates[-1] + '".')
        break
else:
    game_over = True
    print('Я больше не знаю городов на букву "' +
            user_answer[-1] + '". Сдаюсь, вы победили!')
 
Последнее редактирование:
  • Мне нравится
Реакции: Novomaster

Novomaster

Новичок
Пользователь
Май 10, 2022
4
0
1
Python:
import random # Импортируем библиотеку "Рандом"
cities1 = ['Абаза', 'Абакан', '..... ', 'Югорск', '.....', 'Ясный', 'Яхрома'] # Это список всех городов РФ в алфавитном порядке
cities2 = list (cities1) # Это список доступных городов
random.shuffle(cities2) # Перемешиваем все города в списке cities2
bot_answer = cities2.pop () # Бот случайным образом выбирает один из городов в списке доступных городов cities2.
# Функция "pop()" удаляет элемент по указанному индексу и возвращает его. Если индекс не указан, то удаляет и
# возвращает последний элемент. Метод генерирует исключения, если список пуст или указан индекс за пределами диапазона.
print ('>>>>>>>>>> БОТ: ' + bot_answer) # Вывод ответа бота
print('Вам на букву "' + bot_answer [-1] + '".')
print( )

game_over = False
while not game_over: # Зацикливаем игру
    user_answer = input ('>>>>>>>>>> ИГРОК: ') # Это ответ игрока
    if user_answer.lower() [0] != bot_answer [-1]: # функция "lower" переводит заглавные буквы в прописные. Плюс
        # создано Правило - если первая буква ответа игрока не равна последней букве ответа бота, то:
        print ('Неправильно. город должен начинаться с буквы "' + bot_answer [-1] + '"')
        print()
        continue
    elif user_answer not in  cities1:
        print ('Такого города в России не существует! Попробуйте снова.')
        print()
    elif user_answer not in cities2:
        print ('Такой город уже называли.')
        print()
    else: # Иначе (то есть ели первая буква ответа игрока равна последней букве ответа бота, то:
        print ('Верно!')
        print ('Мне на букву "' + user_answer[-1] + '".')
        print()
        cities2.remove (user_answer) # Убираем ответ игрока из списка доступных городов

        for candidate in cities2: # Создаём переменную "candidate" для ответа бота. Цикл "for" - для переменной
            # "candidate", находящейся в списке доступных городов "cities2"
            if candidate.lower()[0] == user_answer[-1]:  # функция "lower" переводит заглавные буквы в прописные. Плюс
        # создано Правило - если первая буква ответа бота равна последней букве ответа игрока, то:
                bot_answer = candidate # Присваеваем ответу бота переменную "candidate"
                cities2.remove (candidate) # Убираем ответ бота из списка доступных городов "cities2"
                print ('>>>>>>>>>> БОТ: ' + candidate) # Вывод ответа бота
                print ('Вам на букву "' + candidate [-1] + '".')
                print()
                break
        else:
            game_over = True
            print ('Я больше не знаю городов на букву "' + user_answer[-1] + '". Сдаюсь, вы победили!')

# Есть проблемы:
# 1)      При вводе игроком города с прописной буквы выдаёт ответ, что такого города не существует;
# 2)      На букву "Й" есть всего один город - Йошкар-Ола. то есть если в игре первый раз город заканчивается на "Й",
# то соперник пишет "Йошкар-Ола" (при этом если написть "Йошкар-ола", "йошкар-ола" или "йошкар-Ола", то такого города
# не существует). А когда второй раз какой-либо город заканчивается на "Й", то ничего уже ввести нельзя,
# так как единственный город на "Й" - Йошкар-Ола - уже использовался в игре. Надо сделать так, чтобы после
# использования города "Йошкар-Ола" далее в игре допускалось использование городов на букву "И" при необходимости
# писать город на "Й";
# 3)      Нет городов на "Ё". Необходимо допустить, чтобы при необходиомти написания города на "Ё" можно было писать
# города на "Е";
# 4)      Нет городов на "Ы", "ь" и "Ъ". Необходимо реализовать правило, при котором если город заканчивается на "Ы",
# "Ь" и "Ъ", то следующий город должен начинаться не на последнюю букву предыдущего города, а на предпоследнюю.
 

Novomaster

Новичок
Пользователь
Май 10, 2022
4
0
1
1) Храни города в нижнем регистре, сравнивание будет работать нормально, а когда будешь выводить применяй метод capitalize
(прописные и заглавные - одно и тоже. Строчные и прописные - маленькие и большие)

2) Создать словарь, в нем хранить какие буквы проверять при отсутствии
Python:
chars = {"ё":["ё", 'е'], "й":["й", 'и']}
Python:
chars = {"ё":["ё", 'е'], "й":["й", 'и']}
first_char = chars.get(user_answer[-1]) or user_answer[-1]
for char in first_char:
    if candidates := list(filter(lambda x: x[0] == char, cities2)):
        cities2.remove(candidates[0])
        print('>>>>>>>>>> БОТ: ' + candidates[0])
        print('Вам на букву "' + candidates[-1] + '".')
        break
else:
    game_over = True
    print('Я больше не знаю городов на букву "' +
            user_answer[-1] + '". Сдаюсь, вы победили!')
Спасибо, вроде понял.
 

Форум IT Специалистов