summaryrefslogtreecommitdiffstats
path: root/src/jrummikub/model/Hand.java
blob: 344855d578ddb026b4e41d068fff8a37df0b953c (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
121
122
123
124
125
126
127
128
129
130
package jrummikub.model;

import static jrummikub.model.StoneTray.Direction.LEFT;
import static jrummikub.model.StoneTray.Direction.RIGHT;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.TreeMap;

import jrummikub.control.AIUtil;
import jrummikub.util.Pair;

/** Class managing a {@link Player}'s {@link Stone}s */
public class Hand extends StoneTray<Stone> implements IHand {
	/**
	 * The width of the hand
	 */
	public final static int WIDTH = 14;

	private GameSettings settings;

	/**
	 * Create a new empty hand with given game settings
	 * 
	 * @param settings
	 *          the game settings
	 */
	public Hand(GameSettings settings) {
		this.settings = settings;
	}

	@Override
	public int getFreeRowSpace(int row) {
		int count = 0;
		for (Pair<Stone, Position> entry : this) {
			if (entry.getSecond().getY() == row) {
				count++;
			}
		}
		return WIDTH - count;
	}

	@Override
	public int getRowCount() {
		int rows = 0;

		for (Pair<Stone, Position> entry : this) {
			if (entry.getSecond().getY() > rows) {
				rows = (int) entry.getSecond().getY();
			}
		}

		return rows + 1;
	}

	@Override
	protected Pair<Position, Direction> fixInvalidDrop(Stone stone, Position pos,
			Direction dir) {
		float x = pos.getX();
		float y = pos.getY();

		if (x >= 0 && x <= WIDTH - 1) {
			return null;
		}
		if (x < 0) {
			return new Pair<Position, Direction>(new Position(0, y), RIGHT);
		} else {
			if (getFreeRowSpace((int) y) == 0) {
				return new Pair<Position, Direction>(new Position(0, y + 1), RIGHT);
			} else {
				return new Pair<Position, Direction>(new Position(WIDTH - 1, y), LEFT);
			}
		}
	}

	public int getStonePoints() {
		int points = 0;

		for (Pair<Stone, Position> entry : this) {
			if (entry.getFirst().isJoker()) {
				points += settings.getJokerPoints();
			} else {
				points += entry.getFirst().getValue();
			}
		}

		return points;
	}

	@Override
	public boolean isInitialMeldPossible() {
		List<Stone> stones = new ArrayList<Stone>();

		for (Iterator<Pair<Stone, Position>> iter = this.iterator(); iter.hasNext();) {
			stones.add(iter.next().getFirst());
		}

		Pair<TreeMap<Pair<Integer, StoneColor>, Integer>, Integer> stoneCounts = AIUtil
				.countStones(stones);

		Pair<List<StoneSet>, Integer> result = AIUtil.findSetsWithTotalPoints(
				settings.getInitialMeldThreshold(), stoneCounts.getFirst(),
				stoneCounts.getSecond());
		
		System.out.println(result);

		return (result.getSecond() >= settings.getInitialMeldThreshold());
	}

	@Override
	public int getIdenticalStoneCount() {
		List<Stone> stones = new ArrayList<Stone>();

		for (Iterator<Pair<Stone, Position>> iter = this.iterator(); iter.hasNext();) {
			stones.add(iter.next().getFirst());
		}

		Pair<TreeMap<Pair<Integer, StoneColor>, Integer>, Integer> stoneCounts = AIUtil
				.countStones(stones);

		int pairCount = 0;

		for (int count : stoneCounts.getFirst().values()) {
			pairCount += count / 2;
		}

		return pairCount;
	}
}