質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

2330閲覧

目的地までの軌跡を表示する方法

fit.s

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2017/07/18 02:07

編集2017/07/18 02:16

###前提・実現したいこと
先日、Yahoo知恵袋に「ゴールまでの軌跡を表示していくゲームを作りたい」
という質問を見つけて他の方の解答やネットで見つけたソースを参考に作ってみました。

自分にも動くモノが作れてかなり感動したのですが、肝心の足跡を残す機能を
どのように実装すればいいのかわかりません。

解答の一つに「2次元配列にマップを作って移動したら元の位置に+を入れるだけです。」
とあったのですがどうすればいいのでしょか?
教えてください。

###発生している問題・エラーメッセージ

エラーメッセージ

###該当のソースコード
#include <stdio.h>
#include <stdlib.h>
#define N 5

int main(void)
{
int key='0';
int i, j, y=0, x=1;
int map[N][N];
int check[N][N]; //足跡用の配列を作ったのですが、どう扱っていいのかわかりません。

//壁 for(i=0; i<N; i++){ for(j=0; j<N; j++){ map[i][j]=1; check[N][N]=0; //初期化 } } //通路 for(i=1; i<N-1; i++){ for(j=1; j<N-1; j++){ map[i][j]=0; } } map[0][1]=3; //入口 : スタート map[4][3]=4; //出口 : ゴール while(key!='q') //キー入力 'q'キーで終了 { key=getch(); switch((key == 0x00 || key == 0xe0) ? getch(): key) { case 0x48:if((y>0)&&(map[y-1][x]!=1)) y--;break;//上 case 0x50:if((y<N-1)&&(map[y+1][x]!=1)) y++;break;//下 case 0x4b:if((x>0)&&(map[y][x-1]!=1)) x--;break;//左 case 0x4d:if((x<N-1)&&(map[y][x+1]!=1)) x++;break;//右 default:break; } //描画 system("cls"); for(i=0; i<N; i++){ for(j=0; j<N; j++){ if(y==i && x==j) printf("@"); else if(map[i][j]==1) printf("■"); else if((map[i][j]==0) || (map[0][1]==3 && map[4][3]==4)) printf(" "); else printf("+"); //どれでもなければ、+が付くと思ったのですがつきませんでした。 } printf("\n"); } } return 0;

}

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
Notepad++で書いてVSのclコマンドでコンパイルしてます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2017/07/18 02:32

コードはバッククオート三つで括ってください。よくわからない場合は、マークダウン記法について調べてみてください。
fit.s

2017/07/18 06:49

ご指摘ありがとうございます。 これ、' ` ' バックオートって名前だったんですね。 数字の1の隣にあるのに単独で使ったことなかったです。 次から気を付けます。
LouiS0616

2017/07/18 06:51

シングルクオート' ダブルクオート" バッククオート` 似てますよね...
LouiS0616

2017/07/18 06:52

マークダウン記法を使っていないと回答してくれない人もいます、必ず使うようにしてくださいね。
guest

回答1

0

ベストアンサー

こんにちは。

map[0][1]=3; //入口 : スタート

map[4][3]=4; //出口 : ゴール

があるので、if((map[i][j]==0) || (map[0][1]==3 && map[4][3]==4)) printf(" ");の条件が常に成立しますから、次のelse節のprintf("+");は実行されません。

if(map[i][j]==0) printf(" ");
とすればスタートとゴールに+が表示されるだろうと思います。

ところで、そもそもmap[][]に「軌跡」を記録していないようです。
map[y][x]に通った位置を記録(例えば2とか?)すれば、軌跡にが表示されると思いますよ。

なお、表示する文字が全角と半角が入り交じると桁ズレしますから統一することをお勧めします。

投稿2017/07/18 03:38

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fit.s

2017/07/18 06:50

表示の方は@とスペースと四角とプラスは全角に統一します。 指摘していただいた部分は修正しました。 ``` //足跡 追加した部分 for(i=1; i<N-1; i++){ for(j=1; j<N-1; j++){ map[i][j]=2; } } map[0][1]=0; //入口 : スタート map[4][3]=0; //出口 : ゴール //描画 system("cls"); for(i=0; i<N; i++){ for(j=0; j<N; j++){ if(y==i && x==j) printf("@"); else if(map[i][j]==0) printf(" "); else if(map[i][j]==1) printf("■"); else if(map[i][j]==2)printf("+"); } printf("\n"); } ``` keyの入力をどう保存すればいいのかがわかりません。 for文のように一周させると通路としていたところが 全て”+”に塗りつぶされてしまします。 スタート地点からゴールまで移動した跡をどうゆう風に残せばいいでしょうか?
Chironian

2017/07/18 07:44

> for文のように一周させると通路としていたところが 全て”+”に塗りつぶされてしまします 全ての通路を通れば軌跡で埋まって当然では? > ゴールまでの軌跡を表示していく 既にこの要件を満たしいてるように思います。 きっとfit.sさんは、現状とは異なるイメージをお持ちなのでしょうね。 そのイメージを元に具体的な表示例を作ってみるとよいと思いますよ。 その過程で対応方法を思いつくことは良く有ります。
fit.s

2017/07/18 08:21

``` /* イメージを作ってみました。 こんな風に@を移動させると跡を残していく感じです。 */ #include <stdio.h> #define N 5 int main(void) { int map[N][N]={ {1, 2, 1, 1, 1}, {1, 2, 0, 0, 1}, {1, 2, 2, 2, 1}, {1, 0, 0, 0, 1}, {1, 1, 1, 0, 1}, }; int i, j, y, x; y=3; x=3; //キーで入力部分 for(i=0; i<N; i++){ for(j=0; j<N; j++){ if(y==i && x==j) printf("@"); else{ switch(map[i][j]) { case 0 : printf(" "); break;//全角スペース 通路部分と出口 case 1 : printf("■"); break;//壁 case 2 : printf("+"); break;//入口から@が移動してきた跡  default : break; } } } printf("\n"); } return 0; } ```
Chironian

2017/07/18 08:46

現状と大差ないようですね。 ゴールに+を表示しないだけで終わると思います。 頑張ってください。
Chironian

2017/07/18 08:50

ああっ。 ちゃんとmap[y][x]=2;を適切な位置にいれてますか? > map[y][x]に通った位置を記録(例えば2とか?)すれば、軌跡に+が表示されると思いますよ。
fit.s

2017/07/18 09:08

もう少し時間をかけてがんばってみます。 みなさん、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問