2

我正在尝试创建一个包含数字的动态字符数组,然后将它们更改为 X 或 0,

我正在创建一个井字游戏,它为您想要的特定数字创建一个网格,该数组需要包含正方形的所有数字,然后根据玩家将此数字更改为 X,0,

我目前有;

const int grid_size = size * size; // determines the size of the grid height x width
char **number = new char*[grid_size]; // create the array to the size of the grid

for ( int i = 1; i <= grid_size+1; i++ ) {
    number[i] = i;
}

但有了这个我得到一个错误:-错误C2440:'=':无法在行号[i] = i上从'int'转换为'char *';

我将如何创建包含数字的数组 - 1,grid_size,将这些数字更改为 X,0 ?

4

5 回答 5

2

我认为您不必将单元格 indides 存储在数组中。您只是使用它们将当前网格打印给用户,对吗?这个解决方案怎么样:

enum class Marker { PlayerX, PlayerO, None };

class TicTacToeGrid
{
public:
     TicTacToeGrid(size_t size) :
         grid(size* size, Marker::None), size(size)
     {}

     void Set(size_t cellId, Marker player)
     {
         if (cellId < 1 || cellId >= size * size)
             throw std::runtime_error("invalid cell");
         if (grid[cellId - 1] != Marker::None)
             throw std::runtime_error("cell is not free");

         grid[cellId - 1] = player;
     }

     Marker Get(size_t cellId) const
     {
         return grid[cellId - 1];
     }

     void Print(std::ostream& os) const
     {
         for(size_t row = 0; row < size; ++row)
         {
             for (size_t col = 0; col < size; ++col)
             {
                 size_t index = size * row + col;
                 os << CellContent(index) << "\t";
             }
             os << "\n";
         }
     }

     std::string CellContent(size_t index) const
     {
        Marker marker = grid[index];
        switch(marker)
        {
        case Marker::PlayerX:
            return "X";
        case Marker::PlayerO:
            return  "O";
        case Marker::None:
            // If it's not X or O let's show the cell index.
            return std::to_string(index + 1);
        }
     }

private:
     std::vector<Marker> grid;
     size_t size;
};


int main()
{
    TicTacToeGrid grid(3);
    grid.Print(std::cout);

    grid.Set(1, Marker::PlayerO);
    grid.Set(2, Marker::PlayerX);

    grid.Print(std::cout);
}
于 2013-04-10T08:47:32.313 回答
0
char **number = new char*[size]; // create the rows

for ( int i = 0; i < size; i++ ) {
   number[i] = new char[size]; // create the columns for the current row
   for (int j = 0; j < size; j++) {
      number[i][j] = (char)i*j; // set the cell number 
   }
}

请注意,我很久没有用 C++ 编写代码了,所以我可能会遇到一些语法问题。但这是做到这一点的方法。

于 2013-04-10T08:19:03.187 回答
0

正确的方法是......

#define Row_num 3
#define Col_num 3
char **number = new char*[Row_num];

for(int i=0;i<Row_num;i++){
    number[i] = new char[Col_num];
    for(int j=0;j<Col_num;j++){
        number[i][j] = j;
    }
}

通过这条线

 char **number = new char*[Row_num];

您实际上创建了一个指针数组。所以你不能做这个任务......

number[i] = i;

由于 number[i] 持有指向数组的指针。

于 2013-04-10T08:22:40.060 回答
0

首先,如果你需要一个数字数组,你应该使用int* number = new int[grid_size],而且绝对不是char**(就像你存储字符串一样)。

其次,即使您希望数字从 1 变为grid_size,您存储它们的数组索引也应该在 range 中0..grid_size-1,否则您将访问一个不存在的元素。

const int grid_size = size * size; // determines the size of the grid height x width
int *number = new int*[grid_size]; // create the array to the size of the grid

for ( int i = 0; i < grid_size; i++ ) {
    number[i] = i + 1;
}
于 2013-04-10T08:23:07.977 回答
0

您有两种解决方案:创建一个数组数组来存储您的字符(这就是矩阵的本质),或者创建一个 char 数组,这将是矩阵的线性化版本,即。一个数组,包含矩阵的所有行放在一起。

第一种情况很简单:

const int grid_size = size * size; // determines the size of the grid height x width
char **number = new char*[size]; // create the array to the size of the grid

for ( int i = 0; i < size; i++ ) {
    number[i] = new char[grid_size];
    for( int j = 0; j < size; j++)
         number[i][j] = i * size + j;
}

// access any char with a double bracket notation
// beware that coordinates start at `0`
number[2][1] = 'X';

第二种解决方案比较棘手,我建议使用辅助函数将矩阵坐标转换为数组索引:

const int grid_size = size * size;

int idx(int x, int y){
    return y * size + x;
}

char *number = new char[grid_size];

for (int i = 0; i < grid_size; i++)
    number[i] = i;

number[idx(2,1)] = 'O';

字符实际上是变相的数字,但值远高于9,因此对于常规井字游戏来说,这应该不是问题,并且您应该能够让它在最大为 8*8 的情况下工作。从 65 开始,数字开始代表常规字母字符(即 65 是A,66 是B等等,查看 ASCII 码表了解更多详细信息)。解决该问题的一种方法是,如果您想将单元格编号存储在单元格中并跟踪游戏状态,则使用 254 和 255 作为表示玩家移动的值,而不是使用Oand X,但您会仍然限制在 7*7 的网格大小。

对于更大的尺寸,您可能需要考虑另一种数据结构来跟踪游戏状态。

于 2013-04-10T08:25:05.950 回答