-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathPlayer.java
More file actions
111 lines (97 loc) · 3.47 KB
/
Player.java
File metadata and controls
111 lines (97 loc) · 3.47 KB
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
import java.io.Serializable;
import java.util.*;
public class Player implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private List<Tile> rack;
private int score;
private String lastError = "";
public Player(String name) { this.name = name; rack = new ArrayList<>(); score = 0; }
public String getName() { return name; }
public int getScore() { return score; }
public List<Tile> getRack() { return rack; }
public String getLastError() { return lastError; }
public void setLastError(String msg) { lastError = msg; }
public void addScore(int pts) { score += pts; }
public void drawTiles(Queue<Tile> bag, int count) {
while (rack.size() < 7 && !bag.isEmpty() && count > 0) { rack.add(bag.poll()); count--; }
}
public boolean hasTilesForWord(String word) {
List<Character> copy = new ArrayList<>();
for (Tile t : rack) copy.add(t.isBlank() ? '*' : t.getLetter());
for (char c : word.toUpperCase().toCharArray()) {
if (!copy.remove((Character)c)) {
// if specific letter not found, try to use a blank ('*')
if (!copy.remove((Character)'*')) return false;
}
}
return true;
}
public void useTilesForWord(String word) {
for (char ch : word.toUpperCase().toCharArray()) {
boolean removed = false;
for (int i = 0; i < rack.size(); i++) {
Tile t = rack.get(i);
if (!t.isBlank() && t.getLetter() == ch) {
rack.remove(i);
removed = true;
break;
}
}
if (!removed) {
// remove a blank if available
for (int i = 0; i < rack.size(); i++) {
Tile t = rack.get(i);
if (t.isBlank()) {
rack.remove(i);
removed = true;
break;
}
}
}
}
}
public Tile takeTileForLetter(char letter) {
letter = Character.toUpperCase(letter);
// prefer exact match
for (int i = 0; i < rack.size(); i++) {
Tile t = rack.get(i);
if (!t.isBlank() && t.getLetter() == letter) {
return rack.remove(i);
}
}
// otherwise use a blank
for (int i = 0; i < rack.size(); i++) {
Tile t = rack.get(i);
if (t.isBlank()) {
return rack.remove(i); // returns an unassigned blank (letter = '*')
}
}
return null; // no tile found
}
public boolean swapTiles(String letters, Queue<Tile> bag) {
if (!hasTilesForWord(letters)) return false;
for (char c : letters.toCharArray())
for (int i = 0; i < rack.size(); i++)
if (rack.get(i).getLetter() == c) { bag.offer(rack.remove(i)); break; }
drawTiles(bag, letters.length());
return true;
}
public void useBlankTile(char letter) {
for (int i = 0; i < rack.size(); i++) {
Tile t = rack.get(i);
if (t.isBlank()) {
rack.remove(i);
break;
}
}
}
public Player copy() {
Player p = new Player(this.name);
p.score = this.score;
for (Tile t : this.rack) {
p.rack.add(t.copy());
}
return p;
}
}