Найти в Дзене

Бот для игры в слова на PYTHON!

Решил вот рассказать вам про своего старого бота, которого написал летом со скуки. Как вы догадались, он играет в слова! И даже более того, он может обучаться прямо во время игры! В статье я расскажу о том, как написать такого бота и как он работает, возможно, это будет кому-нибудь полезно. Ссылка на полный код в конце статьи.
Оглавление

Решил вот рассказать вам про своего старого бота, которого написал летом со скуки. Как вы догадались, он играет в слова! И даже более того, он может обучаться прямо во время игры! В статье я расскажу о том, как написать такого бота и как он работает, возможно, это будет кому-нибудь полезно. Ссылка на полный код в конце статьи. Начнем!

0. Инициализация переменных и считывание "словаря"

В самом начале нам необходимо инициализировать переменные и, самое важное, создать словарь, на основе которого бот будет играть в слова.

Создадим текстовый файл в той же папке, что и сама программа. У меня он называется listfile. Запишем в него где-то 10 слов, по 1 в каждой строке, чтобы у бота был начальный "капитал", примерно вот так:

Далее инициализируем нужные переменные и откроем словарь из файла:

Dict = []
used=[]  # использованные слова
last= '0101010100101' # последнее наше слово. Если нашего слова не было, то у переменной фиксированное значение.

# откроем файл и считаем его содержимое в список
with open ('listfile.txt' , 'r' ) as filehandle:
for line in filehandle:
# удалим заключительный символ перехода строки
currentPlace = line[:-1 ]

# добавим элемент в конец списка
Dict.append(currentPlace)

1. Ход игрока

В моем боте первый ход делает игрок. Если вам нужно будет это изменить, то особого труда это не составит, так что я не буду уделять этому внимание.

word_input = input ('Введите слово' )

Казалось бы, все, но нет. Нам ведь не нужно, чтобы игрок дурил нашего бота и писал ему слова, которые уже были использованы, или не подходят правилам игры. Иначе в боте нет смысла, не так ли?

Поэтому пишем условия:

# проверка на использованность слова
if word_input in used:
print ('Это слово было, введите другое' )
word_input = input ('Введите слово' )
# проверка на последнюю букву слова игрока
elif last[-1 ] != word_input[0 ] and last != '0101010100101' and last[-1 ] != 'ь' and last[-1 ] != 'ъ' :
print ('Тебе меня не обмануть, давай нормальное слово' )
word_input = input ('Введите слово' )
elif last[-2 ] != word_input[0 ] and last != '0101010100101' and (last[-1 ] == 'ь' or last[-1 ] == 'ъ' ):
print ('Тебе меня не обманнуть, давай нормальное слово' )
word_input = input ('Введите слово' )

Я также добавил проверку на то, является ли последний символ ь или ъ, ибо по правилам в таких случаях последнюю букву просто игнорируют и работают с предпоследней.

3. Обучение бота.

Но мы же хотим, чтобы наш бот обучался во время игр, не так ли? Пополнял словарь Поэтому необходимо написать следующее:

# если слово незнакомое - добавить его в словарь
if word_input not in Dict:
Dict.append(word_input)
# запись в файл
with open ('listfile.txt' , 'w' ) as filehandle:
for listitem in Dict:
filehandle.write('%s \n ' % listitem)

4. Наш ответ игроку

Итак, империя наносит ответный удар. Вернее бот.

Разобьем нашу стратегию ответа на 2 случая:

  1. Если последний символ в слове игрока - не мягкий или твердый знак:
if word_input[-1 ] != 'ь' and word_input[-1 ] != 'ъ' :
# перебираем все известные боту слова
for dict_word in Dict:
win = False # не знаю, зачем эта переменная, но не буду чиниить то, что работает
# если слово неиспользовано и удовлетворяет правилам
if dict_word[0 ] == word_input[-1 ] and dict_word not in used and dict_word!=word_input:
print ('Мой ответ: ' , dict_word)
win = True
# Добавляем слова в использованные
used.append(dict_word)
used.append(word_input)
# записываем наш ход
last = dict_word
# выходим из цикла
break

ну, и предполагая, что игрок смог нас обыграть:

# если не нашли ответа, то игрок победил
elif dict_word[0 ] != word_input[-1 ] and dict_word == Dict[-1 ] and win == False :
print ('YOU WIN!!!' )
# возвращаем исходные значения
used = []
last = '0101010100101'

2. Если последний символ в слове игрока - это мягкий или твердый знак:

# действия, если последний символ "ь" или "Ъ"
if word_input[-1 ] == 'ь' or word_input[-1 ] == 'ъ' :
for dict_word in Dict:
win = False
if dict_word[0 ] == word_input[-2 ] and dict_word not in used and
dict_word!=word_input:
print ('Мой ответ: ' , dict_word)
win = True
used.append(dict_word)
used.append(word_input)
last = dict_word
break
elif dict_word[0 ] != word_input[-2 ] and dict_word == Dict[-1 ] and win == False :
print ('YOU WIN!!!' )
used = []
last = '0101010100101'

Ну вот и все, бот готов. Осталось только обернуть все это дело в цикл while True, чтобы можно было играть бесконечно, и можно радоваться жизни. Надеюсь, этот бот будет кому-то полезен.

Полный код на ЯД:

https://yadi.sk/d/3guXGSHXmDis3A

Мой блог в телеграмм, подписывайтесь, планирую там еще много подобного поделать:

https://t.me/NineOblomeow