【问题标题】:I'm trying to make a card game. How would I make a deck of cards and then deal them?我正在尝试制作纸牌游戏。我将如何制作一副牌然后发牌?
【发布时间】:2017-01-23 01:17:48
【问题描述】:

我正在制作一个纸牌游戏,我首先将所有纸牌放在一个分配有数字 1-52 的元组数组中。但是通过使用随机数生成器来挑选卡片,从牌组中移除卡片变得很困难,因为我无法从我的随机数生成器中专门移除该数字。任何帮助表示赞赏。

 func createDeck(){

    deck.append((name: "ace1", number: 1))
    deck.append((name: "ace2", number: 2))
    deck.append((name: "ace3", number: 3))
    deck.append((name: "ace4", number: 4))
    deck.append((name: "two1", number: 5))
    deck.append((name: "two2", number: 6))
    deck.append((name: "two3", number: 7))
    deck.append((name: "two4", number: 8))
    deck.append((name: "three1", number: 9))
    deck.append((name: "three2", number: 10))
    deck.append((name: "three3", number: 11))
    deck.append((name: "three4", number: 12))
    deck.append((name: "four1", number: 13))
    deck.append((name: "four2", number: 14))
    deck.append((name: "four3", number: 15))
    deck.append((name: "four4", number: 16))
    deck.append((name: "five1", number: 17))
    deck.append((name: "five2", number: 18))
    deck.append((name: "five3", number: 19))
    deck.append((name: "five4", number: 20))
    deck.append((name: "six1", number: 21))
    deck.append((name: "six2", number: 22))
    deck.append((name: "six3", number: 23))
    deck.append((name: "six4", number: 24))
    deck.append((name: "seven1", number: 25))
    deck.append((name: "seven2", number: 26))
    deck.append((name: "seven3", number: 27))
    deck.append((name: "seven4", number: 28))
    deck.append((name: "eight1", number: 29))
    deck.append((name: "eight2", number: 30))
    deck.append((name: "eight3", number: 31))
    deck.append((name: "eight4", number: 32))
    deck.append((name: "nine1", number: 33))
    deck.append((name: "nine2", number: 34))
    deck.append((name: "nine3", number: 35))
    deck.append((name: "nine4", number: 36))
    deck.append((name: "ten1", number: 37))
    deck.append((name: "ten2", number: 38))
    deck.append((name: "ten3", number: 39))
    deck.append((name: "ten4", number: 40))
    deck.append((name: "jack1", number: 41))
    deck.append((name: "jack2", number: 42))
    deck.append((name: "jack3", number: 43))
    deck.append((name: "jack4", number: 44))
    deck.append((name: "queen1", number: 45))
    deck.append((name: "queen2", number: 46))
    deck.append((name: "queen3", number: 47))
    deck.append((name: "queen4", number: 48))
    deck.append((name: "king1", number: 49))
    deck.append((name: "king2", number: 50))
    deck.append((name: "king3", number: 51))
    deck.append((name: "king4", number: 52))


}
func randomNumber(){
    random = arc4random_uniform(52) + 0;
    print(random)
}
func deal(){

    var aces = Set<Int>(arrayLiteral:1, 2, 3,4)
    var twos = Set<Int>(arrayLiteral:5, 6, 7,8)
    var threes = Set<Int>(arrayLiteral:9, 10, 11,12)
    var fours = Set<Int>(arrayLiteral:13, 14, 15,16)
    var fives = Set<Int>(arrayLiteral:17, 18,19,20)
    var sixes = Set<Int>(arrayLiteral:21, 22, 23,24)
    var sevens = Set<Int>(arrayLiteral:25, 26, 27,28)
    var eights = Set<Int>(arrayLiteral:29, 30, 31,32)
    var nines = Set<Int>(arrayLiteral:33, 34, 35,36)
    var tens = Set<Int>(arrayLiteral:37, 38, 39,40)
    var jacks = Set<Int>(arrayLiteral:41, 42, 43,44)
    var queens = Set<Int>(arrayLiteral:45, 46, 47,48)
    var kings = Set<Int>(arrayLiteral:49, 50, 51,52)



    if aces.contains(Int(random)){
        playern1 = Int(random)
        aces.removeFirst()
    }
    if twos.contains(Int(random)){
        twos.removeFirst()

...

【问题讨论】:

  • 它是如何“变得困难”的? 挑选移除一张牌与制作一副牌有什么关系?展示你的代码并解释你想要什么以及实际发生了什么。
  • 好的,你去吧
  • 你在开玩笑吗?关于什么的建议?你没有按照我的要求去做。你没有解释你想要什么以及实际发生了什么。相信我,看着你提供的代码,我知道你想做什么。提示我。
  • 您创建了一个deck,但您从不使用它。你定义了randomNumber,你从不调用它。你的代码没有任何事情!
  • 不管其他什么,你都应该了解数组,没有理由要进行 50 次 append 调用。

标签: arrays swift tuples


【解决方案1】:

您可能想要重新设计您定义卡片的方式:

enum Suit: String {
    case heart, diamond, club, spade
}
enum Rank: Int {
    case _1 = 1, _2 = 2, _3 = 3, _4 = 4, _5 = 5, _6 = 6, _7 = 7, _8 = 8, _9 = 9, _10 = 10
    case jack = 11, queen = 12, king = 13
}
struct Card {
    let suit: Suit
    let rank: Rank
}

(或者替代方案可以是enum Card {case card(suit: Suit, rank: Rank)}

然后定义你的牌组:

var deck = [Card(suit: .heart, rank: ._1),
            Card(suit: .heart, rank: ._2),
            Card(suit: .heart, rank: ._3),
            Card(suit: .heart, rank: ._4),
            Card(suit: .heart, rank: ._5),
            Card(suit: .heart, rank: ._6),
            // ...
]

然后从一副牌中挑选一张牌:

func pickRandomCardFromDeck() -> Card {
    return deck.remove(at: Int(arc4random_uniform(UInt32(deck.count))))
}

[编辑评论]

检查一对:

extension Card {
    func isPair(with card: Card) -> Bool {
        return rank == card.rank
    }
}

【讨论】:

  • 我怎样才能使用我选择的卡。例如,如果我想判断是否有两张牌的对子?
  • 我在答案中添加了对检查。 @约翰德
【解决方案2】:

维护一组仍然可用且尚未选择的卡片。出于本次讨论的目的,我将其称为“deal 数组”(这必须与 deck 数组分开维护!它可以作为 deck 数组的可变副本开始。)。

当您随机挑选/发牌时,将其从发牌数组中移除

您的随机数生成器应该在零和交易数组中剩余的项目数之间选择一个数字 - 而不是在零到五十二之间。

(假设发牌数组不为空 - 在从发牌数组中随机选择一张牌之前检查此项。)

当从发牌数组中选择一张牌时,使用随机数作为数组的索引(而不是您创建的牌号,这对于从中挑选牌没有任何实际用途交易数组随机)。

(请注意,我没有在此处包含任何示例代码,因为我不清楚您的某些代码的目的是什么。如果我试图在此处发布代码,我可能会误解您的代码因此发布不正确的代码)。

【讨论】:

    猜你喜欢
    • 2020-09-30
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2023-03-16
    • 1970-01-01
    • 2016-01-13
    相关资源
    最近更新 更多