Я пытаюсь создать динамический массив символов, который будет содержать числа, а затем изменить их на 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?
У вас есть два решения: создать массив массивов для хранения ваших символов (в этом и заключается матрица), или создать один массив символов 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 в качестве значений, обозначающих движения игрока, вместо O
а также X
, но вы все равно будете ограничены размером сетки 7 * 7.
Для большего размера вам, вероятно, потребуется рассмотреть другую структуру данных, чтобы отслеживать состояние игры.
Я думаю, вам не нужно хранить индексируемые ячейки в вашем массиве. Вы просто используете их для печати текущей сетки для пользователя, верно? Как насчет этого решения:
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);
}
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
}
}
Обратите внимание, что я давно не программировал на С ++, поэтому у меня могут возникнуть некоторые проблемы с синтаксисом. Но это способ сделать это.
Прежде всего, если вам нужен массив чисел, вы должны использовать 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;
}
Правильный путь это ….
#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] содержит указатель на массив.