fiftytwo 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f841300403b3e5e84bd2094a711ee89c13333537e3cabd08f3dfff000d59f69c
4
- data.tar.gz: be8c200b6207437b4cabe5c500df1ff80caccf17ca8845a048c124c6ac86d97d
3
+ metadata.gz: a5c1752b761a6a418abc5635ece62d1dde656012ca5b548e107ab633a915d868
4
+ data.tar.gz: f044e63524c51c7f25987f8a682e5876157bda0bbb10c2c3b7959535afbe88c3
5
5
  SHA512:
6
- metadata.gz: 579cf55130a79d92779edf40dce3f99e232270845c4f8a48097d1f904b759317f3aa19cba206e62bf60917306ac05b008b02cc938e21a4d017b5a97e529662b9
7
- data.tar.gz: '0643844dd685e0f5c44f629f5db3c70b5599c00cfe136ba914448c88cf2974b864f7e30c6a661cb69a90544da82e65eff527b2eef7618f8a37191cef0f581c23'
6
+ metadata.gz: 3e413c3f029b93322be3ed98725dc99dc7621ddc2bd53f9e3d18abb417419be200b53d055620e3dbffce932e691c56dd5466d097a4ffb24800d7c20a8dfc34df
7
+ data.tar.gz: a1db0d51936d8c0d20b4bf25ac1f9d9f6525e509cbe557a5b327c582c22d32831c2e0fb460a96ddf30a0826299c9e2039759937def354e1fa7851483c0f5d081
data/README.md CHANGED
@@ -116,15 +116,15 @@ deck.deal([my_hand, your_hand], 5)
116
116
  # => "Deck has 42 cards, I have 5 cards, you have 5 cards"
117
117
 
118
118
  puts my_hand.render, your_hand.render # by the way renderings are colored red/black in your terminal, just like the suit!
119
- 3♦ 4♠ 5♦ 7♥ 2♣
120
- 6♠ A♦ 5♠ 10♦ Q♣
119
+ # 3♦ 4♠ 5♦ 7♥ 2♣
120
+ # 6♠ A♦ 5♠ 10♦ Q♣
121
121
  ```
122
122
 
123
123
  Hands, just like the deck, can be shuffled, sorted, searched, etc:
124
124
  ```ruby
125
125
  your_hand.sort!
126
126
  puts your_hand.render
127
- 5♠ 6♠ 10♦ Q♣ A♦
127
+ # 5♠ 6♠ 10♦ Q♣ A♦
128
128
 
129
129
  your_hand.aces.count
130
130
  # => 1
@@ -132,15 +132,15 @@ your_hand.aces.count
132
132
 
133
133
  Pass your cards around:
134
134
  ```ruby
135
- my_hand.transfer("4S", your_hand)
135
+ my_hand.transfer("4S", your_hand) # try an array of card identifiers, too!
136
136
  puts my_hand.render, your_hand.render
137
- 3♦ 5♦ 7♥ 2♣
138
- 5♠ 6♠ 10♦ Q♣ A♦ 4♠
137
+ # 3♦ 5♦ 7♥ 2♣
138
+ # 5♠ 6♠ 10♦ Q♣ A♦ 4♠
139
139
 
140
140
  your_hand.transfer("QC") # goes back to the deck
141
141
  puts my_hand.render, your_hand.render
142
- 3♦ 5♦ 7♥ 2♣
143
- 5♠ 6♠ 10♦ A♦ 4♠
142
+ # 3♦ 5♦ 7♥ 2♣
143
+ # 5♠ 6♠ 10♦ A♦ 4♠
144
144
 
145
145
  deck.count
146
146
  # => 43
@@ -155,6 +155,44 @@ your_hand.release
155
155
  # => "Deck has 52 cards, I have 0 cards, you have 0 cards"
156
156
  ```
157
157
 
158
+ ## Example: 5 card draw poker
159
+ _Reminder, we are implementing a deck of cards, and the operations you can perform with that deck. Evaluation of hands is dependent upon some
160
+ particular game, and is outside the scope of this gem!_
161
+
162
+ ```ruby
163
+ require "fiftytwo"
164
+
165
+ deck = FiftyTwo::Deck.standard
166
+ deck.shuffle!
167
+
168
+ my_hand = FiftyTwo::Hand.new
169
+ your_hand = FiftyTwo::Hand.new
170
+ discard = FiftyTwo::Hand.new
171
+
172
+ deck.deal([your_hand, my_hand], 5)
173
+
174
+ [my_hand, your_hand].each(&:sort!)
175
+ puts "you: #{your_hand.render}", "me: #{my_hand.render}"
176
+ # you: 6♦ 6♠ 7♠ K♣ A♦
177
+ # me: 2♦ 5♥ 8♠ 9♥ 10♦
178
+
179
+ your_hand.transfer(%w[7s kc], discard)
180
+ deck.deal(your_hand, 2)
181
+
182
+ my_hand.transfer(%w[2D 5H], discard)
183
+ deck.deal(my_hand, 2)
184
+
185
+ [my_hand, your_hand].each(&:sort!)
186
+ puts "you: #{your_hand.render}", "me: #{my_hand.render}"
187
+ # you: 4♠ 6♦ 6♠ K♦ A♦
188
+ # me: 2♣ 4♣ 8♠ 9♥ 10♦
189
+
190
+ puts "Congratulations, you win!"
191
+
192
+ [my_hand, your_hand, discard].each(&:release)
193
+ deck.shuffle!
194
+ ```
195
+
158
196
  # Problems?
159
197
  Please submit an [issue](https://github.com/kevinstuffandthings/fiftytwo/issues).
160
198
  We'll figure out how to get you up and running with FiftyTwo as smoothly as possible.
@@ -24,11 +24,8 @@ module FiftyTwo
24
24
  cards.find { |c| c.identifier == identifier.upcase }
25
25
  end
26
26
 
27
- def transfer(card, destination = nil)
28
- card = locate(card) unless card.is_a?(FiftyTwo::Card)
29
- raise CardUnavailableError if card.nil?
30
- raise CardUnavailableError unless cards.include?(card)
31
- (destination || card.deck) << cards.delete(card)
27
+ def transfer(cards, destination = nil)
28
+ gather(cards).map { |c| (destination || c.deck) << self.cards.delete(c) }
32
29
  end
33
30
 
34
31
  FiftyTwo::Suit::ALL.each do |suit|
@@ -48,5 +45,14 @@ module FiftyTwo
48
45
  def select(identifier)
49
46
  self.class.new(cards.select { |c| c.send("#{identifier}?") })
50
47
  end
48
+
49
+ def gather(cards)
50
+ Array(cards).map do |card|
51
+ card = locate(card) unless card.is_a?(FiftyTwo::Card)
52
+ raise CardUnavailableError if card.nil?
53
+ raise CardUnavailableError unless self.cards.include?(card)
54
+ card
55
+ end
56
+ end
51
57
  end
52
58
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FiftyTwo
4
- VERSION = "0.0.2"
4
+ VERSION = "0.0.3"
5
5
  end
@@ -7,6 +7,7 @@ module FiftyTwo
7
7
  before(:each) do
8
8
  minideck << FiftyTwo::Card.new(minideck, FiftyTwo::Rank::THREE, FiftyTwo::Suit::CLUBS)
9
9
  minideck << FiftyTwo::Card.new(minideck, FiftyTwo::Rank::NINE, FiftyTwo::Suit::DIAMONDS)
10
+ minideck << FiftyTwo::Card.new(minideck, FiftyTwo::Rank::TEN, FiftyTwo::Suit::DIAMONDS)
10
11
  end
11
12
 
12
13
  it "is a deck, made up of cards" do
@@ -117,17 +118,22 @@ module FiftyTwo
117
118
  let(:subject) { minideck }
118
119
 
119
120
  it "takes cards in order from the deck" do
121
+ expect(subject.count).to eq 3
122
+
123
+ card = subject.draw
120
124
  expect(subject.count).to eq 2
125
+ expect(card).to be_a FiftyTwo::Card
126
+ expect(card.identifier).to eq "3C"
121
127
 
122
128
  card = subject.draw
123
129
  expect(subject.count).to eq 1
124
130
  expect(card).to be_a FiftyTwo::Card
125
- expect(card.identifier).to eq "3C"
131
+ expect(card.identifier).to eq "9D"
126
132
 
127
133
  card = subject.draw
128
134
  expect(subject.count).to eq 0
129
135
  expect(card).to be_a FiftyTwo::Card
130
- expect(card.identifier).to eq "9D"
136
+ expect(card.identifier).to eq "10D"
131
137
 
132
138
  card = subject.draw
133
139
  expect(subject.count).to eq 0
@@ -174,22 +180,34 @@ module FiftyTwo
174
180
  let(:hand) { FiftyTwo::Hand.new }
175
181
 
176
182
  it "has a deck with 2 cards, and a hand with none" do
177
- expect(subject.count).to eq 2
183
+ expect(subject.count).to eq 3
178
184
  expect(hand.count).to eq 0
179
185
  end
180
186
 
181
187
  it "can transfer a card by object" do
182
188
  subject.transfer(subject[1], hand)
183
- expect(subject.count).to eq 1
189
+ expect(subject.count).to eq 2
184
190
  expect(hand.count).to eq 1
185
191
  end
186
192
 
187
193
  it "can transfer a card by identifier" do
188
194
  subject.transfer("3C", hand)
189
- expect(subject.count).to eq 1
195
+ expect(subject.count).to eq 2
190
196
  expect(hand.count).to eq 1
191
197
  end
192
198
 
199
+ it "can transfer multiple cards" do
200
+ subject.transfer(%w[3C 10D], hand)
201
+ expect(subject.count).to eq 1
202
+ expect(hand.count).to eq 2
203
+ end
204
+
205
+ it "will not transfer any and raise an error if any one card reference is invalid" do
206
+ expect { subject.transfer(%w[3C 10K], hand) }.to raise_error FiftyTwo::HasCards::CardUnavailableError
207
+ expect(subject.count).to eq 3
208
+ expect(hand.count).to eq 0
209
+ end
210
+
193
211
  context "missing card" do
194
212
  let(:missing_card) { FiftyTwo::Card.new(subject, FiftyTwo::Rank::THREE, FiftyTwo::Suit::HEARTS) }
195
213
 
@@ -206,14 +224,14 @@ module FiftyTwo
206
224
  let(:card) { subject[1] }
207
225
  before(:each) { subject.transfer(card, hand) }
208
226
 
209
- it "starts with a card in the hand and a card in the deck" do
210
- expect(subject.count).to eq 1
227
+ it "starts with a card in the hand and 2 in the deck" do
228
+ expect(subject.count).to eq 2
211
229
  expect(hand.count).to eq 1
212
230
  end
213
231
 
214
232
  it "can transfer a card from a hand back to the bottom of its originating deck" do
215
233
  hand.transfer(card)
216
- expect(subject.count).to eq 2
234
+ expect(subject.count).to eq 3
217
235
  expect(hand.count).to eq 0
218
236
  expect(subject.last).to eq card
219
237
  end
@@ -230,7 +248,7 @@ module FiftyTwo
230
248
  end
231
249
 
232
250
  it "renders the set of cards in this deck" do
233
- expect(subject.render).to eq "CARD0 CARD1"
251
+ expect(subject.render).to eq "CARD0 CARD1 CARD2"
234
252
  end
235
253
  end
236
254
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fiftytwo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin McDonald
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-30 00:00:00.000000000 Z
11
+ date: 2021-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport