require_relative "deck" require_relative "player" require_relative "terminal_ui" # Gère le déroulement et les règles d'une partie d'Écarté. 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 # Simule une coupe pour déterminer quel joueur sera le donneur. 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 # Échange les rôles de donneur et de non-donneur. def change_dealer old_dealer = @dealer @dealer = @non_dealer @non_dealer = old_dealer end # Distribue les cartes et pose la retourne. 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 # Retourne les cartes restantes dans le talon. def stock @deck.cards end # Vérifie si le coup du second joueur respecte les règles. def valid_follow_card?(follow_player, lead_card, follow_card) if follow_card.suit == lead_card.suit true elsif follow_player.hand.any? { |card| card.suit == lead_card.suit } false else true end end # Joue un pli. def play_trick(lead_player, follow_player) lead_card = @ui.choose_card(lead_player) follow_card = @ui.choose_card(follow_player) until valid_follow_card?(follow_player, lead_card, follow_card) @ui.display_wrong_card follow_card = @ui.choose_card(follow_player) end 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 # Retourne l'autre joueur. def other_player(player) player == @player1 ? @player2 : @player1 end # Joue une partie. 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 # Retourne le joueur ayant le meilleur score. def game_winner if @player1.score > @player2.score @player1 elsif @player1.score < @player2.score @player2 else nil end end end