Жанр: стратегия/игра для программистов Количество игроков: 2 Платформа: Delphi Версия: глубокая альфа
Когда месяца три назад решил попробовать себя в игрострое, то выбрал не "банальный" платформер, а замахнулся сразу на игру для программистов. Впоследствии оказалось, что это не самый удачный выбор. >_<
Делал долго, делал мучительно. Изначально задуманная красивая архитектура не выдержала суровых реалий и потонула в говнокоде, спрайтики тоже получились так себе, часть свои, а часть потыренные.
Есть огромное желание удалить все нафиг и переписать заново --> то есть, превратить в очередной незавершенный проект.
Дабы избежать этого соблазна (ну и в целом, как ни странно, все это все же работает!), выкладываю свою поделку здесь.
В чем суть: игра для программистов, конкретно для дельфистов, потому что заголовочные файлы есть пока только для Delphi. Игра для двоих: вы пишете своего бота для игры в войнушку, собираете dll и запускаете ее против чужой. Кто лучше закодил, тот и победил. :)
Игрушка очень сырая, графику просьба критиковать умеренно, а вот предложения и замечания по правилам и реализации очень жажду получить. Выкладывайте своих ботов сюда.
Let the battle begins!
1а. Юнит сначала ходит, потом стреляет. Можно стрелять сразу без ходьбы, но после этого ход
юнита заканчиваеся, двигаться он не может.
2. Дальности движения:
танка - 3 клетки
солдата - 2 клетки
пушки - 1 клетка
3. Озера непроходимы, если юнит входит в лес, он останавливается. Передвижение по лесу - 1 клетка в ход.
4. Базовые показатели здоровья юнитов:
Солдаты - 6 хр
Танк - 9 хр
Артиллерия - 4 хр
5. Стрельба:
Солдаты - 2 максимум на 3 клетки по вертикали или горизонтали
Танк - 3 максимум на 3 клетки по вертикали или горизонтали
Артиллерия - бьет в любой квадрат 3х3 клетки. Центральная клетка - 2 повреждения,
остальные 8 - по 1 повреждению.
6. У солдат в лесу есть преимущество: повреждения по ним уменьшаются на 1.
// вражеский юнит - им нельзя управлять IEnemyWarUnit = interface(IUnknown)
function GetCoordinate: TPoint; // координата юнита
function GetHealth: Integer; //количество здоровья
function GetUnitType: TWarUnitType;//тип юнита
end;
// свой юнит IWarUnit = interface(IEnemyWarUnit)
function Place(Coordinate: TPoint): Boolean; // функция размещает юнит на поле
function Move(Direction: TDirection): Boolean; // перемещение юнита на 1 клетку
function Shoot(X, Y: integer): Boolean; // выстрел по указанным координатам (для пушки)
или в указанном направлении
function MovePoints: Integer; // предел движения
function ShotPower: Integer; // сила выстрела
function UnitState: TUnitState; //состояние юнита
function Team: Integer; // номер команды юнита
function Health: Integer; // текущее здоровье юнита
function UnitType: TWarUnitType; // тип юнита
function IsPlaced: Boolean; // проверка, помещен юнит на поле или нет
end;
// интерфейс для поля боя IWarField = interface(IUnknown)
function Height: Integer; //высота поля боя
function Width: Integer; //ширина поля боя
function Terrain(X, Y: Integer): TTerrain; //тип местности в указанной координате
end;
DLL должна реализовывать следующие две функции:
1. procedure PlaceUnits(TeamNumber: Integer; YourUnits: TList<IWarUnit>; WarField: IWarField)
// функция для размещения своих юнитов перед боем
// список юнитов - YourUnits, поле битвы - WarField
// команда определяет вертикаль расстановки юнитов
// для команды 1 - это первая вертикаль с X = 0
// для команды 2 - это последняя вертикаль с X = WarField.Width - 1
// После того, как юнит поставлен, его нельзя перемещать или переставлять.
2. function Proceed2(YourUnits: TList<IWarUnit>; EnemyUnits: TList<IEnemyWarUnit>;
WarField: IWarField): Boolean
- основная функция, которая управляет всеми юнитами игрока
Архив по ссылке
В архиве лежит программа-клиент, в которую и надо вставлять свои dll + заготовка под собственную dll.
Интересно звучит, только лучше наверное сделать не dll, а какой-нибудь скриптовый язык а-ля lua. Запилить рейтинг ботов с игрой по интернету. Пишешь своего бота - выбираешь достойного соперника — fight.
Начал тестовую разработку библиотеки.
Первое, что показалось неудобным, это нехватка процедур инициализации и уничтожения ресурсов библиотеки. Приходится каждый хот создавать и уничтожать все объекты.