Skip to content
Snippets Groups Projects
Select Git revision
  • 44f3ce79b06df2d15e66a04fdce5f1e38bba53f0
  • master default protected
2 results

test_analyse.py

Blame
  • index.js 18.85 KiB
    const player = {
        host: false,
        playedCell: "",
        roomId: null,
        username: "",
        socketId: "",
        symbol: "X",
        turn: false,
        win: false,
        isBlackPlayer: false
    };
    
    const socket = io();
    
    const queryString = window.location.search;
    const urlParams = new URLSearchParams(queryString);
    const roomId = urlParams.get('room');
    
    if (roomId) {
        document.getElementById('start').innerText = "Rejoindre";
    }
    
    const usernameInput = document.getElementById('username');
    
    const gameCard = document.getElementById('game-card');
    const userCard = document.getElementById('user-card');
    
    const restartArea = document.getElementById('restart-area');
    const waitingArea = document.getElementById('waiting-area');
    
    const roomsCard = document.getElementById('rooms-card');
    const roomsList = document.getElementById('rooms-list');
    
    const turnMsg = document.getElementById('turn-message');
    const linkToShare = document.getElementById('link-to-share');
    
    let ennemyUsername = "";
    
    socket.emit('get rooms');
    socket.on('list rooms', (rooms) => {
        let html = "";
    
        if (rooms.length > 0) {
            rooms.forEach(room => {
                if (room.players.length !== 2) {
                    html += `<li class="list-group-item d-flex justify-content-between">
                                <p class="p-0 m-0 flex-grow-1 fw-bold">Salon de ${room.players[0].username} - ${room.id}</p>
                                <button class="btn btn-sm btn-success join-room" data-room="${room.id}">Rejoindre</button>
                            </li>`;
                }
            });
        }
    
        if (html !== "") {
            roomsCard.classList.remove('d-none');
            roomsList.innerHTML = html;
    
            for (const element of document.getElementsByClassName('join-room')) {
                element.addEventListener('click', joinRoom, false)
            }
        }
    });
    
    $("#form").on('submit', function (e) {
        e.preventDefault();
    
        player.username = usernameInput.value;
    
        if (roomId) {
            player.roomId = roomId;
        } else {
            player.host = true;
            player.turn = true;
        }
    
        player.socketId = socket.id;
    
        userCard.hidden = true;
        waitingArea.classList.remove('d-none');
        roomsCard.classList.add('d-none');
    
        socket.emit('playerData', player);
    });
    
    $(".cell").on("click", function (e) {
        const playedCell = this.getAttribute('id');
    
        if (this.innerText === "" && player.turn) {
            player.playedCell = playedCell;
    
            this.innerText = player.symbol;
    
            player.win = calculateWin(playedCell);
            player.turn = false;
    
            socket.emit('play', player);
        }
    });
    
    $("#restart").on('click', function () {
        restartGame();
    })
    
    socket.on('join room', (roomId) => {
        player.roomId = roomId;
        linkToShare.innerHTML = `<a href="${window.location.href}?room=${player.roomId}" target="_blank">${window.location.href}?room=${player.roomId}</a>`;
    });
    
    socket.on('start game', (players) => {
        console.log(players)
        startGame(players);
    });
    
    socket.on('play', (ennemyPlayer) => {
    
        if (ennemyPlayer.socketId !== player.socketId && !ennemyPlayer.turn) {
            const playedCell = document.getElementById(`${ennemyPlayer.playedCell}`);
    
            playedCell.classList.add('text-danger');
            playedCell.innerHTML = 'O';
    
            if (ennemyPlayer.win) {
                setTurnMessage('alert-info', 'alert-danger', `C'est perdu ! <b>${ennemyPlayer.username}</b> a gagné !`);
                calculateWin(ennemyPlayer.playedCell, 'O');
                showRestartArea();
                return;
            }
    
            if (calculateEquality()) {
                setTurnMessage('alert-info', 'alert-warning', "C'est une egalité !");
                return;
            }
    
            setTurnMessage('alert-info', 'alert-success', "C'est ton tour de jouer");
            player.turn = true;
        } else {
            if (player.win) {
                $("#turn-message").addClass('alert-success').html("Félicitations, tu as gagné la partie !");
                showRestartArea();
                return;
            }
    
            if (calculateEquality()) {
                setTurnMessage('alert-info', 'alert-warning', "C'est une egalité !");
                showRestartArea();
                return;
            }
    
            setTurnMessage('alert-success', 'alert-info', `C'est au tour de <b>${ennemyUsername}</b> de jouer`)
            player.turn = false;
        }
    });
    
    socket.on('play again', (players) => {
        restartGame(players);
    })
    
    function startGame(players) {
        restartArea.classList.add('d-none');
        waitingArea.classList.add('d-none');
        turnMsg.classList.remove('d-none');
        draw();
        const ennemyPlayer = players.find(p => p.socketId != player.socketId);
        ennemyUsername = ennemyPlayer.username;
    
    
        player.isBlackPlayer = !player.host;
    
        if (player.host && player.turn) {
            setTurnMessage('alert-info', 'alert-success', "C'est ton tour de jouer");
        } else {
            setTurnMessage('alert-success', 'alert-info', `C'est au tour de <b>${ennemyUsername}</b> de jouer`);
        }
        draw();
    }
    
    function setTurnMessage(classToRemove, classToAdd, html) {
        turnMsg.classList.remove(classToRemove);
        turnMsg.classList.add(classToAdd);
        turnMsg.innerHTML = html;
    }
    const joinRoom = function () {
        if (usernameInput.value !== "") {
            player.username = usernameInput.value;
            player.socketId = socket.id;
            player.roomId = this.dataset.room;
    
            socket.emit('playerData', player);
    
            userCard.hidden = true;
            waitingArea.classList.remove('d-none');
            roomsCard.classList.add('d-none');
        }
    }
    
    const canvas = document.getElementById("chessboard");
    const ctx = canvas.getContext("2d");
    const size = 60; // Taille des cases
    currentPlayer = 0;
    // Disposition initiale de l'échiquier
    const board = [
        ["T", "C", "F", "Q", "K", "F", "C", "T"],
        ["P", "P", "P", "P", "P", "P", "P", "P"],
        ["", "", "", "", "", "", "", ""],
        ["", "", "", "", "", "", "", ""],
        ["", "", "", "", "", "", "", ""],
        ["", "", "", "", "", "", "", ""],
        ["p", "p", "p", "p", "p", "p", "p", "p"],
        ["t", "c", "f", "q", "k", "f", "c", "t"]
    ];
    
    // Charger les images des pièces
    
    const pieceImages = {
        "p": "pion_blanc.png",
        "P": "pion_noir.png",
        "t": "tour_blanc.png",
        "T": "tour_noir.png",
        "c": "cavalier_blanc.png",
        "C": "cavalier_noir.png",
        "f": "fou_blanc.png",
        "F": "fou_noir.png",
        "q": "reine_blanc.png",
        "Q": "reine_noir.png",
        "k": "roi_blanc.png",
        "K": "roi_noir.png"
    };
    
    const pieces_joueurs = {0: ["p","t","c","f","q","k"],1:["P","T","C","F","Q","K"]};
    
    
    
    
    // Dessiner l'échiquier avec les couleurs des cases
    function drawBoard() {
        for (let row = 0; row < 8; row++) {
            for (let col = 0; col < 8; col++) {
                let displayRow = player.isBlackPlayer ? 7 - row : row;
                let displayCol = player.isBlackPlayer ? 7 - col : col;
                ctx.fillStyle = (displayRow + displayCol) % 2 === 0 ? "#F5DEB3" : "#8B4513";
                ctx.fillRect(col * size, row * size, size, size);
            }
        }
    }
    
    
    // Dessiner les pièces sur l'échiquier
    function drawPieces() {
        for (let row = 0; row < 8; row++) {
            for (let col = 0; col < 8; col++) {
                let piece = board[row][col];
                if (piece !== "") {
                    let img = new Image();
                    img.src = "chess_pieces/" + pieceImages[piece];
                    img.onload = function () {
                        let displayRow = player.isBlackPlayer ? 7 - row : row;
                        let displayCol = player.isBlackPlayer ? 7 - col : col;
                        ctx.drawImage(img, displayCol * size, displayRow * size, size, size);
                    };
                }
            }
        }
    }
    
    
    // Fonction principale pour dessiner l'échiquier
    function draw() {
        drawBoard();
        drawPieces();
    }
    
    // Appeler la fonction pour afficher l'échiquier
    
    
    
    //Mouvement des pièces sur l'échiquier 
    
    let selectedPiece = null;
    let selectedPosition = null;
    
    canvas.addEventListener("click", function(event) {
        let col = Math.floor(event.offsetX / size);
        let row = Math.floor(event.offsetY / size);
    
        if (player.isBlackPlayer) {
            col = 7 - col;
            row = 7 - row;
        }
    
        if (selectedPiece) {
            movePiece(row, col);
        } else {
            selectPiece(row, col);
        }
    });
    
    
    function selectPiece(row, col) {
        const piece = board[row][col];
    
        if (piece !== "" && pieces_joueurs[currentPlayer].includes(piece)) {  // Vérifier que ce n'est pas une case vide
            selectedPiece = piece;
            selectedPosition = { row, col };
            highlightMoves(currentPlayer,piece, row, col);
        }
    }
    
    function highlightMoves(player,piece, row, col) {
        if (player===0){
            direction=-1;
            opponent=1;
        }
        else{direction=1;
            opponent=0;
        }
        let moves = [];
        if (piece.toLowerCase() === "p") {
            if(row===6 && player===0){
                if (board[row + 2*direction][col] === "") {
                    moves.push({row: row + 2*direction,col});
                }
            }
            if(row===1 && player===1){
                if (board[row +2*direction][col] === "") {
                    moves.push({row: row + 2*direction,col});
                }
            }
            if (board[row + direction] && board[row + direction][col] === "") {
                moves.push({ row: row + direction, col });
            }
            if (pieces_joueurs[opponent].includes(board[row + direction][col + direction])){
                moves.push({row: row +direction, col: col + direction })
            }
            if (pieces_joueurs[opponent].includes(board[row + direction][col - direction])){
                moves.push({row: row +direction, col: col - direction })
            }
        }
        if (piece.toLowerCase() === "t") {
            // Déplacements vers le haut
            for (let r = row - 1; r >= 0; r--) {
                if (board[r][col] === "") {
                moves.push({ row: r, col });
                } 
                else {
                    if (pieces_joueurs[opponent].includes(board[r][col])) {
                    moves.push({ row: r, col }); // Capture possible
                    }
                    break // Bloqué par une pièce
                }
            }
    
            // Déplacements vers le bas
            for (let r = row + 1; r < 8; r++) {
                if (board[r][col] === "") {
                    moves.push({ row: r, col });
                } else {
                    if (pieces_joueurs[opponent].includes(board[r][col])) {
                        moves.push({ row: r, col });
                    }
                    break;
                }
            }
    
            // Déplacements vers la gauche
            for (let c = col - 1; c >= 0; c--) {
                if (board[row][c] === "") {
                    moves.push({ row, col: c });
                } else {
                    if (pieces_joueurs[opponent].includes(board[row][c])) {
                        moves.push({ row, col: c });
                    }
                    break;
                }
            }
    
            // Déplacements vers la droite
            for (let c = col + 1; c < 8; c++) {
                if (board[row][c] === "") {
                    moves.push({ row, col: c });
                } else {
                    if (pieces_joueurs[opponent].includes(board[row][c])) {
                        moves.push({ row, col: c });
                    }
                    break;
                }
            }
        }
        if (piece.toLowerCase() === "f") {
            // Déplacements en haut à gauche
            for (let r = row - 1, c = col - 1; r >= 0 && c >= 0; r--, c--) {
                if (board[r][c] === "") {
                    moves.push({ row: r, col: c });
                } else {
                    if (pieces_joueurs[opponent].includes(board[r][c])) {
                        moves.push({ row: r, col: c });
                    }
                    break; // Bloqué par une pièce
                }
            }
        
            // Déplacements en haut à droite
            for (let r = row - 1, c = col + 1; r >= 0 && c < 8; r--, c++) {
                if (board[r][c] === "") {
                    moves.push({ row: r, col: c });
                } else {
                    if (pieces_joueurs[opponent].includes(board[r][c])) {
                        moves.push({ row: r, col: c });
                    }
                    break;
                }
            }
        
            // Déplacements en bas à gauche
            for (let r = row + 1, c = col - 1; r < 8 && c >= 0; r++, c--) {
                if (board[r][c] === "") {
                    moves.push({ row: r, col: c });
                } else {
                    if (pieces_joueurs[opponent].includes(board[r][c])) {
                        moves.push({ row: r, col: c });
                    }
                    break;
                }
            }
        
            // Déplacements en bas à droite
            for (let r = row + 1, c = col + 1; r < 8 && c < 8; r++, c++) {
                if (board[r][c] === "") {
                    moves.push({ row: r, col: c });
                } else {
                    if (pieces_joueurs[opponent].includes(board[r][c])) {
                        moves.push({ row: r, col: c });
                    }
                    break;
                }
            }
        }
        if (piece.toLowerCase() === "k") {
            let directions = [
                { dr: -1, dc: 0 },  // Haut
                { dr: 1, dc: 0 },   // Bas
                { dr: 0, dc: -1 },  // Gauche
                { dr: 0, dc: 1 },   // Droite
                { dr: -1, dc: -1 }, // Diagonale haut-gauche
                { dr: -1, dc: 1 },  // Diagonale haut-droite
                { dr: 1, dc: -1 },  // Diagonale bas-gauche
                { dr: 1, dc: 1 }    // Diagonale bas-droite
            ];
        
            for (let { dr, dc } of directions) {
                let newRow = row + dr;
                let newCol = col + dc;
        
                // Vérifie que la nouvelle position est sur l'échiquier
                if (newRow >= 0 && newRow < 8 && newCol >= 0 && newCol < 8) {
                    if (board[newRow][newCol] === "" || pieces_joueurs[opponent].includes(board[newRow][newCol])) {
                        moves.push({ row: newRow, col: newCol });
                    }
                }
            }
        }
        if (piece.toLowerCase() === "c") {
            let movesL = [
                { dr: -2, dc: -1 }, { dr: -2, dc: 1 }, // Haut gauche, Haut droite
                { dr: 2, dc: -1 }, { dr: 2, dc: 1 },   // Bas gauche, Bas droite
                { dr: -1, dc: -2 }, { dr: -1, dc: 2 }, // Gauche haut, Droite haut
                { dr: 1, dc: -2 }, { dr: 1, dc: 2 }    // Gauche bas, Droite bas
            ];
        
            for (let { dr, dc } of movesL) {
                let newRow = row + dr;
                let newCol = col + dc;
        
                // Vérifie que la nouvelle position est sur l'échiquier
                if (newRow >= 0 && newRow < 8 && newCol >= 0 && newCol < 8) {
                    if (board[newRow][newCol] === "" || pieces_joueurs[opponent].includes(board[newRow][newCol])) {
                        moves.push({ row: newRow, col: newCol });
                    }
                }
            }
        }
    
        if (piece.toLowerCase() === "q") {
            // Déplacements verticaux (haut et bas)
            for (let r = row - 1; r >= 0; r--) { // Haut
                if (board[r][col] === "") {
                    moves.push({ row: r, col });
                } else {
                    if (pieces_joueurs[opponent].includes(board[r][col])) {
                        moves.push({ row: r, col }); // Capture possible
                    }
                    break; // Bloqué par une pièce
                }
            }
            for (let r = row + 1; r < 8; r++) { // Bas
                if (board[r][col] === "") {
                    moves.push({ row: r, col });
                } else {
                    if (pieces_joueurs[opponent].includes(board[r][col])) {
                        moves.push({ row: r, col });
                    }
                    break;
                }
            }
        
            // Déplacements horizontaux (gauche et droite)
            for (let c = col - 1; c >= 0; c--) { // Gauche
                if (board[row][c] === "") {
                    moves.push({ row, col: c });
                } else {
                    if (pieces_joueurs[opponent].includes(board[row][c])) {
                        moves.push({ row, col: c });
                    }
                    break;
                }
            }
            for (let c = col + 1; c < 8; c++) { // Droite
                if (board[row][c] === "") {
                    moves.push({ row, col: c });
                } else {
                    if (pieces_joueurs[opponent].includes(board[row][c])) {
                        moves.push({ row, col: c });
                    }
                    break;
                }
            }
        
            // Déplacements diagonaux (haut-gauche, haut-droite, bas-gauche, bas-droite)
            for (let r = row - 1, c = col - 1; r >= 0 && c >= 0; r--, c--) { // Haut-Gauche
                if (board[r][c] === "") {
                    moves.push({ row: r, col: c });
                } else {
                    if (pieces_joueurs[opponent].includes(board[r][c])) {
                        moves.push({ row: r, col: c });
                    }
                    break;
                }
            }
            for (let r = row - 1, c = col + 1; r >= 0 && c < 8; r--, c++) { // Haut-Droite
                if (board[r][c] === "") {
                    moves.push({ row: r, col: c });
                } else {
                    if (pieces_joueurs[opponent].includes(board[r][c])) {
                        moves.push({ row: r, col: c });
                    }
                    break;
                }
            }
            for (let r = row + 1, c = col - 1; r < 8 && c >= 0; r++, c--) { // Bas-Gauche
                if (board[r][c] === "") {
                    moves.push({ row: r, col: c });
                } else {
                    if (pieces_joueurs[opponent].includes(board[r][c])) {
                        moves.push({ row: r, col: c });
                    }
                    break;
                }
            }
            for (let r = row + 1, c = col + 1; r < 8 && c < 8; r++, c++) { // Bas-Droite
                if (board[r][c] === "") {
                    moves.push({ row: r, col: c });
                } else {
                    if (pieces_joueurs[opponent].includes(board[r][c])) {
                        moves.push({ row: r, col: c });
                    }
                    break;
                }
            }
        }
    
        return moves;
    
        }
    
    
    
    
    
    function drawHighlightedMoves(moves) {
        ctx.fillStyle = "rgba(0, 255, 0, 0.5)";  // Vert transparent
    
        for (let move of moves) {
            ctx.beginPath();
            ctx.arc(move.col * size + size / 2, move.row * size + size / 2, size / 4, 0, 2 * Math.PI);
            ctx.fill();
        }
    }
    function movePiece(newRow, newCol) {
        if (!selectedPiece) return;
    
        // Vérifier si le mouvement est valide
        const validMoves = highlightMoves(currentPlayer,selectedPiece, selectedPosition.row, selectedPosition.col);
    
    
        // Vérifier que validMoves est un tableau et qu'il contient des objets avec { row, col }
        const isValidMove = Array.isArray(validMoves) && validMoves.some(m => m.row === newRow && m.col === newCol);
    
        if (isValidMove) {
            // Déplacer la pièce
            board[newRow][newCol] = selectedPiece;
            board[selectedPosition.row][selectedPosition.col] = "";
    
            // Réinitialiser la pièce sélectionnée
            selectedPiece = null;
            selectedPosition = null;
            currentPlayer=(currentPlayer+1)%2;
            // Redessiner le plateau
            drawBoard();
            drawPieces();
        } else {
            // Si le mouvement est invalide, tu pourrais afficher un message
            console.log("Mouvement invalide !");
            selectedPiece=null;
        }
    }