/* Creare un programma che mostri una clessidra che scandisce un countdown, i parametri di tempo (minuti) vanno letti da stdin. Dimensione della clessidra è funzione dei minuti per cui è stata programmata. Inizio: ********** ******** ****** **** * * * * * * *________* In itinere: * * ******** ****** **** * * * * * * ********** Fine: * * * * * * * * **** ****** ******** ********** */ func main() { // chiedere dati a utente // chiamare funzione disegna clessidra in un ciclo temporizzato, // cancellando schermo tra un disegno e l'altro } // funzione che disegna una singola riga // accetta lunghezza, stato di piena o meno, carattere da usare, shift // Dato che avete già visto strings provate a farlo senza for // funzione che disegna tutta la clessidra // accetta altezza, livello passaggio sabbia (100% sabbia tutta su, 0% tutta giù) // Funzione che attende // time.Sleep(n_seconds * time.Second) // (o time.Millisecond, time.Nanosecond....) // Funzione che fa il clear dello schermo func cancella() { cmd := exec.Command("clear") cmd.Stdout=os.Stdout log.Printf("Running command and waiting for it to finish...") cmd.Run() //log.Printf("Command finished with error: %v", err) } /*+++++++++++++++++ Programma clessidra +++++++++++++++++*/ package main import ( "fmt" "os" "os/exec" "strings" "time" ) func main() { var height, timer int var char string clean() fmt.Print("Inserire i livelli della clessidra (metà clessidra): ") fmt.Scan(&height) fmt.Print("Inserire il carattere da usare per la clessidra: ") fmt.Scan(&char) fmt.Print("Inserire la durata della clessidra: ") fmt.Scan(&timer) rChar := []rune(char) if draw(height, rChar[0], timer) { fmt.Println("Tempo scaduto!") } else { fmt.Println("Il numero di livelli deve essere maggiore di 1") } } // Funzione che disegna una singola riga. Accetta lunghezza, pienezza, carattere, shift func row(lenght int, full bool, char rune, shift int) { str := string(char) switch full { case true: str := strings.Repeat(" ", shift) + strings.Repeat(str, lenght-2*shift) + strings.Repeat(" ", shift) fmt.Println(str) case false: str := strings.Repeat(" ", shift) + str + strings.Repeat(" ", lenght-2*shift-2) + str + strings.Repeat(" ", shift) fmt.Println(str) } } // Funzione disegna clessidra func draw(height int, char rune, timer int) bool { clean() livelliT := height livelli := livelliT if height > 1 { l := height*2 + 1 for livelli >= 0 { for i := 0; i < livelliT-livelli; i++ { row(l, false, char, i) } for i := livelliT - livelli; i < livelliT; i++ { row(l, true, char, i) } for i := livelliT - 1; i >= livelliT-livelli; i-- { row(l, false, char, i) } for i := livelliT - livelli - 1; i >= 0; i-- { row(l, true, char, i) } if livelli != 0 { time.Sleep(time.Duration((timer * 1000 / height)) * time.Millisecond) clean() } livelli-- } } else { return false } clean() return true } // Funzione cancella schermo func clean() { cmd := exec.Command("clear") cmd.Stdout = os.Stdout cmd.Run() }