【问题标题】:Beginner BlackJack Game [closed]初学者二十一点游戏[关闭]
【发布时间】:2012-07-13 20:16:37
【问题描述】:

我目前正在将语言从 Java(初学者)切换到 C++,并想复制我用 Java 制作的 BlackJack 游戏,但在使用代码块在 C++ 中进行设置时遇到困难。

代码设计:

  • 等级和花色的枚举。

  • 等级和花色的 52 种变体一起形成 52 个卡片对象

  • 将对象存储在向量中

  • 随机化向量

  • 从向量中弹出两张牌给玩家

  • 向庄家弹出一张牌

  • 当闲家或庄家发牌时,计算取回的牌,值 += 到 int player/dealerValue;

我不知道如何实现这一目标:

Deck.cpp:

     for(Suit suit: Suit.values()) {
        for (Rank rank : Rank.values()) {   
           add(new Card(rank, suit));   
        }
    }
     createDeck()
     shuffleDeck()
     dealUser()
     dealerDealer()

播放器.cpp

     userVector
     dealerVector
     getUserVector()
     getDealerVector()
     addCardUser()
     addCardDealer()
     calcUserValue()
     calcDealerValue()

卡片.cpp

     card(Rank rank, Suit suit) { }
     getSuit()
     getRank()

黑杰克.cpp

    call deck constructor
    Player user  =  new Player()
    Player dealer = new Player()

---游戏代码---

有人可以介绍或指导我一些好的资源吗:

  • 管理头文件

  • 我需要的一些方法的简要骨架代码块

  • 但最重要的是,我是否需要在这个程序中使用指针?我现在只能访问在线 YouTube 教程几天了,而我的 c++ 书籍到了,并且对任何类型的内存管理都没有信心。

  • 任何关于这个程序的通用 c++ 技巧都会很棒。

非常感谢您花时间和耐心阅读本文。

【问题讨论】:

  • 这写的有点太宽泛了。如果您想一次问一个特定的问题,我们很乐意提供帮助,前提是该问题不是开放式的并且可以有一个正确的答案。

标签: c++ blackjack


【解决方案1】:

解决您的问题:

管理头文件

不要打扰。只需将所有内容都放在一个源文件中(与 Java 不同,您完全可以在 C++ 中执行此操作)。如果您愿意,也许稍后您可以将其分解为多个源文件。

方法的骨架代码块

如果您已经获得了用 Java 编写的代码,那么这就是您的骨架块。

我必须使用指针吗?

可能不会。但是,如果您只是想开始使用看起来像您的 Java 代码的程序,您总是可以简单地忽略手动内存管理,调用new,而不必担心delete。你会到处都有内存泄漏,但一次只有一件事,对吧?

典型的“现代”C++ 风格几乎完全避免使用原始指针。您可以稍后再处理。

【讨论】:

  • 谢谢,我不知道将所有内容放在一个文件中是可以接受的。我需要阅读哪些资源以避免内存泄漏?我想尝试避免不良的编码习惯(新的等)。在这个程序的上下文中,我将在哪里使用指针?最后,枚举在 C++ 中的使用方式不同吗?您是否有机会发布如何从 Rank 枚举和 Suit 枚举生成 52 张卡片?我有 Java 代码,但不知道如何翻译。再次感谢,不胜感激。
  • 使用new 本身并不是一个“不良编码习惯”。动态内存分配是大多数现代编程系统不可或缺的一部分。我不知道您可能想在哪里使用指针,但您几乎可以通过在 Java 中使用引用的任何位置使用指针将 Java 代码转换为 C++。这取决于您的目标是什么——您是想简单地开始用 C++ 编写代码,还是想放弃您对 Java 的了解并重新开始使用 C++? (我建议让一些东西运行起来,这样你就可以玩它了。)
  • 以下是将 Java 代码转换为 C++ 的方法:Player user = new Player() -> Player *user = new Player(); user.method() -> user->method()。你可以走得很远。
  • 很遗憾,我不知道您在学习 Java 时遇到了什么“问题”,因此我很难提供避免该问题的建议。找一本好书(我对“加速 C++”一无所知),做练习,玩得开心。
  • 我更喜欢学习新的编程语言的方式是获取有关该语言的规范书籍,通常由语言本身的作者编写,然后从头到尾阅读。对于 C++,这将是 "The C++ Programming Language" by Bjarne Stroustrup。但是,每个人的学习方式都不一样,我不是教学专家。
【解决方案2】:

我从“边做边学”的角度来解决这个问题......所以这个答案的目的是让你走上正轨,这样你就可以开始实验了。

  1. 设计:这两种语言非常相似,因此无论是 Java 还是 C++,类和类结构都无关紧要,因此您可以继续“用 Java 术语”思考使用 C++。您可以从相同的设计开始。

  2. 文件组织:将 .java 文件视为对应于 .h 文件和 .cpp 文件对(并非总是如此,扩展名可能会根据偏好而有所不同,但这暂时可以)。将 Java 代码复制到 .h 头文件中,并将函数定义隔离到对应的 .cpp 文件中。通常的语法清理是必要的 - 将导入替换为 #include<header.h> 定义,在函数定义前加上类名(记住使用 ClassName:: 语法)。还要记住,包含头文件并不意味着您包含上下文 - 您仍然需要使用适当的命名空间来引用它。 注意:这一步产生编译错误,但这可能是学习和习惯差异的最佳方式。

  3. 内存管理:在您的 Q 指针上,良好的 C++ 编程约定表示:指针 = 否,堆栈变量和智能指针 = 是 - 是。将堆栈变量用于普通/临时变量。对于参数等,请使用boost::shared_pointer(下载并安装boost libraries)。它的用法就像一个普通的 C++ 指针(即使用newlyDealtCard->member 语法)。简而言之,原因是共享指针模仿了 Java 对象模型——对象分配创建引用而不是副本,并且当所有引用不再使用时,对象会自动删除。 100 次中有 99 次行为是相同的,它会节省你可以花在理解其他事情上的时间。一旦您对 C++ 如何表示和处理内存感到满意,您就可以开始使用其他智能指针类型。 语法:

    Card newdealtCard = new Card(randomSuite, randomValue); //Java

    boost::shared_pointer newdealtCard(new Card(randomSuite, randomValue)); //C++

  4. 继承: 对于interfaces,使用关键字class。并声明函数pure virtual。 从这些“接口”或其他类派生时,现在使用公共继承。在 C++ 中还有另外两种类型,一旦你变得更加熟悉,就可以开始查找。

其余的差异主要是句法或只是名称不同的标准函数,它们不涉及视角的改变。希望随着您编写更多代码,您将能够在这些选项之外进行探索。

祝你好运!

【讨论】:

  • 刚看到这条评论,非常感谢您的意见,一些很棒的信息!
猜你喜欢
  • 2014-02-19
  • 2012-10-16
  • 2015-04-16
  • 2021-10-10
  • 2023-03-21
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多