%% nav-debut : généré par gen_navigation.py, ne pas modifier à la main %%
> [!nav]
> ↩ [[Code et Développement/Programmation/Piles et Files/Piles et Files|Accueil · Piles et Files]]
%% nav-fin %%
# Évaluation - La Bataille
> [!info] 🎯 Objectif
> Simuler une partie du jeu de la bataille avec deux files de cartes, puis présenter le programme en soutenance.
Cette page sert à la préparation de l'évaluation de la compétence [[Code et Développement/Programmation/Piles et Files/Piles et Files|Piles et Files]]. La validation se fait lors d'une soutenance individuelle.
## Le problème
Deux joueurs ont chacun un paquet de cartes. Chaque paquet est une file : on joue la carte du dessus et on range les cartes gagnées dessous.
Un tour se déroule ainsi :
1. Chaque joueur retourne la carte du dessus de son paquet.
2. La carte la plus forte gagne. L'ordre des valeurs est 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A. La couleur ne compte pas.
3. Le gagnant range sous son paquet toutes les cartes du tour : d'abord celles du joueur 1, dans l'ordre où elles ont été posées, puis celles du joueur 2.
Si les deux cartes ont la même valeur, il y a bataille. Chaque joueur pose trois cartes face cachée, puis retourne une nouvelle carte. Ces nouvelles cartes se comparent comme au point 2. Une nouvelle égalité déclenche une nouvelle bataille. Toutes les cartes posées vont au gagnant, dans l'ordre du point 3. Une bataille, même répétée, compte pour un seul tour.
La partie s'arrête quand un joueur n'a plus de cartes. Si un joueur n'a pas assez de cartes pour terminer une bataille, la partie est nulle.
Les notions utilisées sont celles de la page [[Code et Développement/Programmation/Piles et Files/02_Les files|Les files]].
## Entrée et sortie
- Ligne 1 : le nombre n de cartes du joueur 1.
- Lignes suivantes : ses n cartes, du dessus vers le dessous. Une carte s'écrit valeur puis couleur, par exemple `10H` ou `AD`.
- Ligne suivante : le nombre m de cartes du joueur 2, puis ses m cartes.
La sortie est `1 T` ou `2 T`, où 1 ou 2 est le gagnant et T le nombre de tours joués. En cas de partie nulle, la sortie est `PAT`.
## Les cas de test
```sq-fichier
nom: cas1.txt
---
3
AD
KC
QC
3
KH
QS
JC
```
```sq-fichier
nom: cas2.txt
---
3
5C
3D
2H
3
8D
9S
10C
```
```sq-fichier
nom: cas3.txt
---
6
4D
QS
9S
2H
9H
JS
6
4C
KC
QH
8H
7D
3D
```
```sq-fichier
nom: cas4.txt
---
1
AD
1
AH
```
```sq-fichier
nom: cas5.txt
---
26
3D
7H
AC
4S
9D
AS
6C
6H
KD
8C
4C
JC
3C
10H
4H
7D
9C
6S
8S
2S
QH
10S
QD
6D
QS
7C
26
2D
10C
3S
QC
KC
JS
KS
JD
AH
JH
9S
9H
2H
8H
5H
10D
5S
AD
3H
2C
KH
5D
4D
8D
7S
5C
```
## Votre programme
Écrivez la fonction `resoudre(texte)`. Elle reçoit le contenu complet d'un cas de test et renvoie la sortie attendue sous forme de chaîne. `collections.deque` convient pour les deux files.
```sq-python
def resoudre(texte):
lignes = texte.strip("\n").split("\n")
# À compléter : renvoyer la sortie attendue sous forme de chaîne
return ""
print(resoudre(open("cas1.txt").read()))
#--- tests
assert resoudre(open("cas1.txt").read()) == "1 3", "cas 1 : victoire du joueur 1"
assert resoudre(open("cas2.txt").read()) == "2 3", "cas 2 : victoire du joueur 2"
assert resoudre(open("cas3.txt").read()) == "1 2", "cas 3 : bataille dès le premier tour"
assert resoudre(open("cas4.txt").read()) == "PAT", "cas 4 : partie nulle faute de cartes"
assert resoudre(open("cas5.txt").read()) == "2 1720", "cas 5 : partie complète de 52 cartes"
```
## Pour la soutenance
- Justifier le choix d'une file pour chaque paquet.
- Expliquer l'ordre dans lequel les cartes gagnées sont rangées.
- Montrer comment le programme détecte une partie nulle.
Puzzle d'origine sur CodinGame : [Winamax Battle](https://www.codingame.com/training/medium/winamax-battle).
%% nav-debut : généré par gen_navigation.py, ne pas modifier à la main %%
> [!nav]
> ↩ [[Code et Développement/Programmation/Piles et Files/Piles et Files|Accueil · Piles et Files]]
%% nav-fin %%