«Словохват»
Вчера подсел на игру «Словохват», вроде игра незамысловатая, но очень интересная.
Смысл — занять одну из клеток противника, помеченного «звёздочкой», в терминах игры это называется «столица». Чтобы занять клетку, нужно придумать слово с буквой, которая написана на этой клетке, причём нужно уложиться в отведённое время — сверху тикает таймер.
Клетку можно использовать, только если она примыкает к клетке вашего цвета. Клетки чужого цвета захватываются по тому же правилу, но в первый раз они становятся серыми и только в следующий — вашего цвета.
На медиане поля действуют ещё какие-то законы, пока не разбирался, правила есть на сайте. Длина слов важна — упрощённо, чем длинее слово, тем больше вам даётся очков, за очки можно «покупать» различные штуки — дополнительное время, дополнительную букву, «молнию» (вычищает близкорасположенную клетку от цвета противника).
У автора получилась неплохая такая тактическая игра. Мне играть было скучновато — очень лень выдумывать слова, поэтому я написал небольшую программу на Пайтоне, которая работает со словарём под редакцией профессора Лопатина, ей нужно задать файл словаря и буквы, которые у вас есть, она придумает слово:
Работает неспешно, я оптимизировать не стал, времени, даваемого игрой, на поиск вполне хватает (по крайней мере на моём ноуте). Если кому-то захочется оптимизации, то просто посмотрите как преобразуется словарь и закешируйте преобразованный вариант.
У меня на каждом запуске словарь преобразуется заново. Естественно, в словаре, помимо разрешённых частей речи, есть прилагательные, глаголы и так далее — их я не отфильтровываю, в словаре нет для этого информации.
# coding: utf-8
import itertools
import sys
import codecs
# дружим с консолью
sys.stdin = codecs.getreader('utf-8')(sys.stdin)
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
# строки с пропусками любых букв в любом количестве
def combinations(str):
for l in xrange(2, len(str)+1):
yield itertools.combinations(str, l)
# собираем каждую в строку
def iterstr(str):
for s in itertools.chain(*combinations(str)):
yield u''.join(s)
# все наши комбинации
def uniqcombinations(str):
return set(iterstr(sorted(str)))
# проходим по словарю
def iterdict(name, min, max):
with open(name, 'r') as f:
for line in f:
line = line.strip().decode('cp1251')
# текущее слово должно содержать только буквы и быть не больше искомого слова
if max >= len(line) >= min and line.isalpha():
yield u''.join(sorted(line)), line
# ищем наше слово
def find(word, dictname):
words = uniqcombinations(word)
for line, original in iterdict(dictname, 3, len(word)):
if line in words: print(original)
# запуск программы и небольшая помощь
try:
find(sys.argv[2].decode('utf-8'), sys.argv[1].decode('utf-8'))
except IndexError:
print(u'Запуск: {0} <словарь> <буквы в наличии>'.format(sys.argv[0]))
Писал именно на Пайтоне из-за прекрасного модуля itertools, на этот раз он пригодился функцией combinations — она выдаёт генератор всех комбинаций букв, заданной длины, без изменения их порядка. Очень хорошо, что не пришлось писать этот скучный кусок кода самостоятельно.
Если вы думаете, что выиграть можно бездумно подставляя слова из моей программы, то сильно ошибаетесь — на сайте попадаются противники, которые вас с таким подходом разнесут в пух и прах.
Letterpress ( http://www.atebits.com/letterpress/ ) наше все :-)
Комментарий для bealex.moikrug.ru:
На инглише что ли? :)
Комментарий для Евгения Степанищева:
Угу. Она была первой такой. Бешеная популярность. Очень, очень захватывает. При этом правила сильно проще, чем те, которые ты описал.
Есть и русские варианты, это просто первая.
Комментарий для bealex.moikrug.ru:
Если проще, значит это совсем другая игра. У меня сегодня утром за завтраком, произошла эпичнейшая битва — я проморгал твёрдый знак, противник его занял и пока я отвлёкся на проход к «столице», противник на этом плацдарме обосновался и выиграл меня. С другими правилами это нереально :)
Конечно, я не спорю. Просто увидел похожую картинку и вспомнил про Letterpress. Там тоже бывают эпические битвы, стратегии...
Отказался от регулярок, сделал массив комбинаций и поиск по нему, стало побыстрее.
Комментарий для Евгения Степанищева:
Смысл-то игры не только в тактике, но и в эрудированности. А так можно было бы просто генерировать случайное число — сколько клеток тебе можно занять. Но это была бы уже другая игра. И я встречался с соперниками, которые, видно по лексикону, не сами находят слова. Играть с ними довольно трудно и не интересно, как с роботом.
Комментарий для dionys.moikrug.ru:
У меня эрудированность есть, но «программы перебора» в мозгу нет.
Комментарий для Евгения Степанищева:
Развивай.
Комментарий для dionys.moikrug.ru:
А зачем? Где это может пригодиться?
Комментарий для Евгения Степанищева:
В игре «Словохват».
Комментарий для dionys.moikrug.ru:
Да я как-то не планировал выделять этой игре хоть сколько заметное место в моей жизни :)
Комментарий для Евгения Степанищева:
Но ты же «подсел» по собственным словам, значит играть будешь достаточно часто. А я описал свои ощущения от подобных соперников. Вероятно, подобное отношение не только у меня.
Комментарий для dionys.moikrug.ru:
Я вообще ни во что не играю. Так что для меня «подсел» ≈ «провёл один вечер с этой игрой».
Комментарий для dionys.moikrug.ru:
Если я не буду пользоваться своей программой, слова будут те же, просто я их буду медленнее подбирать и в таймер буду чаще не укладываться. Так что у тебя будет ощущение, что кто-то листает словарь медленно.
Сейчас пришёл домой, попытался сыграть без программы этой. Выиграл.
Комментарий для Евгения Степанищева:
Нет, не правда, слова нужно не только знать, но и «увидеть» среди этих букв. Так что без словаря ты не сможешь выдавать серии 10-буквенных слов, как на приведённом тобой скриншоте. (Такие серии, кстати, показатель, что играет не человек.) Разве что время будет не ограничено, да.
Комментарий для dionys.moikrug.ru:
Ну, это лучший мой скриншот в общем-то :) На других не так впечатляет :) Время поиска не линейно растёт, так что я обычно задаю куда меньше букв для поиска, да и символов неудобных в этот раз мало попалось.
Комментарий для dionys.moikrug.ru:
Вот моя утренняя игра без софта:
http://img-fotki.yandex.ru/get/9761/35419492.dd/0_77366_ed72a81a_L#%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%2B%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%2B2013-12-05%2B%D0%B2%2B14.54.58.png%7Chttp%3A%2F%2Ffotki.yandex.ru%2Fusers%2Fbolknote%2Fview%2F488294%2F%3Fpage%3D3#500x316
Комментарий для Евгения Степанищева:
Неужели с программой стало интереснее? :)
Комментарий для fulc.ru:
С программой я хоть вечер поиграл и утром чуть :)
Есть ли сейчас где-то эта игра с живыми игроками?
Не знаю.