0

我的问题是它chips没有保存为传递的参数的全局变量。我正在通过$h1c (这是玩家第一手拥有的总筹码数)。因此,如果他赢或输,chips则应设置为等于chips +- betamount

问题是它没有被保存为全局变量。如果我要写$h1c = 150_000,那就等于那个。如果稍后我写$h1c = 150_000 + 50_000,那么 200_000 将是 $h1c 的新值。

由于某种原因,当我声明时这不起作用chips = chips + betamount,这与说相同$h1c = $h1c + $h1bet

def review(hand, chips, betamount)  
  abc = valueofcards(hand)   #player's hand value
  klm = valueofcards($handD)  #dealer's hand value
    if abc == klm and abc < 19
      puts "You tied"
      chips = chips
    elsif abc > 18
      puts "You lost"
      chips = chips - betamount
    elsif abc < 19 and klm > 18
      puts "You won"
      chips = chips + betamount
    elsif abc < 19 and abc > klm
      puts "You won"
      chips = chips + betamount
    elsif abc < 19 and klm < 19 and klm > abc
      puts "You lost"
      chips = chips - betamount
    end
end

这是我通过参数进行审查的地方:

def pre_review(num)
  puts "Recap of that round"
  puts "First Hand:"
  review($hand1, $h1c, $h1bet)
  muckcards(num)
end

如果需要,这里是完整代码/游戏的链接以测试问题http://labs.codecademy.com/Bmvl#:workspace 注意:我目前只是想让这部分工作以 $ hand1,因此您将选择 1 作为要玩的手数来重现此问题。

4

3 回答 3

1

Ruby 是一种按值传递的语言,而不是按引用传递的语言。因此,您不能重新分配传递给该方法内部方法的变量的值。查看关于评估策略的维基百科文章,了解有关变量传递的不同方法的信息。

Ruby 是按值传递的事实有点复杂 b/c Ruby 实际上按值传递对对象的引用。因此,您可以例如修改方法内的哈希内容,并将这些更改反映在外部变量中。Java 也通过值传递引用,我一直很喜欢这篇关于它的文章,您可能会发现它很有用。

于 2013-12-20T19:06:30.470 回答
1

当你这样做时:

review($hand1, $h1c, $h1bet)

这不会将全局变量$h1c本身传递给方法,而是传递(引用)它的

在该review方法中,传递的值被赋予名称chips,该名称是该方法的本地名称。当您分配给 时chips,您只是更新名称chips以引用不同的值。

要获得您想要的行为,您需要直接分配 to$h1c而不是 to chips。(或者,更好的编程实践,您可以从方法返回值,chips而不是使用全局变量。)

于 2013-12-20T19:08:33.590 回答
1

这是不一样的。带前缀的$变量是全局的,而无前缀的变量是局部的。因此,当您更改 的值时,您正在更改您在程序中其他地方引用$h1c的同一变量的值。$h1c但是,当您更改 的值时chips,您只是在方法chips的上下文中更改 的值review。一旦该方法返回, 的值chips就会丢失。

因此,最简单的解决方案是甚至不费心将参数传递给该方法,而是让它直接读取全局变量的值。尽管就风格而言,这可能不是最好的解决方案。事实上,通常使用全局变量被认为是不好的做法。

另一种解决方案是从 review 方法中返回玩家筹码的新值,如下所示:

def review(hand, chips, betamount)  
  abc = valueofcards(hand)   #player's hand value
  klm = valueofcards($handD)  #dealer's hand value
    if abc == klm and abc < 19
      puts "You tied"
      chips = chips
    elsif abc > 18
      puts "You lost"
      chips = chips - betamount
    elsif abc < 19 and klm > 18
      puts "You won"
      chips = chips + betamount
    elsif abc < 19 and abc > klm
      puts "You won"
      chips = chips + betamount
    elsif abc < 19 and klm < 19 and klm > abc
      puts "You lost"
      chips = chips - betamount
    end
    return chips # See here
end

然后,从方法外设置玩家筹码的值:

def pre_review(num)
  puts "Recap of that round"
  puts "First Hand:"
  $h1c = review($hand1, $h1c, $h1bet) # Like this
  muckcards(num)
end

就代码质量和编程风格而言,可能还有很多工作可以修复该程序,但我现在不会深入讨论。保持学习!;-)

于 2013-12-20T19:10:38.860 回答