Крестики-нолики

Apr 27, 2013 06:01


Зашёл я не так давно к господину Цветкову на сайт (посмотреть, сколько дней уже живёт наша конфа в контакте) и в который раз наткнулся на статью с Хабра "Как начать писать игры". Снова прочёл. Помечтал о своей "Самой Лучшей Игре Всех Времён" и пошёл писать... "крестики-нолики". Ну, а что? Рекомендовали начинать с простых проектов, да и автор статьи пишет, что начинал с этой же игры. Никогда бы не подумал, но в реализации этой простенькой игры скрыт довольно большой потенциал для обучения.
Итак, по порядку. Как и рекомендует статья, первым делом я быстренько накатал версию игры для двух живых игроков на одном компьютере. Консольный вариант, конечно! Какая там графика, о чём вы?
Что умеет?
Зато игра умеет предложить выбор размера поля от 3x3 до 5x5, контролирует правильность ходов (не даёт сходить в занятую клетку и мимо поля) и проверяет, не привёл ли сделанный ход к окончанию игры.
Что не умеет?
1) Только сейчас вспомнил об этом: хоть и есть счётчик ходов, но проверка на победу осуществляется с первого же хода.
Проверку разумно начинать только с хода номер (2*(размер стороны поля) - 1).
2) Не умеет распозновать заранее ситуацию с ничьёй. В "крестиках-ноликах" не обязательно заполнять всё поле до конца, чтобы объявить о ничье. Достаточно знать, что в каждой строке и столбце, и в обоих диагоналях уже есть ходы обоих игроков.
3) Есть ещё претензия на тему ввода значений (координат хода, в частности). Считывание там идёт именно целых значений, и при вводе букв, например, начинается какая-то "котовасия". Либо я не умею пользоваться этим самым безопасным scanf_s(), либо всё-таки надо считывать строку, проверять, введена ли там пара целых координат, и конвертировать их уже в числа. Другой вариант решения, к которому я и хочу обратиться - графический интерфейс вместо консольного, где проблема ввода значений отпадёт сама собой.
Кое-что про начинку.
0) Пишу на C++ (точнее, там пока практически чистый C). Да, я отложил изучение C#, ибо мощнейший инструмент, но несколько специфичный, и для нынешних задач избыточен и, боюсь, если не непригоден, то сложен для реализации задумок. Да и что уж там говорить, в "плюсах" я фигово разбираюсь, и можно их ещё основательно покопать, реализуя на них разные игры.
1) Поле - целочисленная матрица, где каждая ячейка может принимать следующие значения: нуль (пустая клетка), 1 или -1 ( в клетке стоит крестик или нолик).
Показ поля - стандартный построчный вывод матрицы. В случае нуля в ячейке в консоль выводится прочерк "-", а в случае единицы или минус единицы - "X" или "O", соответстенно.
2) Проверка на победу идёт по конкретному ходу. Определяется сумма по строке, куда делается ход, по соответствующему столбцу, а также по соответствующим диагоналям, если ход пришёлся на них тоже. В процессе вычисления суммы контролируется наличие ходов обоих игроков в суммируемом ряду. При возникновении этой контролируемой ситуации суммирование прерывается и по ряду выдаётся вердикт "ничья". Если описанного прерывания не произошло, проверяем сумму ряда на равенство плюс-минус размеру стороны поля.
Можно также было бы ещё хранить в отдельном месте инфу по уже проверенным рядам, использовать и корректировать её в ходе проверок на победу.

Как-то так. Не стал кодить игру с компьютером, который просто делает рандомные ходы. А влез в то, во что автор статьи советовал влезать не особо - создание ИИ. Ибо тема "артификал интеллидженс" мне интересна. Тем более это оказалась ещё одна богатая тема для обучеия. Об этом в следующем посте.

Posted via LiveJournal app for iPad.

coding

Previous post Next post
Up