在2d数组中存储字符并打印



我正在尝试制作一个播放战舰的程序。我有一个2D数组,它被打印到控制台,并嵌套for循环,以显示代表网格的10x10点网格。我希望能够让用户输入船舶的x和y轴,并将其显示在网格上,使用不同的字符,如"+"例如,并在每次"重新绘制"时将其存储起来;网格。

char playerBoard[][]在全局作用域中初始化较早。

void drawPlayerBoard()
{

int yLabel = 0;
char xLabel = 65;// ascii  


for (int i = 0; i < rows; i++)
{
for (int j = 0; j < columns; j++)
{
playerBoard[i][j] = 46;// ascii 
}
}

cout << "   ";
for (xLabel = 65; xLabel < 75; xLabel++)
{
cout << xLabel << " ";
}
cout << "n";
for (int i = 0; i < rows; i++)
{
yLabel++;
if (yLabel >= 10)
{
cout << yLabel << " ";
}
else
{
cout << yLabel << "  ";
}

for (int j = 0; j < columns; j++)
{
cout << playerBoard[i][j] << " ";
}
cout << "n";
}


}

您可以让自己更轻松。例如,将playerBoard的每个值初始化为'.'可以像这样简单:

std::fill_n((char*)playerBoard, rows * columns, '.');

您可能想要在drawPlayerBoard函数中这样做,因为每当您想要显示它时,您将擦除您的板。创建一个单独的函数:

#include <algorithm>
const int rows = 10;
const int cols = 10;
char playerBoard[rows][cols];
void clearPlayerBoard()
{
std::fill_n((char*)playerBoard, rows * cols, '.');
}

对于输出x标签,同样避免使用表示ASCII值的幻数。例如,你可以写char('A' + i)来得到你想要的字母。

要管理间距,请使用I/O操纵符来控制输出宽度。这避免了像您现在使用yLabel测试那样的丑陋代码。只需使用std::setw,并避免使用空格字符串使代码混乱。

把这些放在一起:

#include <iomanip>
#include <iostream>
void drawPlayerBoard()
{
const int colWidth = 2;
const int rowLabelWidth = 3;
// Draw X labels
std::cout << std::setw(rowLabelWidth) << "";
for (int col = 0; col < cols; col++) 
{
std::cout << std::setw(colWidth) << char('A' + col);
}
std::cout << 'n';
// Draw rest of board
for (int row = 0; row < rows; row++)
{
std::cout << std::setw(rowLabelWidth) << row + 1;
for (int col = 0; col < cols; col++) 
{
std::cout << std::setw(colWidth) << playerBoard[row][col];
}
std::cout << 'n';
}
}

注意你现在可以用这两个"width"来控制布局值。这里最有用的是rowLabelWidth值,它有效地控制你的板有多少缩进。

要进行测试,只需main中的一些简单驱动程序代码:
int main()
{
clearPlayerBoard();
drawPlayerBoard();
}

得到输出:

A B C D E F G H I J
1 . . . . . . . . . .
2 . . . . . . . . . .
3 . . . . . . . . . .
4 . . . . . . . . . .
5 . . . . . . . . . .
6 . . . . . . . . . .
7 . . . . . . . . . .
8 . . . . . . . . . .
9 . . . . . . . . . .
10 . . . . . . . . . .

现在你可以写一个简单的函数来添加你的船:

void placeShip(int row, int col, int size, bool horizontal, char player)
{
if (horizontal)
{
for (int i = 0; i < size; i++) playerBoard[row][col+i] = player;
}
else
{
for (int i = 0; i < size; i++) playerBoard[row+i][col] = player;
}
}

的例子:

char player = '#';
placeShip(3, 2, 5, false, player);
placeShip(2, 4, 4, true, player);
placeShip(0, 9, 3, false, player);
placeShip(6, 6, 3, true, player);
placeShip(8, 7, 2, true, player);
drawPlayerBoard();
输出:

A B C D E F G H I J
1 . . . . . . . . . #
2 . . . . . . . . . #
3 . . . . # # # # . #
4 . . # . . . . . . .
5 . . # . . . . . . .
6 . . # . . . . . . .
7 . . # . . . # # # .
8 . . # . . . . . . .
9 . . . . . . . # # .
10 . . . . . . . . . .

最新更新