Игра в города — это всем знакомая с детства игра. Тот кто начинает обычно говорит «Москва» и дальше нужно назвать город на букву «А», т.к. Москва кончается на А. Игру в города можно написать на Python. Это будет игра для одного человека в которой человек будет играть против компьютера. Что бы компьютер мог играть он должен будет иметь в своем распоряжении список всех городов России. Вот такую игру мы и напишем в этом уроке.
Давайте начнем писать программу постепенно усложняя ее. План у нас такой:
- Создадим основной цикл игры
- Добавим загрузку всех городов из внешнего файла
- Добавим все нужные проверки
Основной цикл игры в Города
Добавим игровой цикл игры который позволит играть по очереди с компьютером пока игра не завершится. Игра у нас будет завершена в 2 случаях:
- Если компьютер в своей базе не найдет город на нужную букву — в этом случае победил человек
- Если человек не может назвать очередной город на нужную букву и вместо названия города пишет кодовое слово «стоп».
Так же мы добавим основную проверку для этой игры — это проверку того что названный город начинается на нужную букву. А нужная буква — это последняя буква в названии города на предыдущем шаге. Эту букву будем хранить в переменной «s_end».
Для хранения городов будем использовать переменную с типом список «cityes «. Пока что нужные города добавим прямо в тексте программы. Далее сделаем так, что бы города считывались из текстового файла в который мы запишем все города России.
cityes = ['Москва',"Уфа","Архангельск","Курск"] print("Игра в города. Что бы закончить игру введите слово стоп") game_over = False # Первый ход - делает компьютер city = 'Москва' print(city) step = 'human' s_end = city[-1] while game_over == False: if step == 'human': correct = False while correct == False: city = input("Введите ваш город: на букву: " + s_end+". Ваш город: ") if city == "стоп": game_over = True correct = True else: correct = True #Проверить что город на нужную букву if city[0].lower () != s_end: correct = False print("Не верно. Назовите город на букву",s_end) step = 'AI' else: city = '' for city_next in cityes: if city_next[0].lower() == s_end: city = city_next if city == '': print('Вы победили') print('Не найден город на букву', s_end) game_over = True else: print(city) step = 'human' if game_over == False: s_end = city[-1] print('Игра окончена')
Добавим загрузку городов из файла
Список городов лучше всего хранить отдельно от текста программы. Это позволит сделать игру универсальной. Например можно будет поменять список на города Мира, а не только России. Или например поиграть в страны, а не в города. Вам нужно будет только заменить список в текстовом файле.
Вот файл со всеми городами России: города.txt. Файл нужно поместить в каталог с программой.
А вот простой код для осуществления загрузки этого файла.
text1 = open("города.txt") cityes = [] for i in text1: cityes.append(i) for i in range(len(cityes)): if cityes[i][-1] == "\n": cityes[i]=cityes[i][:-1]
Добавим проверки
Основную проверку мы уже добавили — это проверка, что город на нужную букву. Но кроме того нужно добавить еще 2 проверки:
- Проверка, что назван реально существующий город.
- Проверка, что этот город еще не называли.
Компьютер не сможет обманывать, но человек легко может схитрить и назвать компьютеру не существующий город на нужную букву. Для проверки того, что город действительно существует нужно после ответа человека проверить — содержится ли названный город в базе данных городов.
Кроме того каждый город должен быть назван только один раз. По этому создадим пустой список и в него будем записывать все названные города. И при очередном ходе будем проверять, что названный город не содержится в списке уже названных.
У нас увеличивается количество переменных для хранения городов:
- cityes_all — тут просто список всех городов России
- cityes — тут список городов которые можно использовать на данном шаге. Это список всех городов без тех городов которые уже назвали.
- cityes_old — тут список городов которые уже называли. В начале он пуст.
Так же добавим проверку на символы исключения. Например назван город «Астрахань» — последняя буква «ь». Нет города на эту букву. По этому последней буквой будем считать предпоследнюю, т.е. «н». Список таких символов будем хранить в переменной «symbols_bad».
Полный код игры в города на Python
Вот полный код игры с возможностью загрузить города из файла и со всем нужными проверками.
cityes_old = [] symbols_bad = {"ь","ъ","ы","ц","й"} text1 = open("города.txt") cityes = [] for i in text1: cityes.append(i) for i in range(len(cityes)): if cityes[i][-1] == "\n": cityes[i]=cityes[i][:-1] cityes_all = cityes.copy() game_over = False print("Игра в города. Что бы закончить игру введите слово стоп") city = 'Москва' print(city) s_end = 'a' step = 'human' cityes_old.append(city) s_end = city[-1] while game_over == False: if step == 'human': correct = False while correct == False: city = input("Введите ваш город: на букву: " + s_end+". Ваш город: ") if city == "стоп": game_over = True correct = True else: correct = True #Проверить что город на нужную букву if city[0].lower () != s_end: correct = False print("Не верно. Назовите город на букву",s_end) #Проверить что такой город существует if city in set(cityes_all): pass else: correct = False print("Не верно. Такого города не существует") #Проверить что ранее этот город не называли if city in set(cityes_old): correct = False print("Не верно. Такой город уже называли") step = 'AI' else: city = '' for city_next in cityes: if city_next[0].lower() == s_end: city = city_next if city == '': print('Вы победили') print('Не найден город на букву', s_end) game_over = True else: print(city) step = 'human' if game_over == False: cityes.remove(city) cityes_old.append(city) s_end = city[-1] if s_end in symbols_bad: s_end = city[-2] if s_end in symbols_bad: s_end = city[-3] else: pass print('Игра окончена') print('Назвали ', len(cityes_old), " городов из ", len(cityes_all))
Домашнее задание
В основном цикле игры есть переменная которая отвечает за то чей следующий ход — человека или компьютера. Попробуйте изменить программу так что бы следующим ходом был постоянно ход компьютера. Так вы заставите сыграть в игру Города компьютер с компьютером. В результате получится довольно длинная цыпочка из названных городов.
DoS, файл .py не принимают