Updated.
This commit is contained in:
@@ -2,8 +2,36 @@ package twentyfortyeight;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
import tester.Tester;
|
import tester.Tester;
|
||||||
|
|
||||||
|
// A game of 2048.
|
||||||
|
class Game {
|
||||||
|
int score;
|
||||||
|
Grid grid;
|
||||||
|
Random rand;
|
||||||
|
|
||||||
|
Game(int score, Grid grid, Random rand) {
|
||||||
|
this.score = score;
|
||||||
|
this.grid = grid;
|
||||||
|
this.rand = rand;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convenience constructor for init with default settings.
|
||||||
|
Game() {
|
||||||
|
this.grid = new Grid(4, 4);
|
||||||
|
this.score = 0;
|
||||||
|
this.rand = new Random();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convenience constructor for init with custom settings.
|
||||||
|
Game(int w, int h, int seed) {
|
||||||
|
this.grid = new Grid(w, h);
|
||||||
|
this.score = 0;
|
||||||
|
this.rand = new Random(seed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// The grid in which the game is played.
|
// The grid in which the game is played.
|
||||||
class Grid {
|
class Grid {
|
||||||
int w; // The width of the grid.
|
int w; // The width of the grid.
|
||||||
@@ -15,32 +43,43 @@ class Grid {
|
|||||||
if (w < 1 || h < 1)
|
if (w < 1 || h < 1)
|
||||||
throw new IllegalArgumentException("Can't make grid that small.");
|
throw new IllegalArgumentException("Can't make grid that small.");
|
||||||
|
|
||||||
this.sz = w * h;
|
this.w = w;
|
||||||
|
this.h = h;
|
||||||
|
this.sz = this.w * this.h;
|
||||||
this.buf = new ArrayList<>(this.sz);
|
this.buf = new ArrayList<>(this.sz);
|
||||||
|
|
||||||
for (int i = 0; i < this.sz; i++) this.buf.add(null);
|
// Fill with zeros.
|
||||||
|
for (int i = 0; i < this.sz; this.buf.add(i++ * 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the indexes of all "free" cells -- those whose value in buf is null,
|
// Get the indexes of all "free" cells -- those whose value in buf is 0,
|
||||||
// and are a blank tile.
|
// and are represented as blank tile.
|
||||||
List<Integer> freeCellIdxs() {
|
List<Integer> freeCellIdxs() {
|
||||||
List<Integer> nulls = new ArrayList<>();
|
List<Integer> free = new ArrayList<>();
|
||||||
for (int i = 0; i < this.sz; i++)
|
for (int i = 0; i < this.sz; i++)
|
||||||
if (this.buf.get(i) == null && nulls.add(i)) continue;
|
if (this.buf.get(i) == 0 && free.add(i)) continue;
|
||||||
|
|
||||||
return nulls;
|
return free;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set the tile at the coords. Just for testing.
|
||||||
|
Grid set(int x, int y, int v) {
|
||||||
|
this.buf.set(this.w * y + x, v);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the value at the coords. Just for testing.
|
||||||
|
int get(int x, int y) { return this.buf.get(this.w * y + x); }
|
||||||
}
|
}
|
||||||
|
|
||||||
class Examples {
|
class Examples {
|
||||||
Grid verySmall;
|
Grid verySmall, small, oblong, regular;
|
||||||
Grid small;
|
|
||||||
Grid oblong;
|
|
||||||
|
|
||||||
void init() {
|
void init() {
|
||||||
verySmall = new Grid(1, 1);
|
verySmall = new Grid(1, 1);
|
||||||
small = new Grid(2, 2);
|
small = new Grid(2, 2);
|
||||||
oblong = new Grid(1, 3);
|
oblong = new Grid(1, 3);
|
||||||
|
regular = new Grid(4, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
void testGridFreeCellIdxs(Tester t) {
|
void testGridFreeCellIdxs(Tester t) {
|
||||||
@@ -55,4 +94,26 @@ class Examples {
|
|||||||
oblong.freeCellIdxs(), new ArrayList<Integer>(List.of(0, 1, 2))
|
oblong.freeCellIdxs(), new ArrayList<Integer>(List.of(0, 1, 2))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void testGridSet(Tester t) {
|
||||||
|
init();
|
||||||
|
small.set(0, 0, 1);
|
||||||
|
t.checkExpect(small.freeCellIdxs(), new ArrayList<>(List.of(1, 2, 3)));
|
||||||
|
small.set(1, 1, 1);
|
||||||
|
t.checkExpect(small.freeCellIdxs(), new ArrayList<>(List.of(1, 2)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void testRegular(Tester t) {
|
||||||
|
init();
|
||||||
|
regular.set(1, 0, 16)
|
||||||
|
.set(2, 0, 16)
|
||||||
|
.set(3, 0, 32)
|
||||||
|
.set(0, 1, 4)
|
||||||
|
.set(1, 1, 4)
|
||||||
|
.set(4, 1, 2);
|
||||||
|
|
||||||
|
t.checkExpect(regular.get(1, 0), 16);
|
||||||
|
t.checkExpect(regular.get(0, 0), 0);
|
||||||
|
t.checkExpect(regular.get(3, 3), 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user