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

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

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

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1020閲覧

リトライをして迷路を再構築した際に、スタートとゴールが必ずつながる迷路にしたい

fukayu04

総合スコア1

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/09/11 12:45

swiftの勉強のために、ジャイロセンサーで動かす迷路アプリを作成をしています。
迷路自体はできたのですが、リトライしたときに迷路がシャッフルされる仕組みに苦戦しています。
ただ単純にシャッフルされるだけでなく、迷路がつながっていない場合にそのまま再構築せずにシャッフルし続ける仕組みにしたいです。

◆環境

Xcodeバージョン:11.1
swift:5

◆前提・実現したいこと

◯実現できていること
迷路を[[Int]]の配列で作成。リトライするとシャッフルされる。
配列の値のうち、0を通路、1を壁、2をスタート、3をゴールとして定義。

壁に当たるorゴール地点到着で、アラートでリトライボタンを表示。
リトライボタンを押したら、func retryを起動。
→迷路の配列をシャッフル&迷路の再構築&スタート地点から再スタート。

◯うまく実現できていないこと

迷路をシャッフルした際にifで条件分岐させて、迷路の通路同士が隣接していなかったらreturn falseを返す。
迷路の通路が繋がる形で再構築されるまでwhile文で再シャッフルし続ける。

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

エラーメッセージは出ていないのですが、実機転送をしてリトライをしても、スタートとゴールがつながらない迷路が再構築されてしまいます。
初期状態(アプリ立ち上げ)は必ずこの配置で、黒い部分が通れるところです。
イメージ説明

リトライを押して迷路を再構築しても、以下のように黒の通路がゴールまで繋がらない状態になってしまうことがあります。
イメージ説明

該当のソースコード

*そもそも以下のコードの条件分岐だけでは、完璧に迷路が隣接しないかと思います。
ex.2マスだけ隣接する形の離れ小島ができてしまうなど

ですが、その条件分岐ですらもうまく出来ておらず、1マスの離れ小島などが出来てしまっているのでこの度質問させていただきました。

swift

1func retry(){ 2 var tempmaze:[[Int]] = [[]] 3 tempmaze.removeAll() 4 5 for num in 0 ..< maze.count{ 6 tempmaze.append(maze[num].shuffled()) 7 } 8 9 var remaze = tempmaze.shuffled() 10 11 while mazecheck(remaze: remaze){ 12 tempmaze.removeAll() 13 14 for num in 0 ..< maze.count{ 15 tempmaze.append(maze[num].shuffled()) 16 } 17 18 remaze = tempmaze.shuffled() 19 } 20 21 wallRectArray.removeAll() 22 23 mazerecreate(remaze: remaze, mazewidth: mazewidth, mazeheight: mazeheight, mazeoffx: mazeoffx, mazeoffy: mazeoffy) 24 25 playerView.center = startView.center 26 27 playerView.backgroundColor = UIColor.gray 28 view.addSubview(playerView) 29 30 if !playerMotionManager.isAccelerometerActive { 31 self.startAccelerometer() 32 } 33 speedX = 0.0 34 speedY = 0.0 35} 36 37func mazerecreate(remaze: [[Int]], mazewidth:CGFloat, mazeheight:CGFloat, mazeoffx:CGFloat, mazeoffy:CGFloat){ 38 for mazey in 0 ..< remaze.count { 39 for mazex in 0 ..< remaze[mazey].count{ 40 switch remaze[mazey][mazex] { 41 42 case 0: 43 let passview = createview(x:mazex, y:mazey, width:mazewidth, height:mazeheight, offsetX:mazeoffx, offsetY:mazeoffy) 44 passview.backgroundColor = UIColor.white 45 view.addSubview(passview) 46 47 case 1: 48 let wallview = createview(x:mazex, y:mazey, width:mazewidth, height:mazeheight, offsetX:mazeoffx, offsetY:mazeoffy) 49 wallview.backgroundColor = UIColor.black 50 view.addSubview(wallview) 51 wallRectArray.append(wallview.frame) 52 53 case 2: 54 startView = createview(x:mazex, y:mazey, width:mazewidth, height:mazeheight, offsetX:mazeoffx, offsetY:mazeoffy) 55 startView.backgroundColor = UIColor.green 56 view.addSubview(startView) 57 58 case 3: 59 goalView = createview(x:mazex, y:mazey, width:mazewidth, height:mazeheight, offsetX:mazeoffx, offsetY:mazeoffy) 60 goalView.backgroundColor = UIColor.red 61 view.addSubview(goalView) 62 default:break 63 } 64 } 65 } 66} 67 68func mazecheck(remaze:[[Int]]) -> Bool { 69 var checkValue:String = "nil" 70 for y in 0 ..< maze.count { 71 for x in 0 ..< maze [y].count{ 72 if remaze[y][x] == 0{ 73 74 if y == 9 { 75 if x == 5 { 76 if remaze[y][x] != remaze[y-1][x] && remaze[y][x] != remaze[y][x-1]{ 77 checkValue = "false" 78 } 79 } 80 81 else{ 82 if x == 0 { 83 if remaze[y][x] != remaze[y][x+1] && remaze[y][x] != remaze[y-1][x]{ 84 checkValue = "false" 85 } 86 } 87 else if remaze[y][x] != remaze[y][x+1]{ 88 if remaze[y][x] != remaze[y-1][x] && remaze[y][x] != remaze[y][x-1]{ 89 checkValue = "false" 90 } 91 } 92 } 93 } 94 95 else if y == 0 { 96 if x == 5 { 97 if remaze[y][x] != remaze[y+1][x] && remaze[y][x] != remaze[y][x-1]{ 98 checkValue = "false" 99 } 100 } 101 102 else if x == 0 { 103 if remaze[y][x] != remaze[y][x+1] && remaze[y][x] != remaze[y+1][x]{ 104 checkValue = "false" 105 } 106 } 107 else{ 108 if remaze[y][x] != remaze[y+1][x]{ 109 if remaze[y][x] != remaze[y][x+1] && remaze[y][x] != remaze[y][x-1]{ 110 checkValue = "false" 111 } 112 } 113 } 114 } 115 116 else if x == 0 { 117 if remaze[y][x] != remaze[y+1][x] && remaze[y][x] != remaze[y-1][x] && remaze[y][x] != remaze[y][x+1]{ 118 checkValue = "false" 119 } 120 } 121 122 else if x == 5 { 123 if remaze[y][x] != remaze[y+1][x]{ 124 if remaze[y][x] != remaze[y-1][x] && remaze[y][x] != remaze[y][x-1]{ 125 checkValue = "false" 126 } 127 } 128 } 129 130 else if remaze[y][x] != remaze[y+1][x] && remaze[y][x] != remaze[y][x+1]{ 131 if remaze[y][x] != remaze[y-1][x] && remaze[y][x] != remaze[y][x-1]{ 132 checkValue = "false" 133 } 134 } 135 136 } 137 } 138 } 139 if checkValue == "false" { 140 return false 141 } 142 else{ 143 return true 144 } 145}

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

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

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

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

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

guest

回答1

0

ベストアンサー

迷路を作るアルゴリズムは様々あり、質問者さんの言う通り、今のアルゴリズムだと不完全です。
有名所だと
棒倒し法
穴掘り法(道延ばし法)
壁のばし法
などがあります。
気にったものを調べてもらい、swiftにで自分で実装してみると成長にもつながるかもしれません。
ぜひこれを機会にどんどん成長していきましょう

投稿2020/09/11 14:10

soshiharami

総合スコア25

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

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

fukayu04

2020/09/16 11:20

色々と有名なアルゴリズムがあるのですね・・・ ネットで調べてみて根本から見直ししてみます! 素早いご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問