From d8476230145f15fc24fdea82eb59ffb0ad6da2ca Mon Sep 17 00:00:00 2001 From: Claudio Maggioni Date: Fri, 26 May 2017 16:43:12 +0200 Subject: [PATCH 1/7] Fix html --- element.go | 34 +++++++++++++++++----------------- template/Interfaccia.html | 30 +++++++++++------------------- 2 files changed, 28 insertions(+), 36 deletions(-) diff --git a/element.go b/element.go index c82d997..6f0819d 100644 --- a/element.go +++ b/element.go @@ -3,29 +3,29 @@ package main import "fmt" type Element struct { //struttura che contiene sia cibo sia amebe - IsFood bool //se il contenuto della cella è cibo - Health int //la sua vita - Age int //la sua età - Razza string //per distiguere amici da nemici - Evoluzione int //se evolve in positivo avrà un bonus in attacco che viene sommato a Health - CostoMov int //quanta energia spende per muoversi - CostoSex int //quanto spende per riprodursi - Premura int //quanto distacco di energia è necessario per compiere la riproduzione allo scopo di evitare di rimanere a secco + IsFood bool //se il contenuto della cella è cibo + Health int //la sua vita + Age int //la sua età + Razza string //per distiguere amici da nemici + Evoluzione int //se evolve in positivo avrà un bonus in attacco che viene sommato a Health + CostoMov int //quanta energia spende per muoversi + CostoSex int //quanto spende per riprodursi + Premura int //quanto distacco di energia è necessario per compiere la riproduzione allo scopo di evitare di rimanere a secco } func (e Element) String() string { - return fmt.Sprintf("", e.IsFood, e.Health, e.Age) + return fmt.Sprintf("E'Cibo=%t Salute=%d Eta=%d", e.IsFood, e.Health, e.Age) } func Costruttore(razza string, evoluzione int, costomov int, costosex int, premura int, salute int) *Element { nuovo := new(Element) - nuovo.IsFood=false - nuovo.Health=salute - nuovo.Age=0 - nuovo.Razza=razza - nuovo.Evoluzione=evoluzione - nuovo.CostoMov=costomov - nuovo.CostoSex=costosex - nuovo.Premura=premura + nuovo.IsFood = false + nuovo.Health = salute + nuovo.Age = 0 + nuovo.Razza = razza + nuovo.Evoluzione = evoluzione + nuovo.CostoMov = costomov + nuovo.CostoSex = costosex + nuovo.Premura = premura return nuovo } diff --git a/template/Interfaccia.html b/template/Interfaccia.html index 0af4feb..8fe3176 100644 --- a/template/Interfaccia.html +++ b/template/Interfaccia.html @@ -1,7 +1,7 @@ GoBug - +

Go bug

+ {{range $riga := .matrice}} {{range $cella := $riga}} @@ -69,8 +62,7 @@ {{ else }} class="razza1" {{ end }} - {{ end }} - >{{ $cella }} + {{ end }}>{{ $cella }} {{ end }} {{ end }} From e6f14040830b3a73e90380534b2bacead1cd5a89 Mon Sep 17 00:00:00 2001 From: Giorgio Croci Date: Fri, 26 May 2017 16:54:51 +0200 Subject: [PATCH 2/7] Cose --- element.go | 4 ++-- main.go | 41 +++++++++++++++++++++++++++-------------- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/element.go b/element.go index c82d997..4d00568 100644 --- a/element.go +++ b/element.go @@ -6,7 +6,7 @@ type Element struct { //struttura che contiene sia cibo sia amebe IsFood bool //se il contenuto della cella è cibo Health int //la sua vita Age int //la sua età - Razza string //per distiguere amici da nemici + Razza int //per distiguere amici da nemici Evoluzione int //se evolve in positivo avrà un bonus in attacco che viene sommato a Health CostoMov int //quanta energia spende per muoversi CostoSex int //quanto spende per riprodursi @@ -17,7 +17,7 @@ func (e Element) String() string { return fmt.Sprintf("", e.IsFood, e.Health, e.Age) } -func Costruttore(razza string, evoluzione int, costomov int, costosex int, premura int, salute int) *Element { +func Costruttore(razza int, evoluzione int, costomov int, costosex int, premura int, salute int) *Element { nuovo := new(Element) nuovo.IsFood=false nuovo.Health=salute diff --git a/main.go b/main.go index 3603a99..50a4505 100644 --- a/main.go +++ b/main.go @@ -12,12 +12,15 @@ import ( var Matrix [][]*Element var Altezza int var Larghezza int -var SaluteIniziale int +var SaluteIniziale int = 50 +var CostoMovIniziale int = 5 +var CostoSexIniziale int = 100 +var EvoluzioneIniziale int = 0 +var PremuraIniziale int = 100 var Clock uint var NumClock uint func main() { //FUNZIONE MAIN - SaluteIniziale = 50 Clock = 1 NumClock = 0 rand.Seed(time.Now().UTC().UnixNano()) //inizializzazione rand @@ -42,6 +45,11 @@ func main() { //FUNZIONE MAIN Matrix[i][j].IsFood = false Matrix[i][j].Age = 0 Matrix[i][j].Health = SaluteIniziale + Matrix[i][j].CostoMov = CostoMovIniziale + Matrix[i][j].CostoSex = CostoSexIniziale + Matrix[i][j].Evoluzione = EvoluzioneIniziale + Matrix[i][j].Premura = PremuraIniziale + Matrix[i][j].Razza = rand.Intn(2) case 1: Matrix[i][j] = nil //vuota case 2: @@ -79,6 +87,10 @@ func muovi(h int, w int) { //FUNZIONE MUOVI: aggiorna la posizione di tutti gli if elemento == nil || elemento.IsFood { //controllo se 'elemento' è cibo o un altro essere return } + + if elemento.Health<=0 { + Matrix[h][w] = nil + } direzCasOriz := rand.Intn(3) //numero da 0 a 2 direzCasOriz-- direzCasVert := rand.Intn(3) @@ -90,12 +102,13 @@ func muovi(h int, w int) { //FUNZIONE MUOVI: aggiorna la posizione di tutti gli nuovaPosizioneW >= Larghezza || nuovaPosizioneW < 0 { //se esce dai bordi return } - - if tmpNewElem := Matrix[nuovaPosizioneH][nuovaPosizioneW]; tmpNewElem != nil { + tmpNewElem := Matrix[nuovaPosizioneH][nuovaPosizioneW] + if tmpNewElem != nil { if tmpNewElem.Razza != elemento.Razza { //se non è dalla stessa razza if tmpNewElem.IsFood || (tmpNewElem.Health+tmpNewElem.Evoluzione) < (elemento.Health+elemento.Evoluzione) { // se e' cibo o un insetto piu debole elemento.Health += tmpNewElem.Health //prelevamento energia essere fagocitato - Matrix[nuovaPosizioneH][nuovaPosizioneW] = elemento //inglobamento essere peritos + Matrix[nuovaPosizioneH][nuovaPosizioneW] = elemento //inglobamento essere perito + elemento.Health -= elemento.CostoMov } else { Matrix[h][w] = nil //perdita nel combattimento per la sopravvivenza tmpNewElem.Health += elemento.Health //il nemico prende l'energia @@ -106,20 +119,20 @@ func muovi(h int, w int) { //FUNZIONE MUOVI: aggiorna la posizione di tutti gli } } } else { //si muove sulla nuova casella - Matrix[nuovaPosizioneH][nuovaPosizioneW] = elemento + Matrix[nuovaPosizioneH][nuovaPosizioneW] = Matrix[h][w] Matrix[h][w] = nil - elemento.Health -= elemento.CostoMov + Matrix[nuovaPosizioneH][nuovaPosizioneW].Health -= Matrix[nuovaPosizioneH][nuovaPosizioneW].CostoMov if rand.Intn(10) == 0 { //se ha fortuna (o sfortuna) si evolve if rand.Intn(3) == 0 { - elemento.Evoluzione-- + Matrix[nuovaPosizioneH][nuovaPosizioneW].Evoluzione-- } else { - elemento.Evoluzione++ + Matrix[nuovaPosizioneH][nuovaPosizioneW].Evoluzione++ } } - if (elemento.Health-elemento.Premura)>elemento.CostoSex { //se ha energia a sufficienza per riprodursi - Matrix[h][w] = Costruttore(elemento.Razza, elemento.Evoluzione, elemento.CostoMov, elemento.CostoSex, elemento.Premura, SaluteIniziale) + if (Matrix[nuovaPosizioneH][nuovaPosizioneW].Health-Matrix[nuovaPosizioneH][nuovaPosizioneW].Premura)>Matrix[nuovaPosizioneH][nuovaPosizioneW].CostoSex { //se ha energia a sufficienza per riprodursi + //Matrix[h][w] = Costruttore(elemento.Razza, elemento.Evoluzione, elemento.CostoMov, elemento.CostoSex, elemento.Premura, SaluteIniziale) } } @@ -145,12 +158,12 @@ func stampaMatrice() { for i := 0; i < Altezza; i++ { for j := 0; j < Larghezza; j++ { if Matrix[i][j] == nil { - fmt.Printf("-- ") + fmt.Printf(" -- ") } else { if Matrix[i][j].IsFood { - fmt.Printf("CC ") + fmt.Printf(" CC ") } else { - fmt.Printf("%d ", Matrix[i][j].Health) + fmt.Printf("%d %d ",Matrix[i][j].Razza, Matrix[i][j].Health) } } } From 5c99f837cf280ae604ae38bee6c1fdd08b7d53ff Mon Sep 17 00:00:00 2001 From: Giorgio Croci Date: Fri, 26 May 2017 17:24:17 +0200 Subject: [PATCH 3/7] Immagine --- hackathon.png | Bin 0 -> 38743 bytes main.go | 29 ++++++++++++++++------------- 2 files changed, 16 insertions(+), 13 deletions(-) create mode 100644 hackathon.png diff --git a/hackathon.png b/hackathon.png new file mode 100644 index 0000000000000000000000000000000000000000..0c9a696fc65bdd6efc164fdb637cd355029fc4a5 GIT binary patch literal 38743 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 N+d}>k+!)B@{tdON&{qHe literal 0 HcmV?d00001 diff --git a/main.go b/main.go index 50a4505..4998aa9 100644 --- a/main.go +++ b/main.go @@ -102,16 +102,19 @@ func muovi(h int, w int) { //FUNZIONE MUOVI: aggiorna la posizione di tutti gli nuovaPosizioneW >= Larghezza || nuovaPosizioneW < 0 { //se esce dai bordi return } + tmpNewElem := Matrix[nuovaPosizioneH][nuovaPosizioneW] + if tmpNewElem != nil { if tmpNewElem.Razza != elemento.Razza { //se non è dalla stessa razza if tmpNewElem.IsFood || (tmpNewElem.Health+tmpNewElem.Evoluzione) < (elemento.Health+elemento.Evoluzione) { // se e' cibo o un insetto piu debole elemento.Health += tmpNewElem.Health //prelevamento energia essere fagocitato - Matrix[nuovaPosizioneH][nuovaPosizioneW] = elemento //inglobamento essere perito - elemento.Health -= elemento.CostoMov - } else { - Matrix[h][w] = nil //perdita nel combattimento per la sopravvivenza + tmpNewElem = elemento //inglobamento essere perito + elemento = nil + tmpNewElem.Health -= tmpNewElem.CostoMov + } else { //perdita nel combattimento per la sopravvivenza tmpNewElem.Health += elemento.Health //il nemico prende l'energia + elemento = nil } } else { //se sono amici if nuovaPosizioneH == h && nuovaPosizioneW == w { //se cerca di mangiare il suo amico @@ -119,20 +122,20 @@ func muovi(h int, w int) { //FUNZIONE MUOVI: aggiorna la posizione di tutti gli } } } else { //si muove sulla nuova casella - Matrix[nuovaPosizioneH][nuovaPosizioneW] = Matrix[h][w] - Matrix[h][w] = nil - Matrix[nuovaPosizioneH][nuovaPosizioneW].Health -= Matrix[nuovaPosizioneH][nuovaPosizioneW].CostoMov + tmpNewElem = elemento + elemento = nil + tmpNewElem.Health -= tmpNewElem.CostoMov - if rand.Intn(10) == 0 { //se ha fortuna (o sfortuna) si evolve + /*if rand.Intn(10) == 0 { //se ha fortuna (o sfortuna) si evolve if rand.Intn(3) == 0 { - Matrix[nuovaPosizioneH][nuovaPosizioneW].Evoluzione-- + tmpNewElem.Evoluzione-- } else { - Matrix[nuovaPosizioneH][nuovaPosizioneW].Evoluzione++ + tmpNewElem.Evoluzione++ } - } + }*/ - if (Matrix[nuovaPosizioneH][nuovaPosizioneW].Health-Matrix[nuovaPosizioneH][nuovaPosizioneW].Premura)>Matrix[nuovaPosizioneH][nuovaPosizioneW].CostoSex { //se ha energia a sufficienza per riprodursi - //Matrix[h][w] = Costruttore(elemento.Razza, elemento.Evoluzione, elemento.CostoMov, elemento.CostoSex, elemento.Premura, SaluteIniziale) + if (tmpNewElem.Health-tmpNewElem.Premura)>tmpNewElem.CostoSex { //se ha energia a sufficienza per riprodursi + //tmpNewElem = Costruttore(elemento.Razza, elemento.Evoluzione, elemento.CostoMov, elemento.CostoSex, elemento.Premura, SaluteIniziale) } } From 4f35cc959bb1a4d276b653b6dbd28fbeab5d6693 Mon Sep 17 00:00:00 2001 From: Claudio Maggioni Date: Fri, 26 May 2017 17:30:17 +0200 Subject: [PATCH 4/7] Lavoro su html --- html.go | 2 + template/Interfaccia.html | 112 ++++++++++++++++++++++++-------------- 2 files changed, 72 insertions(+), 42 deletions(-) diff --git a/html.go b/html.go index a0a2e1b..daf1169 100644 --- a/html.go +++ b/html.go @@ -19,6 +19,8 @@ func handlerRoot(w http.ResponseWriter, r *http.Request) { varmap := map[string]interface{}{ "matrice": Matrix, "tempoAggiorna": Clock, + "larghezza": Larghezza, + "altezza": Altezza, } templ.Execute(w, varmap) } diff --git a/template/Interfaccia.html b/template/Interfaccia.html index 8fe3176..aa42cf8 100644 --- a/template/Interfaccia.html +++ b/template/Interfaccia.html @@ -3,35 +3,45 @@ GoBug +

Go bug

-
-
- {{range $riga := .matrice}} - - {{range $cella := $riga}} -
+
+ + {{range $riga := .matrice}} + + {{range $cella := $riga}} + + {{ if $cella.IsFood }} + class="cibo" + {{ else }} + class="razza1" + {{ end }} + {{ end }}>{{ $cella.Health }} + {{ end }} + {{ end }} - - {{ end }} -
{{ $cella }}
-
-
-
-

legenda

-
-

Food

-
-
-

Razza1

-
-
-

Razza2

+
- +
+

legenda

+
+
Cibo
+
+
Razza1
+
+
Razza2
+
+ From 5ec47fba06994a30b4f4a4c1af5f78cd753c394e Mon Sep 17 00:00:00 2001 From: Claudio Maggioni Date: Fri, 26 May 2017 17:33:26 +0200 Subject: [PATCH 5/7] Fix su celle vuote html --- template/Interfaccia.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/template/Interfaccia.html b/template/Interfaccia.html index aa42cf8..8c7dde7 100644 --- a/template/Interfaccia.html +++ b/template/Interfaccia.html @@ -86,14 +86,14 @@ {{range $cella := $riga}} {{ else }} {{ if $cella.IsFood }} class="cibo" {{ else }} class="razza1" - {{ end }} - {{ end }}>{{ $cella.Health }} + {{ end }}>{{ $cella.Health }} + {{ end }} {{ end }} {{ end }} From c19a47c5927559aebf81c28f0543d56708d857c6 Mon Sep 17 00:00:00 2001 From: Claudio Maggioni Date: Fri, 26 May 2017 17:54:45 +0200 Subject: [PATCH 6/7] Caricamento ajax della tabella --- html.go | 27 +++++++++++-------- template/Interfaccia.html | 56 +++++++++++++++++++-------------------- template/tabella.html | 17 ++++++++++++ 3 files changed, 61 insertions(+), 39 deletions(-) create mode 100644 template/tabella.html diff --git a/html.go b/html.go index daf1169..6246df6 100644 --- a/html.go +++ b/html.go @@ -5,22 +5,27 @@ import ( "net/http" ) +var varmap map[string]interface{} + // ServiHTML fa partire il server html func ServiHTML() { - http.HandleFunc("/", handlerRoot) - http.ListenAndServe(":3000", nil) -} - -func handlerRoot(w http.ResponseWriter, r *http.Request) { - templ, err := template.ParseFiles("template/Interfaccia.html") - if err != nil { - panic(err.Error()) - } - varmap := map[string]interface{}{ + varmap = map[string]interface{}{ "matrice": Matrix, "tempoAggiorna": Clock, "larghezza": Larghezza, "altezza": Altezza, } - templ.Execute(w, varmap) + http.HandleFunc("/tabella", handlerRoot("template/tabella.html")) + http.HandleFunc("/", handlerRoot("template/Interfaccia.html")) + http.ListenAndServe(":3000", nil) +} + +func handlerRoot(path string) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + templ, err := template.ParseFiles(path) + if err != nil { + panic(err.Error()) + } + templ.Execute(w, varmap) + } } diff --git a/template/Interfaccia.html b/template/Interfaccia.html index 8c7dde7..1819401 100644 --- a/template/Interfaccia.html +++ b/template/Interfaccia.html @@ -1,7 +1,6 @@ GoBug - + -

Go bug

-
-
- - {{range $riga := .matrice}} - - {{range $cella := $riga}} - - {{ else }} - {{ if $cella.IsFood }} - class="cibo" - {{ else }} - class="razza1" - {{ end }}>{{ $cella.Health }} - {{ end }} - {{ end }} - - {{ end }} -
-
+

Go bug

+
+

legenda

-
-
Cibo
-
-
Razza1
-
-
Razza2
+
 Cibo
+
 Razza 1
+
 Razza 2
diff --git a/template/tabella.html b/template/tabella.html new file mode 100644 index 0000000..773fae2 --- /dev/null +++ b/template/tabella.html @@ -0,0 +1,17 @@ + +{{range $riga := .matrice}} + + {{range $cella := $riga}} + + {{ else }} + {{ if $cella.IsFood }} + class="cibo" + {{ else }} + class="razza1" + {{ end }}>{{ $cella.Health }} + {{ end }} + {{ end }} + +{{ end }} +
From c2ccb780dd514fe893d11c0f570006350d8e1bb5 Mon Sep 17 00:00:00 2001 From: Giorgio Croci Date: Fri, 26 May 2017 17:54:24 +0200 Subject: [PATCH 7/7] Funge in parte --- main.go | 55 +++++++++++++++++++------------------------------------ 1 file changed, 19 insertions(+), 36 deletions(-) diff --git a/main.go b/main.go index 4998aa9..990fd80 100644 --- a/main.go +++ b/main.go @@ -90,6 +90,7 @@ func muovi(h int, w int) { //FUNZIONE MUOVI: aggiorna la posizione di tutti gli if elemento.Health<=0 { Matrix[h][w] = nil + return } direzCasOriz := rand.Intn(3) //numero da 0 a 2 direzCasOriz-- @@ -103,18 +104,16 @@ func muovi(h int, w int) { //FUNZIONE MUOVI: aggiorna la posizione di tutti gli return } - tmpNewElem := Matrix[nuovaPosizioneH][nuovaPosizioneW] - - if tmpNewElem != nil { - if tmpNewElem.Razza != elemento.Razza { //se non è dalla stessa razza - if tmpNewElem.IsFood || (tmpNewElem.Health+tmpNewElem.Evoluzione) < (elemento.Health+elemento.Evoluzione) { // se e' cibo o un insetto piu debole - elemento.Health += tmpNewElem.Health //prelevamento energia essere fagocitato - tmpNewElem = elemento //inglobamento essere perito - elemento = nil - tmpNewElem.Health -= tmpNewElem.CostoMov + if Matrix[nuovaPosizioneH][nuovaPosizioneW] != nil { + if Matrix[nuovaPosizioneH][nuovaPosizioneW].Razza != Matrix[h][w].Razza { //se non è dalla stessa razza + if Matrix[nuovaPosizioneH][nuovaPosizioneW].IsFood || (Matrix[nuovaPosizioneH][nuovaPosizioneW].Health+Matrix[nuovaPosizioneH][nuovaPosizioneW].Evoluzione) < (Matrix[h][w].Health+elemento.Evoluzione) { // se e' cibo o un insetto piu debole + Matrix[h][w].Health += Matrix[nuovaPosizioneH][nuovaPosizioneW].Health //prelevamento energia essere fagocitato + Matrix[nuovaPosizioneH][nuovaPosizioneW] = Matrix[h][w] //inglobamento essere perito + Matrix[h][w] = nil + Matrix[nuovaPosizioneH][nuovaPosizioneW].Health -= Matrix[nuovaPosizioneH][nuovaPosizioneW].CostoMov } else { //perdita nel combattimento per la sopravvivenza - tmpNewElem.Health += elemento.Health //il nemico prende l'energia - elemento = nil + Matrix[nuovaPosizioneH][nuovaPosizioneW].Health += Matrix[h][w].Health //il nemico prende l'energia + Matrix[h][w] = nil } } else { //se sono amici if nuovaPosizioneH == h && nuovaPosizioneW == w { //se cerca di mangiare il suo amico @@ -122,41 +121,25 @@ func muovi(h int, w int) { //FUNZIONE MUOVI: aggiorna la posizione di tutti gli } } } else { //si muove sulla nuova casella - tmpNewElem = elemento - elemento = nil - tmpNewElem.Health -= tmpNewElem.CostoMov + Matrix[nuovaPosizioneH][nuovaPosizioneW] = Matrix[h][w] + Matrix[nuovaPosizioneH][nuovaPosizioneW].Health -= Matrix[nuovaPosizioneH][nuovaPosizioneW].CostoMov + Matrix[h][w] = nil - /*if rand.Intn(10) == 0 { //se ha fortuna (o sfortuna) si evolve + if rand.Intn(10) == 0 { //se ha fortuna (o sfortuna) si evolve if rand.Intn(3) == 0 { - tmpNewElem.Evoluzione-- + Matrix[nuovaPosizioneH][nuovaPosizioneW].Evoluzione-- } else { - tmpNewElem.Evoluzione++ + Matrix[nuovaPosizioneH][nuovaPosizioneW].Evoluzione++ } - }*/ + } - if (tmpNewElem.Health-tmpNewElem.Premura)>tmpNewElem.CostoSex { //se ha energia a sufficienza per riprodursi - //tmpNewElem = Costruttore(elemento.Razza, elemento.Evoluzione, elemento.CostoMov, elemento.CostoSex, elemento.Premura, SaluteIniziale) + if (Matrix[nuovaPosizioneH][nuovaPosizioneW].Health-Matrix[nuovaPosizioneH][nuovaPosizioneW].Premura)>Matrix[nuovaPosizioneH][nuovaPosizioneW].CostoSex { //se ha energia a sufficienza per riprodursi + //Matrix[nuovaPosizioneH][nuovaPosizioneW] = Costruttore(Matrix[h][w].Razza, Matrix[h][w].Evoluzione, Matrix[h][w].CostoMov, Matrix[h][w].CostoSex, Matrix[h][w].Premura, SaluteIniziale) } } } -/*func stampaMatrice2() { - for i := 0; i < Altezza; i++ { - fmt.Printf("Riga %d:\n", i) - for j := 0; j < Larghezza; j++ { - var stringa string - elem := Matrix[i][j] - if elem == nil { - stringa = "Vuota" - } else { - stringa = elem.String() - } - fmt.Printf(" Colonna %d: %s\n", j, stringa) - } - } -}*/ - func stampaMatrice() { for i := 0; i < Altezza; i++ { for j := 0; j < Larghezza; j++ {