相对于网格方向的2d阵列

时间:2018-03-22 10:27:04

标签: c++ arrays multidimensional-array grid-layout directions

我正在开发一个隐藏网格中数字的程序(2d数组,10列和10行,标有数组,上面填充了。或 - 等字符)并将网格打印到屏幕上。

行和列的num是随机生成的,并以“X”形式保存到数组中,仅在找到时显示

用户输入行和列....然后将用户对网格的猜测显示为屏幕上的字符。之后,选择要移动的方向...并提供关于该项目的随机位置在十次尝试总计或更少内的数组中隐藏的提示(用户无法转到在程序期间播放的先前猜测)。

例如:

while (guess <9 || found == false){
cout << "Enter your next move....n, e, s, w, ne, nw, se, sw";   
cin >> d;   
    if (d == 'E' || d == 'e')
        {
        col++;
        guess++;
        array[col][row] = guess;
        cout << "moved east";
        }
    else if (d == 'W' || d == 'w')
        {
        col--;
        guess++;
        array[col][row] = guess;
        cout << "west...";
        }
        ....etc
        else {
        guess++;
        cout << "not valid move. turn is incremented";
        }

然后在所有这些之后的整个while循环之后,我再次显示数组但是我不能让第一步以外的动作出现(需要它做1,2,3 ...... 10或直到found = true显示'X')并且不确定如何根据猜测方向给出隐藏项目隐藏位置的提示。如果项目位于用户猜测其第一个起始位置(列和行)的上方,则应显示基于该位置的提示。我怎么能实现呢?

1 个答案:

答案 0 :(得分:0)

  1. 必须:while(guess < 9 &amp;&amp; !found),任何条件未满足 将离开,因此您只能留在如果两个都符合循环...旁注:代码样式更好的是不比较布尔值,只需使用if(condition)if(!condition)作为在固定循环条件下。
  2. 请注意,您应该检查董事会的边界:
    if(col > 0)
    {
        --col;
        ++guess;
    类似于其他方向......
  3. 如果已经访问过要访问的字段,则需要检查。假设未访问的字段带有值0,您可以将以下条件添加到边界检查:
    if(col > 0 && array[col - 1][row] != 0)
    同样,其他方向类似。
  4. 对于提示,计算目标和当前位置之间坐标的距离;如果是否定的,请分别在垂直或水平方向的提示中添加'n''w',如果为正,'s''e',否则,不提示相应方向(最简单)变体,首先倾向于对角线方向。)
  5. 旁注array[col][row]:通常,您将数组的索引命名为:array[row][col];如果迭代,则使用外部循环表示行,内部循环表示cols(从数据位置获利):

    for(r = 0; r < rows; ++r)
        for(c = 0; c < cols; ++c)
            std::cout << getCharFor(array[r][c]);
    

    北部和南部,上面的代码仍然与垂直,东部和西部以及水平方向相关联......

    修改以回应您的评论:

    1. 您无需检查要离开的边界......
      if(d == "e")
      {
          if(/*col > 0 &&*/ col <= 10)
          //^^^^^^^^^ obsolete... 
      }
    2. 如果您的数组的大小为NxN,则您可以访问的最大索引为N - 1,因此如果您当前位于N - 2位置,则只能向东行进({ {1}})
    3. 如果您沿对角方向行驶,则必须同时检查水平和垂直方向:
      if(d == "sw")
      {
          if(row < N - 1 && col > 0) 
      }
    4. 如果您确定不使用指定的移动退出电路板,则可以按指定的方向访问该字段:
      if(d == "sw")
      {
          if(array[row + 1][col - 1] != 0)
              // visited already; assuming you have initialized the array with 0...
      }
    5. 旁注:对于提示,还有一个未经考虑的问题:如果用户没有遵循它们,那么,由于这个原因,程序会给已经访问过的字段提示? / p>

相关问题