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
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