# function pausa -------------------------------------------------
pausa <- function() {
  cat ("\n >> Premi Invia per il prossimo numero\n")
  scan()
}

# funziona che `mescola' all'inizio -------------------------------
# disponendo quindi l'ordine di uscita 
nuova.tombolata <- function() {
  numeri.tombola <<- sample(1:90)
  n.tomb.rim <<- 90
}

# estrae un numero alla volta ------------------------------------
estrai.numero <- function() {
  if (n.tomb.rim == 0) {
    cat(sprintf("Sveglia! La tombola è finita\n"))
    return(NULL)
  } else {
    n.tomb.rim <<- n.tomb.rim - 1
    return( numeri.tombola[90 - n.tomb.rim] )
  }
}

# controlla se n è fra quelli usciti -----------------------------
controlla.uscito <- function(n) {
  esiti = c('Non uscito. Porta pazienza', 'Uscito. Sveglia!')  
  esiti[ any(numeri.tombola[1:(90-n.tomb.rim)] == n) + 1]
}

# prepara il tabellone ------------------------------------------
tabellone <- function(click=FALSE) {
  f = 1/5  # per convertire numeri in coordinate
  plot(NULL, xlim=c(1, 10), ylim=c(-91*f - 2 * click,-9*f),
       xaxt="n", yaxt="n", xlab='',ylab='')
  abline(h=-(2.5+1)*10*f)
  abline(h=-(5.5+1)*10*f)
  abline(v=5.5)
  for (i in 1:90) segna.numero(i, 'gray90')  
  if (click) { # versione cliccabile
    abline(h=-(8.5+1)*10*f)
    text(8, -(9+1)*10*f, 'Estrai numero', col='blue', cex=2.5)
    text(3, -(9+1)*10*f, 'Termina', col='red', cex=2.5)
  }
}

# segna un numero sul tabellone ---------------------------------
segna.numero <- function(n, fondo='lightblue') {
  if(!is.numeric(n) || (n < 1 && n> 90)) return
  f = 1/5    
  c = n%%10
  if (c==0) c = 10
  r = (n - c) %/% 10
  points(c, -(r+1)*10*f, pch=19, cex=8, col=fondo)
  text(c,-(r+1)*10*f,labels=r*10+c, cex=2)
}

#-------------------------------------------------
#Infine, per giocare: 
gioca.tombola <- function (n.max=90, t.pausa=-1) {
  # t.pausa: tempo fre le estrazioni (secondi)
  # se negatico aspetta Invio
  tabellone()             
  nuova.tombolata()
  if(n.max < 1) return("Per giocare usa 'estrai.numero()' e segna.numero()")

n0 = 0                          # 21/12/2018
for (i in 1:n.max) {
    n <- estrai.numero()   
    segna.numero(n, 'green')    # 21/12/2018
    if(n0>0) segna.numero(n0)   # 21/12/2018
    if( t.pausa >= 0) {
      Sys.sleep(t.pausa)
    } else {
      pausa()
    }
    n0 = n
  }
}

#versione cliccabile 
tombola <- function () {
  tabellone(click=TRUE)             
  nuova.tombolata()
  f = 1/5
  e.l <- c(6.5, 9.5, -20.5, -19.8) # limiti 'tasto' estrazione
  t.l <- c(2, 4, -20.5, -19.8)     # limiti 'tasto' fine gioco

#  text(8, -(9+1)*10*f, 'Estrai numero', col='blue', cex=2)
#  text(3, -(9+1)*10*f, 'Termina', col='red', cex=2)
  n.prec <- NA
  for (i in 1:90) {
    repeat {
      l <- locator(1)
      if (l$x > e.l[1] & l$x < e.l[2] & l$y > e.l[3] & l$y < e.l[4]) {
        n <- estrai.numero();
        segna.numero(n, fondo='green');
        if(!is.na(n.prec)) segna.numero(n.prec, fondo='lightblue');
        n.prec <- n
        break 
      } else if (l$x > t.l[1] & l$x < t.l[2] & l$y > t.l[3] & l$y < t.l[4]) {
        return(sprintf("tombola terminata dopo %d estrazioni", 90-n.tomb.rim))  
      }
    } 
  }
}

# video, provare xmg? http://www.sussex.ac.uk/Users/christ/help/xmg.html
# Google ( grab xwindows mpeg   )

#---------------------------------------------------
# quindi, queste sono le possibilità, dopo aver
# fatto eseguire lo scritto con
#
# > source('tombola.R')
#
# A) versione cliccabile:
# > tombola()
#
# B) vecchia versione:
#
# 1: > gioca.tombola()
#
# 2: > gioca.tombola(t=1)    # per generare numeri intervallati
#
# 3: chiamare 'a mano le varie funzioni, ad esempio:
#    > tabellone()
#    > nuova.tombolata() 
#    > ( n = estrai.numero() ) ; segna.numero(n)
#    > ( n = estrai.numero() ) ; segna.numero(n) 
#      ... etc ...
#    > controlla.uscito(25)
#    > ( n = estrai.numero() ) ; segna.numero(n)
#      ... etc ...
#
#    [Ovviamente i primi due comandi possono essere
#     sostituiti da 'gioca.tombola(0)']
#----------------------------------------------------
