0

私は c++ クラス用の Yatzy プログラムを書いています。std::cout を使用して、さまざまなサイコロの値を出力することになっています。私がやりたいのは、定数文字列をその定数として保存して、サイコロを出力することです。

std::cout << "-------\n|     |\n|  *  |\n|     |\n-------\n"

その値を持つ定数文字列が必要で、これを行います:

std::cout << theConstantString;

ジェネリックプログラミングが再び勝利!

-------
|     |
|  *  |
|     |
-------

私が持っている解決策は、私には最適ではないようです。これは関連するコードです:

YatzyIO.h

class YatzyIO
{
    private:

    // Define die constants
    static const std::string dieOnePrint;
    static const std::string dieTwoPrint;
    static const std::string dieThreePrint;
    static const std::string dieFourPrint;
    static const std::string dieFivePrint;
    static const std::string dieSixPrint;


    void dieOne();
    void dieTwo();
    void dieThree();
    void dieFour();
    void dieFive();
    void dieSix();

};
(そこにはそれよりも多くのコードがあります。関係のないものはすべて切り取っただけです。とにかくそうするはずだと思います)

ここで、YatzyIO.cpp の関数の実装の外側:

const std::string YatzyIO::dieOnePrint = "-------\n|     |\n|  *  |\n|     |\n-------\n";
const std::string YatzyIO::dieTwoPrint = "-------\n|  *  |\n|     |\n|  *  |\n-------\n";
const std::string YatzyIO::dieThreePrint = "-------\n| *   |\n|  *  |\n|   * |\n-------\n";
const std::string YatzyIO::dieFourPrint = "-------\n| * * |\n|     |\n| * * |\n-------\n";
const std::string YatzyIO::dieFivePrint = "-------\n| * * |\n|  *  |\n| * * |\n-------\n";
const std::string YatzyIO::dieSixPrint = "-------\n| * * |\n| * * |\n| * * |\n-------\n";

最後に YatzyIO.ccp には次の関数があります。

void YatzyIO::dieOne()
{
    //output die side 1
    std::cout << dieOnePrint;
}

(サイコロごとに+1、見た目は似ています)

これは、これまでに完了した 3 つのラボの 2 にすぎません。3 つ目は、これらの const を配列に置き換えます。私はこのコードを含むラボ 1 で採点され、先生はこう言いました (私はスウェーデン人なのでここで翻訳しているので、翻訳で失われたものはすべて申し訳ありません!):

「メンバー変数を使用するのは良いことなので、別のサイコロの出力を保存します。代わりに、別の行 (別の出力を形成する) をメンバー変数に保存することをお勧めします。」

彼はどういう意味ですか?それを行うより良い方法はありますか?ヘッダー ファイル内の整数以外の定数を初期化できません。正直なところ、私のソリューションは私にとって最適ではないように思われるため、さまざまな方法を試しました。

4

1 に答える 1

1

あなたの先生はおそらく、すべての異なる出力は実際には線の小さなサブセットの組み合わせであり、サイコロの画像全体を維持するのではなく、それらの線を維持し、必要に応じてソリューションを構成することができると示唆しています.

たとえば-------\n、さまざまな組み合わせごとに上下の境界線として表示され、4、5、6 の| * * |\n上下の線、および 6 の中央の要素を生成するために使用できます。1、3| * |\nの中央の線にすることができます、5 であり、1 の上部と下部の行、および 2 と 4 の中央の行に空の行が必要になります...それらをメンバーとして保存し、それらのプリミティブに基づいてさいころの描画を生成できます。

たとえば、6 を描画するには、次のようにする必要があります。

std::cout << line        // -------
          << two_dots    // | * * |
          << two_dots    // | * * |
          << two_dots    // | * * |
          << line;       // -------

この方法では、完全なサイコロの値すべてではなく、4 つのプリミティブのみを保存する必要があります。

于 2012-06-30T15:14:59.853 に答える