数组元素消失

时间:2015-09-29 14:45:41

标签: c arrays elements

我试图用x标记他们的位置来跟踪玩家的位置。当玩家输入一个字符串时,我相应地增加坐标。然而,当玩家距离周边一个空间时,然后尝试移动到地图的边缘,玩家就会消失。

示例:

.....  
...x.  
.....  
.....  
.....

玩家位于'x'

如果玩家输入字符串"右键"我移动player_loc,数组只返回:

.....  
.....  
.....  
.....  
.....

我试图通过增加数组的大小来添加一种缓冲区。没运气。我已经坚持了近一个星期了。任何帮助,将不胜感激。我为凌乱的代码道歉。我是一个全新的人,我真的只是在黑暗中与所有这些东西一起玩耍。我在这里的论坛上对此进行了研究,并没有找到解决方案。如果你知道我可能(可能)错过的东西,请随意指出我的方向。

#include <stdio.h>
#include <string.h>
char map[6][6];
char player_loc = 'x';
int row;
int col;

void init_map()
{
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {

        map[i][j] = '.';

        }
    }
}

void print_map()
{
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {

                printf("%c", map[i][j]);

            }
        printf("\n");
        }
}

int get_player_loc()
{
    for (int j = 0; j < 5; j++) {
        for (int k = 0; k < 5; k++) {
            if(map[j][k] == player_loc)
            {
                row = k;
                col = j;
            }
        }
    }
    return row;
    return col;
}

void init_player_loc()
{
    int check = 1;
    for (int g = 0; g < 5; g++) {
        for (int h = 0; h < 5; h++) {
            if (map[g][h] == 'x') {
                check = 0;
            }

        }   
    }
    if(check == 1) {
        map[0][0] = player_loc;
    } else {
        get_player_loc();
    }

}

void move_left()
{
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            if (map[i][j] == player_loc) {
                map[i][j-1] = player_loc;
                map[i][j] = '.';
            }
        }
    }

}

void move_right()
{
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            if (map[i][j] == player_loc) {
                map[i][j+1] = player_loc;
                map[i][j] = '.';
            }
        }
    }
}




int main(int argc, char* argv[])
{
    char input[15];
    printf("You enter a room...you can go left, right, or straight. Which way do you go?\n");

    int done = 0;

    init_map();
    map[3][3] = player_loc;
    //init_player_loc();
    print_map();

    while (!done)  {
        scanf("%s", input);

            if (strcmp("left", input) == 0) {
                move_left();
                printf("You go left...\n");
                print_map();
                get_player_loc();
                printf("%d %d\n", row, col);
                done = 1;
            } 
            else if (strcmp("right", input) == 0) {
                move_right();
                printf("You go right...\n");
                print_map();
                get_player_loc();
                printf("%d %d\n", row, col);
                done = 1;
            }
            else if (strcmp("straight", input) == 0) {
                printf("You go straight...");
                done = 1;
            }
            else {
                printf("Sorry, can't do that.\n");
            }
        }
}

4 个答案:

答案 0 :(得分:3)

如果找到玩家位置,你必须打破循环,例如

void move_right()
{
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            if (map[i][j] == player_loc) {
                map[i][j+1] = player_loc;
                map[i][j] = '.';
                return;
            }
        }
    }
}

在你的代码中,你向右移动玩家,下一个循环将在新位置找到玩家并再次向右移动。

此外,在您的代码中,您没有处理二维矩阵的边界:j+1仅在j<5时有效。 那么更好的代码应该是

void move_right()
{
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            if (map[i][j] == player_loc) {
                map[i][j+1] = player_loc;
                map[i][j] = '.';
                return;
            }
        }
    }
}

答案 1 :(得分:1)

问题是你的move_right功能会选择播放器并将它们完全移出地图。假设您的播放器位于[0, 2]并单步执行代码。

for (int j = 0; j < 5; j++) {
    if (map[i][j] == player_loc) {
        map[i][j+1] = player_loc;
        map[i][j] = '.';
    }
}
  • [0, 0]此处没有玩家,继续前进
  • [0, 1]此处没有玩家,继续前进
  • [0, 2]找到一个玩家!将它们向右移动到[0, 3]
  • [0, 3]找到一个玩家!将它们向右移动到[0, 4]
  • [0, 4]找到一个玩家!将它们向右移动到[0, 5]

在5处,循环结束。由于你添加的缓冲区,你的阵列是6x6,所以玩家被隐藏在机翼而不会导致程序崩溃。你应该做一些事情:

  • 找到并移动播放器breakreturn后,他们只会移动一次。
  • 将阵列设为5x5(或打印全部6x6),以便您可以看到所有内容。
  • 执行某些边界检查,以便不允许玩家从j = 5向右移动。
  • move_up中注意同样的错误,当你增加i时会发生这种错误。

答案 2 :(得分:0)

你的循环允许检查位置两次,一次在i,j,再次在i,(j + 1)(或其他一些变体)。这可能不是你想要的。找到播放器后,你应该进行更新,然后打破循环。

此外,理论上,代码允许索引传递数组的边界。也不是所期望的。您可以考虑边界检查。当玩家向右移动并且右边有一堵墙时,我不知道应该发生什么。他不动吗?环绕? LR角可能会导致现在出现seg故障。

答案 3 :(得分:0)

您似乎在get_player_loc函数中转换了行和列indeces,并且有两个return语句(编译器应警告您无法访问的代码),调用代码不需要或使用它们

首先,初始化rowcol变量。 (取自main的值。)

int row = 3;
int col = 3;

更改get_player_loc功能,以便只更新全局rowcol。如果找不到播放器,它会将rowcol设置为0

void get_player_loc(void)
{
    for (int j = 0; j < 5; j++) {
        for (int k = 0; k < 5; k++) {
            if(map[j][k] == player_loc)
            {
                // The meaning of row and col is set by how they are used
                // to index the array in the move and print functions.  Keep
                // the same order and meaning here.
                row = j;
                col = k;
                return;
            }
        }
    }
    // Set row and col to 0 if the location is not found.
    row = 0;
    col = 0;
    map[0][0] = player_loc;
}

当它们到达边缘时,你仍会遇到问题,因为数组中的索引超出了移动函数的范围,但这是一个不同的问题。