2012-06-07 40 views
1

有人可以幫我弄清楚爲什麼我會得到以下錯誤:78- $ player_total = $ player_cards.inject(:+)Ruby-間歇性錯誤w/nil不能強制轉換爲Fixnum(TypeError)

我還用線:15片! - 但似乎已停止?

錯誤如何間斷?

無關的問題:如何將行號添加到在stackoverflow的帖子?

bjtrial.rb:78:在每個+': nil can't be coerced into Fixnum (TypeError) from bjtrial.rb:78:in ' 從bjtrial.rb:78:在start_trial inject' from bjtrial.rb:78:in塊' 從bjtrial.rb :76:在each' from bjtrial.rb:76:in start_trial」 從bjtrial.rb:90:在` 「

@paradise:紅寶石-v 紅寶石1.9.3p194(2012-04-20修訂35410)x86_64的-darwin11.3.0]

#blackjack trial player hits 10-7 once vs. 11, 2 
$deck = (((2..11).to_a+[10]*3)*4) 
$rand= rand($deck.length) 
$dealer_win = 0 
$player_win = 0 
$tie = 0 

$p1 = 10 #players cards 
$p2 = 7 

$d1 = 11 #dealers cards 
$d2 = 2 

#deal & remove dealt cards deck 
$dealer_cards = Array([$deck.slice!($deck.index($d1)),$deck.slice!($deck.index($d2))]) 
$player_cards = Array([$deck.slice!($deck.index($p1)),$deck.slice!($deck.index($p2))]) 

$trials = 2 
$dealer_win = 0 
$playerWin = 0 

def hit_card 
    #remove hit card from the deck 
    $hit_card = $deck.slice!($rand) 
    $hit_card 
end 

def show_dealer_cards 
    total = $dealer_cards.inject(:+) 
    puts 
    puts "Dealer's cards are: #{$dealer_cards.inspect}" 
    puts "Dealer's total is: #{$dealer_cards.inject(:+)}" 
    sleep 1 
    def check_dealer_total 
     total = $dealer_cards.inject(:+) 

     if total > 21 && $dealer_cards.count(11) < 1 
      puts "Dealer Busted- Player wins!" 
      $player_win += 1 
     elsif total > 21 && $dealer_cards.count(11) >= 1 
      puts "Over 21- with an ace to factor:" 
      $dealer_cards[$dealer_cards.index(11)] -= 10 
      puts "Now the dealer has:" 
      show_dealer_cards 
     elsif total <= 16 || total == 17 && $dealer_cards.count(11) == 1 
      hit_card 
      puts "Dealer draws a:#{$hit_card}" 
      $dealer_cards.push($hit_card) 
      show_dealer_cards 
     else 
      player_total = $player_cards.inject(:+) 
      dealer_total = $dealer_cards.inject(:+) 

      puts "Results:" 
      puts "Player has #{player_total}" 
      puts "Dealer has #{dealer_total}" 

      if player_total < dealer_total 
       puts "Dealer Wins!" 
       $dealer_win += 1 
      elsif player_total == dealer_total 
       puts "It's a tie! Nobody Wins" 
       $tie += 1 
      else 
       puts "Player Wins!" 
       $player_win += 1 
      end 

     end 
    end 
    check_dealer_total 
end 

def start_trial 

    for i in (1..$trials).to_a 
     $player_cards.push(hit_card) #player hits once and stays or busts 
     $player_total = $player_cards.inject(:+) #this is line 78 

     if $player_total > 21 
      puts "Player Busted" 
      $dealer_win += 1 
     else 
     show_dealer_cards 
     end 

    end 
end 

start_trial 

puts 
puts "Player Cards: #{$p1}, #{$p2} (alwalys hits once)" 
puts "Dealers Cards: #{$d1}, #{$d2} (plays normally)" 
puts "Number of trials: #{$trials}" 
puts "Ties: #{$tie}" 
puts "Player Wins: #{$player_win}" 
puts "Dealer Wins: #{$dealer_win}" 

我不得不把$蘭特移入hit_card功能因爲它會間歇性地指向一個零值e數組。

它運行 - 我認爲它的準確..不要賭你的房子在維加斯它只是尚未。 LOL

並感謝另一個提示:全局變量。我沒有那麼遠,可是...

#blackjack trial player hits 10-7 once vs. 11, x 
$dealer_win = 0.0 
$player_win = 0.0 
$tie = 0.0 

$trials = 500000 
#Hit Once to hit... 
$strategy = "Hit Once" 

def hit_card 
    $rand= rand($deck.length) 
    #remove hit card from the deck 
    $hit_card = $deck.slice!($rand) 
    $hit_card 
end 

def show_dealer_cards 
    total = $dealer_cards.inject(:+) 
    #puts 
    #puts "Dealer's cards are: #{$dealer_cards.inspect}" 
    #puts "Dealer's total is: #{$dealer_cards.inject(:+)}" 
    #sleep 1 
    def check_dealer_total 
     total = $dealer_cards.inject(:+) 

     if total > 21 && $dealer_cards.count(11) < 1 
      #puts "Dealer Busted- Player wins!" 
      $player_win += 1.0 
     elsif total > 21 && $dealer_cards.count(11) >= 1 
      #puts "Over 21- with an ace to factor:" 
      $dealer_cards[$dealer_cards.index(11)] -= 10 
      #puts "Now the dealer has:" 
      show_dealer_cards 
     elsif total <= 16 || total == 17 && $dealer_cards.count(11) == 1 
      hit_card 
      #puts "Dealer draws a:#{$hit_card}" 
      $dealer_cards.push($hit_card) 
      show_dealer_cards 
     else 
      player_total = $player_cards.inject(:+) 
      dealer_total = $dealer_cards.inject(:+) 

      #puts "Results:" 
      #puts "Player has #{player_total}" 
      #puts "Dealer has #{dealer_total}" 

      if player_total < dealer_total 
       #puts "Dealer Wins!" 
       $dealer_win += 1.0 
      elsif player_total == dealer_total 
       #puts "It's a tie! Nobody Wins" 
       $tie += 1.0 
      else 
       #puts "Player Wins!" 
       $player_win += 1.0 
      end 

     end 
    end 
    check_dealer_total 
end 

def start_trial 

    for i in (1..$trials).to_a 

     $deck = (((2..11).to_a+[10]*3)*4).shuffle 

     $p1 = 10 #players cards 
     $p2 = 7 

     $d1 = 11 #dealers cards 
     $d2 = hit_card #just a random card 

     #deal & remove dealt cards deck 
     $dealer_cards = Array([$deck.slice!($deck.index($d1)),$deck.slice!($deck.index($d2))]) 
     $player_cards = Array([$deck.slice!($deck.index($p1)),$deck.slice!($deck.index($p2))]) 

     if $strategy == "Hit Once" 
      $player_cards.push(hit_card) #player hits once and stays or busts 
     else 
      $strategy = "Stand" 
     end 

     $player_total = $player_cards.inject(:+) #this is line 78 

     if $player_total > 21 
      #puts "Player Busted" 
      $dealer_win += 1.0 
     else 
     show_dealer_cards 
     end 

    end 
end 

start_trial 

puts 
puts '*' * 80 
puts "Player Cards: #{$p1}, #{$p2}" 
puts "Strategy: #{$strategy}" 
puts "Dealers Cards: #{$d1}, x" 
puts "Number of trials: #{$trials}" 
puts "Ties: #{$tie}" 
puts "Player Wins: #{$player_win}" 
puts "Dealer Wins: #{$dealer_win}" 
puts "Win Percentage: %.2f" % (($player_win/$trials) * 100) 
puts "Loss Percentage: %.2f" % (($dealer_win/$trials) * 100) 
puts "Tie Percentage: %.2f" % (($tie/$trials) * 100) 
puts '*' * 80 
+2

你在'$ player_cards'裏有'nil'。檢查數組包含的內容,並跟蹤放置的位置。此外,與您的問題無關,您使用的方式太多全局變量;這不是PHP,所以請使用'$'來調用。最好是不存在的,如果可以的話。 – Amadan

回答

0

我發現在你的程序完全不同的問題:

def start_trial 

    for i in (1..$trials).to_a 
     $player_cards.push(hit_card) #player hits once and stays or busts 
     $player_total = $player_cards.inject(:+) #this is line 78 

     if $player_total > 21 
      puts "Player Busted" 
      $dealer_win += 1 
     else 
     show_dealer_cards 
     end 

    end 
end 

尤爾運行試驗兩次,而無需重新初始化玩家甲板。所以玩家手變成[10, 7, 8, 9]。如果你進行50次試驗,你將用完卡片。

您是否僅運行start_trial兩次並獲取錯誤?

這裏是我的實際運行代碼的結果:

load './bj.rb' 
Player Busted 
Player Busted 

Player Cards: 10, 7 (alwalys hits once) 
Dealers Cards: 11, 2 (plays normally) 
Number of trials: 2 
Ties: 0 
Player Wins: 0 
Dealer Wins: 2 
=> true 

但是,如果我改變$trials = 100,然後我得到了同樣的錯誤:

load './bj.rb' 
Player Busted 
TypeError: nil can't be coerced into Fixnum 
    from /rails/Stack/bj.rb:78:in `+' 

我希望這有助於。

祝你好運!

+0

好的。感謝您的幫助。在閱讀你的幫助後,我認爲「重新初始化玩家套牌」意味着將套牌/手牌分配到for循環 - 然後每次都會重置,對吧?我這樣做,但仍然看到相同的錯誤。我沒有看到players_cards數組越來越多,但是我添加了對帖子的更改。也許我誤解重新初始化? – user1441236

+0

好的,我發現我的錯誤。你對初始化錯誤是正確的。我曾試圖解決這個問題 - 它需要在for循環中。然而,我的間歇性錯誤的原因是從$甲板$蘭特。長度過早初始化並最終匹配hit_card。將它移入hit_card函數解決了這個問題。謝謝你的幫助。 – user1441236

+0

您可以請upvote並接受答案。另外,我希望看到更新的代碼。請將您的問題或答案的底部作爲最終工作代碼發佈。祝你好運! – Anil

相關問題