#!/bin/bash

# Cartes :
# Gère quatre mains d'un jeu de cartes.

NON_RECUPERE=0
RECUPERE=1

DUPE_CARD=99

LIMITE_BASSE=0
LIMITE_HAUTE=51
CARTES_DANS_SUITE=13
CARTES=52

declare -a Jeu
declare -a Suites
declare -a Cartes
#  Le script aurait été plus simple à implémenter et plus intuitif
#+ avec un seul tableau à trois dimensions.
# Peut-être qu'une future version de Bash gèrera des tableaux multi-dimensionnels.


initialise_Jeu ()
{
i=$LIMITE_BASSE
until [ "$i" -gt $LIMITE_HAUTE ]
do
  Jeu[i]=$NON_RECUPERE   # Initialise chaque carte d'un "Jeu" comme non récupérée.
  let "i += 1"
done
echo
}

initialise_Suites ()
{
Suites[0]=C #Carreaux
Suites[1]=D #Piques
Suites[2]=H #Coeurs
Suites[3]=S #Trèfles
}

initialise_Cartes ()
{
Cartes=(2 3 4 5 6 7 8 9 10 J Q K A)
# Autre méthode pour initialiser un tableau.
}

recupere_une_carte ()
{
numero_carte=$ALEATOIRE
let "numero_carte %= $CARTES"
if [ "${Jeu[numero_carte]}" -eq $NON_RECUPERE ]
then
  Jeu[numero_carte]=$RECUPERE
  return $numero_carte
else  
  return $DUPE_CARD
fi
}

analyse_carte ()
{
nombre=$1
let "suit_nombre = nombre / CARTES_DANS_SUITE"
suite=${Suites[suit_nombre]}
echo -n "$suit-"
let "no_carte = nombre % CARTES_DANS_SUITE"
Carte=${Cartes[no_carte]}
printf %-4s $Carte
# Affiche proprement les cartes.
}

recherche_nombre_aleatoire ()  # Générateur de nombres aléatoires.
{                              # Que se passe-t'il si vous ne faites pas cela ?
recherche=`eval date +%s`
let "recherche %= 32766"
ALEATOIRE=$recherche
# Quelles sont les autres méthodes de génération de nombres aléatoires ?
}

gere_cartes ()
{
echo

cartes_recuperees=0
while [ "$cartes_recuperees" -le $LIMITE_HAUTE ]
do
  recupere_une_carte
  t=$?

  if [ "$t" -ne $DUPE_CARD ]
  then
    analyse_carte $t

    u=$cartes_recuperees+1
    # Retour à un indexage simple (temporairement). Pourquoi ?
    let "u %= $CARTES_DANS_SUITE"
    if [ "$u" -eq 0 ]   # Condition if/then imbriquée.
    then
     echo
     echo
    fi
    # Mains séparées.

    let "cartes_recuperees += 1"
  fi  
done  

echo

return 0
}


# Programmation structurée :
# La logique entière du programme est modularisée en fonctions.

#================
recherche_nombre_aleatoire
initialise_Jeu
initialise_Suites
initialise_Cartes
gere_cartes
#================

exit 0



# Exercice 1 :
# Ajouter des commentaires détaillées de ce script.

# Exercice 2 :
# Ajouter une routine (fonction) pour afficher chaque main triée par suite.
# Vous pouvez ajouter d'autres fonctionnalités suivant vos souhaits.

# Exercice 3 :
# Simplifier et améliorer la logique du script.
