From c0b77aebb15af046fadddcbfd15da82a65eb52e8 Mon Sep 17 00:00:00 2001 From: Tiago Ramos <2222055@my.ipleiria.pt> Date: Tue, 23 Dec 2025 20:08:19 +0000 Subject: [PATCH] SyntaxSquad/DADProject#14 added start logic for bot --- frontend/src/stores/bisca.js | 84 ++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/frontend/src/stores/bisca.js b/frontend/src/stores/bisca.js index 37a5903..d5c2040 100644 --- a/frontend/src/stores/bisca.js +++ b/frontend/src/stores/bisca.js @@ -63,9 +63,80 @@ export const useBiscaStore = defineStore('bisca', () => { await dealInitialCards() + if (currentTurn.value === 'opponent') { + setTimeout(botPlayCard, 1000) + } + isDealing.value = false } + const playerPlayCard = (card) => { + if (!isGameRunning.value || currentTurn.value !== 'player') return + if (table.value.playerCard) return + + playerHand.value = playerHand.value.filter((c) => c.id !== card.id) + table.value.playerCard = card + + if (!table.value.firstToPlay) table.value.firstToPlay = 'player' + + checkEndOfTrick() + } + + const botPlayCard = () => { + if (!isGameRunning.value) return + if (opponentHand.value.length === 0) return + + let cardToPlay = null + + if (table.value.playerCard) { + const pCard = table.value.playerCard + const trump = trumpCard.value.suit + + const winningCards = opponentHand.value.filter((botCard) => + doesCardWin(botCard, pCard, trump), + ) + + if (winningCards.length > 0) { + winningCards.sort((a, b) => a.strength - b.strength) + cardToPlay = winningCards[0] + } else { + const sortedHand = [...opponentHand.value].sort((a, b) => { + if (a.points === b.points) return a.strength - b.strength + return a.points - b.points + }) + cardToPlay = sortedHand[0] + } + } else { + const sortedHand = [...opponentHand.value].sort((a, b) => { + if (a.suit === trumpCard.value.suit && b.suit !== trumpCard.value.suit) return 1 + if (a.suit !== trumpCard.value.suit && b.suit === trumpCard.value.suit) return -1 + + return a.strength - b.strength + }) + cardToPlay = sortedHand[0] + table.value.firstToPlay = 'opponent' + } + + opponentHand.value = opponentHand.value.filter((c) => c.id !== cardToPlay.id) + table.value.opponentCard = cardToPlay + + checkEndOfTrick() + } + + const checkEndOfTrick = () => { + if (table.value.playerCard && table.value.opponentCard) { + currentTurn.value = 'resolving' + setTimeout(resolveTrick, 1500) + } else { + if (table.value.playerCard) { + currentTurn.value = 'opponent' + setTimeout(botPlayCard, 1000) + } else { + currentTurn.value = 'player' + } + } + } + const resolveTrick = () => { const pCard = table.value.playerCard const oCard = table.value.opponentCard @@ -117,6 +188,18 @@ export const useBiscaStore = defineStore('bisca', () => { } } + const doesCardWin = (attacker, defender, trumpSuit) => { + if (attacker.suit === trumpSuit && defender.suit !== trumpSuit) return true + + if (defender.suit === trumpSuit && attacker.suit !== trumpSuit) return false + + if (attacker.suit === defender.suit) { + return attacker.strength > defender.strength + } + + return false + } + const endGame = () => { isGameRunning.value = false isGameOver.value = true @@ -211,5 +294,6 @@ export const useBiscaStore = defineStore('bisca', () => { startGame, quitGame, resolveTrick, + playerPlayCard, } })