编程技巧:如何创建简单的纸牌游戏
问题内容:
当我学习Ruby语言时,我越来越接近实际编程。我当时正在考虑创建一个简单的纸牌游戏。我的问题不是面向Ruby的,但我确实想学习如何使用真正的OOP方法解决此问题。在我的纸牌游戏中,我希望有四个玩家,使用标准的52张卡片组,没有小丑/通配符。在游戏中,我不会将ace用作双卡,它始终是最高的卡。
因此,我想知道的编程问题如下:
-
如何对卡片组进行排序/随机化?有四种类型,每种都有13个值。最终只能有唯一的值,因此选择随机值可能会生成重复项。
-
如何实现简单的AI?由于有大量的纸牌游戏,所以有人会已经弄清楚了这部分内容,因此参考文献会很棒。
我是一个真正的Ruby
nuby,我的目标是学习解决问题,所以伪代码很棒,只是了解如何以编程方式解决问题。如果不清楚语法和写作风格,我深表歉意,因为它不是我的母语。
此外,指向可以解释此类挑战的站点的指针将是一个很好的资源!
感谢您的评论,回答和反馈!
问题答案:
可以帮助您入门的东西
您可以使用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]
end
end
class Deck
attr_accessor :cards
def initialize
# shuffle array and init each Card
self.cards = (0..51).to_a.shuffle.collect { |id| Card.new(id) }
end
end
# people with Ruby 1.9 (or 1.8.7 with backports) can safely ignore this duck punch
class 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!
end
end
测试
d = Deck.new
d.cards.each do |card|
puts "#{card.rank} #{card.suit}"
end
输出
6 Spade
5 Heart
2 Heart
8 Heart
8 Diamond
7 Club
J Diamond
4 Club
K Spade
5 Diamond
J Heart
8 Spade
10 Club
4 Diamond
9 Heart
7 Diamond
3 Diamond
K Diamond
7 Spade
Q Diamond
9 Diamond
6 Heart
A Heart
9 Club
A Spade
5 Club
J Club
Q Spade
2 Club
2 Spade
Q Heart
A Diamond
10 Spade
10 Diamond
Q Club
3 Club
A Club
K Club
6 Club
10 Heart
2 Diamond
3 Spade
K Heart
5 Spade
9 Spade
7 Heart
4 Spade
J Spade
3 Heart
4 Heart
8 Club
6 Diamond