我正在学习 Ruby 语言,并且越来越接近实际编程。我正在考虑创建一个简单的卡牌游戏。我的问题不是面向 Ruby 的,但我确实想学习如何用真正的 OOP 方法解决这个问题。在我的卡牌游戏中,我希望有四个玩家,使用一副标准的 52 张牌,没有大小王/鬼牌。在游戏中,我不会将 A 用作双重牌,它始终是最大的牌。
所以,我想知道的编程问题如下:
-
如何排序/随机化一副牌?有四种花色,每种花色有 13 个数值。最终只能有唯一的值,因此选择随机值可能会生成重复项。
-
如何实现一个简单的 AI?由于有很多卡牌游戏,所以应该已经有人弄清楚了这部分,所以如果有参考资料就太好了。
我是一个真正的 Ruby 新手,我的目标是学习解决问题,所以伪代码会很棒,只是为了理解如何以编程方式解决问题。如果我的语法和写作风格不清楚,我深表歉意,因为它不是我的母语。
此外,指向解释这些挑战的网站的链接将是一个很好的资源!
感谢您的评论、答案和反馈!
回答:
一些入门提示
通过使用从 0 到 51 的数字,您可以非常容易地确保获得唯一的卡牌。
Array#shuffle
方法基于 Knuth-Fisher-Yates 洗牌算法。 http://en.wikipedia.org/wiki/Fisher–Yates_shuffle
class Card RANKS = %w(2 3 4 5 6 7 8 9 10 J Q K A) SUITS = %w(Spade Heart Club Diamond) attr_accessor :rank, :suit def initialize(id) self.rank = RANKS[id % 13] self.suit = SUITS[id % 4] endendclass Deck attr_accessor :cards def initialize # shuffle array and init each Card self.cards = (0..51).to_a.shuffle.collect { |id| Card.new(id) } endend# people with Ruby 1.9 (or 1.8.7 with backports) can safely ignore this duck punchclass Array # knuth-fisher-yates shuffle algorithm def shuffle! n = length for i in 0...n r = rand(n-i)+i self[r], self[i] = self[i], self[r] end self end def shuffle dup.shuffle! endend
测试
d = Deck.newd.cards.each do |card| puts "#{card.rank} #{card.suit}"end
输出
6 Spade5 Heart2 Heart8 Heart8 Diamond7 ClubJ Diamond4 ClubK Spade5 DiamondJ Heart8 Spade10 Club4 Diamond9 Heart7 Diamond3 DiamondK Diamond7 SpadeQ Diamond9 Diamond6 HeartA Heart9 ClubA Spade5 ClubJ ClubQ Spade2 Club2 SpadeQ HeartA Diamond10 Spade10 DiamondQ Club3 ClubA ClubK Club6 Club10 Heart2 Diamond3 SpadeK Heart5 Spade9 Spade7 Heart4 SpadeJ Spade3 Heart4 Heart8 Club6 Diamond