【问题标题】:How to Input 2 or 4 at empty places in a 3x3 grid?如何在 3x3 网格中的空白处输入 2 或 4?
【发布时间】:2020-06-27 19:14:20
【问题描述】:
void putTile(int &n1, int &n2, int &n3, int &n4, int &n5, int &n6, int &n7, int &n8, int &n9)
{
    srand(time(0));
    int i = (((rand()%10)) < 5 ? 2:4);

    if (n1||n2||n3||n4||n5||n6||n7||n8||n9 == 0) {
        switch((rand()%9) + 1) {
        case 1:
            n1 = i;
            break;
        case 2:
            n2 = i;
            break;
        case 3:
            n3 = i;
            break;
        case 4:
            n4 = i;
            break;
        case 5:
            n5 = i;
            break;
        case 6:
            n6 = i;
            break;
        case 7:
            n7 = i;
            break;
        case 8:
            n8 = i;
            break;
        case 9:
            n9 = i;
            break;
        }
    }
}

我试图在空的地方(包含 0 的地方)随机生成 2 或 4,但我的算法在随机位置输入随机生成的数字(2 或 4),即使在已经有数字的地方,因为我使用了代码开头的 if 语句。有关如何更正代码的任何建议?

【问题讨论】:

  • n1||n2||n3||n4||n5||n6||n7||n8||n9 == 0 不会像您认为的那样做。 || 运算符接受两个布尔参数并返回一个布尔值。它不能代替英文单词“or”。
  • 题外话:不用每次调用函数都调用srand
  • 除了损坏的if 条件之外,您的代码不能与您描述的不同。如果代码被执行(几乎可以保证),它总是会在随机位置写入随机数。所选位置与该位置是否空闲无关。
  • n1||n2||n3||n4||n5||n6||n7||n8||n9 == 0n1 != 0 || n2 != 0 || n3 != 0 || n4 != 0 || n5 != 0 || n6 != 0 || n7 != 0 || n8 != 0 || n9 == 0 相同

标签: c++ eclipse


【解决方案1】:

让我们像编译器一样查看您的代码:

void putTile(int &n1, int &n2, int &n3, int &n4, int &n5, int &n6, int &n7, int &n8, int &n9)
{
    srand(time(0));
    int i = (((rand()%10)) < 5 ? 2:4);

    // below compiler sees "number or number or number or (number is zero)",
    // compiler does not see "if either of the numbers is zero",
    // if asked to do a logical "OR" of two numbers, then  it will do the logical
    // "number is non-zero OR other number is non-zero",
    // i.e. it sees this, probably extremely probable condition:
    if (   (n1 != 0)
         ||(n2 != 0)
         ||(n3 != 0)
         ||(n4 != 0)
         ||(n5 != 0)
         ||(n6 != 0)
         ||(n7 != 0)
         ||(n8 != 0)
         ||(n9 == 0)
       )
    {
        // program will almost always execute this
        switch((rand()%9) + 1) // do a switch on a random number
        {
        case 1: // if it is 1
            n1 = i; // overwrite n1 unconditionally with i, whether it is 0 or not
            break;
        case 2:     // same for 2 ... etc.
            n2 = i;
            break;
        case 3:
            n3 = i;
            break;
        case 4:
            n4 = i;
            break;
        case 5:
            n5 = i;
            break;
        case 6:
            n6 = i;
            break;
        case 7:
            n7 = i;
            break;
        case 8:
            n8 = i;
            break;
        case 9:
            n9 = i;
            break;
        }
    }
}

【讨论】:

  • 那么我应该如何检查 n1==0 与否,如果不移动到另一个数字?
  • 感谢您的帮助!?
  • 我专注于为什么编译器会完全按照您的描述解释您的代码。 ChrisMM 提出的循环封闭条件分配是实现您似乎试图实现的目标的一种非常合理的尝试。
【解决方案2】:

cmets 已经指出了一些问题。首先,您的 if 声明无法按您预期的方式工作。它正在检查n1n8 是否不为零,或者n9 是否为零。

其次,在初始 if 语句之后,您只是随机更改一个位置,但不要检查该值是否非零。

一个可能的解决方案是:

void putTile( int &n1, int &n2, int &n3, int &n4, int &n5, int &n6, int &n7, int &n8, int &n9 ) {
    int i = ( ( ( rand() % 10 ) ) < 5 ? 2 : 4 );

    if ( n1 == 0 || n2 == 0 || n3 == 0 || n4 == 0 || n5 == 0 || n6 == 0 || n7 == 0 || n8 == 0 || n9 == 0 ) {
        while ( true ) {
            switch ( ( rand() % 9 ) + 1 ) {
            case 1:
                if ( n1 == 0 ) {
                    n1 = i;
                    return;
                }
                break;
            case 2:
                if ( n2 == 0 ) {
                    n2 = i;
                    return;
                }
                break;
            case 3:
                if ( n3 == 0 ) {
                    n3 = i;
                    return;
                }
                break;
            case 4:
                // ...
            }
        }
}

注意,这不是很有效,并且有很多重复。我建议使用数组。

【讨论】:

  • 非常感谢您的帮助!? 不胜感激!
猜你喜欢
  • 1970-01-01
  • 2016-06-18
  • 2020-06-22
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 2013-08-12
相关资源
最近更新 更多