ページ 11

2次元フィールドの移動がうまくいきません(初心者)

Posted: 2016年7月26日(火) 00:21
by heberoke
現在VisualStudioでプログラムを書いているのですがうまくいきません。

8を入力すると上に移動し、2を入力すると下に移動、6を入力すると右、4を入力すると左に移動し、左上からスタートして右下にたどり着くとゴールというものです。
しかし、数回入力すると不具合が起きます。
問題点と改善方法を教えていただきたいです。
プログラムは以下のようなものです。
プログラム初心者ですがよろしくお願いします。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

void ShowMap(int map[8][10]);

int main(void)
{
int map[8][10] = {0}, inputNUM, lineY = 0, lineX = 0;
map[lineY][lineX] = 1;

while (1)
{
system("cls");

ShowMap(map);

scanf("%d", &inputNUM);//方向を入力

if (inputNUM == 8 && lineY != 0)//上方向に移動する場合
{
map[lineY - 1][lineX] = map[lineY][lineX];
map[lineY][lineX] = 0;
lineY = -1;
}
else if (inputNUM == 2 && lineY != 7)//下方向に移動する場合
{
map[lineY + 1][lineX] = map[lineY][lineX];
map[lineY][lineX] = 0;
lineY = +1;
}
else if (inputNUM == 4 && lineX != 0)//左方向に移動する場合
{
map[lineY][lineX - 1] = map[lineY][lineX];
map[lineY][lineX] = 0;
lineX = -1;
}
else if (inputNUM == 6 && lineX != 9)//右方向に移動する場合
{
map[lineY][lineX + 1] = map[lineY][lineX];
map[lineY][lineX] = 0;
lineX = +1;
}
else if (map[7][9] == 1)//ゴールにたどり着いた場合
{
break;
}
}

return 0;
}

void ShowMap(int map[][10])
{
int i, j;

printf(" ↓スタート\n");
printf("┃ ┣━┳━┳━┳━┳━┳━┳━┳━┳━┓\n");
for (j = 0; j<8; j++)
{
printf("┃");
for (i = 0; i<10; i++)
{
if (map[j] == 1)//座標の値が1だった場合
{
printf("○");
}
else if(map[j] == 0)//座標の値が0だった場合
{
printf(" ");
}
if (i<8)
{
printf(" ");
}
}
printf(" ┃\n");
if (j < 7)
{
printf("┣ ╋ ╋ ╋ ╋ ╋ ╋ ╋ ╋ ╋ ┫\n");
}
}
printf("┗━┻━┻━┻━┻━┻━┻━┻━┻━┫ ┃\n");
printf(" ↑ゴール\n");

printf("  8\n");
printf(" ↑\n");
printf("4← →6\n");
printf(" ↓\n");
printf(" 2\n");

}

Re: 2次元フィールドの移動がうまくいきません(初心者)

Posted: 2016年7月26日(火) 01:18
by みけCAT
ソースコードを提示する際は、BBCodeを有効にした(無効にしない)状態でBBCodeのcodeタグで囲んでいただけると、見やすくてありがたいです。
heberoke さんが書きました:しかし、数回入力すると不具合が起きます。
問題点と改善方法を教えていただきたいです。
座標を更新する所の式が間違っているので、範囲外アクセスを起こして未定義動作になる可能性があります。

lineY = -1; → lineY--;
lineY = +1; → lineY++;
lineX = -1; → lineX--;
lineX = +1; → lineX++;

Re: 2次元フィールドの移動がうまくいきません(初心者)

Posted: 2016年7月26日(火) 15:04
by amehirune
オフトピック
おそらく質問主さんは、

コード:

lineY -= 1;
lineX += 1;
という風に描きたかったのを間違えてしまい、
それがVisualStudioの仕様で自動スペースが入ってしまったんでしょうね…