我的问题是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来播放手数来重现此问题。
答案 0 :(得分:1)
Ruby是一种按值传递的语言,而不是传递引用。因此,您无法重新分配传递给该方法内的方法的变量的值。查看关于evaluation strategy的维基百科文章,了解有关变量传递的不同方法的信息。
Ruby是按值传递的事实稍微复杂b / c Ruby实际上是按值传递对象的引用。因此,您可以修改方法内部哈希的内容,并将这些更改反映在外部变量中。 Java也按值传递引用,我总是喜欢this关于它的文章,你可能会觉得它很有用。
答案 1 :(得分:1)
执行此操作时:
review($hand1, $h1c, $h1bet)
这不会将全局变量$h1c
本身传递给方法,而是传递(引用)其值。
在review
方法中,传递的值名为chips
,该方法是本地方法的本地名称。当您分配到chips
时,您只需更新名称chips
以引用其他值。
要获得所需的行为,您需要直接分配到$h1c
而不是chips
。 (或者,更好的编程实践,您可以从方法返回chips
的值,而不是使用全局变量。)
答案 2 :(得分:1)
它不一样。前缀为$
的变量是全局变量,而无前缀变量是本地变量。因此,当您更改$h1c
的值时,您将更改在程序中其他位置引用的相同$h1c
变量的值。但是,当您更改chips
的值时,您只需在chips
方法的上下文中更改review
的值。只要该方法返回,chips
的值就会丢失。
所以最简单的解决方案就是不要将参数传递给该方法,只是让它直接读取全局变量的值。就风格而言,这可能不是最好的解决方案。实际上,通常使用全局变量被认为是不好的做法。
另一个解决方案是从评论方法中返回玩家筹码的新值,如下所示:
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
在代码质量和编程风格方面可能还有很多工作可以用来修复该程序,但我现在还没有进入这个目标。保持学习! ; - )