# Copyright 2006 Michael Lewis # Distributed under the terms of the GNU General Public License v2 require "Deck" require "Hand" require "Player" class Table attr_reader :minBet, :maxBet, :dealerHand, :deck def initialize( nDecks, minBet, maxBet ) @nDecks = nDecks @deck = Deck.new nDecks @deck.shuffle @minBet = minBet @maxBet = maxBet @dealerHand = Hand.new @players = Array.new @verbose = false end def setVerbose @verbose = true end def showing_card @dealerHand.first end def add_player( player ) @players << player true end def remove_player( player ) @players.delete player end def n_players @players.length end def round( forceDealer = nil, forcePlayer = nil ) if @deck.cards_left < 20 @deck.shuffle end @players.each { |player| player.place_bet } #deal each player 2 cards 2.times do |c| @deck.deal @dealerHand @players.each do |player| player.turn do |hand| @deck.deal hand hand[c] = forcePlayer[c] if !forcePlayer.nil? end end end @dealerHand[0] = forceDealer[0] if !forceDealer.nil? @dealerHand[1] = forceDealer[1] if !forceDealer.nil? if showing_card == 11 #add insurance code here end #if dealer has blackjack if @dealerHand.hand_value == 21 cycle_through_hands do |player, hand| player.lose @deck.reclaim_cards hand end else #check for player blackjacks cycle_through_hands do |player, hand| if hand.hand_value == 21 player.blackjack @deck.reclaim_cards hand end end end cycle_through_hands do |player, hand| #there will be one card in the hand if there has been a split if hand.length == 1 then @deck.deal hand end move = "" while !( move == "s" ) and !hand.locked? #TODO: add more code for moves move = player.move self if move == "s" break elsif move == "h" @deck.deal hand if hand.bust? player.lose @deck.reclaim_cards hand break end elsif move == "d" and hand.length == 2 #insert special doubling rules here @deck.deal hand player.double if hand.bust? player.lose @deck.reclaim_cards hand break end elsif move == "l" and hand.length == 2 and hand[0] == hand[1] #insert splitting rules here player.split @deck.deal hand else puts "----" puts "D: " + showing_card.to_s puts "P: " + hand.to_s puts "Invalid Move! " + move end end end while @dealerHand.hand_value < 17 @deck.deal @dealerHand end #puts "d " + @dealerHand.to_s cycle_through_hands do |player, hand| if @dealerHand.bust? or hand.hand_value > @dealerHand.hand_value player.win elsif hand.hand_value < @dealerHand.hand_value player.lose else player.push end @deck.reclaim_cards hand end clean_round true end private def cycle_through_hands @players.each do |player| player.turn do |hand| if !hand.over? then yield( player, hand ) end end end end def clean_round if @verbose then puts "D: " + @dealerHand.to_s end @deck.reclaim_cards @dealerHand @dealerHand.clear true end end