2

現在、言語をJava(初心者)からc ++に切り替えており、Javaで作成したBlackJackゲームを複製したいのですが、コードブロックを使用したC++でのセットアップに問題があります。

コードデザイン:

  • ランクとスーツの列挙型。

  • ランクとスーツの52のバリエーションが一緒に形成され、カードの52のオブジェクトが作成されます

  • オブジェクトをベクトルに保存する

  • ランダムベクトル

  • ベクターからプレイヤーに2枚のカードをポップします

  • カードを1枚ポップしてディーラーに送る

  • プレイヤーまたはディーラーにカードが配られると、取得されたカードが計算され、値+=がintplayer/dealerValueになります。

私はこれをどのように達成できるかについて迷っています:

Deck.cpp:

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

Player.cpp

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

Card.cpp

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

BlackJack.cpp

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

---ゲームコード---

誰かが私をカバーするか、私にいくつかの良いリソースを教えてもらえますか?

  • ヘッダーファイルの管理

  • 必要なメソッドのいくつかの簡単なスケルトンコードブロック

  • しかし、最も重要なことは、このプログラムでポインターを使用する必要があるのでしょうか。私のc++の本が到着し、どのような種類のメモリ管理にもまだ自信がない間、私は数日間だけオンラインのYouTubeチュートリアルにアクセスできました。

  • このプログラムの一般的なC++のヒントは素晴らしいでしょう。

これを読むためにあなたの時間と忍耐に感謝します。

4

2 に答える 2

2

あなたのポイントに対処するには:

ヘッダーファイルの管理

気にしないでください。すべてを1つのソースファイルに入れるだけです(Javaとは異なり、C ++でこれを行うことは完全に許可されています)。必要に応じて、後で複数のソースファイルに分割することもできます。

メソッドのスケルトンコードブロック

すでにJavaで記述されたコードを持っている場合は、スケルトンブロックがあります。

ポインタを使用する必要がありますか?

おそらくそうではありません。ただし、Javaコードのようなプログラムを使い始めたいだけの場合は、手動のメモリ管理を無視して、を呼び出すだけnewで、心配する必要はありませんdelete。いたるところにメモリリークが発生しますが、一度に1つだけですよね?

典型的な「モダンな」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 ++プログラミング規則は次のことを示します:ポインター=いいえ-いいえ、スタック変数およびスマートポインター=はい-はい。通常/一時変数にはスタック変数を使用します。パラメータなどについては、 (ブーストライブラリboost::shared_pointerをダウンロードしてインストールする)を使用してください。使用法は通常のC++ポインタと同じです(つまり、newlyDealtCard->member構文)。一言で言えば、共有ポインタはJavaオブジェクトモデルを模倣しているためです。オブジェクトの割り当てにより、コピーではなく参照が作成され、すべての参照が使用されなくなると、オブジェクトは自動的に削除されます。100回のうち99回は動作が同じで、他のことを理解するために費やす時間を節約できます。C ++がメモリを表現および処理する方法に慣れたら、他の種類のスマートポインタの使用を開始できます。構文:

    カードnewlydealtCard=new Card(randomSuite、randomValue); // Java

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

  4. 継承interfacesには、キーワードを使用しclassます。そして、関数を純粋な仮想として宣言します。これらの「インターフェース」または他のクラスから派生する場合は、今のところパブリック継承を使用してください。C ++には他に2つのタイプがあり、快適になったら検索を開始できます。

残りの違いは、ほとんどが構文であるか、単に異なる名前の標準関数であり、視点の変更を伴いません。うまくいけば、さらにコーディングするにつれて、これらのオプションの外側を探索できるようになります。

幸運を!

于 2012-07-14T01:13:23.867 に答える