C ++ массив символов, содержащий целочисленные значения

Я пытаюсь создать динамический массив символов, который будет содержать числа, а затем изменить их на X или 0,

Я создаю игру Tic Tac Toe, которая создает сетку для определенного числа, которое вы хотите, массив должен содержать все числа для квадратов, а затем изменить это число на 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: ‘=’: невозможно преобразовать из ‘int’ в ‘char *’ номер строки [i] = i;

Как бы я создать массив, содержащий цифры — 1, grid_size, изменить эти числа на X, 0?

2

Решение

У вас есть два решения: создать массив массивов для хранения ваших символов (в этом и заключается матрица), или создать один массив символов 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 A66 B и так далее, посмотрите таблицу кодов ASCII для более подробной информации). Одним из способов решения этой проблемы, если вы хотите сохранить номер ячейки в ячейке и также отслеживать состояние игры, является использование 254 и 255 в качестве значений, обозначающих движения игрока, вместо O а также X, но вы все равно будете ограничены размером сетки 7 * 7.

Для большего размера вам, вероятно, потребуется рассмотреть другую структуру данных, чтобы отслеживать состояние игры.

0

Другие решения

Я думаю, вам не нужно хранить индексируемые ячейки в вашем массиве. Вы просто используете их для печати текущей сетки для пользователя, верно? Как насчет этого решения:

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);
}
2

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
}
}

Обратите внимание, что я давно не программировал на С ++, поэтому у меня могут возникнуть некоторые проблемы с синтаксисом. Но это способ сделать это.

0

Прежде всего, если вам нужен массив чисел, вы должны использовать int* number = new int[grid_size]и определенно нет char** (как если бы вы хранили строки символов).

Во-вторых, даже если вы хотите, чтобы цифры шли от 1 до grid_size, индексы массива, в которых вы храните их, должны по-прежнему находиться в диапазоне 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;
}
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;

Так как число [i] содержит указатель на массив.

0
По вопросам рекламы [email protected]