Морской бой для линукс

Battleship

Battleship — вариация игры Морской бой для Linux. Противником в игре является компьютер, вы расставляете свои корабли на игровом поле, а затем по очереди пытаетесь найти и уничтожить корабли противника.

Игровое поле представлено двумя областями. Слева ваше поле, на котором размещаются ваши корабли, справа поле, на котором вы отмечаете свои ходы и топите корабли компьютера.

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

Battleship немного отличается от привычной нам игры Морской бой.

Как играть в Battleship

В самом начале игры вы должны расставить на своем поле свои корабли. Компьютер расставляет свои корабли у себя (вы этого, конечно, не видите). Когда вы это сделали, игра начнется.

Теперь по очереди с компьютером вы должны совершать ходы. На правом поле вы делаете выстрел (нажимаете левую кнопку мыши по какой-нибудь клетке). Если в клетке, на которую вы нажали, нет корабля противника, тогда на ней отобразится число. Это число является подсказкой. Например, на клетке появилось число 2, это значит, что на горизонтальной полосе и вертикальной полосе (или на одной из них), проходящих через эту клетку находится в сумме 2 корабля. Если появилось число 0, это значит, что на всем перекрестье (на вертикальной и горизонтальной полосе, которые проходят через эту клетку) кораблей нет и вы можете правой кнопкой мыши отметить эти клетки (при клике правой кнопкой мыши на клетке появляются волны). На эти клетки уже нет смысла нажимать, так как кораблей там не будет.

Кто первый уничтожит все корабли противника, тот и выиграл. Попробуйте поиграть, в процессе игры все станет ясно.

Установка игры Battleship в Ubuntu Linux

Для установки игры из PPA репозитория выполните в терминале следующие команды:

Для запуска игры из командой строки выполните в терминале:

Источник

Ubuntu66.ru — новости, уроки, помощь, поддержка.


Battleship — игра в Морской бой для Linux. Противником в игре является компьютер, вы расставляете свои корабли на игровом поле, а затем по очереди пытаетесь найти и уничтожить корабли противника.

Игровое поле представлено двумя областями. Слева ваше поле, на котором размещаются ваши корабли, справа поле, на котором вы отмечаете свои ходы и топите корабли компьютера:

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

Battleship немного отличается от привычной нам игры Морской бой.

Как играть в Battleship

В самом начале игры вы должны расставить на своем поле свои корабли. Компьютер расставляет свои у себя (вы этого, конечно, не видите). Когда всё расставлено, игра начнется.

Теперь по очереди с компьютером вы должны совершать ходы. На правом поле вы делаете выстрел (нажимаете левую кнопку мыши по какой-нибудь клетке). Если в клетке, на которую вы нажали, нет корабля противника, то на ней отобразится число. Это число является подсказкой. Например, на клетке появилось число 2, это значит, что на горизонтальной полосе и вертикальной полосе (или на одной из них), проходящих через эту клетку находится в сумме 2 корабля. Если появилось число 0, это значит, что на всем перекрестье (на вертикальной и горизонтальной полосе, которые проходят через эту клетку) кораблей нет и вы можете правой кнопкой мыши отметить эти клетки (при клике правой кнопкой мыши на клетке появляются волны). На эти клетки уже нет смысла нажимать, так как кораблей там не будет.

Кто первый уничтожит все корабли противника, тот и выиграл. Попробуйте поиграть, в процессе игры все поймёте.

Установка игры Battleship в Ubuntu/Linux Mint

Откройте терминал, скопируйте и выполните следующие команды:

sudo add-apt-repository ppa:finteis/battleship
sudo apt-get update
sudo apt-get install battleship

После установки вы можете запустить Battleship из Меню ->Приложения ->Игры ->Battleship:

Источник

Морской бой с искусственным интеллектом — по-честному

Раз пошла такая пьянка (respect!), решил выложить в opensource свою поделку — игру в морской бой. Проект хостится на googlecode. Там есть SVN. Кроме того, исходники и виндовую сборку можно забрать прямо с моего домашнего компа (почему так — под катом). Основные фичи:

  • написан на Qt — запускается где угодно (причём используются только базовые возможности, вам не придётся доустаналивать какой-нибудь QSvgRenderer)
  • имеет несколько вариантов правил (нужны ещё? — пишите! :-))
  • играет честно (то есть, при выдумывании хода, компьютер не подглядывает в ваше поле)
  • автоматическая и ручная расстановка кораблей и прочие мелочи

Собственно, это всё, что я отдаю человечеству, но… взамен я надеюсь на некоторый feedback ,-)

Осторожно — хабрэффект! 🙂
Коллеги! Сейчас с моего домашнего компа одновременно идёт более сотни скачиваний (обслуживается более ста соединений). Скачивание виндового дистрибутива может занять 10-20 минут, не все браузеры это выдерживают 🙂 Пользуйтесь даунлоадилками, или подождите спада хабраэффекта.
Ещё раз приношу извининея. Никак не мог ожидать такого качалова. Уже более 1000 скачианий :-). Жду ваших комментариев. Спасибо!

Вывалил наспех 🙂
Можно взять всё не из дома!
Сорци
Под винду
(из дома скачали уже больше 3000 копий 🙂 я ожидал, ну максимум 100 :-))

pfactum сообщает, что у него не собиралось из сорцов под Linux и проблема решилась добавлением в src/logic/arena.cpp строчки «#include «. Видимо, проблема действительно имеет место быть. Если у кого-то есть ещё такие проблемы — пишите.

Читайте также:  Какие драйвера нужны перед установки windows

Прежде всего, спасибо за любые комментарии, но одни комментарии мне будут дороже других 🙂

Сейчас мне важнее всего обнаружить

  • возможные нелогичности в работе программы (на пример, если можно стрелять по врагу даже после окончания игры)
  • возможные опечатки в сообщениях
  • принимаются любые предложения, делающие сообщения более понятными

Хорошо: «у приложения нет иконки». Хорошо: «слово `has’ написано не в том пªдеже». Такие предолжения будут сразу учтены. Предложения типа «хорошо бы можно было грабить корабли и насиловать матросов обоего пола» будут рассматриваться не раньше 2012 года 🙂

Теперь несколько слов, предвосхищающих вопросы.

А будут сборки под мою любимую ОС?

У меня три новости: плохая, хорошая и ещё одна хорошая.

Плохая: я уже создал несколько opensource проектов и пришёл к выводу, что я не в состоянии поддерживать актуальные сборки для всех ОС один. Для этого проекта я принципиально не буду выкладывать сборки.

Хорошая: я обнаружил, что находятся люди, для которых не сложно выкладывать сборки, пакеты, порты, билды… для их любимых ОС.

Я очень надеюсь, что у этой маленькой программки найдутся ценители, которые возьмут на себя скромный труд собирать и выкладывать бинарники. Я с благодарностью размещу на сайте проекта ссылки на эти сборки.

Кроме того, я уверен, что пользователи соотвествующих ОС и дистрибутивов смогут оформить бинаринки в духе и в стиле этих ОС. Например, что я сделал для пользователей Windows? — тупой zip-архив с exe-шником и необходимыми dll-ками. А правильный путь, наверно сделать msi, или инсталяшку какую-нибудь. Чтобы бинарник ставился куда надо, чтобы появлялись иконки, чтобы ОС знала о новом софте и могла его обносить и/или удалить… Я этого делать не умею. И освоить такое искуство для всех и вся… нет — я не в состоянии. Я думаю, что все выиграют, если я не буду брать на себя непосильную ношу и делать корявые сборки. Пусть этим займутся профессионалы.

И ещё одна хорошая новость: для текущей версии я собрал виндовую сборку и вы можете забрать её с моей домашней машины 🙂 Я сижу на стриме поэтому (1) скорость на отдачу очень не высока, и (2) связь рвется раз в сутки. Прошу простить за неудобства 🙂

Что за извращение!? Почему не выложить бинарники и исходники на том же googlecode?

Ну с бинарниками у меня принципиальная позиция (см. выше), а исходники в виде архива обязательно выложу, когда зарелизю окончательную версию 1.0. Пока вы можете взять их из гуглового SVN, или в виде архива с моего домашнего компа. Мне просто не охота засорять download-секцию pre-release версиями. В googlecode удалить из download-секции ничего нельзя; мне не хочется, чтобы там вечно хранились девелоперские варианты.

Я посмотрел ваш код… он странный

О да. Чтобы хотя-бы частично развеять удивление тех, кто заглянул в код, расскажу его историю.

Эра перла. Несколько лет назад я написал на коленке web-приложение «Морской бой». Было оно (оно и сейчас здравствует) сотворено на перле. Логика включала несколько существенных упрощений, что иногда приводило к неадекватностям, но на это можно было закрыть глаза. Написал и забросил.

Эра питона. Больше года назад я пошёл на google developers day 2008. Перед этим делом я решил попробовать GAE. Ничего нового я придумывать не стал, а перекатал перловый код на Python. Причесал его слегка, чуть подчистил протокол взаимодействия с сервером… Но никаких принципиальных изменений не произошло — только смена языка.

Эра питона: смута. На питоне с кодом стало работать приятно и я решил попробовать сделать что-нибудь интересненькое. (Да, — забыл сказать, — GAE меня не вдохновил и я забросил GAE-проект; почему не вдохновил, могу рассказать в комментариях, а сейчас не об этом.) Решил я сделать шестиугольный морской бой. Не квадратные клетки, а шестиугольные соты. Чтобы было удобно работать с сотами, написал несколько классов, и работа оказалась фантастически лёгкой. Идеи, положенные в основу этого кода мне очень понравились, они более чем оправдали мои ожидания. А вот игра получилась не интересная, обычный морской бой на много интересней. Поэтому этот проект я тоже забросил.

Эра Qt. Летом этого прошлого года мне пришлось… одним словом, по работе, я столкнулся с Qt и многие идеи Qt мне очень понравились. Я решил переписать моё питонское шестиугольное чудо в классический Qt/C++ морской бой. Структура классов была взята из питонского прототипа — придумывать ничего не пришлось. Были устранены все логические «упрощения», приводившие к безумной игре компьютера. Было прикручено Qt и GUI.

Теперь мы имеем то, что имеем.

Вся логика написана, как самостоятельная библиотека. Она не требует ни Qt, ни даже STL. Однако тут классы распиханы по файлам наиболее странно. И местами код требует «си-плюс-плюс-пизации» 🙂 Это связано с питонской предысторией этого кода.

Весь GUI написан на Qt. Здесь управление памятью полностью отдано на откуп Qt-механизму, всем правят сигналы. Если вы захотите переписать GUI, то сделать это очень легко! Достаточно поддержать обработку всего нескольких сигналов.

Кроме того, есть Qt-класс, управляющий ходом игры. Он хранит состояние игры, получает сигналы от пользователя и передает их GUI. Строго говоря, дело чуть упростилось бы, если бы этот класс был разбит на два… но правильней, наверно, было бы использовать машину состояний… в общем, и тут есть что подправить 🙂

Вот и всё. Каждая отдельная деталь этого аппарат хранит некоторые исторические рудименты и/или следы поспешного и не очень аккуратного написания. Однако, всё вместе скомпоновано достаточно стройно, и если у меня будет кураж, я потихоньку перепишу всё. Однако, сейчас мы имеем вполне рабочую версию программы. Выкладывая её я хотел бы

  1. порадовать людей уже сейчас
  2. понять, а надо ли ещё что-то дорабатывать, или забросить этот проект, как и всех его предшественников.
Читайте также:  Mod для windows media

Всем успехов в борьбе с искусственным интеллектом на морских просторах! 🙂

Источник

Морской бой за 25 мс

Предисловие

Несколько месяцев назад я решил изучить Python. В качестве одной из тестовых задач требовалось написать игру «Морской бой». Тогда я не сделал эту задачу, но в голову пришла идея написать «Морской бой», где будут играть два компьютера между собой. Эта мысль не оставляла меня, и я решил дерзнуть. Результат представлен на ваш суд. Буду признателен за любую конструктивную критику.

Общая концепция текущей реализации

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

Стратегия расстановки кораблей следующая: 2-3-4 палубные размещаются по краям карты (2 клетки), 1-палубный в центре (квадрат 6х6).

Стратегия ходов, как в игре между людьми: первый ход наобум, если попал, то прорабатываем 4 клетки вокруг и далее, если попал повторно, то прорабатываем по две клетки уже на линии (две, т.к. макс. длинна корабля 4 клетки, в 2 уже попал, значит макс. есть ещё 2 клетки).

В статье на Википедии всё достаточно подробно описано, поэтому не буду здесь сильно касаться игровой логики, тем более, что и так все примерно понимают, о чём идёт речь. У меня отличия только такие: начисление очков за каждый ход, нумерация клеток от 0 до 9.

В игре используются три класса: Game, Player, Ship. Использование класса Game в текущей реализации избыточно, так как используется всего один его экземпляр, но это некоторый задел на будущее (см. список улучшений в конце статьи).

Game отвечает за общую игровую логику, Player — за стратегию ходов, Ship — хранит текущее состояние кораблей и их координаты.

Ссылка проект в GitHub.

Основные сложности, которые возникли входе разработки

1. Проектирование. Писать с использованием классов или функций? Какой набор классов использовать?
Основной проблемой при проектировании оказалось отслеживание различных состояний в игре. Например, кто сейчас ходит, в каком состоянии корабль (подбит, убит), не закончилась ли игра, кто выиграл и т.п.

2. Логика/алгоритмы. Как расставить корабли в соответствии со стратегией, как выбрать координаты для хода?

Обзор наиболее интересных частей кода

return_shoot_state — определяет дальнейшую стратегию в зависимости от результатов текущего хода.

Важные переменные: recomendation_pool — список координат для будущих выстрелов, succ_shoots — последний успешный выстрел.

Если мы попали в корабль, то, во-первых, нужно начислить себе очки за успешный выстрел (scores += 1), а во-вторых, понять, что делать дальше. Мы проверяем recomendation_pool, есть ли там что-то, если нет, то записываем туда 4 близлежащих координаты (предварительно отфильтровав их по границам поля и списку координат, по которым мы уже стреляли).

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

Если текущим выстрелом корабль был потоплен, мы считаем свою задачу выполненной и зачищаем пул рекомендаций и проч. Следующий выстрел будет выполнен случайным образом.

service.gen_cord — генерирует все возможные координаты для каждого типа кораблей. Результатом работы функции будет словарь со следующей структурой: <«S0»:[[[x0,y0],[x1,y2],[xN0,yN1]], [[x3,y3],[x4,y4],[xN2,yN3]], . ], «S1»: . >, где S — тип корабля, [[x0,y0],[x1,y2],[xN0,yN1]] — набор координат для корабля.

Важные переменные: all_comb — хранит координаты поля в формате [[x0,y0], [x1,y1], . ]. for_1_ship — тот самый квадрат 6х6 для однопалубных, for_other_ship — набор координат для всех остальных кораблей. cord_comb — словарь, который хранит все комбинации координат.

Расстановка кораблей

В момент инициализации экземпляра класса Player также расставляются и корабли. В классе за это отвечает метод create_ships, где происходит следующее:

1. Для каждого корабля (ships) из доступной последовательности комбинаций координат (combinations) псевдослучайным образом (random.choice) выбирается набор координат.
2. Далее для набора координат генерируется ореол (service.set_halo). Ореол — это набор координат в которые нельзя будет поставить потом корабль (правило: не размещать корабли рядом).

3. После чего зачищаем список комбинаций (data_cleaner) из списка который состоит из координат корабля и ореола.

Модуль Logging

Под конец разработки открыл для себя модуль logging из стандартной библиотеки. Поля для вывода настраиваются (logging.basicConfig), а работать с выводом не сложнее, чем с print.

Прочее

sevice.rdn_usr_name — генерирует случайные имена игроков из набора букв и цифр от 0 до 999.

Игра заканчивается, если у противника Player.ships_defeat = 10, т.е. потоплены все 10 кораблей. Счётчик обновляется, если корабль отвечает «Убил!».

Список улучшений (TO DO)

1. Сделать турнир между игроками, скажем, где будет 1000 игроков. По идее, с учётом текущего времени выполнения весь турнир должен занять примерно 30 сек.

2. Добавить «базовый алгоритм» хода, например, ходить крест на крест, т.е. пробивать все клетки по диагонали и потом далее. Реализовать несколько таких алгоритмов и далее присваивать случайным образом работу по ним игроку. После чего сравнивать эффективность (например, что даёт больше результата случайные ходы или алгоритм «крест на крест»?)

3. Оптимизировать механизм поиска комбинаций (service.gen_cord), т.к. очевидно, что он избыточен и отнимает много ресурсов.

4. Реализовать различные стратегии размещения кораблей и потом сравнить какая из них наиболее успешна.

P.S. Буду признателен за любые интересные идеи.

Турнир реализован + сделан небольшой сбор статистики и вот что получается:

В турнире идёт игра на вылет, т.е. если проиграл на след. ступень уже не попадаешь.

Чтобы турнир был без косяков количество игроков должно быть, чтобы при делении остаток от деления всегда делился на 2 и так до того как число игроков в турнире не будет 1 (т.е. победитель). К таким числам относятся 1024 (512, 256, 128, 64, 32, 16, 8, 4, 2).

Ранее я предполагал, что турнир будет длиться порядка 30 секунд, т.е. время вырастает линейно в зависимости от количества игроков, однако каково же было моё удивление, когда весь турнир для 1024 игроков всего 17 секунд. Почему получается 17 секунд мне не ведомо, возможно начинают работать какие-то механизмы оптимизации. Мои расчеты таковы: 1022 партии длится весь турнир* 25 мс одна партия = 25.55 секунд.

Читайте также:  Как переустановить драйвер сетевой карты windows 10

Статистика турнира держится в пределах следующих значений:

1. Среднее количество ходов (всех игроков): 85.06,
2. Среднее количество ходов выигравших игроков: 85.95,
3. Среднее количество ходов проигравших игроков: 84.17,
4. Среднее количество очков, которое набрали проигравшие: 17.75

Выводы можем сделать следующие:

1. Количество ходов, что выигравшие, что проигравшие делают примерно одинаковое.

2. Количество очков почти 18 (для победы нужно 20).

Итог: оба игрока играют примерно одинаково и одинаково неэффективно 🙂 Разница в 2 очка показывает, что победа буквально вырывается из лап соперника на последних ходах.

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

Следите за обновлениями статьи.

UPDATE2(16.01.2015)
Реализовал добавление ореола к списку пробитых координат после потопления корабля (в принципе всё честно). Статистика по количеству ходов существенно улучшилась:
1. Среднее количесво ходов (всех игроков): 58.91,
2. Среднее количество ходов выйгравших игроков: 60.98,
3. Среднее количество ходов проигравших игроков: 56.83,
4. Среднее количество очков, которое набрали проигравшие: 15.37

Спасибо Meklon за идею.

Реализовал новые стратегии размещения кораблей (там где 60 клеток под однопалубные). В итоге получилось следующее, если каждый из игроков использует одну и туже стратегию, то разницы между проигравшими и победителями нет, а вот если кажому игроку стратегия расстановки присваивается случайно, то явно видно, что прогиравших с моей стратегией больше (квадрат 6х6 в центре), т.е. если мою стратегию выбросить, то все будут играть примерно одинаково. Это тоже не интересно. Теперь буду реализывать различные стратегии ходов (может найдётся, что-то сверхоптимальное).

left,right, top,bottom и т.п. — это всё вариации размещения 60 координат на поле.
[2015-01-17 19:14:07,780] Статистика:
1. Среднее количесво ходов (всех игроков): 63.18,
2. Среднее количество ходов выйгравших игроков: 64.82,
3. Среднее количество ходов проигравших игроков: 61.54,
4. Среднее количество очков, которое набрали проигравшие: 16.24
[2015-01-17 19:14:07,783] Стратегия: for_1_ship_left loosers: 508
[2015-01-17 19:14:07,783] Стратегия: for_1_ship_left winners: 515

[2015-01-17 19:20:27,526] Статистика:
1. Среднее количесво ходов (всех игроков): 62.58,
2. Среднее количество ходов выйгравших игроков: 64.23,
3. Среднее количество ходов проигравших игроков: 60.93,
4. Среднее количество очков, которое набрали проигравшие: 16.23
[2015-01-17 19:20:27,529] Стратегия: for_1_ship_right loosers: 498
[2015-01-17 19:20:27,529] Стратегия: for_1_ship_right winners: 525

[2015-01-17 19:21:40,153] Статистика:
1. Среднее количесво ходов (всех игроков): 58.94,
2. Среднее количество ходов выйгравших игроков: 61.02,
3. Среднее количество ходов проигравших игроков: 56.87,
4. Среднее количество очков, которое набрали проигравшие: 15.35
[2015-01-17 19:21:40,155] Стратегия: for_1_ship_36 loosers: 518
[2015-01-17 19:21:40,157] Стратегия: for_1_ship_36 winners: 505

[2015-01-17 19:23:37,322] Статистика:
1. Среднее количесво ходов (всех игроков): 62.85,
2. Среднее количество ходов выйгравших игроков: 64.55,
3. Среднее количество ходов проигравших игроков: 61.16,
4. Среднее количество очков, которое набрали проигравшие: 16.15
[2015-01-17 19:23:37,323] Стратегия: for_1_ship_bottom loosers: 526
[2015-01-17 19:23:37,325] Стратегия: for_1_ship_bottom winners: 497

[2015-01-17 19:33:07,933] Статистика:
1. Среднее количесво ходов (всех игроков): 61.59,
2. Среднее количество ходов выйгравших игроков: 63.37,
3. Среднее количество ходов проигравших игроков: 59.81,
4. Среднее количество очков, которое набрали проигравшие: 15.95
[2015-01-17 19:33:07,934] Стратегия: for_1_ship_center_vertical loosers: 512
[2015-01-17 19:33:07,934] Стратегия: for_1_ship_center_vertical winners: 511

[2015-01-17 19:36:03,585] Статистика:
1. Среднее количесво ходов (всех игроков): 61.03,
2. Среднее количество ходов выйгравших игроков: 62.89,
3. Среднее количество ходов проигравших игроков: 59.18,
4. Среднее количество очков, которое набрали проигравшие: 15.78
[2015-01-17 19:36:03,589] Стратегия: for_1_ship_36 loosers: 148
[2015-01-17 19:36:03,589] Стратегия: for_1_ship_36 winners: 109
[2015-01-17 19:36:03,591] Стратегия: for_1_ship_bottom loosers: 34
[2015-01-17 19:36:03,591] Стратегия: for_1_ship_bottom winners: 50
[2015-01-17 19:36:03,591] Стратегия: for_1_ship_center_horisontal loosers: 129
[2015-01-17 19:36:03,591] Стратегия: for_1_ship_center_horisontal winners: 120
[2015-01-17 19:36:03,592] Стратегия: for_1_ship_center_vertical loosers: 96
[2015-01-17 19:36:03,592] Стратегия: for_1_ship_center_vertical winners: 94
[2015-01-17 19:36:03,592] Стратегия: for_1_ship_left loosers: 28
[2015-01-17 19:36:03,592] Стратегия: for_1_ship_left winners: 44
[2015-01-17 19:36:03,592] Стратегия: for_1_ship_right loosers: 40
[2015-01-17 19:36:03,594] Стратегия: for_1_ship_right winners: 48
[2015-01-17 19:36:03,594] Стратегия: for_1_ship_top loosers: 35
[2015-01-17 19:36:03,594] Стратегия: for_1_ship_top winners: 48

Добавил различные варианты совершения ходов: random — случайно из свободных клеток, cross — крест на крест, linear — линейно в 4 ряда через одну (как в хвалёных статьях). Важный момент: стратегия расстановки кораблей выдаётся на весь турнир, а вот стратегия ходов выдаётся на каждую игру.

Собрал статистку (напомню речь идёт о турните, где 1024 игрока играют между собой на вылет).

Основные выводы:
Стратегии расстановки однопалубных кораблей random_12 (выбирается 12 случайных клеток и в них расставляем корабли) и for_1_ship_36 (поле 6х6 в центре) явно наименее эффективные.

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

Количество ходов с реализацией дополнительных стратегий ходов не уменьшилось, а вот время турнира увеличилось с 25 до 50 секунд:
1. Среднее количесво ходов (всех игроков): 61.43,
2. Среднее количество ходов выйгравших игроков: 63.23,
3. Среднее количество ходов проигравших игроков: 59.63,
4. Среднее количество очков, которое набрали проигравшие: 15.93

Буду признателен, если кто-то посмотрит мой код на GitHub и даст свои рекомендации по его улучшению.

Осталась одна намеченная задача по оптимизации, но, как известно, оптимизировать можно бесконечно долго, так что статья без особой надобности в ближайшее время обновляться не будет.

Спасибо за внимание и да прибудет с вами сила Python!

Источник

Оцените статью