rajout de polling
This commit is contained in:
parent
c6aa103a7f
commit
b9901c133c
2 changed files with 59 additions and 28 deletions
|
|
@ -15,6 +15,9 @@ class Game:
|
||||||
self.discards_bots = [[] for _ in range(3)]
|
self.discards_bots = [[] for _ in range(3)]
|
||||||
self.hidden_discards_bots = [[] for _ in range(3)]
|
self.hidden_discards_bots = [[] for _ in range(3)]
|
||||||
|
|
||||||
|
self.has_draw = False
|
||||||
|
self.has_played = True
|
||||||
|
|
||||||
self.scores = [25000] * 4
|
self.scores = [25000] * 4
|
||||||
|
|
||||||
self.winds = [
|
self.winds = [
|
||||||
|
|
@ -57,6 +60,12 @@ class Game:
|
||||||
self.discards_bots = [[] for _ in range(3)]
|
self.discards_bots = [[] for _ in range(3)]
|
||||||
self.hidden_discards_bots = [[] for _ in range(3)]
|
self.hidden_discards_bots = [[] for _ in range(3)]
|
||||||
|
|
||||||
|
def play_draw(self):
|
||||||
|
if self.turn == 0:
|
||||||
|
self.hand_player.draw(self.wall.draw())
|
||||||
|
self.has_draw = True
|
||||||
|
print(f"player {self.turn} has draw")
|
||||||
|
|
||||||
def draw_tile(self, hand: Hand):
|
def draw_tile(self, hand: Hand):
|
||||||
tile = self.wall.draw()
|
tile = self.wall.draw()
|
||||||
hand.draw_tile(tile)
|
hand.draw_tile(tile)
|
||||||
|
|
|
||||||
|
|
@ -141,43 +141,20 @@
|
||||||
.then(html => document.getElementById('menu').innerHTML = html);
|
.then(html => document.getElementById('menu').innerHTML = html);
|
||||||
|
|
||||||
// Afficher la mascotte et le texte
|
// Afficher la mascotte et le texte
|
||||||
const mascolteEl = document.getElementById('mascotte');
|
const mascotteEl = document.getElementById('mascotte');
|
||||||
mascolteEl.innerHTML = '<img src="/img/tilineau/idle.png" alt="Tilineau">';
|
mascotteEl.innerHTML = '<img src="/img/tilineau/idle.png" alt="Tilineau">';
|
||||||
document.getElementById('speech-text').innerHTML = texts.riichi.chap5;
|
document.getElementById('speech-text').innerHTML = texts.riichi.chap5;
|
||||||
|
|
||||||
// Toggle bulle de dialogue au clic sur la mascotte
|
// Toggle bulle de dialogue au clic sur la mascotte
|
||||||
const speechBubble = document.querySelector('.speech-bubble');
|
const speechBubble = document.querySelector('.speech-bubble');
|
||||||
mascolteEl.addEventListener('click', () => {
|
mascotteEl.addEventListener('click', () => {
|
||||||
speechBubble.classList.toggle('visible');
|
speechBubble.classList.toggle('visible');
|
||||||
mascolteEl.innerHTML = speechBubble.classList.contains('visible')
|
mascotteEl.innerHTML = speechBubble.classList.contains('visible')
|
||||||
? '<img class="explaining" src="/img/tilineau/explaining.png" alt="Tilineau">'
|
? '<img class="explaining" src="/img/tilineau/explaining.png" alt="Tilineau">'
|
||||||
: '<img src="/img/tilineau/idle.png" alt="Tilineau">';
|
: '<img src="/img/tilineau/idle.png" alt="Tilineau">';
|
||||||
});
|
});
|
||||||
|
|
||||||
// Initialiser une partie au chargement du chapitre 5
|
// Fonction d'affichage d'une main
|
||||||
fetch('/api/game/start', { method: 'POST' })
|
|
||||||
.then(r => r.json())
|
|
||||||
.then(data => {
|
|
||||||
console.log('Réponse API', data);
|
|
||||||
if (data.state && data.state.hand_player) {
|
|
||||||
displayHand(data.state.hand_player, 'hand-0');
|
|
||||||
}
|
|
||||||
// Affichage des mains bots (1, 2, 3)
|
|
||||||
[1, 2, 3].forEach(id => {
|
|
||||||
fetch(`/api/game/hand/${id}`)
|
|
||||||
.then(r => r.json())
|
|
||||||
.then(botData => {
|
|
||||||
if (botData.hand) {
|
|
||||||
displayHand(botData.hand, `hand-${id}`);
|
|
||||||
} else {
|
|
||||||
console.error(`Main vide pour joueur ${id}`);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(e => console.error(`Erreur main ${id}`, e));
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.catch(e => console.error('Erreur initialisation partie', e));
|
|
||||||
|
|
||||||
function displayHand(hand, displayId) {
|
function displayHand(hand, displayId) {
|
||||||
const display = document.getElementById(displayId);
|
const display = document.getElementById(displayId);
|
||||||
display.innerHTML = '';
|
display.innerHTML = '';
|
||||||
|
|
@ -192,6 +169,51 @@
|
||||||
display.appendChild(tileDiv);
|
display.appendChild(tileDiv);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Polling pour récupérer la main d'un bot
|
||||||
|
function fetchBotHandWithRetry(id, tries = 8, delay = 300) {
|
||||||
|
fetch(`/api/game/hand/${id}`)
|
||||||
|
.then(r => r.json())
|
||||||
|
.then(botData => {
|
||||||
|
if (botData.hand) {
|
||||||
|
displayHand(botData.hand, `hand-${id}`);
|
||||||
|
} else if (tries > 0) {
|
||||||
|
setTimeout(() => fetchBotHandWithRetry(id, tries - 1, delay), delay);
|
||||||
|
} else {
|
||||||
|
console.error(`Main vide pour joueur ${id}`);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(e => {
|
||||||
|
if (tries > 0) {
|
||||||
|
setTimeout(() => fetchBotHandWithRetry(id, tries - 1, delay), delay);
|
||||||
|
} else {
|
||||||
|
console.error(`Erreur main ${id}`, e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialiser une partie au chargement du chapitre 5
|
||||||
|
fetch('/api/game/start', { method: 'POST' })
|
||||||
|
.then(r => r.json())
|
||||||
|
.then(data => {
|
||||||
|
console.log('Réponse API', data);
|
||||||
|
// Si has_draw est False, on appelle play_draw et on attend le reload
|
||||||
|
if (data.state && data.state.has_draw === false) {
|
||||||
|
fetch('/api/play_draw', { method: 'POST' })
|
||||||
|
.then(() => {
|
||||||
|
location.reload();
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Afficher la main du joueur
|
||||||
|
if (data.state && data.state.hand_player) {
|
||||||
|
displayHand(data.state.hand_player, 'hand-0');
|
||||||
|
// Affichage des mains bots (1, 2, 3) avec polling
|
||||||
|
[1, 2, 3].forEach(id => {
|
||||||
|
fetchBotHandWithRetry(id);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
Loading…
Reference in a new issue