#--------------------------------------------
#  gioco strategico delle 21 palline
#
# GdA, Roma, 8/12/2012
#--------------------------------------------



g21 <- function(livello=-1, print=FALSE) { 
  # livello:  0: stupido
  #           1: stupido le prime due mosse, poi usa strategia
  #           2:   "         "    tre   "     "   "     "    
  #           3: usa strategia
  #          -1: sceglie a caso il livello
  
  n <- 21  # versione grafica solo con 21 palline
  if (livello < 0) livello <- sample(0:3, 1)
  
  #-- grafica ----------------------------------------
  R6 <- 10
  a6 <- R6*sin(pi/6)
  L6 <- 2*R6*cos(pi/6)
  dv <- (R6+a6)/5      # spaziatura verticale
  dh <- L6/5           #     ''     orizzontale 

  if(!is.null(dev.list())) lapply(as.numeric(dev.list()), dev.off)
  
  dev.new(width=6, height=6)
  old.mar = par("mar")
  par(mar=c(0., 0., 0., 0.)) 
  par(bg='darkgreen')
  plot(NULL, xlim=c(-10., 10.)  , ylim=c(-5, 10), axes=FALSE,
     xlab='', ylab='',asp=1)
  rect(6, 7, 10, 9,  col='white', border='black') 
  text(8, 8, "fatto", cex=3)

  p <- matrix(1:42, 21, 2)
  np <- 0
  for (v in 0:5) { # loop verticale dal basso all'alto
    y <- -a6 + v * dv
    for (h in 0:(5-v)) {
      x <- -L6/2 + dh/2*v + h*dh
      np <- np + 1
      p[np,1] <- x
      p[np,2] <- y
    } 
  }
  vive <- rep(TRUE, 21)   # palline in gioco
  i.vive <- 1:21
  points(p[,1], p[,2], pch=19, cex=8, col='red')
  par(mar=old.mar)

  #-- comincia il gioco ------------------------------------------
  iniziTu <- FALSE
  if( runif(1)> 0.5 ) iniziTu <- TRUE  # giocatore inizia 

  haivinto <- FALSE
  mossaR <- 0
  while (n > 0) {
    if (iniziTu) {
      rect(6, 7, 10, 9,  col='white', border='black') 
      text(8, 8, "a te", cex=3)
      if(print) cat(sprintf("Sono rimaste %d palline: scegli un numero da 1 a 3\n",n))
      n.click <- min(4, n+1)
      nc <- 0
      repeat {
         l <- locator(1)
         if( (l$x > 6 & l$x < 10) & (l$y > 7 & l$y < 9) & nc > 0) {
           rect(6, 7, 10, 9,  col='white', border='black') 
           text(8, 8, "a me", cex=3)
           break
         } else {
           # cerchiamo la pallina beccata
           cand <- which( (sqrt((l$x - p[,1])^2 + (l$y - p[,2])^2) < 1 ) & vive, TRUE)
           if(length(cand) == 0) next # è andata a vuoto: clicka ancora
           vive[cand] = FALSE
           points(p[cand,1], p[cand,2], pch=19, cex=8, col='pink')
           if(length(i.vive) > 0) i.vive <- i.vive[!(i.vive==cand)]
           nc <- nc + 1
           if( ((n-nc) == 0) || (nc == 3) ) break    # max nr palline
         } 
      }
       
      ns <- nc # ci raccordiamo con il vecchio programma
      if(print) cat(sprintf("Hai scelto %d palline\n", ns))
      n <- max(0, n-ns)
      if (n==0) {
        haivinto = TRUE
        break;
      }
    }
    rect(6, 7, 10, 9,  col='white', border='black') 
    text(8, 8, "a me", cex=3)
    mossaR = mossaR + 1
    if (livello == 0 || (livello < 3 && mossaR <= (4-livello) )) {
      if ((n >= 3) & (n <= 4)) {  # scemo sì, ma c'è un limite
        ns <- 1
      } else {
        ns <- min( sample(c(1,2,3), 1), n)
      }
    } else {
      ns = n %% 4 
      if (ns == 0) ns <- min( sample(c(1,2,3), 1), n)
    }
    Sys.sleep(2)
    scelte <- sample(i.vive, ns)
    vive[scelte] <- FALSE
    for (cand in scelte) { i.vive <- i.vive[!(i.vive==cand)]
                           points(p[cand,1], p[cand,2], pch=19, cex=8, col='yellow')
                           Sys.sleep(1.5)
                         }
    #------------------------------------------------------
    if(print) cat(sprintf("\nSono rimaste %d palline. Scelgo io\n",n))
    if(print) cat(sprintf("Ho scelto %d palline\n\n\n", ns))
    n <- max(0, n-ns)
    if (n==0) {
      break;
    }
    iniziTu <- TRUE 
  }
  rect(6, 7, 10, 9,  col='white', border='black') 
           text(8, 8, "Fine", cex=3)
  if (haivinto) {
    if(print) cat(sprintf("\n    HAI VINTO!!\n",n))
    text(+5.9, 10.3, "hai vinto", cex=3.5, col='white')
  } else { 
    if(print) cat(sprintf("\n    Ho vinto io! Riprova\n",n))
    text(-5.9, 10.3, "Ho vinto!", cex=3.5, col='white')
  }  
}
