172 lines
2.5 KiB
Ruby
172 lines
2.5 KiB
Ruby
#!/usr/bin/env ruby
|
|
|
|
class Card
|
|
attr_reader :value, :suit
|
|
|
|
def initialize(value, suit)
|
|
@value = value
|
|
@suit = suit
|
|
end
|
|
|
|
def display
|
|
puts "#{@value} of #{@suit}"
|
|
end
|
|
|
|
def strength
|
|
if @value.match?(/\A\d+\z/)
|
|
@value.to_i
|
|
else
|
|
case @value
|
|
when "jack"
|
|
11
|
|
when "queen"
|
|
12
|
|
when "king"
|
|
13
|
|
when "ace"
|
|
14
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
class Deck
|
|
attr_reader :cards
|
|
|
|
def initialize
|
|
@cards = []
|
|
values = ["7", "8", "9", "10", "jack", "queen", "king", "ace"]
|
|
suits = ["hearts", "diamonds", "clubs", "spades"]
|
|
|
|
suits.each do |suit|
|
|
values.each do |value|
|
|
@cards << Card.new(value, suit)
|
|
end
|
|
end
|
|
end
|
|
|
|
def shuffle
|
|
@cards.shuffle!
|
|
end
|
|
|
|
def draw
|
|
@cards.pop
|
|
end
|
|
end
|
|
|
|
class Player
|
|
attr_reader :player_name, :score
|
|
|
|
def initialize(player_name)
|
|
@hand = []
|
|
@player_name = player_name
|
|
@score = 0
|
|
end
|
|
|
|
def receive(card)
|
|
@hand << card
|
|
end
|
|
|
|
def display_hand
|
|
@hand.each do |card|
|
|
card.display
|
|
end
|
|
end
|
|
|
|
def play
|
|
@hand.pop
|
|
end
|
|
|
|
def add_point
|
|
@score += 1
|
|
end
|
|
end
|
|
|
|
class Game
|
|
attr_reader :player1, :player2, :round_winner
|
|
|
|
def initialize(player_name1, player_name2)
|
|
@deck = Deck.new
|
|
@player1 = Player.new(player_name1)
|
|
@player2 = Player.new(player_name2)
|
|
@round_winner = nil
|
|
end
|
|
|
|
def deal
|
|
@deck.shuffle
|
|
(1..16).each do
|
|
@player1.receive(@deck.draw)
|
|
@player2.receive(@deck.draw)
|
|
end
|
|
end
|
|
|
|
def play_round
|
|
card1 = @player1.play
|
|
card2 = @player2.play
|
|
card1.display
|
|
card2.display
|
|
if card1.strength > card2.strength
|
|
@round_winner = @player1
|
|
elsif card1.strength < card2.strength
|
|
@round_winner = @player2
|
|
else
|
|
@round_winner = nil
|
|
end
|
|
|
|
if @round_winner
|
|
@round_winner.add_point
|
|
end
|
|
end
|
|
|
|
def play
|
|
(1..16).each do
|
|
play_round
|
|
end
|
|
end
|
|
|
|
def game_winner
|
|
if @player1.score > @player2.score
|
|
@player1
|
|
elsif @player1.score < @player2.score
|
|
@player2
|
|
else
|
|
nil
|
|
end
|
|
end
|
|
end
|
|
|
|
# Card
|
|
|
|
# card = Card.new("king", "hearts")
|
|
# puts card.value
|
|
# puts card.suit
|
|
# card.display
|
|
# puts card.strength
|
|
|
|
# Deck
|
|
|
|
# deck = Deck.new
|
|
# deck.shuffle
|
|
# card = deck.draw
|
|
# card.display
|
|
|
|
# Game
|
|
|
|
game = Game.new("Bob", "Alice")
|
|
game.deal
|
|
puts "Player 1 :"
|
|
game.player1.display_hand
|
|
puts
|
|
puts "Player 2 :"
|
|
game.player2.display_hand
|
|
puts
|
|
game.play
|
|
puts
|
|
winner = game.game_winner
|
|
if winner
|
|
puts winner.player_name
|
|
else
|
|
puts "Nobody wins"
|
|
end
|
|
|