summaryrefslogtreecommitdiff
path: root/domain/src/main/java/mancala/domain/Bowl.java
blob: fece3934c99d8f1241ca8f5123ca830827117b83 (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
package mancala.domain;

abstract class Bowl {
    protected int myRocks;
    protected Player myOwner;
    protected Bowl nextBowl;

    public int getMyStones() {
        return myRocks;
    }

    public Bowl getNextBowl() {
        return nextBowl;
    }

    public Player getMyOwner() {
        return myOwner;
    }

    abstract void distribute(int remainingRocks);

    abstract SmallBowl getOpposite(int i);

    abstract SmallBowl getNextSmallBowlTimes(int i);

    abstract Kalaha getKalaha();

    abstract SmallBowl getSmallBowl();

    abstract SmallBowl goToFirstBowlOfPlayerWithTurn();

    abstract boolean isEmpty();
    // abstract SmallBowl getNextSmallBowl();

    boolean endTheGame() {
        return goToFirstBowlOfPlayerWithTurn().getNextBowl().endTheGame(goToFirstBowlOfPlayerWithTurn(), 0, 0);
    }

    protected boolean endTheGame(Bowl startOfLoop, int scorePlayer, int scoreOpponent) {
        if (isEmpty() == false && getMyOwner().equals(startOfLoop.getMyOwner())) return false;

        if (this.equals(startOfLoop)) {

            int playerKalaha = getKalaha().getMyStones();

            if (scorePlayer == playerKalaha) {

                if (scorePlayer == scoreOpponent) getMyOwner().gotADraw();
                else if (scorePlayer > scoreOpponent) getMyOwner().isTheWinner();
                else getMyOwner().getOpponent().isTheWinner();

                return true;
            }


        } else {
            if (getMyOwner().equals(startOfLoop.getMyOwner())) {
                scorePlayer = scorePlayer + getMyStones();
            } else scoreOpponent = scoreOpponent + getMyStones();

            return getNextBowl().endTheGame(startOfLoop, scorePlayer, scoreOpponent);
        }
        return false;
    }



}