import React, { useState, useEffect } from "react";
import wall from "./assets/wall.png";
import coin from "./assets/coin.png";
import pacmann from "./assets/pacman.png";
import bg from "./assets/bg.png";
import ghost from "./assets/ghost2.png";
import "./App.css"; // Import your CSS file
const PacManGame = () => {
// State for PacMan position and game map
const [pacman, setPacman] = useState({ x: 6, y: 4 });
const [map, setMap] = useState([
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 1],
[1, 2, 1, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1],
[1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1],
[1, 2, 2, 2, 1, 1, 5, 1, 1, 2, 2, 2, 1],
[1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1],
[1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1],
[1, 2, 2, 2, 2, 2, 1, 4, 2, 2, 2, 2, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
]);
const [gameOver, setGameOver] = useState(false);
// Function to handle PacMan movement
const handleKeyDown = (event) => {
if (gameOver) {
return; // If the game is over, don't handle key events
}
if (
event.keyCode === 37 &&
pacman.x > 0 &&
map[pacman.y][pacman.x - 1] !== 1
) {
setMap((prevMap) => {
const newMap = [...prevMap];
newMap[pacman.y][pacman.x] = 3;
setPacman(
(prevPacman) =>
(
{
...prevPacman,
x: prevPacman.x - 1
}));
newMap[pacman.y][pacman.x - 1] = 5;
return newMap;
});
} else if (
event.keyCode === 38 &&
pacman.y > 0 &&
map[pacman.y - 1][pacman.x] !== 1
) {
setMap((prevMap) => {
const newMap = [...prevMap];
newMap[pacman.y][pacman.x] = 3;
setPacman(
(prevPacman) =>
(
{
...prevPacman,
y: prevPacman.y - 1
}));
newMap[pacman.y - 1][pacman.x] = 5;
return newMap;
});
} else if (
event.keyCode === 39 &&
pacman.x < map[0].length - 1 &&
map[pacman.y][pacman.x + 1] !== 1
) {
setMap((prevMap) => {
const newMap = [...prevMap];
newMap[pacman.y][pacman.x] = 3;
setPacman(
(prevPacman) =>
(
{
...prevPacman,
x: prevPacman.x + 1
}));
newMap[pacman.y][pacman.x + 1] = 5;
return newMap;
});
} else if (
event.keyCode === 40 &&
pacman.y < map.length - 1 &&
map[pacman.y + 1][pacman.x] !== 1
) {
setMap((prevMap) => {
const newMap = [...prevMap];
newMap[pacman.y][pacman.x] = 3;
setPacman((prevPacman) =>
(
{
...prevPacman,
y: prevPacman.y + 1
}));
newMap[pacman.y + 1][pacman.x] = 5;
return newMap;
});
}
// Check for winning condition after each movement
checkWinningCondition();
};
// Function to check for winning condition and collision detection
const checkWinningCondition = () => {
if (!map.some((row) => row.includes(2))) {
setGameOver(true);
alert("Congratulations! You collected all the coins. You win!");
// Additional logic for restarting the game or other actions
} else if (!map.some((row) => row.includes(4))) {
setGameOver(true);
alert("Game over !! You collided with the ghost");
// Additional logic for restarting the game or other actions
}
};
// Initial rendering
useEffect(() => {
const handleKeyDownEvent =
(event) => handleKeyDown(event);
document.addEventListener("keydown", handleKeyDownEvent);
// Cleanup event listener on component unmount
return () => {
document.removeEventListener("keydown", handleKeyDownEvent);
};
}, [handleKeyDown]);
return (
<div id="world" style={{ backgroundColor: "white" }}>
{/* Render the game map */}
{map.map((row, rowIndex) => (
<div key={rowIndex}>
{row.map((cell, colIndex) => (
<div
key={colIndex}
className={
cell === 1
? "wall"
: cell === 2
? "coin"
: cell === 3
? "ground"
: cell === 4
? "ghost"
: cell === 5
? "pacman"
: null
}
style={
cell === 1
? { backgroundImage: `url(${wall})` }
: cell === 2
? { backgroundImage: `url(${coin})` }
: cell === 3
? { backgroundImage: `url(${bg})` }
: cell === 4
? { backgroundImage: `url(${ghost})` }
: cell === 5
? { backgroundImage: `url(${pacmann})` }
: null
}
></div>
))}
</div>
))}
</div>
);
};
export default PacManGame;