-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path5b.rb
80 lines (63 loc) · 3.17 KB
/
5b.rb
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
# story (defect): as a user I can re-enter a cleared position and the board resets that position
# story (defect): as a user I can re-enter a flipped position and the board clears that position
# (after some investigation, these stories are likely related)
# acceptance criteria (fixed):
# - I can re-enter a cleared position and nothing changes on the board
# - I can re-enter a flipped position and nothing changes on the board
# setup the cards
cards = [['a','*'],['b','*'],['a','*'],['b','*']] # setup the data structure
# setup the view
puts "welcome to Remory, a game of memory" # print game header
view = cards.map(&:last) # setup game variables
showing = []
loop do
# show the board
puts
puts "-" * 20 # print round header
puts "here is the board"
puts view.join(" | ") # print the board
puts "pick a number 1 - #{cards.length}" # prompt the user for input
# collect the input
input = gets.chomp # collect and clean user input
pos = input.to_i - 1 # convert input to a number
# bug fixes
next if input.empty? # enforce a meaningful input
next unless (0...cards.length).include? pos # enforce a meaningful position
next if view[pos] != '*' # enforce a valid choice
# apply the input
face = cards[pos].first # extract card value
view[pos] = face # save card value to view
# show the result
puts "you flipped card #{input}"
puts view.join(" | ") # print the board
# track the cards facing up
showing.push(face) # track which cards are showing
# check if we have a pair
if showing.count == 2 # if 2 cards are showing
print "you picked 2 cards: #{showing} ... "
if showing.first == showing.last # if they're the same card
puts "and they match!"
new_view = [] # create a new view
view.each do |card| # iterate (loop) over the cards in the view
if card == '*' # if the card hasn't been flipped
new_view.push(card) # then leave it as is
else
new_view.push('_') # otherwise clear it
end
end
view.replace(new_view) # replace the view with the new one
else
puts "but they're different."
new_view = [] # create a new view
view.each do |card| # iterate (loop) over the cards in the view
if card == '_' # if the card has already been cleared
new_view.push(card) # then leave it as is
else
new_view.push('*') # otherwise reset it
end
end
view.replace(new_view) # replace the view with the new one
end
showing.clear # clear showing cards
end
end