我试图用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");
}
}
}
答案 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,所以玩家被隐藏在机翼而不会导致程序崩溃。你应该做一些事情:
break
或return
后,他们只会移动一次。j = 5
向右移动。move_up
中注意同样的错误,当你增加i
时会发生这种错误。答案 2 :(得分:0)
你的循环允许检查位置两次,一次在i,j,再次在i,(j + 1)(或其他一些变体)。这可能不是你想要的。找到播放器后,你应该进行更新,然后打破循环。
此外,理论上,代码允许索引传递数组的边界。也不是所期望的。您可以考虑边界检查。当玩家向右移动并且右边有一堵墙时,我不知道应该发生什么。他不动吗?环绕? LR角可能会导致现在出现seg故障。
答案 3 :(得分:0)
您似乎在get_player_loc
函数中转换了行和列indeces,并且有两个return语句(编译器应警告您无法访问的代码),调用代码不需要或使用它们
首先,初始化row
和col
变量。 (取自main
的值。)
int row = 3;
int col = 3;
更改get_player_loc
功能,以便只更新全局row
和col
。如果找不到播放器,它会将row
和col
设置为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;
}
当它们到达边缘时,你仍会遇到问题,因为数组中的索引超出了移动函数的范围,但这是一个不同的问题。