// Размер игрового поля
const gridSize = 65;
// Создание игрового поля
function createGameGrid() {
const gameGrid = [];
for (let i = 0; i < gridSize; i++) {
const row = [];
for (let j = 0; j < gridSize; j++) {
row.push("field");} // Изначально все клетки поля
gameGrid.push(row);}
return gameGrid;}
// Генерация ландшафта
function generateLandscape(gameGrid) {
const totalCells = gridSize * gridSize;
const fieldCount = Math.floor((totalCells * 50) / 100);
const sandCount = Math.floor((totalCells * 5) / 100);
const forestCount = Math.floor((totalCells * 15) / 100);
const mountainCount = Math.floor((totalCells * 10) / 100);
const cellTypes = [];
for (let i = 0; i < fieldCount; i++) {
cellTypes.push("field");}
for (let i = 0; i < sandCount; i++) {
cellTypes.push("sand");}
for (let i = 0; i < forestCount; i++) {
cellTypes.push("forest");}
for (let i = 0; i < mountainCount; i++) {
cellTypes.push("mountain");}
for (let i = 0; i < gridSize; i++) {
for (let j = 0; j < gridSize; j++) {
const randomIndex = Math.floor(Math.random() * cellTypes.length);
gameGrid[i][j] = cellTypes[randomIndex];}}
return gameGrid;}
// Генерация реки
function generateRiver(gameGrid) {
const startRow = Math.floor(Math.random() * gridSize); // Стартовая позиция реки (случайная строка)
const startCol = 0; // Начало реки на краю поля (первая колонка)
const endRow = Math.floor(Math.random() * gridSize); // Конечная позиция реки (случайная строка)
const endCol = gridSize - 1; // Конец реки на краю поля (последняя колонка)
let row = startRow;
let col = startCol;
let waterCount = 0; // Счётчик клеток с водой
while (row !== endRow || col !== endCol) {
// Проверяем, является ли текущая клетка уже водой
if (gameGrid[row][col] !== "water") {
gameGrid[row][col] = "water"; // Устанавливаем текущую клетку как воду
waterCount++;} // Увеличиваем счётчик клеток с водой
// Проверяем, достигло ли количество клеток с водой заданного предела
if (waterCount === 850) {
break;} // Выходим из цикла
const directions = [
{ dx: 0, dy: -1 }, // Вверх
{ dx: 1, dy: 0 }, // Вправо
{ dx: 0, dy: 1 }, // Вниз
{ dx: -1, dy: 0 } // Влево
];
// Выбираем случайное направление движения
const randomDirection = directions[Math.floor(Math.random() * directions.length)];
// Перемещаемся в выбранном направлении
row += randomDirection.dy;
col += randomDirection.dx;
// Проверяем, чтобы не выходить за границы поля
if (row < 0) {row = 0;}
else if (row >= gridSize) {
row = gridSize - 1;}
if (col < 0) {col = 0;}
else if (col >= gridSize) {
col = gridSize - 1;}}
return gameGrid;}
/*Отображение игрового поля*/
function renderGameGrid(gameGrid) {
const container = document.getElementById("game-board");
// Очищаем контейнер перед отображением игрового поля
container.innerHTML = "";
for (let i = 0; i < gridSize; i++) {
for (let j = 0; j < gridSize; j++) {
const cell = document.createElement("div");
cell.className = gameGrid[i][j] + " cell";
container.appendChild(cell);}}}
// Создание игрового поля и генерация ландшафта
const gameGrid = createGameGrid();
generateLandscape(gameGrid);
// Генерация реки
generateRiver(gameGrid);
// Добавление внутреннего водяного обрамления
for (let i = 0; i < gridSize; i++) {
for (let j = 0; j < 4; j++) {
gameGrid[i][j] = "water";}}
for (let i = 0; i < gridSize; i++) {
for (let j = 61; j < gridSize; j++) {
gameGrid[i][j] = "water";}}
for (let i = 0; i < 4; i++) {
for (let j = 0; j < gridSize; j++) {
gameGrid[i][j] = "water";}}
for (let i = 61; i < gridSize; i++) {
for (let j = 0; j < gridSize; j++) {
gameGrid[i][j] = "water";}}
let yz; // Объявляем переменную yz глобально
// Размещение героя, казармы, лодки, дома друзей и дома героя
function placeHeroAndBuildings(gameGrid) {
const minY = 10;
const maxY = 55;
// Выбираем случайное значение yz из диапазона
yz = Math.floor(Math.random() * (maxY - minY + 1) + minY);
// Выравнивание площадки под объектами
for (let i = 58; i <= 60; i++) {
for (let j = yz - 1; j <= yz + 1; j++) {
gameGrid[i][j] = "field";}}
// Размещение героя
gameGrid[59][yz] = "hero";
// Размещение казармы
gameGrid[59][yz - 1] = "barracks";
// Размещение дома друзей
gameGrid[59][yz + 1] = "friendsHouse";
// Размещение дома героя
gameGrid[58][yz] = "heroHouse";
// Размещение лодки героя
gameGrid[61][yz] = "heroBoat";
return gameGrid;}
// Вернуть символ или объект в данной позиции на вашем игровом поле (gameGrid)
function getMapChar(x, y) {return gameGrid[y][x];}
//[row] - строки, [col] - столбцы (колонки)
// Объект, хранящий соответствие между типами ландшафта и картинками
const landscapeImages = {
field: "landshaft/field.png", // поле:
sand: "landshaft/sand.png", // песок:
mountain: "landshaft/mountain.png", // гора:
forest: "landshaft/forest.png", // лес:
water: "landshaft/water.png", // вода:
hero: "landshaft/hero.png", // герой:
barracks: "landshaft/barracks.png", // казармы:
heroHouse: "landshaft/heroHouse.png", // геройДом:
heroBoat: "landshaft/heroBoat.png", // геройЛодка:
robber: "landshaft/robber.png", // грабитель:
evilCastle: "landshaft/evilCastle.png", // злой замок:
friendsHouse: "landshaft/friendsHouse.png",// Дом друзей:
fieldkaz: "landshaft/fieldkaz.png", // жилище воинов:
goldChest: "landshaft/goldChest.png", }; // сундук с золотом:
// Функция для получения пути к картинке по типу ландшафта
function getImagePath(landscapeType) {
return landscapeImages[landscapeType];}
// Получение контейнера окна игры
const gameWindow = document.getElementById('game-window');
// Функция для создания элемента картинки и установки ему нужных свойств
function createImageElement(src) {
const img = document.createElement('img');
img.src = src;
img.width = 96;
img.height = 60;
return img;}
// Вернуть символ или объект в данной позиции на вашем игровом поле (gameGrid)
function getMapChar(x, y) {return gameGrid[x][y];}
function getImageForObject(objectSymbol) {
switch (objectSymbol) {
case "field":
return new Image("landshaft/field.png");
case "sand":
return new Image("landshaft/sand.png");
case "mountain":
return new Image("landshaft/mountain.png");
case "forest":
return new Image("landshaft/forest.png");
case "water":
return new Image("landshaft/water.png");
case "hero":
return new Image("landshaft/hero.png");
case "barracks":
return new Image("landshaft/barracks.png");
case "heroHouse":
return new Image("landshaft/heroHouse.png");
case "heroBoat":
return new Image("landshaft/heroBoat.png");
case "robber":
return new Image("landshaft/robber.png");
case "evilCastle":
return new Image("landshaft/evilCastle.png");
case "fieldkaz":
return new Image("landshaft/fieldkaz.png");
case "friendsHouse":
return new Image("landshaft/friendsHouse.png");
case "goldChest":
return new Image("landshaft/goldChest.png");
default:
return null;}}// Если символ не распознан, возвращаем null или другое значение по умолчанию.
// Функция для заполнения окна игры картинками ландшафта
function fillGameWindow(gameGrid) {
// Очистка контейнера окна игры
gameWindow.innerHTML = '';
// Перебор всех ячеек окна игры
for (let i = 57; i <= 61; i++) {
for (let j = yz - 2; j <= yz + 2; j++) {
// Получение типа ландшафта для текущей ячейки
const landscapeType = gameGrid[i][j];
// Получение путь к картинке для данного типа ландшафта
const imagePath = getImagePath(landscapeType);
// Создание элемента картинки и установка ему пути к картинке
const img = createImageElement(imagePath);
img.classList.add("game-image");
// Добавление элемента картинки в контейнер окна игры
gameWindow.appendChild(img);}}}
// Получите координаты центральной точки (позиции) на ландшафте
var centerX = 59; // Замените на соответствующее значение
var centerY = yz; // Замените на соответствующее значение
// Определите координаты верхнего левого угла фрагмента 5x5 относительно центральной точки
var startX = centerX - 2;
var startY = centerY - 2;
// Получите canvas и его контекст
var canvas = document.getElementById("gameCanvas");
var context = canvas.getContext("2d");
// Размеры клетки и фрагмента
var cellSize = 96; // Используйте ваше значение
var fragmentSize = 5;
// Проходитесь по фрагменту 5x5 и рисуйте объекты
for (var y = 0; y < fragmentSize; y++) {
for (var x = 0; x < fragmentSize; x++) {
var posX = startX + x;
var posY = startY + y;
var objectSymbol = getMapChar(posX, posY);
var image = getImageForObject(objectSymbol);
if (image) {
image.onload = function() {
context.drawImage(image, x * cellSize, y * cellSize, cellSize, cellSize);};
image.src = getImagePath(objectSymbol);}}}
console.log(centerX, yz);
// Размещение героя, казармы, лодки, дома друзей и дома героя
placeHeroAndBuildings(gameGrid);
// Отображение игрового поля
renderGameGrid(gameGrid);
// Заполнение окна игры изображениями
fillGameWindow(gameGrid, yz);