C、 当我在2D数组的单个位置更改角色时,第二个位置也会更改其角色

C、 当我在2D数组的单个位置更改角色时,第二个位置也会更改其角色,c,arrays,character,C,Arrays,Character,我一天前才开始学习C语言,如果答案很明显,或者我的代码效率太低,我深表歉意 我正在创建一个战舰游戏,其中3艘战舰(一艘战舰、一艘驱逐舰和一艘航母)将被放置在一个棋盘上 战列舰将占据3个方格,驱逐舰2和航母5 电路板是一个二维字符数组 P1_board[9][9] 当玩家希望将一艘船放置在棋盘上时,阵列中的特定位置将更改为一个字符(“B”表示战列舰,“D”表示驱逐舰,“C”表示航母)。船舶通过一个名为: PlaceShip(char Letter, char Number, ch

我一天前才开始学习C语言,如果答案很明显,或者我的代码效率太低,我深表歉意

我正在创建一个战舰游戏,其中3艘战舰(一艘战舰、一艘驱逐舰和一艘航母)将被放置在一个棋盘上

战列舰将占据3个方格,驱逐舰2和航母5

电路板是一个二维字符数组

    P1_board[9][9]
当玩家希望将一艘船放置在棋盘上时,阵列中的特定位置将更改为一个字符(“B”表示战列舰,“D”表示驱逐舰,“C”表示航母)。船舶通过一个名为:

    PlaceShip(char Letter, char Number, char Ship, char Direction)
其中字母将是从a到j的小写字符,数字将是从1到10的数字字符,对应的船舶将是“B”、“D”或“C”,方向将是“r”表示右侧或“D”表示向下

我遇到的问题是,当我试图把船放在左边或两边时,船舷另一边的位置也会改变

例如: 当我运行这些C命令时:

    PlaceShip('a', '2', 'C', 'r');
    PlaceShip('a', '7', 'B', 'd');
    PlaceShip('c', '2', 'C', 'r');
    PlaceShip('b', '7', 'B', 'd');

如果现在改为运行以下C命令:

    PlaceShip('a', '2', 'C', 'r');
    PlaceShip('a', '7', 'B', 'd');
    PlaceShip('c', '2', 'C', 'r');
    PlaceShip('b', '7', 'B', 'd');

我认为它可能是一些字符溢出到下一个数组位置,但我不确定如何修复,或者这是否是事实

我使用Visual Studio社区2015版的Visual C++编写和运行C代码。 下面是我的完整代码的简化版本,它仍然会产生问题:

    #include <stdio.h>
    #define Board_Size 2
    Board[Board_Size][Board_Size];
    void main() {
            int i = 0, j = 0;
            for (i = 0; i <= Board_Size; i++) {
            for (j = 0; j <=Board_Size; j++) {
                    Board[i][j] = 'a';
                    printf("%c   ", Board[i][j]);
            }
            printf("\n");
    }
    printf("\n");
    Board[0][2] = 'b';
    //   [y][x]
    printf("\n");
    printf("%c   %c   %c\n", Board[0][0], Board[0][1], Board[0][2]);
    printf("%c   %c   %c\n", Board[1][0], Board[1][1], Board[1][2]);
    printf("%c   %c   %c\n", Board[2][0], Board[2][1], Board[2][2]);
    }
#包括
#定义电路板尺寸2
线路板[线路板尺寸][线路板尺寸];
void main(){
int i=0,j=0;
对于(i=0;iLine#7(指链接的代码)。这是一个简单的错误,在使用基于0的数组的语言中,这是一个常见的错误,通常需要从大小中减去一来确定上界

您将“Board_Size”声明为10,但减去1得到9x9矩阵:

#定义电路板尺寸10 字符P1_板[board_Size-1][board_Size-1]

这将打印一个10x10矩阵:

printf(“1 |%c |%c |%c |%c |%c |%c |%c |%c | \n”、P1|board[0][0]、P1|board[0][1]、P1|board[0][2]、P1 u board[0][3]、P1 u board[0][4]、P1 u board[0][6]、P1 u board[0][7]、P1 u board[0][8][9])

C按行主顺序存储阵列(对于9x9矩阵元素,a(0,10)与a(1,0)位于同一内存位置),这解释了为什么在板上会看到多个船

另一方面,C将字符常量视为整数,因此可以编写(字母-‘a’)将字母转换为索引


维基百科很好地描述了如果你不熟悉这个术语,行主顺序的含义:

这里的完整代码:
int y=Number-49;/'1'=int(49)
?你确定要将
'1'
转换成
0
?这样当用户键入战舰坐标“a1”时“1”将从字符“1”转换为整数0,以便它可以用于寻址数组的第一行。代码应进行检查,以确保位置在棋盘的边界内。一个简单的简化方法是实际定义比播放区域稍大的棋盘。例如,9x9播放区域为12x12。我希望您不要这样做在使用数组时,要了解内存的实际布局。如果不是,那么在试图理解问题根源时,这可能是一个很好的起点。我想我现在明白了,如果我想定义一个10x10数组,我会这样做:
charboard[10][10];
但是如果我想访问第10列的第10个条目,我会这样做:
Board[9][9]='a';
是否正确?这完全正确。索引从零开始,最大索引为(大小-1),但大小始终是声明中的大小。