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

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

ただいまの
回答率

90.62%

  • C

    3573questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 2,154

shirono

score 1

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

1111111111
1000010001
1001000001
1000000001
1000010001
1111111111

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

解答、よろしくお願いします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

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 21:52

    解答ありがとうございます!
    こんな感じのことがやりたかったです。
    知識不足でわかりづらい説明だったのに、ありがとうございます。
    探索をするのは人を想定していました!

    申し訳ないのですが、2つ質問があります。
    1.二次元配列+別にx,y座標を設定する方法を探しているのですが見つかりませんでした。方法か、参考になりそうな文献など知っていましたら教えていただけませんか?
    2.私は迷路といったら二次元配列を使うと思い込んでいたのですが、何か他の方法もあるのでしょうか?調べてみたのですが見つからなかったのでもしあったら教えていただけませんか?

    重ね重ねすみません。

    キャンセル

  • 2015/09/10 22:43 編集

    やりたかった内容と合っていて良かったです。

    長文になってしまいましたが、質問を頂いた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のような図面データ
     →二次元、三次元を問わないと思いますが。今存在しているオープンなデータ形式で作りたい物の条件を満足できなければ、独自フォーマットのファイルを検討しないといけない可能性がある事と、迷路データをどうやって作成するか?などがありそうに思えます。

    --------------------
    頂いた質問の内容とずれている等ありましたら、コメントなど頂ければと思います。

    キャンセル

  • 2015/09/11 11:28

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

    また、勉強を進めるうちにわからないことが出てくるかもれないので、その時はまた教えていただけるとうれしいです!

    キャンセル

  • 2015/09/11 12:15

    お返事ありがとうございます。
    お役に立てたようで 良かったです。

    楽しい物に仕上げていけると良いですね

    キャンセル

0

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/10 18:21

    参考までに
    ・迷路自動生成アルゴリズム
    http://www5d.biglobe.ne.jp/stssk/maze/make.html
    ・探索アルゴリズムを視覚的に楽しむ「迷路で眺める探索アルゴリズム」
    http://gigazine.net/news/20150619-search-algorithm-visualize/

    キャンセル

  • 2015/09/10 21:58

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

    キャンセル

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 18:32

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

    キャンセル

  • 2015/09/10 22:00

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

    キャンセル

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

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3573questions

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