From 03eb576e946ae4f28162da0c8c14beb9f6dbed1b Mon Sep 17 00:00:00 2001 From: zm343 <2639-zm343@users.noreply.gitlab.cci.drexel.edu> Date: Sat, 17 Aug 2024 06:15:44 +0000 Subject: [PATCH] game.js update(addFood & moveOneStep) --- src/game/game.js | 179 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 133 insertions(+), 46 deletions(-) diff --git a/src/game/game.js b/src/game/game.js index 85c3ea4..d33f57a 100644 --- a/src/game/game.js +++ b/src/game/game.js @@ -1,15 +1,52 @@ +const cellTypes = { + EMPTY: 0, + PLAYERHEAD: 1, + PLAYERBODY: 2, + FOOD: 3, +}; + +function createCell(x, y, type) { + return { + x: x, + y: y, + type: type, + pid: 0, + direction: 0, + next: null, + }; +} + +function getRandomInt(max) { + return Math.floor(Math.random() * max); +} + +function addFood(gameBoard) { + //Find all the empty spaces on the grid + let emptySpaces = []; + for (let row of gameBoard) { + for (let cell of row) { + if (cell.type === cellTypes.EMPTY) { + emptySpaces.push(cell); + } + } + } + + //Create food cells randomly + if (emptySpaces.length > 0) { + let randomCell = emptySpaces[getRandomInt(emptySpaces.length)]; + randomCell.type = cellTypes.FOOD; + } + + return gameBoard; +} + module.exports = { - cellTypes: { - EMPTY: 0, - PLAYERHEAD: 1, - PLAYERBODY: 2, - FOOD: 3, - }, + cellTypes, createGameBoard: (width, height) => { let gameBoard = []; for (var i = 0; i < height; i++) { - row = []; + let row = []; for (var j = 0; j < width; j++) { row.push(createCell(j, i, cellTypes.EMPTY)); } @@ -18,58 +55,108 @@ module.exports = { for (var i = 0; i < 10; i++) { gameBoard = addFood(gameBoard); } - return gameBoard; - }, - - addFood: (gameBoard) => { - // select a random cell that is empty - // set the cell to FOOD + //console.log(gameBoard); return gameBoard; }, addPlayer: (gameBoard, pid) => { - let x = getRandomInt(gameBoard[0].length); - let y = getRandomInt(gameBoard.length); - - gameBoard[y][x].type = cellTypes.PLAYERHEAD; - gameBoard[y][x].pid = pid; - gameBoard[y][x].direction = 0; + let placedCell = false; + while (!placedCell) { + let x = getRandomInt(gameBoard[0].length); + let y = getRandomInt(gameBoard.length); - let y2 = y - 1; - gameBoard[y2][x].type = cellTypes.PLAYERBODY; - gameBoard[y2][x].pid = pid; - gameBoard[y2][x].direction = 0; - gameBoard[y][x].next = gameBoard[y2][x]; + if (gameBoard[y][x].type === cellTypes.EMPTY) { + gameBoard[y][x].type = cellTypes.PLAYERHEAD; + gameBoard[y][x].pid = pid; + gameBoard[y][x].direction = 0; + let y2 = y - 1; + if (y2 >= 0 && gameBoard[y2][x].type === cellTypes.EMPTY) { + gameBoard[y2][x].type = cellTypes.PLAYERBODY; + gameBoard[y2][x].pid = pid; + gameBoard[y2][x].direction = 0; + gameBoard[y][x].next = gameBoard[y2][x]; + } + placedCell = true; + } + } + //console.log(gameBoard); return gameBoard; }, moveOneStep: (gameBoard) => { - // Loop through board until we find a PLAYERHEAD - // Move the head in the direction it is facing - // if the head has a next, move the next to the head's old position - // if the next has a next, move the next's next to the next's old position - // and so on - // return the new gameBoard + //Loop through board until we find a PLAYERHEAD + for (var i = 0; i < gameBoard.length; i++) { + for (var j = 0; j < gameBoard[i].length; j++) { + let cell = gameBoard[i][j]; + if (cell.type === cellTypes.PLAYERHEAD) { + let oldX = cell.x; + let oldY = cell.y; + let newX = oldX; + let newY = oldY; + + //New position based on direction + if (cell.direction === 0) { // Up + newY -= 1; + } else if (cell.direction === 1) { // Right + newX += 1; + } else if (cell.direction === 2) { // Down + newY += 1; + } else if (cell.direction === 3) { // Left + newX -= 1; + } + + //Continue if within bounds + if (newX >= 0 && newX < gameBoard[0].length && newY >= 0 && newY < gameBoard.length) { + + //Snake head to new position by updating cell object + gameBoard[newY][newX] = { + ...cell, + x: newX, + y: newY, + }; + + //Remove previous head position + gameBoard[oldY][oldX].type = cellTypes.EMPTY; + gameBoard[oldY][oldX].pid = 0; + gameBoard[oldY][oldX].direction = 0; + gameBoard[oldY][oldX].next = null; + + //Snake body to previous locations + let currentBody = gameBoard[newY][newX].next; + while (currentBody) { + let bodyOldX = currentBody.x; + let bodyOldY = currentBody.y; + currentBody.x = oldX; + currentBody.y = oldY; + + //Update cell body position + gameBoard[oldY][oldX] = { + ...currentBody, + type: cellTypes.PLAYERBODY, + }; + oldX = bodyOldX; + oldY = bodyOldY; + currentBody = currentBody.next; + } + + //Remove previous body position + gameBoard[oldY][oldX].type = cellTypes.EMPTY; + gameBoard[oldY][oldX].pid = 0; + gameBoard[oldY][oldX].direction = 0; + gameBoard[oldY][oldX].next = null; + + //console.log(gameBoard); + return gameBoard; + } + } + } + } + return gameBoard; }, - checkColissions: (gameBoard) => { + checkCollisions: (gameBoard) => { // returns a list of players that have collided, // and a new gameBoard with the players removed }, }; - -let createCell = (x, y, type) => { - return { - x: x, - y: y, - type: type, - pid: 0, - direction: 0, - next: null, - }; -}; - -function getRandomInt(max) { - return Math.floor(Math.random() * max); -} -- GitLab