Всем доброго времени суток.
Представляю вашему вниманию свою первую игру Домино :) Собственно, игру писал при изучении Java, поэтому на качество не обессудьте. Теперь гранит сгрызен, а удалять жалко. Может быть кому-нибудь и пригодится. Если кому-то нужно, то подарю исходники.
Развивать не буду, т.к. собираюсь полностью переписать на qt4 (в целях изучения оного). Если кто-то хочет это делать из любви к искусству, то с радостью отдам код :)
До искусственного интеллекта руки не дошли, поэтому противники ходят рандомно. Игра 2x2, доступны режимы Draw и Block, играть можно до 20, 100 и 500 очков.
Скрины:

Сыровато. Начну с интерфейса: При появлении все окна появляются в углу экрана. Этого можно избежать задав относительныю позицию окна функцией setLocationRelativeTo. Главное вызывать её после установки размеров, а то ничего не получится. Во втором режиме игры новое окно с вопросом куда добавлять костяшку появляется всегда заново в левом верхнем углу, а в первом оно остаётся там, где я его оставлял в последний раз. Компановка в диалоге новой игры какая-то тесная. В GridLayoute можно же задавать расстояние между ячейками. Но вообще я как научился использовать GridBagLayout везде пихаю именно его, если нельзя обойтись BorderLayout-ом. Хотя, может для такой простой структуры лучше и обычный грид.
Изображения в игре все можно было нагенерить программно, так они не занимали бы места в архиве с игрой и вообще было бы более круто. Заодно научишься работать и изображениями. Костяшки нарисовать на BufferedImage ничего не стоит. Даже "базар" можно сделать нагенерив несколько изображений со случайно добавленной костяшкой. Так даже добавится разноообразие. Ну а все кнопки и поля это обычный roundRect, тут тоже ничего сложного.
После начала новой игры очки не обнуляются, а остаются теми же, что и были после завершения предыдущеё.
Окно, спрашивающее куда поставить кость иногда выскакивает в тех случаях, когда это не надо. Если на концах одинаковые значения, или я заканчиваю игру, то мне ведь без разницы, куда её положить. Или сделать тогда визуальный выбор. Перетаскивание, допустим, или два мигающих мест, а то диалог как-то недружелюбен.
В качестве улучшения каждому противнику я добавил бы свой AI. Сначала по умолчанию их надо назвать как-нибудь по нормальному. Допустим, как в Червах: Трус, Балбес, Бывалый. Балбес всегда ходит рандомно. Трус кладёт костяшку с наибольшим весом из всех возможных, а бывалый просчитывает от какой костяшки ему можно построить наибольшую непрерывную цепь. Вроде несложно и разнообразит.
В общем, для первой игры не плохо. Думаю, на С++ после Java будет сложнее писать.
Спасибо за критику :)
Первый блин он всегда комом. Зато уже вторую игру буду вытачивать напильником :)
Выложил исходники: Domino (sources)
Тема в архиве.