Как обнаружить столкновение в игре pacman?Python

Программы на Python
Anonymous
Как обнаружить столкновение в игре pacman?

Сообщение Anonymous »

Ниже приведен шаблон для игры Pacman, который мне нужно завершить. У меня проблемы с определением того, когда игрок собирается столкнуться со стенами. Проблема в том, что я не знаю, где находится игрок относительно лабиринта. Например, если игрок переместил одну плитку из массива лабиринта при нажатии клавиши, я мог бы определить положение и проверить соседние плитки на предмет столкновения. Но поскольку при нажатии клавиши игрок перемещается с шагом в 1 пиксель, я не могу отследить, на какой плитке он находится в данный момент.
Что я пробовал:
Я создал две переменные для хранения текущей строки и столбца игрока. Всякий раз, когда игрок движется, я проверяю, находится ли игрок полностью внутри блока, используя метод getBoundingClientRect(), а когда игрок полностью находится внутри блока, я обновляю трекеры строк и столбцов. Но я столкнулся с узким местом, так как игрок также может перемещаться между двумя плитками.
Пожалуйста, предложите мне несколько идей.
let upPressed = false;
let downPressed = false;
let leftPressed = false;
let rightPressed = false;

const main = document.querySelector("main");

//Player = 2, Wall = 1, Enemy = 3, Point = 0
let maze = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 2, 0, 1, 0, 0, 0, 0, 3, 1],
[1, 0, 0, 0, 0, 0, 0, 1, 1, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 1, 1, 0, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 1, 1, 1],
[1, 0, 0, 1, 0, 3, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 1, 0, 1],
[1, 3, 1, 0, 0, 0, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
];

//Populates the maze in the HTML
for (let y of maze) {
for (let x of y) {
let block = document.createElement("div");
block.classList.add("block");

switch (x) {
case 1:
block.classList.add("wall");
break;
case 2:
block.id = "player";
let mouth = document.createElement("div");
mouth.classList.add("mouth");
block.appendChild(mouth);
break;
case 3:
block.classList.add("enemy");
break;
default:
block.classList.add("point");
block.style.height = "1vh";
block.style.width = "1vh";
}

main.appendChild(block);
}
}

//Player movement

const lbutton = document.querySelector("#lbttn");
const rbutton = document.querySelector("#rbttn");
const ubutton = document.querySelector("#ubttn");
const dbutton = document.querySelector("#dbttn");

function keyUp(event) {
if (event.key === "ArrowUp") {
upPressed = false;
ubutton.style.borderStyle = "outset";
} else if (event.key === "ArrowDown") {
downPressed = false;
dbutton.style.borderStyle = "outset";
} else if (event.key === "ArrowLeft") {
leftPressed = false;
lbutton.style.borderStyle = "outset";
} else if (event.key === "ArrowRight") {
rightPressed = false;
rbutton.style.borderStyle = "outset";
}
}

function keyDown(event) {
if (event.key === "ArrowUp") {
upPressed = true;
ubutton.style.borderStyle = "inset";
} else if (event.key === "ArrowDown") {
downPressed = true;
dbutton.style.borderStyle = "inset";
} else if (event.key === "ArrowLeft") {
leftPressed = true;
lbutton.style.borderStyle = "inset";
} else if (event.key === "ArrowRight") {
rightPressed = true;
rbutton.style.borderStyle = "inset";
}
}

const player = document.querySelector("#player");
const playerMouth = player.querySelector(".mouth");
let playerTop = 0;
let playerLeft = 0;

setInterval(function () {
if (downPressed) {
playerTop++;
player.style.top = playerTop + "px";
playerMouth.classList = "down";
} else if (upPressed) {
playerTop--;
player.style.top = playerTop + "px";
playerMouth.classList = "up";
} else if (leftPressed) {
playerLeft--;
player.style.left = playerLeft + "px";
playerMouth.classList = "left";
} else if (rightPressed) {
playerLeft++;
player.style.left = playerLeft + "px";
playerMouth.classList = "right";
}
}, 10);

function startGame() {
document.addEventListener("keydown", keyDown);
document.addEventListener("keyup", keyUp);
startBtn.style.display = "none";
}

const startBtn = document.querySelector(".start");
startBtn.addEventListener("click", startGame);


Подробнее здесь: https://stackoverflow.com/questions/787 ... acman-game

Вернуться в «Python»