PAC-MAN
Створення гри PAC-MAN

Давайте запишемо наш шаблон до гри:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>28 Pac-man</title>
<style>
canvas {
border: 1px solid black; /* Додаємо чорну рамку до canvas для видимості */
background-color: lightgrey; /* Даємо ледь сірий фон, щоб краще було видно жовтого пакмена */
}</style>
</head>
<body>
<canvas id="canvas" width="400" height="400"></canvas> <!-- Визначаємо канвас для гри -->
<script> </script>
</body>
</html>Підключення JavaScript. Так як ми будемо весь час працювати з нашим полотном, нам необхідно по стандартній схемі отримати елемент canvas і отримати контекст для малювання на canvas:
const canvas = document.getElementById('canvas'); // Отримуємо елемент canvas
const ctx = canvas.getContext('2d'); // Отримуємо контекст для малювання на canvas- document.getElementById('canvas') Знаходимо елемент на сторінці за його ID (canvas), це наш прямокутник, де буде відображатися гра.
- canvas.getContext('2d') Отримуємо "контекст" канвасу, який дозволяє нам малювати 2D графіку.
Опис лабіринту та Pac-Man:
const cellSize = 40; // Розмір клітинки в лабіринті
const rows = 10; // Кількість рядків в лабіринті
const cols = 10; // Кількість стовпців в лабіринтіВизначаємо розміри клітинок лабіринту і скільки клітинок буде по горизонталі (стовпці) і вертикалі (рядки). Лабіринт буде мати 10 рядів і 10 стовпців.
const maze = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 1, 1, 0, 1, 1, 1, 0, 1],
[1, 0, 1, 0, 0, 0, 1, 0, 0, 1],
[1, 0, 1, 1, 1, 0, 1, 1, 0, 1],
[1, 0, 0, 0, 1, 0, 0, 0, 0, 1],
[1, 0, 1, 0, 1, 1, 1, 0, 1, 1],
[1, 0, 0, 0, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 0, 0, 0, 0, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
];maze — це двовимірний масив, де 1 означає стіну, а 0 — вільне місце. Це й буде лабіринт.
А тепер створимо самого Pac-Man:
let pacman = {
x: 1 * cellSize + cellSize / 2, // Початкові координати Pac-Man (центр клітинки)
y: 1 * cellSize + cellSize / 2,
radius: 15, // Розмір Pac-Man
direction: 'right', // Початковий напрямок руху (право)
speed: cellSize // Швидкість руху, рівна розміру клітинки
};- x, y — координати, де буде розташований Pac-Man.
- radius — радіус Pac-Man.
- direction — напрямок руху (початково "right" — вправо).
- speed — швидкість руху, рівна розміру клітинки.
Тепер нам потрібна функція для малювання лабіринту. Буде вона називатись drawMaze(). Зробимо так: якщо на певній клітинці є стіна значення буде 1, тоді ми малюємо блок синього кольору.
function drawMaze() {
for (let row = 0; row < rows; row++) {
for (let col = 0; col < cols; col++) {
if (maze[row][col] === 1) {
ctx.fillStyle = 'blue'; // Колір стін
ctx.fillRect(col * cellSize, row * cellSize, cellSize, cellSize); // Малюємо стіну
}
}
}
};А тепер напишемо функцію drawPacman(). Ця функція буде для малювання Pac-Man. Вона малює жовтий круг з відкритим ротом, в залежності від напрямку (право чи вліво), а також додає око.
function drawPacman() {
ctx.beginPath(); // Початок малювання фігури
let startAngle = 0.25 * Math.PI;
let endAngle = 1.75 * Math.PI;
if (pacman.direction === 'left') {
startAngle = Math.PI + 0.25 * Math.PI;
endAngle = Math.PI + 1.75 * Math.PI;
}
ctx.arc(pacman.x, pacman.y, pacman.radius, startAngle, endAngle);
ctx.lineTo(pacman.x, pacman.y); // Завершуємо шлях до центру
ctx.fillStyle = 'yellow'; // Колір Pac-Man
ctx.fill(); // Заповнюємо фігуру
ctx.closePath(); // Завершуємо малювання
const eyeX = pacman.direction === 'left' ? pacman.x + 5 : pacman.x - 5;
const eyeY = pacman.y - 5;
const eyeRadius = 3;
ctx.beginPath();
ctx.arc(eyeX, eyeY, eyeRadius, 0, 2 * Math.PI);
ctx.fillStyle = 'black'; // Колір ока
ctx.fill(); // Заповнюємо око
ctx.closePath();
};Одна з обов’язкових функцій яка нам необхідна, це перевірка руху, тобто чи можна перемістити Pac-Man у нову клітинку (чи не є вона стіною). Назвемо її isValidMove().
function isValidMove(newX, newY) {
const gridX = Math.floor(newX / cellSize);
const gridY = Math.floor(newY / cellSize);
return maze[gridY] && maze[gridY][gridX] === 0;
};Тепер створимо обробник події для натискання клавіші. Він повинен змінювати напрямок руху Pac-Man залежно від того, яку клавішу ми натиснули.
document.addEventListener('keydown', function(event) {
if (event.key === 'ArrowRight') pacman.direction = 'right';
if (event.key === 'ArrowLeft') pacman.direction = 'left';
if (event.key === 'ArrowUp') pacman.direction = 'up';
if (event.key === 'ArrowDown') pacman.direction = 'down';
});Отже, залишився наш основний цикл прописати на періодичне оновлення гри.
Створимо дві нові змінні newX та newY, щоб відслідковувати нові координати Pac-Man на основі його напрямку. Потім, в залежності від напрямку, додаємо або віднімаємо значення від координат. Кожен раз, коли Pac-Man рухається, його нове положення змінюється в залежності від напрямку. Наприклад, якщо напрямок right, то нові координати newX збільшуються на значення швидкості (pacman.speed). Виглядатиме наш основний цикл ось так:
function update() {
ctx.clearRect(0, 0, canvas.width, canvas.height); // Очищаємо канвас
drawMaze(); // Малюємо лабіринт
drawPacman(); // Малюємо Pac-Man
// Рух Pac-Man, залежно від напрямку
let newX = pacman.x;
let newY = pacman.y;
if (pacman.direction === 'right') newX += pacman.speed; // Рух вправо
if (pacman.direction === 'left') newX -= pacman.speed; // Рух вліво
if (pacman.direction === 'up') newY -= pacman.speed; // Рух вгору
if (pacman.direction === 'down') newY += pacman.speed; // Рух вниз
// Перевіряємо, чи можна перемістити Pac-Man в нову позицію
if (isValidMove(newX, newY)) {
pacman.x = newX; // Оновлюємо координати
pacman.y = newY;
}
};І звісно, саме оновлення гри буде виглядати досить простенько:
setInterval(update, 200); // Оновлення гри кожні 200 мілісекундФункція викликає функцію update() кожні 200 мілісекунд, тим самим оновлюючи гру.
Отже, ми передивились кожен етап створення pac-man, виглядає повний код у нас так:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Pac-man</title>
<style>
canvas {
border: 1px solid black; /* Додаємо чорну рамку до canvas для видимості */
background-color: lightgrey; /* Даємо ледь сірий фон, щоб краще було видно жовтого пакмена */
}
</style>
</head>
<body>
<canvas id="canvas" width="400" height="400"></canvas> <!-- Визначаємо канвас для гри -->
<script>
const canvas = document.getElementById('canvas'); // Отримуємо елемент canvas
const ctx = canvas.getContext('2d'); // Отримуємо контекст для малювання на canvas
const cellSize = 40; // Розмір клітинки в лабіринті
const rows = 10; // Кількість рядків в лабіринті
const cols = 10; // Кількість стовпців в лабіринті
// Лабіринт: 0 - вільний простір, 1 - стіна
const maze = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 1, 1, 0, 1, 1, 1, 0, 1],
[1, 0, 1, 0, 0, 0, 1, 0, 0, 1],
[1, 0, 1, 1, 1, 0, 1, 1, 0, 1],
[1, 0, 0, 0, 1, 0, 0, 0, 0, 1],
[1, 0, 1, 0, 1, 1, 1, 0, 1, 1],
[1, 0, 0, 0, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 0, 0, 0, 0, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
];
let pacman = {
x: 1 * cellSize + cellSize / 2, // Початкові координати Pac-Man (центр клітинки)
y: 1 * cellSize + cellSize / 2,
radius: 15, // Розмір Pac-Man
direction: 'right', // Початковий напрямок руху (право)
speed: cellSize // Швидкість руху, рівна розміру клітинки
};
// Функція для малювання лабіринту
function drawMaze() {
for (let row = 0; row < rows; row++) {
for (let col = 0; col < cols; col++) {
if (maze[row][col] === 1) {
ctx.fillStyle = 'blue'; // Колір стін
ctx.fillRect(col * cellSize, row * cellSize, cellSize, cellSize); // Малюємо стіну
}
}
}
};
// Функція для малювання Pac-Man
function drawPacman() {
ctx.beginPath(); // Початок малювання фігури
// Початкові кути для відкриття рота (право)
let startAngle = 0.25 * Math.PI;
let endAngle = 1.75 * Math.PI;
// Якщо напрямок вліво, змінюємо кути відкриття рота
if (pacman.direction === 'left') {
startAngle = Math.PI + 0.25 * Math.PI;
endAngle = Math.PI + 1.75 * Math.PI;
}
// Малюємо Pac-Man з вказаними кутами
ctx.arc(pacman.x, pacman.y, pacman.radius, startAngle, endAngle);
ctx.lineTo(pacman.x, pacman.y); // Завершуємо шлях до центру
ctx.fillStyle = 'yellow'; // Колір Pac-Man
ctx.fill(); // Заповнюємо фігуру
ctx.closePath(); // Завершуємо малювання
// Малюємо око
const eyeX = pacman.direction === 'left' ? pacman.x + 5 : pacman.x - 5; // Око змінює свою позицію в залежності від напрямку
const eyeY = pacman.y - 5;
const eyeRadius = 3; // Розмір ока
// Малюємо око
ctx.beginPath();
ctx.arc(eyeX, eyeY, eyeRadius, 0, 2 * Math.PI);
ctx.fillStyle = 'black'; // Колір ока
ctx.fill(); // Заповнюємо око
ctx.closePath(); // Завершуємо малювання ока
};
// Функція для перевірки, чи можна зробити рух в нову позицію
function isValidMove(newX, newY) {
const gridX = Math.floor(newX / cellSize); // Переводимо координати в клітинки лабіринту
const gridY = Math.floor(newY / cellSize);
return maze[gridY] && maze[gridY][gridX] === 0; // Перевіряємо, чи клітинка не є стіною
};
// Оновлення гри
function update() {
ctx.clearRect(0, 0, canvas.width, canvas.height); // Очищаємо канвас
drawMaze(); // Малюємо лабіринт
drawPacman(); // Малюємо Pac-Man
// Рух Pac-Man, залежно від напрямку
let newX = pacman.x;
let newY = pacman.y;
if (pacman.direction === 'right') newX += pacman.speed; // Рух вправо
if (pacman.direction === 'left') newX -= pacman.speed; // Рух вліво
if (pacman.direction === 'up') newY -= pacman.speed; // Рух вгору
if (pacman.direction === 'down') newY += pacman.speed; // Рух вниз
// Перевіряємо, чи можна перемістити Pac-Man в нову позицію
if (isValidMove(newX, newY)) {
pacman.x = newX; // Оновлюємо координати
pacman.y = newY;
}
};
// Обробник клавіш для зміни напрямку руху
document.addEventListener('keydown', function(event) {
if (event.key === 'ArrowRight') pacman.direction = 'right'; // Якщо натиснута стрілка вправо
if (event.key === 'ArrowLeft') pacman.direction = 'left'; // Якщо натиснута стрілка вліво
if (event.key === 'ArrowUp') pacman.direction = 'up'; // Якщо натиснута стрілка вгору
if (event.key === 'ArrowDown') pacman.direction = 'down'; // Якщо натиснута стрілка вниз
});
// Використовуємо setInterval для періодичного оновлення гри
setInterval(update, 200); // Оновлення гри кожні 200 мілісекунд
</script>
</body>
</html>
build info
- compiler
- 2.0.5.1 · 4054EF9BF6C4510A
- built
- 2026-11-08 14:31:25 UTC
WebUniverse