From 9d3f4714d28fb0c3177f2e22f0b703b09c1f2357 Mon Sep 17 00:00:00 2001 From: florian Date: Wed, 7 May 2025 08:26:27 +0200 Subject: [PATCH] remake hologram --- .vscode/settings.json | 6 + index.js | 313 ++++----------------------- public/font/Pixeboy-z8XGD.ttf | Bin 0 -> 33328 bytes public/index.html | 22 +- public/script/controller.js | 5 +- public/script/displayGameFunction.js | 2 +- public/script/displayMenuFunction.js | 6 +- public/script/element.js | 6 +- public/script/gameFunction.js | 158 ++++++++++---- public/script/index.js | 6 +- public/script/magicVariable.js | 11 +- public/script/menuController.js | 9 + public/script/var.js | 4 +- public/style/index.css | 198 +++++++++++------ 14 files changed, 336 insertions(+), 410 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 public/font/Pixeboy-z8XGD.ttf diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..f19673f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "cSpell.words": [ + "elle", + "fixée" + ] +} \ No newline at end of file diff --git a/index.js b/index.js index d8c7b46..92a3d7e 100644 --- a/index.js +++ b/index.js @@ -104,292 +104,67 @@ const templateColor = [ [177, 225, 218, 255] ]; -const MOVELEFT = 1; -const MOVERIGHT = 2; -const MOVEDOWN = 3; -const ROTATE = 4; -const MOVEDOWNFAST = 5; -const RESPAWN = 6; -const CHANGENEXTPIECE = 7; - -function ifPiece(x, y, board) { - if (x < 0 || x >= 10 || y >= 20) { - return true; - } - - if (y < 0) { - return false; - } - - if (board[x][y][0] == 0 && board[x][y][1] == 0 && board[x][y][2] == 0) { - return false; - } - - return true; -} - -function canMoveTo(x, y, piece, board) { - for (let i = 0; i < piece.length - 1; i++) { - if (piece[i][0] + x < 0 || piece[i][0] + x >= 10 || piece[i][1] + y >= 20 || ifPiece(piece[i][0] + x, piece[i][1] + y, board)) { - return false; - } - } - return true; -} - -function ifRotate(piece, board) { - for (let i = 0; i < piece.length - 1; i++) { - if (piece[i][0] < 0 || piece[i][0] >= 10 || piece[i][1] >= 20 || ifPiece(piece[i][0], piece[i][1], board)) { - return false; - } - } - return true; -} - -function moveDown(piece, board) { - if (canMoveTo(0, 1, piece, board)) { - for (let i = 0; i < piece.length; i++) { - piece[i][1]++; - } - } -} - -function moveLeft(piece, board) { - if (canMoveTo(-1, 0, piece, board)) { - for (let i = 0; i < piece.length; i++) { - piece[i][0]--; - } - } -} - -function moveRight(piece, board) { - if (canMoveTo(1, 0, piece, board)) { - for (let i = 0; i < piece.length; i++) { - piece[i][0]++; - } - } -} - -function rotate(piece, board) { - if (piece.length == 0) { - return; - } - - let currentPieceCopy = []; - - for (let i = 0; i < piece.length; i++) { - currentPieceCopy.push([piece[i][0], piece[i][1]]); - } - - const center = currentPieceCopy[currentPieceCopy.length - 1]; - for (let i = 0; i < piece.length - 1; i++) { - const x = currentPieceCopy[i][0] - center[0]; - const y = currentPieceCopy[i][1] - center[1]; - - currentPieceCopy[i][0] = center[0] - y; - currentPieceCopy[i][1] = center[1] + x; - } - - - if (ifRotate(currentPieceCopy, board)) { - piece = currentPieceCopy; - // Don't modify history in verification function - } - else { - for (let x = -1; x <= 1; x++) { - for (let y = 0; y >= -1; y--) { - if (canMoveTo(x, y, currentPieceCopy, board)) { - moveToPiece(x, y, currentPieceCopy); - piece = currentPieceCopy; - - x = 2; - y = -2; - } - } - } - } -} - -function moveToPiece(x, y, piece) { - for (let i = 0; i < piece.length; i++) { - piece[i][0] += x; - piece[i][1] += y; - } -} - -function checkLine(board, scoreObject) { - let lineFilled = 0; - let score = 0; - let lines = 0; - let level = 0; - - for (let i = 0; i < 20; i++) { - let check = true; - - for (let j = 0; j < 10; j++) { - if (board[j][i][0] == 0 && board[j][i][1] == 0 && board[j][i][2] == 0) { - check = false; - break; - } - } - - if (check) { - for (let j = i; j > 0; j--) { - for (let k = 0; k < 10; k++) { - board[k][j] = board[k][j - 1]; - } - } - - for (let k = 0; k < 10; k++) { - board[k][0] = [0, 0, 0, 255]; - } - - lineFilled++; - } - } - - if (lineFilled == 1) { - score += 40; - } - else if (lineFilled == 2) { - score += 100; - } - else if (lineFilled == 3) { - score += 300; - } - else if (lineFilled == 4) { - score += 1200; - } - - lines += lineFilled; - level = Math.floor(lines / 10); - - scoreObject.score += score; - scoreObject.lines += lineFilled; - scoreObject.level = Math.floor(scoreObject.lines / 10); -} - -function verifieHystoryAndScore(score, history) { - let board = []; - - for (let i = 0; i < 10; i++) { - board[i] = []; - for (let j = 0; j < 20; j++) { - board[i][j] = [0, 0, 0, 255]; - } - } - - let piece = []; - let nextPiece = []; - let nextIndex = 0; - - let scoreObject = { - score: 0, - lines: 0, - level: 0 - }; - - for (let i = 0; i < history.length; i++) { - if (history[i][0] === CHANGENEXTPIECE) { - // Only place non-fractional coordinates on the board - for (let j = 0; j < piece.length - 1; j++) { - if (Number.isInteger(piece[j][0]) && Number.isInteger(piece[j][1]) && - piece[j][0] >= 0 && piece[j][0] < 10 && - piece[j][1] >= 0 && piece[j][1] < 20) { - board[piece[j][0]][piece[j][1]] = [templateColor[nextIndex][0], templateColor[nextIndex][1], templateColor[nextIndex][2], templateColor[nextIndex][3]]; - } - } - - checkLine(board, scoreObject); - - nextIndex = history[i][1]; - - // Reset piece and copy from template - piece = []; - for (let j = 0; j < templatePiece[nextIndex].length; j++) { - piece.push([templatePiece[nextIndex][j][0], templatePiece[nextIndex][j][1]]); - } - - // Set up next piece - nextPiece = []; - let nextNextIndex = (i+1 < history.length && history[i+1][0] === CHANGENEXTPIECE) ? history[i+1][1] : 0; - for (let j = 0; j < templatePiece[nextNextIndex].length; j++) { - nextPiece.push([templatePiece[nextNextIndex][j][0], templatePiece[nextNextIndex][j][1]]); - } - } - else if (history[i][0] === MOVEDOWN) { - moveDown(piece, board); - } - else if (history[i][0] === MOVELEFT) { - moveLeft(piece, board); - } - else if (history[i][0] === MOVERIGHT) { - moveRight(piece, board); - } - else if (history[i][0] === ROTATE) { - rotate(piece, board); - } - } - - console.log("Calculated score:", scoreObject.score, "Submitted score:", score); - return score === scoreObject.score; -} - app.put('/api/sendScore', (req, res) => { let score = req.body.score; - let history = req.body.history; + // let history = req.body.history; + let lines = req.body.lines; let playerName = req.body.playerName; - // if (score === null || history === null || playerName === null) { - // return res.status(400).send('Missing required fields'); + // Vérifier si le score est un nombre valide + if (isNaN(score) || score < 0) { + return res.status(400).send('Invalid score'); + } + // Vérifier si l'historique est un tableau valide + // if (!Array.isArray(history)) { + // return res.status(400).send('Invalid history'); // } - - // if (score < 0) { - // return res.status(400).send('Score cannot be negative'); - // } - - // if (history.length === 0) { - // return res.status(400).send('History cannot be empty'); - // } - - if (!verifieHystoryAndScore(score, history)) { - return res.status(400).send('Invalid history or score'); + // Vérifier si le nom du joueur est une chaîne de caractères valide + if (typeof playerName !== 'string' || playerName.trim() === '') { + return res.status(400).send('Invalid player name'); + } + // Vérifier si le score est supérieur à 0 et inférieur à 1200 * (lines/4) + if ((lines/4) * 1200 < score) { + return res.status(400).send('Invalid score'); + } + // Vérifier si la line est un nombre valide + if (isNaN(lines) || lines < 0) { + return res.status(400).send('Invalid lines'); } // Vérifier si le dossier des historiques existe, le créer si nécessaire - const historyDir = './datas/histories'; - if (!fs.existsSync(historyDir)) { - fs.mkdirSync(historyDir, { recursive: true }); - } + // const historyDir = './datas/histories'; + // if (!fs.existsSync(historyDir)) { + // fs.mkdirSync(historyDir, { recursive: true }); + // } // Date du jour - const date = new Date(); - const dateString = date.toISOString().split('T')[0]; // Format YYYY-MM-DD + // const date = new Date(); + // const dateString = date.toISOString().split('T')[0]; // Format YYYY-MM-DD - // Vérifier si un fichier avec ce nom existe déjà et ajouter un chiffre si nécessaire - let finalPlayerName = playerName + dateString; - let counter = 0; - let historyFilePath = `${historyDir}/${finalPlayerName}.json`; + // // Vérifier si un fichier avec ce nom existe déjà et ajouter un chiffre si nécessaire + // let finalPlayerName = playerName + dateString; + // let counter = 0; + // let historyFilePath = `${historyDir}/${finalPlayerName}.json`; - while (fs.existsSync(historyFilePath)) { - counter++; - finalPlayerName = `${playerName}${dateString}${counter}`; - historyFilePath = `${historyDir}/${finalPlayerName}.json`; - } + // while (fs.existsSync(historyFilePath)) { + // counter++; + // finalPlayerName = `${playerName}${dateString}${counter}`; + // historyFilePath = `${historyDir}/${finalPlayerName}.json`; + // } - // Écrire l'historique dans le fichier - try { - fs.writeFileSync(historyFilePath, JSON.stringify(history)); - console.log(`History written to ${historyFilePath}`); - } catch (err) { - console.error('Error writing history file:', err); - return res.status(500).send('Error writing history file'); - } + // // Écrire l'historique dans le fichier + // try { + // fs.writeFileSync(historyFilePath, JSON.stringify(history)); + // console.log(`History written to ${historyFilePath}`); + // } catch (err) { + // console.error('Error writing history file:', err); + // return res.status(500).send('Error writing history file'); + // } // - db.run('INSERT INTO scores (player_name, score, pathHistory) VALUES (?, ?, ?)', [playerName, score, historyFilePath]) + db.run('INSERT INTO scores (player_name, score, pathHistory) VALUES (?, ?, ?)', [playerName, score, "/"]) .then(() => { console.log(`Score inserted for ${playerName}`); }) diff --git a/public/font/Pixeboy-z8XGD.ttf b/public/font/Pixeboy-z8XGD.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d303047cb6e145adb6ccecea900ab6dd1ea69fd9 GIT binary patch literal 33328 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 literal 0 HcmV?d00001 diff --git a/public/index.html b/public/index.html index ff138f0..13ca9f6 100644 --- a/public/index.html +++ b/public/index.html @@ -36,7 +36,7 @@

- Score: + Score: 0

@@ -44,20 +44,20 @@ -