2013-12-20 92 views
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来玩这个问题的手数。

+0

Ruby 1.8.7已经退役。可能是升级的时间... https://www.ruby-lang.org/zh/news/2013/06/30/we-retire-1-8-7/ –

回答

1

这不一样。以$为前缀的变量是全局变量,而前缀变量是局部变量。因此,当您更改$h1c的值时,您正在更改您在程序中其他地方引用的相同$h1c变量的值。但是,如果更改chips的值,则只会在review方法的上下文内更改chips的值。只要该方法返回,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 

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

根据代码质量和编程风格,修复该程序可能还有很多工作要做,但我现在还不能接受。保持学习! ;-)

1

Ruby是一种传值语言,不通过引用。因此,您不能重新分配传递给该方法内的方法的变量的值。查看关于evaluation strategy的维基百科文章,了解变量传递的不同方法。

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

1

当你这样做:

review($hand1, $h1c, $h1bet) 

这并不全局变量$h1c本身传递给方法,它传递(一个参考)其

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

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