User Tools

Site Tools


pub:labprog:20181112

12 novembre 2018

/*
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()
}
pub/labprog/20181112.txt · Last modified: 2018/11/13 18:09 by andrea.milani