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

Игра в города — это всем знакомая с детства игра. Тот кто начинает обычно говорит «Москва» и дальше нужно назвать город на букву «А», т.к. Москва кончается на А. Игру в города можно написать на 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))


Домашнее задание

В основном цикле игры есть переменная которая отвечает за то чей следующий ход — человека или компьютера. Попробуйте изменить программу так что бы следующим ходом был постоянно ход компьютера. Так вы заставите сыграть в игру Города компьютер с компьютером. В результате получится довольно длинная цыпочка из названных городов.

Вам также может понравиться

About the Author: Азат Ахметович

1 комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Максимальный размер загружаемого файла: 999 МБ. Вы можете загрузить: изображение, аудио, видео, документ, таблица, интерактив, текст, архив, код, другое. Ссылки на YouTube, Facebook, Twitter и другие сервисы, вставленные в текст комментария, будут автоматически встроены. Drop files here