Introduction
Goal: Realizzazione in Java del
GAME OF LIFE DI CONWAY
limitatamente al
requisito R1.
Requirements
R1 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
R2 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
ICell
Dopo aver parlato col committente, formalizzo il seguente modello:
Cosa intende il committente con la parola "Cell"?
public interface ICell {
void setStatus(boolean v); //ha la capacità di modificare il proprio stato interno con un valore booleano che può essere true o false
boolean isAlive(); //ha la capacità di rispondere alla "query" isAlive con un valore booleano (se è viva o morta)
void switchCellState(); //ha la capacità di cambiare lo stato
}
Test Plan:
public class CellTest {
private ICell c;
@Before
public void setup() {
System.out.println("ConwayLifeTest | setup");
c = new Cell();
}
@After
public void down() {
System.out.println("ConwayLifeTest | down");
}
@Test
public void testCellAlive() {
System.out.println("ConwayLifeTest | doing alive");
c.setStatus(true);
boolean r = c.isAlive();
assertTrue(r);
}
@Test
public void testCellDead() {
System.out.println("ConwayLifeTest | doing dead");
c.setStatus(false);
boolean r = c.isAlive();
assertTrue( !r);
}
}
IGrid
Cosa intende il committente con la parola "Grid"?
E' un'entità composta da più ICell, ha due dimensioni
Quali sono queste dimensioni? Righe e colonne
public interface IGrid {
public int getRowsNum(); //[primitiva] ha la capacità di restituire il numero di righe
public int getColsNum(); //[primitiva] ha la capacità di restituire il numero di colonne
public void setCellValue(int x, int y, boolean state); //[non primitiva] ha la capacità di cambiare il valore di una determinata cella
public ICell getCell(int x, int y); //[primitiva] ha la capacità di restituire la ICell sapendo le sue coordinate
public boolean getCellValue(int x, int y); //[non primitiva] ha la capacità di restituire il valore della cella sapendo le sue coordinate
public void reset(); //[non primitiva] ha la capacità di cambiare lo stato di tutte le ICell in "dead"
}
Test Plan:
public class GridTest {
private static final int nRows=5;
private static final int nCols=5;
private Grid grid;
@Before
public void setup() {
System.out.println("GridTest | setup");
grid= new Grid(nRows,nCols);
}
@After
public void down() {
System.out.println("GridTest | down");
}
@Test
public void testDims() {
System.out.println("testDims ---------------------" );
int nr = grid.getRowsNum();
int nc = grid.getColsNum();
assertTrue( nr==nRows && nc==nCols );
}
@Test
public void testCGridCellValue() {
System.out.println("testCGridCellValue ---------------------" );
grid.setCellValue(0,0,true);
assertTrue( grid.getCellValue(0,0) );
assertFalse( grid.getCellValue(0,1) );
}
@Test
public void testGridRep() {
System.out.println("testGridRep ---------------------" );
System.out.println(""+grid);
assertTrue( grid.toString().startsWith(". . . . ."));
}
@Test
public void testPrintGrid() {
System.out.println("testPrintGrid ---------------------" );
grid.setCellValue(0,0,true);
grid.setCellValue(0,1,true);
grid.setCellValue(0,2,true);
grid.setCellValue(0,3,true);
grid.setCellValue(0,4,true);
//grid.printGrid();
}
}
LifeInterface
E' un'entità composta da una IGrid
public interface LifeInterface {
void nextGeneration(); //Calcola l'evoluzione dello stato alla generazione successiva
boolean isAlive(int row, int col); //Restituisce lo stato di una cella specifica
void setCell(int row, int col, boolean alive); //Imposta lo stato di una cella
ICell getCell(int x, int y); //Restituisce la cell
Grid getGrid(); //Restituisce la grid
void resetGrids(); //pulisce
/** Restituisce il numero di righe e colonne */
// int getRows();
// int getCols();
/** Restituisce una rappresentazione grafica testuale della grglia*/
//public String gridRep( );
}
public class LifeTest {
private LifeInterface lifeModel;
@Before
public void setup() {
System.out.println("LifeTest | setup");
lifeModel = new Life(5, 5);
}
@After
public void down() {
System.out.println("LifeTest | down");
}
@Test
public void testSetCellAlive() {
System.out.println("LifeTest | setting cell alive");
lifeModel.setCell(3, 3, true);
assertTrue(lifeModel.isAlive(3, 3));
}
@Test
public void testSetCellDead() {
System.out.println("LifeTest | setting cell dead");
lifeModel.setCell(1, 2, false);
assertFalse(lifeModel.isAlive(1, 2));
}
@Test
public void testLonelyCellDies() {
System.out.println("LifeTest | test lonely cell");
lifeModel.setCell(4, 1, true);
lifeModel.nextGeneration();
assertFalse(lifeModel.isAlive(4, 1));
}
@Test
public void testBlockStillLife() {
System.out.println("LifeTest | test block 2x2");
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() {
System.out.println("LifeTest | reset");
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 5; j++) {
lifeModel.setCell(i, j, true);
}
}
lifeModel.resetGrids();
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 5; j++) {
assertFalse(lifeModel.isAlive(i,j));
}
}
}
@Test
public void testGetGrid() {
System.out.println("LifeTest | get grid");
Grid grid = lifeModel.getGrid();
assertNotNull(grid);
}
}
Problem analysis
Test plans
Project
Testing
Deployment
Maintenance