【问题标题】:Deck of cards wrong output一副牌输出错误
【发布时间】:2020-04-26 21:28:29
【问题描述】:

我正在尝试为我正在制作的游戏创建一副纸牌。为什么我在这里得到错误的结果?该代码应该输出一副 52 张牌中的每张牌。我是结构的新手,但我认为到目前为止我在这段代码上做得很好。是的,我知道有更好的方法来做同样的事情,但我是初学者,所以不要评判我。

int main()
{
    struct Card 
    {
        int value;
        char suit;
    };

    Card cards[52]; //Declaring each unique card
    for (int i = 0; i < 52; i++)
    {
        cards[i].value = i % 13; // 13 values
        if (cards[i].value == 1) {
            cards[i].value = 1;
        }
        if (cards[i].value == 2) {
            cards[i].value = 2;
        }
        if (cards[i].value == 3) {
            cards[i].value = 3;
        }
        if (cards[i].value == 4) {
            cards[i].value = 4;
        }
        if (cards[i].value == 5) {
            cards[i].value = 5;
        }
        if (cards[i].value == 6) {
            cards[i].value = 6;
        }
        if (cards[i].value == 7) {
            cards[i].value = 7;
        }
        if (cards[i].value == 8) {
            cards[i].value = 8;
        }
        if (cards[i].value == 9) {
            cards[i].value = 9;
        }
        if (cards[i].value == 10) {
            cards[i].value = 10;
        }
        if (cards[i].value == 11) {
            cards[i].value = 10;

        }
        if (cards[i].value == 12) {
            cards[i].value = 10;
        }
        if (cards[i].value == 13) {
            cards[i].value = 10;
        }


        cards[i].suit = i / 13;// 4 suits
        if (cards[i].suit == 1) {
            cards[i].suit = 'D';
        }
        if (cards[i].suit == 2) {
            cards[i].suit = 'H';
        }
        if (cards[i].suit == 3) {
            cards[i].suit = 'C';
        }
        if (cards[i].suit == 4) {
            cards[i].suit = 'S';
        }
    }
    for (int count = 0; count < 52; count++) {
        cout << cards[count].value;
        cout << cards[count].suit;
        cout << endl;
    }
    return 0;
}

编辑:

int main()
{
    struct Card //struct is a way to store many values on 1 array for example
    {
        int value;
        char suit;
    };

    Card cards[52]; //Declaring each unique card
    for (int i = 0; i < 52; i++)
    {
        cards[i].value = i % 13; // 13 values
        if (cards[i].value == 0) {
            cards[i].value = 1;
        }
        else if (cards[i].value == 1) {
            cards[i].value = 2;
        }
        else if (cards[i].value == 2) {
            cards[i].value = 3;
        }
        else if (cards[i].value == 3) {
            cards[i].value = 4;
        }
        else if (cards[i].value == 4) {
            cards[i].value = 5;
        }
        else if (cards[i].value == 5) {
            cards[i].value = 6;
        }
        else if (cards[i].value == 6) {
            cards[i].value = 7;
        }
        else if (cards[i].value == 7) {
            cards[i].value = 8;
        }
        else if (cards[i].value == 8) {
            cards[i].value = 9;
        }
        else if (cards[i].value == 9) {
            cards[i].value = 10;
        }
        else if (cards[i].value == 10) {
            cards[i].value = 10;

        }
        else if (cards[i].value == 11) {
            cards[i].value = 10;
        }
        else if (cards[i].value == 12) {
            cards[i].value = 10;
        }


        cards[i].suit = i / 13;// 4 suits
        if (cards[i].suit == 0) {
            cards[i].suit = 'D';
        }
        else if (cards[i].suit == 1) {
            cards[i].suit = 'H';
        }
        else if (cards[i].suit == 2) {
            cards[i].suit = 'C';
        }
        else if (cards[i].suit == 3) {
            cards[i].suit = 'S';
        }
    }
    for (int count = 0; count < 52; count++) {
        cout << cards[count].value;
        cout << cards[count].suit;
        cout << endl;
    }
    return 0;
}

【问题讨论】:

    标签: c++ arrays struct


    【解决方案1】:

    问题是

    cards[i].suit = i / 13;
    

    将产生一个介于 0 和 3 之间的值,而不是像您的代码假设的那样是 1 和 4。

    同样的问题也存在于

    cards[i].value = i % 13;
    

    它给出的值介于 0 和 12 之间,而不是 1 和 13。

    好的,最新的问题

        if (cards[i].value == 0) {
            cards[i].value = 1;
        }
        if (cards[i].value == 1) {
            cards[i].value = 2;
        }
        if ... etc etc
    

    应该是

        if (cards[i].value == 0) {
            cards[i].value = 1;
        }
        else if (cards[i].value == 1) {
            cards[i].value = 2;
        }
        else if ... etc etc
    

    在您的版本中,第一个 if 语句(如果为真)会将值设置为 1,但随后下一个 if 语句将为真并将值设置为 2,依此类推。使用else if 可确保只执行一条 if 语句。

    【讨论】:

    • @Pneuma 嗯,简单的方法是写if (cards[i].suit == 0) { cards[i].suit = 'D'; }等等等等。
    • @AsteroidsWithWings Wannabe C++ 程序员需要学会尽快从零开始计数。这对他们在大部分代码中所做的发布者来说是公平的。
    • @john 这并不意味着你不能在代码中的任何地方使用+1 以产生正确的结果。
    • @Pneuma 我不能说你的最新版本有什么问题,除非我能看到最新的代码。编辑问题并添加最新版本的代码。
    • 您只希望执行其中一个 if 语句,这就是使用 else if 所做的事情,只要一个 if 语句为真,其余的就会被跳过。在您的版本中,这不是真的,不幸的是,如果一个语句将卡值设置为 5(例如),那么下一个 if 语句测试卡值是否为 5 并将其设置为 6,因此您得到一个链直到卡片价值达到 10 为止。
    【解决方案2】:
       if (cards[i].value == 11) {
           cards[i].value = 10;
    
       }
       if (cards[i].value == 12) {
           cards[i].value = 10;
       }
       if (cards[i].value == 13) {
           cards[i].value = 10;
       }
    

    我相信这些应该代表 Q、J 和 K?不过可能是笔误。

    此外,i / 13 将始终向下舍入。这应该解决西装:

      cards[i].suit = i / 13;// 4 suits
       if (cards[i].suit == 0) {
           cards[i].suit = 'D';
       }
       if (cards[i].suit == 1) {
           cards[i].suit = 'H';
       }
       if (cards[i].suit == 2) {
           cards[i].suit = 'C';
       }
       if (cards[i].suit == 3) {
           cards[i].suit = 'S';
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多