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