Introduction

Le but de ce challenge est d’implémenter from scratch le jeu du Black Jack. Je vous invite donc à lire les règles du jeu. Pour ce premier challenge uniquement je vais vous aider pour le départ. Ainsi nous allons commencer à écrire tous ensemble du code. Pour les prochains challenges, vous vous débrouillerez tout seul comme des grands.

Point de départ

playBlackJack <- function(){
  ## un bon etudiant commente son code
  
  ## Dans le black jack on se fiche pas mal
  ## de la famille donc on utilise que la valeur
  ## pour la suite
  
  ## Une fonction utile plus tard
  afficheJeu <- function()
    print(mains[1:tour,])
  
  jeu <- rep(c("As", 2:10, "Valet", "Dame", "Roi"), 4)
  jeu <- sample(jeu, 52)
  
  mains <- matrix(NA, 52, 2)
  colnames(mains) <- c("Croupier", "Joueur")
  
  mains[1:2,1:2] <- jeu[1:4]
  jeu <- jeu[-(1:4)]
  
  tour <- 2
  afficheJeu()
  
  ## Commencons a jouer
  tour <- 3
  while (TRUE){
    veuxCarte <- readline("Carte ? (Carte / Non) : ")
    
    if (veuxCarte == "Non")
      break
    else if (veuxCarte == "Carte"){
      mains[tour, 2] <- jeu[1]
      jeu <- jeu[-1]
      tour <- tour + 1
      
      afficheJeu()
      
      point.joueur <- calculPoint(mains[,2])
      
      if (point.joueur > 21)
        break
    } else
      cat("T'es serieux la... Tu sais pas lire cretin")
  }
  
  tour.save <- tour
  ## Le croupier joue
  tour <- 3
  while (TRUE){
    nb.point <- calculPoint(mains[,1])
    
    if (nb.point < 17){
      mains[tour, 1] <- jeu[1]
      jeu <- jeu[-1]
      tour <- tour + 1
      
      afficheJeu()
    } else
      break    
  }
  
  mains <- mains[1:max(tour.save, tour),]
  return(mains)  
}


calculPoint <- function(main){
  main[main %in% c("Valet", "Dame", "Roi")] <- 10
  sub.main <- as.numeric(main[main != "As"])
  sub.tot <- sum(sub.main, na.rm = TRUE)
  
  main[main == "As"] <- ifelse(sub.tot > 10, 1, 11)
  
  return(sum(as.numeric(main), na.rm = TRUE))
}

Et le script R

source("BlackJack.R")

toto <- playBlackJack()

Objectifs

  1. Bon bah avoir déjà un code qui fait ce qu’il doit faire pour 1 joueur contre le croupier
  2. Génaraliser avec \(n\) joueurs
  3. Autoriser différentes stratégies pour le croupier par exemple via un argument croupier.limit, valeur au delà de laquelle le croupier cesse de prendre de carte.
  4. Faites de même pour les joueurs.
  5. Faites une étude de Monte Carlo pour analyser l’impact de la stratégie sur les gains. Une suggestion pour présenter vos résultats serait de faire une heat map (je vous laisse chercher ce que c’est) du graphe de la fonction \[(croupier.limit, joueur.limit) \mapsto \Pr(\text{joueur ne perd pas})\] où la probabilité sera estimée justement via Monte Carlo.
  6. Bonus : Traitez le cas où l’on choisit de manière intelligente si les As valent 1 ou 11. Bref pas comme nous l’avons fait ensemble au début via la célèbre stratégie de travail développée par M. Al Arrache.