【问题标题】:Creating a Blackjack Game in Python用 Python 创建二十一点游戏
【发布时间】:2017-08-10 20:00:00
【问题描述】:

我是编程新手,我加入这里是为了提问、贡献(当我掌握了更多知识时),并且基本上只是学习并弄清楚编程是否适合我。

我目前正在通过 Udemy 的课程学习 Python,并且我正在开发一个里程碑项目以创建二十一点游戏。唯一的规则是我使用面向对象编程并为卡片和甲板之类的东西创建类。

我看过一些关于 OOP 的教程,但我仍然没有信心实现它们,所以我希望我可以分享我所写的内容,并希望通过这里的交互有更好的理解。

首先,我制定了一个计划,将项目分解为更小的任务,因为这对我来说太难了。这是我的计划:

  1. 用 52 张牌创建一副牌

  2. 为每张牌分配数值(Ace 可以是 1 或 11)

  3. 洗牌

  4. 庄家和闲家每人拿到 2 张牌作为开始

  5. 询问玩家是想击打还是站立

  6. 庄家必须打到17点

  7. 比较“点数”,看看谁拥有更多

  8. 任何时候,如果有人超过 21 岁,那人就输了

我目前正试图弄清楚第一部分。我基本上是在尝试使用 OOP 和 for 循环创建一个包含所有 52 张卡片的列表,但我似乎无法正确处理。

我在下面分享我用 Python 2 编写的代码。有什么想法可以继续吗?

谢谢, 保罗

编辑 #1:感谢大家的 cmets 和反馈。我想我现在离我越来越近了。有人可以告诉我我这样做是否正确,以及如何打印我用来创建套牌的列表,以便我能够看到列表中的 52 张卡片中的每一张吗?我尝试使用 str 方法,但似乎我做错了。

import random

rank = [2,3,4,5,6,7,8,9,10,'Jack','Queen','King','Ace']
suit = ['Diamonds','Clubs','Hearts','Spade']

class Card(object):

    def __init__(self,rank,suit):
        self.rank = rank
        self.suit = suit

    def __str__(self):
        return self.suit + self.rank

    def grab_suit(self):
        return self.suit

    def grab_rank(self):
        return self.rank

    def draw(self):
        print (self.suit + self.rank)

class Deck(object):
    def __init__(self):
        self.cards = []    
        for i in rank:
            for j in suit:
                self.cards.append(Card(i,j))

    def __str__(self):
        return self.cards()

【问题讨论】:

  • python有指针吗?
  • 我认为他的意思是建议中的指针......
  • 不需要从对象显式派生 Card,改为class Card()。 new 通过调用 Card 像一个带参数的函数(除了 self)来创建一张卡片,所以将 self.deck.append(Card) 更改为 self.deck.append(Card(i,j))
  • self.deck = self 不要那样做……反正没意义,因为你马上就做self.deck = []。
  • @juanpa.arrivillaga 感谢您的更正。 :)

标签: python


【解决方案1】:

通常在这里,人们喜欢你提出一个具体的问题,而不是“给我一些指示”,所以要准备好抱怨这个问题太宽泛了。也就是说,我会给你一些建议。

你已经在任何类之外定义了西装和排名数组(你也把它们的名字颠倒了,但无论如何)。那不是面向对象的。我会把它们放在 Deck 类中,因为那是它们被使用的地方。可以这样想:每张卡不需要知道所有可能的等级和花色,它只需要在它所属的牌组创建时知道自己的等级和花色。

我不确定self.deck = self 发生了什么。你想在那里做什么?在下一行你有self.deck = [],你将用卡片对象填充它。这听起来不错,但是,将局部变量命名为与其所属类的名称相同的名称并不是一个好主意。这会让人感到困惑。我建议称它为cards,因为它将是一个充满牌组的数组。你的循环看起来不错,但就在这里: self.deck.append(Card) 您没有正确创建卡片。该卡需要知道您要分配给该特定卡的等级和花色。我会让你自己研究如何做到这一点。祝你好运:)

【讨论】:

  • 呃,我不太同意使用模块级常量来包含 suits 和 ranks 是“不是 OOP”。通常,无论如何,您会使用enums 来表示“西装”和“等级”,因为它们有点像canoncial example of enums。对于这个任务来说,这并不是真正必要的,其中包含 suit 和 rank 信息的全局列表似乎很好。此外,这是一个挑剔的问题,但这些不是数组而是列表。
  • 对我来说,这不是一个好主意,因为它将 Card 和 Deck 类绑定在一起。假设您想添加一个塔罗牌,并重复使用您的卡片对象。数组与列表的好调用,我最近写的 JS 比 Python 还多!
  • 但如果suit 和rank 在模块级命名空间或Deck 命名空间中,这不会改变。
  • 所以如果你添加了塔罗牌,你会推荐把suit=[swords, wands, coins, cups]放在哪里?
  • 再次,模块级:tarot_suits = ['swords', ...] 但您可以也在Deck 类中引用它。我的主要观点是模块级常量是可以的,只要它们实际上被用作常量。在这种情况下,我可能只会使用enums,就像我在那个链接中展示的那样,我实现了Card 和Deck 类。我也会有一个 TarotSuit 枚举。
猜你喜欢
  • 1970-01-01
  • 2012-07-27
  • 2012-06-29
  • 2023-03-21
  • 2020-05-18
  • 2014-10-22
  • 2022-11-12
  • 1970-01-01
  • 2012-10-16
相关资源
最近更新 更多