Introduction
Realizzazione in Java del
GAME OF LIFE DI CONWAY
Requirements
Realizzare una versione in Java del gioco Life di Conway, come gioco zero-player.
Il gioco consiste nell’introdurre una Griglia di Celle il cui stato (cella ‘viva’ o cella ‘morta’)
evolve come stabilito dallle regole di ConwayLife
L’utente umano deve poter:
- specificare la configurazione iniziale della griglia del gioco
- vedere l’evoluzione del gioco in forma opportuna
(si veda Problema della vista del gioco )
- fermare e far ripartire l’evoluzione del gioco
- pulire (a gioco fermo) la configurazione della griglia del gioco
Requirement analysis
//La cella ha uno stato (viva o morta) ottenibile e impostabile con gli opportuni accessori
public interface ICell {
public void setStatus(boolean status); //primitiva
public boolean isAlive(); //primitiva
public void switchCellState(); //composta
}
//La griglia è un insieme di celle, con dimensioni specificabili, e con accessori per ottenere e impostare lo stato di ogni cella
public interface IGrid {
public int getWidth(); //primitiva
public int getHeight(); //primitiva
public ICell getCell(int x, int y); //primitiva
public boolean getCellValue(int x, int y); //composta
public void setCell(int x, int y, ICell cell); //primitiva
public void setCellValue(int x, int y, boolean value); //composta
//Imposta tutte le celle della griglia a morte
public void reset(); //composta
}
//Life è un sistema che si occupa di far evolvere la griglia secondo le regole del gioco
public interface LifeInterface {
void nextGeneration(); //primitiva
//Si riferisce alla cella della griglia
boolean isAlive(int row, int col); //composta
ICell getCell(int x, int y); //composta
void setCell(int row, int col, boolean alive); //composta
Grid getGrid(); //primitiva
//Imposta tutte le celle della griglia a morte
void resetGrids(); //composta
}
Problem analysis
Test plans
public class CellTest {
@Test
//Per comodita una cella viva restituisce un boolean true, una cella morta restituisce un boolean false
public void testCell() {
var cell = null;
cell.setStatus(true);
assertTrue(cell.isAlive());
cell.setStatus(false);
assertFalse(cell.isAlive());
}
}
public class GridTest {
@Test(expected = IllegalArgumentException.class)
//Le coordinate della cella devono essere comprese in [0, dim)
public void testGrid() throws Exception {
var grid = null;
for (int i = 0; i < grid.getWidth(); i++) {
for (int j = 0; j < grid.getHeight(); j++) {
assertFalse(grid.getCell(i, j).isAlive());
}
}
grid.setCell(0, 0, new Cell(true));
assertTrue(grid.getCell(0, 0).isAlive());
grid.getCell(-1, grid.getHeight() + 1);
}
}
public class LifeTest {
private LifeInterface lifeModel;
@Test
public void testSetCellAlive() {
lifeModel.setCell(2, 3, true);
assertTrue(lifeModel.isAlive(2, 3));
}
@Test
public void testSetCellDead() {
lifeModel.setCell(1, 1, false);
assertFalse(lifeModel.isAlive(1, 1));
}
@Test
public void testLonelyCellDies() {
lifeModel.setCell(1, 1, true);
lifeModel.nextGeneration();
assertFalse(lifeModel.isAlive(1, 1));
}
@Test
public void testBlockStillLife() {
lifeModel.setCell(1,1,true);
lifeModel.setCell(1,2,true);
lifeModel.setCell(2,1,true);
lifeModel.setCell(2,2,true);
lifeModel.nextGeneration();
assertTrue(lifeModel.isAlive(1,1));
assertTrue(lifeModel.isAlive(1,2));
assertTrue(lifeModel.isAlive(2,1));
assertTrue(lifeModel.isAlive(2,2));
}
@Test
public void testReset() {
lifeModel.setCell(2,2,true);
lifeModel.resetGrids();
assertFalse(lifeModel.isAlive(2,2));
}
@Test
public void testGetGrid() {
Grid grid = lifeModel.getGrid();
assertNotNull(grid);
}
}
Project
Testing
Deployment
Maintenance