-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgame.rb
More file actions
166 lines (133 loc) · 4.21 KB
/
game.rb
File metadata and controls
166 lines (133 loc) · 4.21 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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
class Game
attr_reader :players, :deck
def initialize
@deck = Deck.new
@players = [User.new, Dealer.new]
end
def start
player_name = ask_for_name
players.first.name = player_name
puts "Добро пожаловать в игру Blackjack, #{player_name}!"
game_loop
end
private
def game_loop
loop do
play_round
display_balances
break unless play_again?
end
puts 'Игра завершена, у одного из игроков закончились деньги или мотивация.'
end
def play_round
take_bets
reset_round
deal_cards
player_turn
dealer_turn
display_cards(players[1])
calculate_results
end
def take_bets
players.each do |player|
if player.balance >= 10
player.balance -= 10
puts "#{player.name} ставит 10 $"
else
puts "#{player.name} не может поставить ставку. У него недостаточно денег."
break
end
end
end
def reset_round
players.each(&:reset_cards) # Сбрасываю карты перед раздачей
end
def deal_cards
2.times { players.each { |player| player.cards << deck.deal } }
end
def show_player_cards
puts "Твои карты:"
display_cards(players.first)
end
def player_turn
action = players.first.make_move
case action
when :skip
puts "#{players.first.name} пропустил ход."
when :take
deal_card_to_player
when :open_cards
puts "#{players.first.name} открывает карты."
display_cards(players.first, hide_dealer_cards = false)
display_cards(players[1], hide_dealer_cards = false)
end
end
def deal_card_to_player
players.first.cards << deck.deal
puts "Ты взял карту."
display_cards(players.first)
end
def dealer_turn
puts "Ход дилера:"
# Сначала показываю скрытые карты дилера
display_cards(players[1], hide_dealer_cards = true)
while players[1].points < 17
dealer_move(players[1]) # Добавляю карту дилеру
puts "Дилер берет карту."
display_cards(players[1], hide_dealer_cards = true)
end
# Когда дилер завершит свой ход, раскрываю ему карты
puts "Карты дилера раскрыты:"
# display_cards(players[1], hide_dealer_cards = false) ВРЕМЕННО СКРЫЛ ЧТОБЫ ДУБЛИРОВАНИЕ УБРАТЬ
end
def dealer_move(dealer)
return if dealer.points >= 17
dealer.add_card(@deck.deal)
end
def display_cards(player, hide_dealer_cards = false)
player.cards.each_with_index do |card, index|
if hide_dealer_cards && player.is_a?(Dealer)
puts "Карта №#{index + 1}: ***"
else
# Иначе показываем настоящие карты
puts "Карта № #{index + 1}: #{card}"
end
end
# Сумму очков показываем только если карты не скрыты
unless hide_dealer_cards
puts "Сумма очков у #{player.name}: #{player.points}"
end
end
def calculate_results
player, dealer = players
if player.points > 21
puts "#{player.name} проиграл!!! Перебор!"
dealer.balance += 20
elsif dealer.points > 21
puts "Дилер проиграл!!! Перебор!"
player.balance += 20
elsif player.points > dealer.points
puts "#{player.name} победил!!!"
player.balance += 20
elsif player.points < dealer.points
puts "Дилер победил!!!"
dealer.balance += 20
else
puts "Ничья!!! Ставка возвращается."
end
end
def play_again?
print 'Играть снова? (y/n): '
answer = gets.chomp.downcase
answer == 'y'
end
def ask_for_name
print 'Введите ваше имя: '
gets.chomp
end
def display_balances
puts "\nТекущее количество грошей у игроков:"
players.each { |player| puts "#{player.name}: $#{player.balance}" }
puts "-" * 30
end
end