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

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

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

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

Q&A

解決済

3回答

6926閲覧

C言語で迷路を進むプログラムを作成したい

shirono

総合スコア7

C

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

0グッド

0クリップ

投稿2015/09/10 08:52

初めまして。
現在、プログラミングを始めたばかりの初心者です。
C言語でゲームを作成してみたいと思い、迷路の中を進んでゴールへ到達させるプログラムを作ろうと考えています。
私が作成したいのは360度自由に探索ができるプログラムです。
調べた結果、二次元配列を使って壁に1、通路に0を代入して迷路を作成できるということがわかりました。

1111111111
1000010001
1001000001
1000000001
1000010001
1111111111

上記のような感じです。
しかし、これだと1マスずつ上下左右の4方向にしか動けないのではないかと思います。
360度自由に探索ができるプログラムを作成するには、どうしたらいいでしょうか?

解答、よろしくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

こんばんは。

質問中で頂いているような二次元配列を使って迷路を構成するのであれば、
以下のような考え方ではいかがでしょうか?

迷路そのものは格子状に切られていても、360度を見渡せるような形式には出来るのではないかと考えています。
(Y字路のような上下左右に限定されない分かれ道の再現をしたい場合は、kutsulogさんのような配列データの考え方に工夫が必要になると思います。格子状のデータから迷路を構築する場合は、斜めの表現は少し大変そうな印象です。)

イメージ説明
二次元配列の1つの値(壁or通路)をXY空間で大きさを持ったタイルにして考えてやることで
例えば、1つのタイルを100x100の大きさとして、左上(1のタイル)の角の座標を
(x, y) = (0, 0)と決めれば、
自分の位置[緑の円]を(x, y) = (150, 350)のように決められると思います。

加えて、向いてる方向を赤の矢印のように決めてやれば一歩(一度に進む距離)の大きさで
移動後の位置も決められますし、移動後の位置が「壁」か「通路」かも判断ができます。

・二次元配列のデータをXY空間に展開?する
・自分の位置、向きというパラメータを設定する
・一歩で移動する距離、進行方向を変える際の角度を決める
これらを考える事で、「360度自由に」が実現出来るように思えます。

一回の移動量が1マスという前提でしたらすいません。

----- 追記 -----
後で気が付きましたが、穴がありました・・・
以下のようなケースだと、多分大回りが必要だと思えますが
赤の矢印方向に移動するとして単純に移動後の位置が配列上の0か1かで判断してしまうと、通り抜けられてしまいます。
イメージ説明
これを回避するためには、
a)二次元配列データに壁のルールを設ける(壁には最低「配列の1要素」の厚みが必要)
b)配列の隣り合う要素間の境界を考慮する
のいずれかが必要ですね。圧倒的に(1)の方法が簡単ですが

あと、ゲームという事ですし「360度自由に」との事ですので、「探索」をするのはユーザー(人間)を想定していました。(勘違いでなければ良いのですが)

投稿2015/09/10 09:52

編集2015/09/10 11:31
sgr-2

総合スコア294

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

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

shirono

2015/09/10 12:52

解答ありがとうございます! こんな感じのことがやりたかったです。 知識不足でわかりづらい説明だったのに、ありがとうございます。 探索をするのは人を想定していました! 申し訳ないのですが、2つ質問があります。 1.二次元配列+別にx,y座標を設定する方法を探しているのですが見つかりませんでした。方法か、参考になりそうな文献など知っていましたら教えていただけませんか? 2.私は迷路といったら二次元配列を使うと思い込んでいたのですが、何か他の方法もあるのでしょうか?調べてみたのですが見つからなかったのでもしあったら教えていただけませんか? 重ね重ねすみません。
sgr-2

2015/09/10 13:53 編集

やりたかった内容と合っていて良かったです。 長文になってしまいましたが、質問を頂いた2点についてです -------------------- 1.「二次元配列+別にx,y座標を設定する方法」が、回答をさせて頂いた「二次元配列のデータをXY空間に展開?する」を指しているようでしたら。になりますが  配列の1要素をタイルに置き換える時のサイズを決めてしまえば、おのずと求まってくると思います。 例えばになりますが、タイルの大きさを100x100とすれば MazeData[0][0] は 0<= x < TileSize (TileSize = 100) 0<= y < TileSize のように決められると思います。 この時、MazeData[i][j]は i*TileSize <= x < (i + 1) * TileSize j*TileSize <= y < (j + 1) * TileSize のように範囲が求まります。 タイルの各頂点の座標値は、 左上 : (i*TileSize, j*TileSize) 左下 : (i*TileSize, (j + 1) * TileSize) 右上 : ( (i + 1) * TileSize, j*TileSize) 右下 : ( (i + 1) * TileSize, (j + 1) * TileSize) # 座標値は整数型で、xyの軸の方向は図と同じと考えた場合 あと、すいません。文献の方はちょっと思い付くものがありません… -------------------- 2.迷路のデータについて こちらは、私の思い付く範囲になってしまいますが、 (a)画像ファイル(もしくは相当) [二次元限定になりそう]  →斜めの線や曲線など自由度が高くなりますし、迷路データ準備が簡単そうに思えます   画面を二次元の表示にするなら、実際に画面に表示する画像と迷路データとしての画像の2つに分けて、迷路データとしての画像を色で壁と通路を決めるなど (b)いわゆるCADのような図面データ  →二次元、三次元を問わないと思いますが。今存在しているオープンなデータ形式で作りたい物の条件を満足できなければ、独自フォーマットのファイルを検討しないといけない可能性がある事と、迷路データをどうやって作成するか?などがありそうに思えます。 -------------------- 頂いた質問の内容とずれている等ありましたら、コメントなど頂ければと思います。
shirono

2015/09/11 02:28

回頭ありがとうございました! なるほど、わかりやすいお答えありがとうございます。 まずは簡単な迷路のプログラムから作成して、最終的には質問したようなプログラムを作成したいと思っているので、とても参考になりました。 特に迷路に画像ファイルや図面データを使うというアイデアは私には思いつくことが出来なかったと思います。 ありがとうございました。 また、勉強を進めるうちにわからないことが出てくるかもれないので、その時はまた教えていただけるとうれしいです!
sgr-2

2015/09/11 03:15

お返事ありがとうございます。 お役に立てたようで 良かったです。 楽しい物に仕上げていけると良いですね
guest

0

1回に進むますの数を増やせば角度は増やせます

必ず1ます
90:上、下、左、右
45:右上、右下、左上、左下
000
000
001 <- 右下45度に行けない

必ず2ます
90:上、下、左、右
45:右上、右下、左上、左下
22.5:右上右、右下右、右上上、右下下、左上左、左下左、左上上、左下下
00000
00000
00000 <- 左下左22.5度に行けない
10000
00000

一度に必ず進む数を増やせば360度に近づきますが
当然必要なデータは増えます

投稿2015/09/10 09:22

編集2015/09/10 09:30
kutsulog

総合スコア985

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

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

cateye

2015/09/10 09:32

よく分からないのですが・・・ 進む升を増やすという事は、途中の壁は無視するのでしょうか? それとも、経路上の壁も確認するのでしょうか? ならば、1升進むのと変わらないと思いますが? ・・・へんな事を言ってるようなら読み飛ばしてくださいmm
shirono

2015/09/10 13:00

回答ありがとうございました! おお…こんな方法があったとは本当に思いつきませんでした。 自分一人では考えもつかなかったです。 参考にさせていただきます!
guest

0

"迷路"をどう作るかによると思いますが、2次元配列で1升ずつ進むのであれば上、下、左、右、右上、右下、左上、左下(8方向)以外の選択肢があるのでしょうか?
[追記]
探索方法も決まってないようですし、簡単なところから始めてはいかがでしょう?
(まず、上下左右を探索するプログラムを作ってみましょう)

投稿2015/09/10 09:04

編集2015/09/10 09:13
cateye

総合スコア6851

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

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

shirono

2015/09/10 12:58

回答ありがとうございました。 最終的な私が作りたいプログラムが全然思い描けなかったので質問させていただきました。私の説明不足な質問にアドバイスをいただき本当にありがとうございました。 参考URLもありがとうございます。 参考にさせていただきました。 がんばってプログラム作ろうと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問