2

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

代码设计:

  • 枚举的等级和花色。

  • Rank 和 Suit 的 52 种变体一起形成了 52 个卡片对象

  • 将对象存储在向量中

  • 随机化向量

  • 将两张卡片从 Vector 弹出到 Player

  • 向庄家弹出一张牌

  • 当玩家或庄家发牌时,计算取回的牌,value += to int player/dealerValue;

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

甲板.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++ 技巧都会很棒。

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

4

2 回答 2

2

为了解决您的观点:

管理头文件

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

方法的骨架代码块

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

我必须使用指针吗?

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

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

于 2012-07-13T23:44:31.867 回答
1

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

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

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

  3. 内存管理:在您的 Q 指针上,良好的 C++ 编程约定表示:指针 = no-no,堆栈变量和智能指针 = yes-yes。将堆栈变量用于普通/临时变量。对于参数等,请使用boost::shared_pointer(下载并安装boost 库)。它的用法就像一个普通的 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++ 中还有另外两种类型,一旦你变得更舒服,就可以开始查找它们。

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

祝你好运!

于 2012-07-14T01:13:23.867 回答