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}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/16 11:20