summaryrefslogtreecommitdiff
path: root/org/guru/boggle/SimpleBoard.java
blob: c291a63e58a74829df98d2cbfe9ee2414e521e6d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package org.guru.boggle;

import java.util.List;
import java.util.Random;

import com.google.common.collect.Lists;

public class SimpleBoard implements Board {

    private static final int DIM = 5;
    private final char[][] state = new char[DIM][DIM];
    private final boolean[][] used = new boolean[DIM][DIM];
    private final Random rand = new Random();

    public SimpleBoard() {
        reset();
        dump();
    }

    @Override
    public void reset() {
        for (int i = 0; i < DIM; ++i) {
            for (int j = 0; j < DIM; ++j) {
                state[i][j] = randomLetter();
                used[i][j] = false;
            }
        }
    }

    public void dump() {
        for (int i = 0; i < DIM; ++i) {
            for (int j = 0; j < DIM; ++j) {
                System.out.printf("%c ", state[i][j]);
            }
            System.out.printf("\n");
        }
    }

    public List<BoardPosition> allPositions() {
        List<BoardPosition> result = Lists.newArrayList();
        for (int i = 0; i < DIM; ++i) {
            for (int j = 0; j < DIM; ++j) {
                result.add(new BoardPosition(i, j));
            }
        }
        return result;
    }

    private char randomLetter() {
        return Character.valueOf((char) (rand.nextInt(26) + 65));
    }

    private void checkDimension(int i) {
        if (i < 0 || i >= DIM) {
            throw new IllegalArgumentException("Bad board dimension: " + i);
        }
    }

    private void checkOnBoard(BoardPosition p) {
        checkDimension(p.x());
        checkDimension(p.y());
    }

    @Override
    public char letterAt(BoardPosition p) {
        checkOnBoard(p);
        return state[p.x()][p.y()];
    }

    @Override
    public void markUsed(BoardPosition p) {
        checkOnBoard(p);
        used[p.x()][p.y()] = true;
    }

    @Override
    public void clearUsed(BoardPosition p) {
        checkOnBoard(p);
        used[p.x()][p.y()] = false;
    }

    @Override
    public boolean isUsed(BoardPosition p) {
        checkOnBoard(p);
        return used[p.x()][p.y()];
    }

    @Override
    public List<BoardPosition> adjacentNeighborPositions(BoardPosition p) {
        List<BoardPosition> result = Lists.newArrayList();
        int x = p.x();
        int y = p.y();
        for (int i = x - 1; i <= x + 1; ++i) {
            for (int j = y - 1; j <= y + 1; ++j) {
                if (i == x && y == j) continue;
                if (i < 0 || j < 0) continue;
                if (i >= DIM || j >= DIM) continue;
                result.add(new BoardPosition(i, j));
            }
        }
        return result;
    }

    @Override
    public List<BoardPosition> adjacentUnusedNeighborPosition(BoardPosition p) {
        List<BoardPosition> result = Lists.newArrayList();
        int x = p.x();
        int y = p.y();
        for (int i = x - 1; i <= x + 1; ++i) {
            for (int j = y - 1; j <= y + 1; ++j) {
                if (i == x && y == j) continue;
                if (i < 0 || j < 0) continue;
                if (i >= DIM || j >= DIM) continue;
                if (used[i][j] == true) continue;
                result.add(new BoardPosition(i, j));
            }
        }
        return result;
    }
}