109 lines
2.3 KiB
Ruby
109 lines
2.3 KiB
Ruby
require_relative "deck"
|
|
require_relative "player"
|
|
require_relative "terminal_ui"
|
|
|
|
class Game
|
|
attr_reader :player1, :player2, :dealer, :non_dealer,
|
|
:upcard, :trump_suit, :trick_winner
|
|
|
|
def initialize(player_name1, player_name2)
|
|
@deck = Deck.new
|
|
@player1 = Player.new(player_name1)
|
|
@player2 = Player.new(player_name2)
|
|
@dealer = nil
|
|
@non_dealer = nil
|
|
@upcard = nil
|
|
@trump_suit = nil
|
|
@trick_winner = nil
|
|
@ui = TerminalUI.new
|
|
end
|
|
|
|
def determine_dealer
|
|
@deck.shuffle
|
|
|
|
while @dealer.nil?
|
|
card1 = @deck.cards[rand(2..30) - 1]
|
|
card2 = @deck.cards[rand(2..30) - 1]
|
|
|
|
if card1.strength > card2.strength
|
|
@dealer = @player1
|
|
@non_dealer = @player2
|
|
elsif card2.strength > card1.strength
|
|
@dealer = @player2
|
|
@non_dealer = @player1
|
|
end
|
|
end
|
|
end
|
|
|
|
def change_dealer
|
|
old_dealer = @dealer
|
|
@dealer = @non_dealer
|
|
@non_dealer = old_dealer
|
|
end
|
|
|
|
def deal
|
|
@player1.clear_hand
|
|
@player2.clear_hand
|
|
|
|
@deck = Deck.new
|
|
@deck.shuffle
|
|
|
|
5.times do
|
|
@non_dealer.receive(@deck.draw)
|
|
@dealer.receive(@deck.draw)
|
|
end
|
|
@upcard = @deck.draw
|
|
@trump_suit = @upcard.suit
|
|
end
|
|
|
|
def stock
|
|
@deck.cards
|
|
end
|
|
|
|
def play_trick(lead_player, follow_player)
|
|
lead_card = @ui.choose_card(lead_player)
|
|
follow_card = @ui.choose_card(follow_player)
|
|
|
|
lead_player.play(lead_card)
|
|
follow_player.play(follow_card)
|
|
|
|
if lead_card.suit != follow_card.suit && follow_card.suit != @trump_suit
|
|
@trick_winner = lead_player
|
|
elsif lead_card.suit == follow_card.suit && lead_card.strength > follow_card.strength
|
|
@trick_winner = lead_player
|
|
else
|
|
@trick_winner = follow_player
|
|
end
|
|
|
|
@trick_winner.add_point
|
|
@ui.display_trick_winner(@trick_winner)
|
|
end
|
|
|
|
def other_player(player)
|
|
player == @player1 ? @player2 : @player1
|
|
end
|
|
|
|
def play
|
|
lead_player = @non_dealer
|
|
follow_player = @dealer
|
|
|
|
5.times do
|
|
play_trick(lead_player, follow_player)
|
|
|
|
lead_player = @trick_winner
|
|
follow_player = other_player(lead_player)
|
|
end
|
|
end
|
|
|
|
def game_winner
|
|
if @player1.score > @player2.score
|
|
@player1
|
|
elsif @player1.score < @player2.score
|
|
@player2
|
|
else
|
|
nil
|
|
end
|
|
end
|
|
end
|
|
|