2017-05-26 10:23:39 +00:00
package main
import (
"fmt"
2017-05-26 11:14:18 +00:00
"math/rand"
2017-05-26 11:56:06 +00:00
"time"
2017-05-26 21:36:12 +00:00
"os"
"os/exec"
2017-05-26 10:23:39 +00:00
)
2017-05-26 12:23:57 +00:00
//VARIABILI
2017-05-26 23:16:22 +00:00
var def int
2017-05-26 11:14:18 +00:00
var Matrix [ ] [ ] * Element
2017-05-26 12:07:10 +00:00
var Altezza int
2017-05-26 12:09:41 +00:00
var Larghezza int
2017-05-26 14:54:51 +00:00
var SaluteIniziale int = 50
var CostoMovIniziale int = 5
2017-05-27 01:21:11 +00:00
var CostoSexIniziale int = 50
2017-05-26 14:54:51 +00:00
var EvoluzioneIniziale int = 0
2017-05-26 16:01:40 +00:00
var PremuraIniziale int = 10
2017-05-26 17:16:18 +00:00
var AgeMaxInizio int = 30
2017-05-26 11:56:06 +00:00
var Clock uint
2017-05-26 12:44:11 +00:00
var NumClock uint
2017-05-27 01:27:02 +00:00
var LivelloSblocco int = 1
2017-05-27 00:04:24 +00:00
var Possibilita int = 5
2017-05-27 01:21:11 +00:00
var ValoreNutrizionale int = 10
var ValoreNutrizionaleCarcassa int = 5
var Supestiti bool = true
//var ZonaCiboX int
//var ZonaCiboY int
2017-05-26 10:23:39 +00:00
2017-05-26 12:27:54 +00:00
func main ( ) { //FUNZIONE MAIN
2017-05-26 12:44:11 +00:00
Clock = 1
NumClock = 0
2017-05-26 12:55:05 +00:00
rand . Seed ( time . Now ( ) . UTC ( ) . UnixNano ( ) ) //inizializzazione rand
2017-05-26 21:36:12 +00:00
/ * height , err := strconv . Atoi ( os . Args [ 1 ] )
2017-05-26 10:23:39 +00:00
if err != nil {
panic ( "height not valid" )
}
width , err2 := strconv . Atoi ( os . Args [ 2 ] )
if err2 != nil {
panic ( "width not valid" )
}
2017-05-26 12:09:41 +00:00
Altezza = height
2017-05-26 21:36:12 +00:00
Larghezza = width * /
cmd := exec . Command ( "cmd" , "/c" , "cls" )
cmd . Stdout = os . Stdout
cmd . Run ( )
fmt . Println ( "Inserisci altezza mondo: " )
fmt . Scan ( & Altezza )
fmt . Println ( "Inserisci larghezza mondo: " )
fmt . Scan ( & Larghezza )
2017-05-26 23:16:22 +00:00
fmt . Println ( "Inserisci 1 per usare i valori di default o un altro numero per medificarli: " )
fmt . Scan ( & def )
if def != 1 {
2017-05-26 21:36:12 +00:00
fmt . Println ( "Inserisci la salute iniziale: " )
fmt . Scan ( & SaluteIniziale )
2017-05-26 23:16:22 +00:00
fmt . Println ( "Inserisci il costo di uno spostamento iniziale (riduce l'energia ad ogni movimento) [default = 5]: " )
fmt . Scan ( & CostoMovIniziale )
2017-05-27 01:21:11 +00:00
fmt . Println ( "Inserisci il costo di una riproduzione iniziale (riduce l'energia ad ogni riproduzione) [default = 50]: " )
2017-05-26 23:16:22 +00:00
fmt . Scan ( & CostoSexIniziale )
fmt . Println ( "Inserisci i secondi di vita massimi (limita la durata della vita) [default = 30]: " )
2017-05-26 21:36:12 +00:00
fmt . Scan ( & AgeMaxInizio )
2017-05-27 01:21:11 +00:00
fmt . Println ( "Inserisci il valore nutrizionale del cibo (di quanto aumenta l'energia di chi lo mangia) [default = 10]: " )
2017-05-26 23:16:22 +00:00
fmt . Scan ( & ValoreNutrizionale )
2017-05-27 01:21:11 +00:00
fmt . Println ( "Inserisci il valore nutrizionale delle carcasse (di quanto aumenta l'energia di chi lo mangia) [default = 5]: " )
2017-05-26 23:16:22 +00:00
fmt . Scan ( & ValoreNutrizionaleCarcassa )
fmt . Println ( "Inserisci il grado di evoluzione iniziale (se maggiore di zero migliora le prestazioni vitali)[default = 0]: " )
fmt . Scan ( & EvoluzioneIniziale )
2017-05-27 00:04:24 +00:00
fmt . Println ( "Inserisci la possibilità di evoluzione (numero da 1 a 10) [default = 5]: " )
fmt . Scan ( & Possibilita )
if ( Possibilita < 1 || Possibilita > 10 ) {
Possibilita = 1
}
fmt . Println ( "Inserisci il livello di evoluzione visivo base (il livello evolutivo minimo che permette di vedere il cibo vicino)[default = 1]: " )
fmt . Scan ( & LivelloSblocco )
2017-05-26 23:16:22 +00:00
}
2017-05-26 21:36:12 +00:00
Matrix = make ( [ ] [ ] * Element , Altezza )
2017-05-26 11:14:18 +00:00
for i := range Matrix { // inizializzazione matrice
2017-05-26 21:36:12 +00:00
Matrix [ i ] = make ( [ ] * Element , Larghezza )
2017-05-26 11:14:18 +00:00
for j := range Matrix [ i ] {
2017-05-26 12:55:05 +00:00
chose := rand . Intn ( 3 ) //scelta rando cibo bug o vuoto (null)
2017-05-26 11:14:18 +00:00
switch chose {
case 0 :
Matrix [ i ] [ j ] = new ( Element ) // insetto
Matrix [ i ] [ j ] . IsFood = false
Matrix [ i ] [ j ] . Age = 0
Matrix [ i ] [ j ] . Health = SaluteIniziale
2017-05-26 14:54:51 +00:00
Matrix [ i ] [ j ] . CostoMov = CostoMovIniziale
Matrix [ i ] [ j ] . CostoSex = CostoSexIniziale
Matrix [ i ] [ j ] . Evoluzione = EvoluzioneIniziale
Matrix [ i ] [ j ] . Premura = PremuraIniziale
2017-05-26 17:16:18 +00:00
Matrix [ i ] [ j ] . AgeMax = AgeMaxInizio
2017-05-26 14:54:51 +00:00
Matrix [ i ] [ j ] . Razza = rand . Intn ( 2 )
2017-05-26 11:14:18 +00:00
case 1 :
Matrix [ i ] [ j ] = nil //vuota
case 2 :
Matrix [ i ] [ j ] = new ( Element ) // cibo
Matrix [ i ] [ j ] . IsFood = true
2017-05-26 18:20:22 +00:00
Matrix [ i ] [ j ] . Health = ValoreNutrizionale
2017-05-27 00:04:24 +00:00
Matrix [ i ] [ j ] . Razza = 2
2017-05-26 11:14:18 +00:00
}
}
2017-05-26 10:23:39 +00:00
}
2017-05-26 13:35:26 +00:00
go ServiHTML ( ) // fai partire il server html
2017-05-26 12:26:59 +00:00
fmt . Println ( "Situazione iniziale: " )
2017-05-27 01:21:11 +00:00
for Supestiti {
2017-05-26 12:44:11 +00:00
aggiorna ( )
2017-05-27 01:21:11 +00:00
rimasti ( )
}
aggiorna ( )
2017-05-26 21:36:12 +00:00
2017-05-26 23:33:36 +00:00
2017-05-26 11:56:06 +00:00
}
2017-05-26 12:27:54 +00:00
func aggiorna ( ) { //FUNZIONE AGGIORNA: chiama la funzione muovi
2017-05-27 01:21:11 +00:00
2017-05-26 12:44:11 +00:00
time . Sleep ( time . Second * time . Duration ( Clock ) )
NumClock ++
2017-05-26 12:27:54 +00:00
for i := 0 ; i < Altezza ; i ++ {
for j := 0 ; j < Larghezza ; j ++ {
muovi ( i , j )
2017-05-26 12:14:33 +00:00
}
}
2017-05-26 12:44:11 +00:00
fmt . Printf ( "\nSituazione dopo %d movimenti:\n" , NumClock )
2017-05-27 00:06:56 +00:00
2017-05-26 12:44:11 +00:00
stampaMatrice ( )
2017-05-27 01:21:11 +00:00
//giraMatrice()
2017-05-27 00:06:56 +00:00
2017-05-26 10:23:39 +00:00
}
2017-05-26 11:14:18 +00:00
2017-05-26 12:23:57 +00:00
func muovi ( h int , w int ) { //FUNZIONE MUOVI: aggiorna la posizione di tutti gli oggetti in tabella // h verticale, w orizzontale
2017-05-26 12:27:54 +00:00
elemento := Matrix [ h ] [ w ] //assegnamente del contenuto della cella in 'elemento'
2017-05-26 12:44:11 +00:00
if elemento == nil || elemento . IsFood { //controllo se 'elemento' è cibo o un altro essere
2017-05-26 11:14:18 +00:00
return
}
2017-05-26 14:54:51 +00:00
2017-05-26 17:33:57 +00:00
2017-05-27 00:04:24 +00:00
2017-05-26 14:54:51 +00:00
if elemento . Health <= 0 {
2017-05-26 18:30:57 +00:00
fmt . Printf ( "Il soggetto in cella %d, %d è morto di fame\n" , h , w )
2017-05-26 14:54:51 +00:00
Matrix [ h ] [ w ] = nil
2017-05-26 18:20:22 +00:00
Matrix [ h ] [ w ] = new ( Element ) // sostituisce con la carcassa
Matrix [ h ] [ w ] . IsFood = true
Matrix [ h ] [ w ] . Health = ValoreNutrizionaleCarcassa
2017-05-27 00:04:24 +00:00
Matrix [ h ] [ w ] . Razza = 3
2017-05-26 15:54:24 +00:00
return
2017-05-26 17:16:18 +00:00
} else {
elemento . Age ++
2017-05-26 14:54:51 +00:00
}
2017-05-26 16:01:40 +00:00
2017-05-26 17:16:18 +00:00
if elemento . Age > Matrix [ h ] [ w ] . AgeMax {
2017-05-26 18:30:57 +00:00
fmt . Printf ( "Il soggetto in cella %d, %d è morto di vecchiaia\n" , h , w )
2017-05-26 16:01:40 +00:00
Matrix [ h ] [ w ] = nil
2017-05-26 18:20:22 +00:00
Matrix [ h ] [ w ] = new ( Element ) // sostituisce con la carcassa
Matrix [ h ] [ w ] . IsFood = true
Matrix [ h ] [ w ] . Health = ValoreNutrizionaleCarcassa
2017-05-27 00:04:24 +00:00
Matrix [ h ] [ w ] . Razza = 3
2017-05-26 16:01:40 +00:00
return
}
2017-05-26 23:16:22 +00:00
var h2 int
var w2 int
var direzCasOriz int
var direzCasVert int
2017-05-27 00:04:24 +00:00
var trovato bool = false
if Matrix [ h ] [ w ] . Evoluzione >= LivelloSblocco {
2017-05-26 23:16:22 +00:00
for i := 0 ; i < 8 ; i ++ {
switch i {
case 0 :
h2 = - 1
w2 = 0
case 1 :
h2 = - 1
w2 = 1
case 2 :
h2 = 0
w2 = 1
case 3 :
h2 = 1
w2 = 1
case 4 :
h2 = 1
w2 = 0
case 5 :
h2 = 1
w2 = - 1
case 6 :
h2 = 0
w2 = - 1
case 7 :
h2 = - 1
w2 = - 1
}
if ( ( h + h2 ) >= 0 ) && ( ( h + h2 ) < Altezza ) && ( ( w + w2 ) >= 0 ) && ( ( w + w2 ) < Larghezza ) {
if Matrix [ h + h2 ] [ w + w2 ] != nil {
2017-05-27 00:04:24 +00:00
if Matrix [ h + h2 ] [ w + w2 ] . IsFood && ! trovato {
2017-05-26 23:16:22 +00:00
direzCasVert = h2 ;
direzCasOriz = w2 ;
trovato = true
}
}
}
}
2017-05-27 00:04:24 +00:00
}
2017-05-26 23:16:22 +00:00
if ! trovato {
2017-05-27 01:27:02 +00:00
direzCasVert = rand . Intn ( 3 )
2017-05-26 23:16:22 +00:00
direzCasVert --
2017-05-27 01:27:02 +00:00
direzCasOriz = rand . Intn ( 3 )
2017-05-26 23:16:22 +00:00
direzCasOriz --
}
2017-05-27 00:04:24 +00:00
nuovaPosizioneH := h + direzCasVert //aggiornamento posizione verticale
2017-05-26 12:44:11 +00:00
nuovaPosizioneW := w + direzCasOriz //aggiornamento posizione orizzontale
2017-05-26 11:14:18 +00:00
2017-05-27 00:04:24 +00:00
2017-05-26 12:44:11 +00:00
if nuovaPosizioneH >= Altezza || nuovaPosizioneH < 0 ||
nuovaPosizioneW >= Larghezza || nuovaPosizioneW < 0 { //se esce dai bordi
return
2017-05-26 12:09:41 +00:00
}
2017-05-27 00:04:24 +00:00
trovato = false
2017-05-26 15:54:24 +00:00
if Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] != nil {
2017-05-26 23:16:22 +00:00
2017-05-26 15:54:24 +00:00
if Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . Razza != Matrix [ h ] [ w ] . Razza { //se non è dalla stessa razza
2017-05-26 16:40:49 +00:00
if Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . IsFood || ( Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . Health + ( Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . Evoluzione * 5 ) ) < ( Matrix [ h ] [ w ] . Health + ( Matrix [ h ] [ w ] . Evoluzione ) * 5 ) { // se e' cibo o un insetto piu debole
2017-05-26 15:54:24 +00:00
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
2017-05-26 17:33:57 +00:00
Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . Health -= ( Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . CostoMov )
2017-05-26 18:30:57 +00:00
fmt . Printf ( "Il soggetto in cella %d, %d ha sconfitto quello in cella %d, %d\n" , nuovaPosizioneH , nuovaPosizioneW , h , w )
2017-05-26 15:24:17 +00:00
} else { //perdita nel combattimento per la sopravvivenza
2017-05-26 15:54:24 +00:00
Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . Health += Matrix [ h ] [ w ] . Health //il nemico prende l'energia
Matrix [ h ] [ w ] = nil
2017-05-26 18:30:57 +00:00
fmt . Printf ( "Il soggetto in cella %d, %d ha fallito nel sconfiggere quello in cella %d, %d\n" , h , w , nuovaPosizioneH , nuovaPosizioneW )
2017-05-26 12:45:02 +00:00
}
2017-05-26 13:35:26 +00:00
} else { //se sono amici
if nuovaPosizioneH == h && nuovaPosizioneW == w { //se cerca di mangiare il suo amico
2017-05-26 12:45:02 +00:00
muovi ( h , w )
}
2017-05-26 12:09:41 +00:00
}
2017-05-26 12:27:54 +00:00
} else { //si muove sulla nuova casella
2017-05-26 15:54:24 +00:00
Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] = Matrix [ h ] [ w ]
2017-05-26 17:33:57 +00:00
Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . Health -= Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . CostoMov
2017-05-26 15:54:24 +00:00
Matrix [ h ] [ w ] = nil
2017-05-26 12:45:02 +00:00
2017-05-27 00:04:24 +00:00
if rand . Intn ( Possibilita ) == 0 { //se ha fortuna (o sfortuna) si evolve
2017-05-26 13:36:30 +00:00
if rand . Intn ( 3 ) == 0 {
2017-05-26 15:54:24 +00:00
Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . Evoluzione --
2017-05-26 17:16:18 +00:00
Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . AgeMax -= 5
2017-05-26 13:10:37 +00:00
} else {
2017-05-26 15:54:24 +00:00
Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . Evoluzione ++
2017-05-26 17:16:18 +00:00
Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . AgeMax += 10
2017-05-26 13:10:37 +00:00
}
2017-05-26 15:54:24 +00:00
}
2017-05-26 13:10:37 +00:00
2017-05-27 01:21:11 +00:00
if ( Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . Health - ( Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . Premura ) * 10 ) > Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . CostoSex { //se ha energia a sufficienza per riprodursi
2017-05-26 17:16:18 +00:00
Matrix [ h ] [ w ] = Costruttore ( Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . Razza , Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . Evoluzione , Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . CostoMov , Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . CostoSex , Matrix [ nuovaPosizioneH ] [ nuovaPosizioneW ] . Premura , SaluteIniziale , AgeMaxInizio )
2017-05-26 12:59:20 +00:00
}
2017-05-26 12:45:02 +00:00
2017-05-26 12:59:20 +00:00
}
2017-05-26 17:16:18 +00:00
2017-05-26 11:14:18 +00:00
}
2017-05-27 01:21:11 +00:00
func rimasti ( ) {
var i int
var j int
Supestiti = false
for i = 0 ; i < Altezza ; i ++ {
for j = 0 ; j < Larghezza ; j ++ {
if Matrix [ i ] [ j ] != nil {
if ! Matrix [ i ] [ j ] . IsFood {
Supestiti = true
}
}
}
}
}
/ *
2017-05-26 23:33:36 +00:00
func giraMatrice ( ) {
var conta int = 0
var contaMax int = 0
var i int
var j int
for i = 1 ; i < Altezza - 1 ; i ++ {
for j = 1 ; j < Larghezza - 1 ; j ++ {
if Matrix [ i ] [ j ] != nil {
if Matrix [ i ] [ j ] . IsFood {
conta ++ ;
}
}
if Matrix [ i - 1 ] [ j ] != nil {
if Matrix [ i - 1 ] [ j ] . IsFood {
conta ++ ;
}
}
if Matrix [ i - 1 ] [ j - 1 ] != nil {
if Matrix [ i - 1 ] [ j - 1 ] . IsFood {
conta ++ ;
}
}
if Matrix [ i - 1 ] [ j + 1 ] != nil {
if Matrix [ i - 1 ] [ j + 1 ] . IsFood {
conta ++ ;
}
}
if Matrix [ i ] [ j + 1 ] != nil {
if Matrix [ i ] [ j + 1 ] . IsFood {
conta ++ ;
}
}
if Matrix [ i ] [ j - 1 ] != nil {
if Matrix [ i ] [ j - 1 ] . IsFood {
conta ++ ;
}
}
if Matrix [ i + 1 ] [ j - 1 ] != nil {
if Matrix [ i + 1 ] [ j - 1 ] . IsFood {
conta ++ ;
}
}
if Matrix [ i + 1 ] [ j ] != nil {
if Matrix [ i + 1 ] [ j ] . IsFood {
conta ++ ;
}
}
if Matrix [ i + 1 ] [ j + 1 ] != nil {
if Matrix [ i + 1 ] [ j + 1 ] . IsFood {
conta ++ ;
}
}
if conta > contaMax {
ZonaCiboX = j
ZonaCiboY = i
contaMax = conta
}
conta = 0 ;
}
}
fmt . Printf ( "%d %d %d" , contaMax , ZonaCiboX , ZonaCiboY )
}
2017-05-27 01:21:11 +00:00
* /
2017-05-26 21:36:12 +00:00
2017-05-26 13:38:04 +00:00
func stampaMatrice ( ) {
2017-05-26 18:30:57 +00:00
/ * for i := 0 ; i < Altezza ; i ++ {
2017-05-26 13:38:04 +00:00
for j := 0 ; j < Larghezza ; j ++ {
2017-05-26 14:15:28 +00:00
if Matrix [ i ] [ j ] == nil {
2017-05-26 16:40:49 +00:00
fmt . Printf ( " -- " )
2017-05-26 13:38:04 +00:00
} else {
2017-05-26 14:15:28 +00:00
if Matrix [ i ] [ j ] . IsFood {
2017-05-26 16:40:49 +00:00
fmt . Printf ( " CC " )
2017-05-26 14:15:28 +00:00
} else {
2017-05-26 14:54:51 +00:00
fmt . Printf ( "%d %d " , Matrix [ i ] [ j ] . Razza , Matrix [ i ] [ j ] . Health )
2017-05-26 14:15:28 +00:00
}
2017-05-26 13:38:04 +00:00
}
}
fmt . Printf ( "\n" )
2017-05-26 18:30:57 +00:00
} * /
2017-05-26 12:59:20 +00:00
}