forked from AllenDowney/ThinkJavaCode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEights.java
More file actions
145 lines (121 loc) · 3.18 KB
/
Eights.java
File metadata and controls
145 lines (121 loc) · 3.18 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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import java.util.Scanner;
/**
* Simulates a game of Crazy Eights. See
* https://en.wikipedia.org/wiki/Crazy_Eights
* for basic play and scoring rules.
*/
public class Eights {
private Player one;
private Player two;
private Hand drawPile;
private Hand discardPile;
private Scanner in;
/**
* Initializes the state of the game.
*/
public Eights() {
Deck deck = new Deck("Deck");
deck.shuffle();
// deal cards to each player
int handSize = 5;
one = new Player("Allen");
deck.deal(one.getHand(), handSize);
two = new Player("Chris");
deck.deal(two.getHand(), handSize);
// turn one card face up
discardPile = new Hand("Discards");
deck.deal(discardPile, 1);
// put the rest of the deck face down
drawPile = new Hand("Draw pile");
deck.dealAll(drawPile);
// create the scanner we'll use to wait for the user
in = new Scanner(System.in);
}
/**
* Returns true if either hand is empty.
*/
public boolean isDone() {
return one.getHand().empty() || two.getHand().empty();
}
/**
* Moves cards from the discard pile to the draw pile and shuffles.
*/
public void reshuffle() {
// save the top card
Card prev = discardPile.popCard();
// move the rest of the cards
discardPile.dealAll(drawPile);
// put the top card back
discardPile.addCard(prev);
// shuffle the draw pile
drawPile.shuffle();
}
/**
* Returns a card from the draw pile.
*/
public Card draw() {
if (drawPile.empty()) {
reshuffle();
}
return drawPile.popCard();
}
/**
* Switches players.
*/
public Player nextPlayer(Player current) {
if (current == one) {
return two;
} else {
return one;
}
}
/**
* Displays the state of the game.
*/
public void displayState() {
one.display();
two.display();
discardPile.display();
System.out.print("Draw pile: ");
System.out.println(drawPile.size() + " cards");
}
/**
* Waits for the user to press enter.
*/
public void waitForUser() {
in.nextLine();
}
/**
* One player takes a turn.
*/
public void takeTurn(Player player) {
Card prev = discardPile.last();
Card next = player.play(this, prev);
discardPile.addCard(next);
System.out.println(player.getName() + " plays " + next);
System.out.println();
}
/**
* Plays the game.
*/
public void playGame() {
Player player = one;
// keep playing until there's a winner
while (!isDone()) {
displayState();
waitForUser();
takeTurn(player);
player = nextPlayer(player);
}
// display the final score
one.displayScore();
two.displayScore();
}
/**
* Creates the game and runs it.
*/
public static void main(String[] args) {
Eights game = new Eights();
game.playGame();
}
}