编程技巧:如何创建一个简单的卡牌游戏

我正在学习 Ruby 语言,并且越来越接近实际编程。我正在考虑创建一个简单的卡牌游戏。我的问题不是面向 Ruby 的,但我确实想学习如何用真正的 OOP 方法解决这个问题。在我的卡牌游戏中,我希望有四个玩家,使用一副标准的 52 张牌,没有大小王/鬼牌。在游戏中,我不会将 A 用作双重牌,它始终是最大的牌。

所以,我想知道的编程问题如下:

  1. 如何排序/随机化一副牌?有四种花色,每种花色有 13 个数值。最终只能有唯一的值,因此选择随机值可能会生成重复项。

  2. 如何实现一个简单的 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

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注