Classi e oggetti

Gioco LIFE (Conway)

import java.util.*;
import java.io.*;
import java.util.concurrent.*;
 
public class Life {
    // attributi
    private Campo campo1, campo2, campoCorrente, altro;
    private int righe,colonne;
 
    // costruttori
    public Life(int righe, int colonne) {
        this.righe=righe;
        this.colonne=colonne;
        campo1= new Campo(righe,colonne);
        campo2= new Campo(righe,colonne);
        campoCorrente=campo1;
        altro=campo2;
    }
 
    public Campo cambiaCampo() {
        if(campoCorrente==campo1) {
            //System.out.println("era campo1");
            campoCorrente=campo2;
            altro=campo1;
        }
        else if(campoCorrente==campo2) {
            //System.out.println("era campo2");
            campoCorrente=campo1;
            altro=campo2;
        }
        return campoCorrente;
    }
 
    /**
    	calcola una singola "generazione" di celle
 
    	regole https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life#Rules
 
    	- <2 intorno, muore
    	- 2,3 intorno, resta viva
    	- >3 intorno, muore
    	- ==3 intorno, nasce
    */
    public void iterazione() {
        // per ora con algoritmo stupido
        for(int riga=0; riga<righe; riga++) {
            for(int colonna=0; colonna<colonne; colonna++) {
                int q=campoCorrente.quanteViveIntorno(riga,colonna);
 
                // mancava la copia del vecchio stato
                altro.impostaCella(riga,colonna,campoCorrente.osservaCella(riga,colonna));
 
                if(q<2) altro.impostaCella(riga,colonna,Campo.MORTA);
                if(q>3) altro.impostaCella(riga,colonna,Campo.MORTA);
                if(q==3) altro.impostaCella(riga,colonna,Campo.VIVA);
                //System.err.print(campoCorrente.quanteViveIntorno(riga,colonna));
            }
            //System.err.println();
        }
        cambiaCampo();
    }
 
    public void inizializzazione(String fileName)
    throws Exception
    {
        // leggere il file se esiste
        Scanner s=new Scanner(new File(fileName));
 
        // scandire riga per riga
 
        // i puntini sono celle morte
        // gli asterischi sono dei celle vive
        // (del campo corrente)
 
        String riga;
 
        int rigacorrente=0;
        while(s.hasNextLine()) {
            riga=s.nextLine();
            System.err.println(riga);
            for(int i=0; i<riga.length(); i++) {
                if(riga.charAt(i)=='*') campoCorrente.impostaCella(rigacorrente,i,Campo.VIVA);
                if(riga.charAt(i)=='.') campoCorrente.impostaCella(rigacorrente,i,Campo.MORTA);
            }
            rigacorrente++;
        }
    }
 
 
    public void _inizializzazioneTest() {
        // impostare una cella del campo corrente a viva o morta?
        campoCorrente.impostaCella(5,6,Campo.VIVA);
        campoCorrente.impostaCella(5,7,Campo.VIVA);
    }
 
    // metodi
    // public ... iterazione, imposta il campo iniziale
 
    // MAIN
    public static void main(String[] arg)
    throws Exception
    {
        Life l=new Life(30,180); // istanziazione (tutto a "zero")
 
        //System.out.println(l); // stampo stato iniziale
        //l._inizializzazioneTest(); // modifico stato
        l.inizializzazione("initLife.txt"); // modifico stato
        //System.out.println(l); // stampo stato a valle modifica
 
        //System.out.println(l.campoCorrente.quanteViveIntorno(4,9));	// expected: 5
        //System.out.println(l.campoCorrente.quanteViveIntorno(4,20));	// expected: 4
        //System.out.println(l.campoCorrente.quanteViveIntorno(0,0));	// expected: 2
 
        for(int it=0; it<1000; it++) {
            l.iterazione();
            System.out.println(l.campo());
            System.out.print("\033[H");
            TimeUnit.MILLISECONDS.sleep(50);
        }
    }
 
    public String campo() {
        return campoCorrente.campo();
    }
 
 
 
    //public Object dammiSuper(){return super;} // impedito dal compilatore
 
    /**
    	@override
    */
    public String toString() {
        StringBuilder sb=new StringBuilder();
        sb.append("(");
        sb.append(super.toString());
        sb.append(": ");
        //sb.append("... attributi interni ...")
        sb.append(campoCorrente.toString());
        sb.append(")");
        return sb.toString();
    }
}
/**
	rappresenta matrice bidimensionale del campo di gioco,
	ogni cella rappresenta una cellula che può essere viva o morta
*/
 
public class Campo // extends Object (è implicito)
{
    // costanti globali
    public static final boolean VIVA=true;
    public static final boolean MORTA=false;
 
    private boolean[][] celle;
    private int righe, colonne;
 
    /*
    public Campo(){
    	super(); // invocazione costruttore della classe da cui eredito
    }
    */
 
    public Campo(int righe, int colonne) {
        celle=new boolean[righe][colonne];
        this.righe=righe;
        this.colonne=colonne;
    }
 
    public int quanteVive() {
        int quante=0;
        for(int i=0; i<righe; i++)
            for(int j=0; j<colonne; j++)
            {
                if(celle[i][j]==VIVA) quante++;
            }
        return quante;
    }
 
 
    public String campo() {
        StringBuilder sb=new StringBuilder();
        for(int riga=0; riga<righe; riga++) {
            for(int colonna=0; colonna<colonne; colonna++) {
                sb.append(charCella(riga,colonna));
            }
            sb.append("\n");
        }
        return sb.toString();
    }
 
 
    /**
    	@override
    */
    public String toString() {
        StringBuilder sb=new StringBuilder();
        sb.append("(");
        sb.append(super.toString());
        sb.append(": ");
        //sb.append("... attributi interni ...")
        sb.append(celle.length);
        sb.append(", ");
        sb.append(celle[0].length);
        sb.append(", ");
        sb.append(quanteVive());
        sb.append(" vive )");
        return sb.toString();
    }
 
    public void impostaCella(int riga, int colonna, boolean stato) {
        celle[riga][colonna]=stato;
    }
 
    public boolean osservaCella(int riga, int colonna) {
        return celle[coordRiga(riga)][coordColonna(colonna)];
    }
 
    public char charCella(int riga, int colonna) {
        if(osservaCella(riga,colonna)) return '*';
        return '.';
    }
 
    public int isViva(int coordX, int coordY) {
        if(osservaCella(coordX, coordY)) return 1;
        return 0;
    }
 
    public int coordRiga(int riga) {
        if(riga==-1) return righe-1;
        if(riga==righe) return 0;
        return riga;
    }
 
    public int coordColonna(int colonna) {
        if(colonna==-1) return colonne-1;
        if(colonna==colonne) return 0;
        return colonna;
    }
 
    public int quanteViveIntorno(int riga, int colonna) {
 
        return
            isViva(riga-1,colonna-1)+
            isViva(riga-1,colonna)+
            isViva(riga-1,colonna+1)+
            isViva(riga,colonna-1)+
            isViva(riga,colonna+1)+
            isViva(riga+1,colonna-1)+
            isViva(riga+1,colonna)+
            isViva(riga+1,colonna+1);
 
 
 
        /*
        if(riga!=0 && riga!=ultima)
        {
        	if(isviva(riga-1,colonna))
        		vivaintorno++;
        	if(isviva(riga+1,colonna))
        		vivaintorno++;
 
        	if(colonna!=0 && colonna!=ultima)
        	{
        		if(isviva(riga,colonna-1))
        			vivaintorno++;
        		if(isviva(riga,colonna+1))
        			vivaintorno++;
        		if(isviva(riga+1,colonna-1))
        			vivaintorno++;
        		if(isviva(riga+1,colonna+1))
        			vivaintorno++;
        		if(isviva(riga-1,colonna-1))
        			vivaintorno++;
        		if(isviva(riga-1,colonna+1))
        			vivaintorno++;
        	}
        	else
        	{
        		if(colonna==ultima)
        		{
        			if(isviva(riga,colonna-1))
        				vivaintorno++;
        			if(isviva(riga,0))
        				vivaintorno++;
        			if(isviva(riga+1,colonna-1))
        				vivaintorno++;
        			if(isviva(riga+1,0))
        				vivaintorno++;
        			if(isviva(riga-1,colonna-1))
        				vivaintorno++;
        			if(isviva(riga-1,0))
        				vivaintorno++;
        		}
        		else
        		{
        			if(isviva(riga,ultima))
        				vivaintorno++;
        			if(isviva(riga,colonna+1))
        				vivaintorno++;
        			if(isviva(riga+1,ultima))
        				vivaintorno++;
        			if(isviva(riga+1,colonna+1))
        				vivaintorno++;
        			if(isviva(riga-1,ultima))
        				vivaintorno++;
        			if(isviva(riga-1,colonna+1))
        				vivaintorno++;
        		}
        	}
 
        }
        else //riga non ultima e non prima
        {
        	if(riga==ultima)
        		{
        			if(isviva(riga-1,colonna-1))
        				vivaintorno++;
        			if(isviva(riga-1,colonna+1))
        				vivaintorno++;
        			if(isviva(0,colonna-1))
        				vivaintorno++;
        			if(isviva(0,colonna+1))
        				vivaintorno++;
        			if(isviva(riga,colonna-1))
        				vivaintorno++;
        			if(isviva(riga,colonna+1))
        				vivaintorno++;
        		}
        		else
        		{
        			if(isviva(riga,colonna-1))
        				vivaintorno++;
        			if(isviva(riga,colonna+1))
        				vivaintorno++;
        			if(isviva(riga+1,colonna-1))
        				vivaintorno++;
        			if(isviva(riga+1,colonna+1))
        				vivaintorno++;
        			if(isviva(ultima,colonna-1))
        				vivaintorno++;
        			if(isviva(ultima,colonna+1))
        				vivaintorno++;
        		}
        		*/
    }
 
 
 
}
..............................
..............................
..............................
.........*....................
.........*....................
.........*....................
..............................
..............................
..............................
..............................

Glider cannon

....................................................................................................................................................................................
....................................................................................................................................................................................
....................................................................................................................................................................................
....................................................................................................................................................................................
....................................................................................................................................................................................
....................................................................................................................................................................................
....................................................................................................................................................................................
....................................................................................................................................................................................
....................................................................................................................................................................................
....................................................................................................................................................................................
....................................................................................................................................................................................
....................................................................................................................................................................................
.....................................*..............................................................................................................................................
...................................*.*..............................................................................................................................................
.........................**......**............**...................................................................................................................................
........................*...*....**............**...................................................................................................................................
.............**........*.....*...**.................................................................................................................................................
.............**........*...*.**....*.*..............................................................................................................................................
.......................*.....*.......*..............................................................................................................................................
........................*...*.......................................................................................................................................................
.........................**.........................................................................................................................................................
....................................................................................................................................................................................
....................................................................................................................................................................................
....................................................................................................................................................................................
....................................................................................................................................................................................
....................................................................................................................................................................................
....................................................................................................................................................................................
....................................................................................................................................................................................
....................................................................................................................................................................................
....................................................................................................................................................................................
pub/labprog/20171211.txt · Last modified: 2017/12/13 08:13 by atrent
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0