Files
ecarte/lib/game.rb
T

134 lines
3.1 KiB
Ruby

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