ConwayLife Sprint3

Introduction

Realizzazione in Java del GAME OF LIFE DI CONWAY

Requirements

  • R1: Sviluppare in Java il gioco Life di Conway come zero-player game. La griglia di celle evolve secondo le regole del gioco.
  • R2: L'utente deve poter:
    • definire la configurazione iniziale della griglia
    • osservare l'evoluzione del gioco ( vista del gioco )
    • interrompere e riprendere l'evoluzione
    • resettare la griglia quando il gioco è fermo

Requirement analysis

Cosa si intende per Cella?

Dopo aver parlato col committente formalizzo il seguente modello:


public interface ICell {
    /* Una cella ha la capacità di impostare il proprio stato interno a seconda di un valore booleano */
    void setStatus(boolean v);

    /* Una cella, come entità, ha la capacità di rispondere alla "query" isAlive rispondendo con il valore dello stato */
    boolean isAlive();

    /* Una cella ha la capacità di cambiare il proprio stato da viva a morta e da morta a viva */
    void switchCellState(); 
}
                        
Cosa si intende per Griglia?

Dopo aver parlato col committente formalizzo il seguente modello:


public interface IGrid {
    /* Una griglia ha la capacità di comunicare il numero delle righe che la compongono */
    int getRows();

    /* Una griglia ha la capacità di comunicare il numero delle colonne che la compongono */
    int getCols();

    /* Una griglia ha la capacità di restituire la cella in corrispondenza degli indici di riga e colonna passati come parametri */
    ICell getCell(int row, int col);

    /* Una griglia ha la capacità di rispondere alla query isCellAlive restituendo lo stato della cella corrispondente */
    boolean isCellAlive(int row, int col);

    /* Una griglia ha la capacità di impostare lo stato di una cella a seconda degli indici di riga e colonna passati come parametri e di un valore booleano */
    void setCellState(int row, int col, boolean alive);

    /* Una griglia ha la capacità di contare il numero di celle adiacenti vive rispetto alla cella specificata */
    int countNeighbors(int row, int col);

    /* Una griglia ha la capacità di resettarsi riportando tutte le celle allo stato iniziale */
    void reset();
}
                        
Cosa si intende per Life?

Dopo aver parlato col committente formalizzo il seguente modello:


public interface LifeInterface {
    /* Life ha la capacità di calcolare il valore della sua griglia alla generazione successiva */
    void nextGeneration();

    /* Life ha la capacità di restituire lo stato di una cella a seconda degli indici di riga e colonna passati come parametri */
    boolean isCellAlive(int row, int col);

    /* Life ha la capacità di impostare lo stato di una cella a seconda degli indici di riga e colonna passati come parametri e di un valore booleano */
    void setCellState(int row, int col, boolean alive);

    /* Life ha la capacità di restituire la cella in corrispondenza degli indici di riga e colonna passati come parametri */
    ICell getCell(int row, int col);

    /* Life ha la capacità di restituire la griglia gestita dal modello */
    IGrid getGrid();

    /* Life ha la capacità di resettare la griglia riportando tutte le celle allo stato iniziale */
    void resetGrids();
}
                        

Problem analysis

Problem analysis

Test plans


public class CellTest {
    private ICell c;

    @Before
    public void setup() {
        c = new Cell();
    }

    @Test
    public void testCellAlive() {
        c.setStatus(true);
        assertTrue(c.isAlive());
    }

    @Test
    public void testCellDead() {
        c.setStatus(false);
        assertFalse(c.isAlive());
    }
}


public class GridTest {
    private IGrid grid;

    @Before
    public void setup() {
        grid = new Grid(5, 5);
    }

    @Test
    public void testDims() {
        assertEquals(5, grid.getRows());
        assertEquals(5, grid.getCols());
    }

    @Test
    public void testCellValue() {
        grid.setCellState(0, 0, true);
        assertTrue(grid.isCellAlive(0, 0));
    }
}


public class LifeTest {
    private LifeInterface lifeModel;

    @Before
    public void setup() {
        lifeModel = new Life(5, 5);
    }

    @Test
    public void testSetCellAlive() {
        lifeModel.setCellState(2, 3, true);
        assertTrue(lifeModel.isCellAlive(2, 3));
    }

    @Test
    public void testReset() {
        lifeModel.setCellState(2, 2, true);
        lifeModel.resetGrids();
        assertFalse(lifeModel.isCellAlive(2, 2));
    }
}

Project

Testing

Deployment

Il deployment è effettuato creando un'immagine docker attraverso il seguente file: Dockerfile Successivamente l'immagine viene "eseguita" con il compose file in un network esterno: docker-compose.yaml

Maintenance