Для проектирования таблицы в базе данных для типов местности (биомов) учитывая нужные нам характеристики, нам потребуется структура данных, которая вмещала бы всю эту информацию. Вот созданная мной структура таблицы для этой цели:
CREATE TABLE biomes ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, description TEXT, danger_level_text VARCHAR(50), danger_level INT, survival_difficulty_text VARCHAR(50), survival_difficulty INT, occurrence_rate DECIMAL(5,2), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
Пояснения к структуре таблицы:
id
: Уникальный идентификатор биома.name
: Название биома.description
: Описание биома.danger_level_text
: Текстовое описание уровня опасности биома.danger_level
: Числовое значение уровня опасности (от 1 до 10).survival_difficulty_text
: Текстовое описание сложности выживания в биоме.survival_difficulty
: Числовое значение сложности выживания (от 1 до 10).occurrence_rate
: Процентная частота встречаемости биома на карте.created_at
: Дата и время создания записи.updated_at
: Дата и время последнего обновления записи.
Эта структура позволит нам эффективно хранить информацию о каждом биоме и легко выполнять запросы для получения данных о них. А также можно будет добавить другие поля, если возникнет необходимость в дальнейшем расширении функциональности игры или детализации информации о биомах.
Реализация на CodeIgniter 4
Для реализации был создан файл миграции, в котором содержался такой код:
<?php namespace App\Database\Migrations; use CodeIgniter\Database\Migration; class CreateBiomesTable extends Migration { public function up() { $this->forge->addField([ 'id' => [ 'type' => 'INT', 'constraint' => 5, 'unsigned' => true, 'auto_increment' => true, ], 'name' => [ 'type' => 'VARCHAR', 'constraint' => 100, ], 'description' => [ 'type' => 'TEXT', ], 'danger_level_text' => [ 'type' => 'VARCHAR', 'constraint' => 50, 'null' => true, ], 'danger_level' => [ 'type' => 'INT', 'constraint' => 2, 'null' => true, ], 'survival_difficulty_text' => [ 'type' => 'VARCHAR', 'constraint' => 50, 'null' => true, ], 'survival_difficulty' => [ 'type' => 'INT', 'constraint' => 2, 'null' => true, ], 'occurrence_rate' => [ 'type' => 'DECIMAL', 'constraint' => '5,2', ], 'created_at' => [ 'type' => 'DATETIME', 'null' => true, 'default' => null, ], 'updated_at' => [ 'type' => 'DATETIME', 'null' => true, 'default' => null, ] ]); $this->forge->addPrimaryKey('id'); $this->forge->createTable('biomes'); } public function down() { $this->forge->dropTable('biomes'); } }
Ну и как следствие мы получили в таблице структуру и готовый каркас для заполнения всех биомов, которые могут быть на карте игрового мира. Какое в этой таблице есть преимущество?
- Можно по примеру и структуре добавлять любое количество биомов даже когда уже игра будет работать и в нее будут играть
- Можно без особого труда для каждой генерации мира (каждый вайп — обнуление игровой карты и всех данных игроков) менять % количества этого биома на карте
- Можно добавлять любое количество полей, которые могут со временем понадобиться в игровом мире или логике игры
Вот такие данные, пока что у нас есть в таблице отвечающей за биомы. Важно отметить, что балансировка местности в процентном соотношении каких биомов сколько должно быть на карте еще не производилась, это будет в будущем. Скорее всего на том этапе, где будет писаться логика автоматической генерации игрового мира.