Answer Key
Your final code should look something like this:
import SwiftUI
struct ContentView: View {
var data = [
[
["🟩","🟩","🟩","🟩","🟩","🟩","🟩","🟧","🟩","🟩","🟩","🟩",
"🟩", "🟩","🟩","🟩"],
["🟩","🟧","🟧","🟧","🟧","🟧","🟧","🟧","🟩","🟧","🟧","🟧",
"🟧","🟧","🟧","🟩"],
["🟩","🟩","🟩","🟩","🟩","🟩","🟩","🟧","🟩","🟩","🟩","🟩",
"🟩","🟩","🟧","🟩"],
["🟩","🟧","🟧","🟧","🟧","🟧","🟩","🟧","🟧","🟧","🟧","🟧",
"🟧","🟧","🟧","🟩"],
["🟩","🟧","🟩","🟩","🟩","🟧","🟩","🟩","🟩","🟩","🟩","🟩",
"🟩","🟩","🟧","🟩"],
["🟩","🟩","🟩","🟩","🟩","🟧","🟧","🟧","🟧","🟧","🟧","🟧",
"🟧","🟧","🟧","🟩"],
["🟩","🟧","🟧","🟧","🟧","🟧","🟩","🟩","🟩","🟩","🟧","🟩",
"🟧","🟩","🟧","🟩"],
["🟩","🟧","🟩","🟩","🟩","🟧","🟩","🟧","🟧","🟧","🟧","🟩",
"🟧","🟩","🟧","🟩"],
["🟩","🟧","🟧","🟧","🟩","🟧","🟩","🟩","🟩","🟩","🟩","🟩",
"🟩","🟩","🟧","🟩"],
["🟩","🟩","🟩","🟧","🟩","🟩","🟩","🟩","🟩","🟩","🟩","🟧",
"🟧","🟧","🟧","🟩"],
["🟩","🟩","🟩","🥕","🟩","🟩","🟩","🟩","🟩","🟩","🟩","🟩",
"🟩","🟩","🟩","🟩"],
],
[
["🟩","🟩","🟩","🟩","🟩","🟩","🟩","🟩","🟩","🟩","🟩","🟩",
"🟩","🟩","🟩","🟩"],
["🟩","🟧","🟧","🟧","🟧","🟧","🟧","🟧","🟩","🟧","🟧","🟧",
"🟧","🟧","🟧","🟩" ],
["🟩","🟩","🟧","🟩","🟩","🟩","🟩","🟧","🟧","🟧","🟩","🟩",
"🟩","🟩","🟧","🟧"],
["🟩","🟧","🟧","🟩","🟧","🟧","🟩","🟧","🟩","🟧","🟧","🟧",
"🟩","🟧","🟧","🟩"],
["🟩","🟩","🟧","🟩","🟩","🟧","🟩","🟩","🟩","🟩","🟩","🟩",
"🟩","🟩","🟧","🟩"],
["🟩","🟩","🟧","🟩","🟩","🟧","🟧","🟧","🟧","🟧","🟧","🟩",
"🟧","🟧","🟧","🟩"],
["🟩","🟩","🟧","🟧","🟩","🟧","🟩","🟩","🟩","🟩","🟧","🟩",
"🟧","🟩","🟩","🟩"],
["🥕","🟧","🟩","🟩","🟩","🟧","🟩","🟧","🟧","🟧","🟧","🟩",
"🟧","🟧","🟧","🟩"],
["🟩","🟧","🟧","🟧","🟩","🟧","🟩","🟧","🟩","🟩","🟧","🟩",
"🟩","🟩","🟧","🟩"],
["🟩","🟩","🟩","🟧","🟧","🟧","🟩","🟧","🟧","🟧","🟧","🟧",
"🟧","🟧","🟧","🟩"],
["🟩","🟩","🟩","🟩","🟩","🟩","🟩","🟩","🟩","🟩","🟩","🟩",
"🟩","🟩","🟩","🟩"],
]
]
@State var playerRow = 2
@State var playerCol = 15
@State var wonGame = false
@State var carrotRow = 10
@State var carrotCol = 3
@State var currentMaze = 1
var carrotLocations = [[10, 3], [7,0]]
var playerLocations = [[0, 7], [3, 15]]
func generateRow(col: [String], drawPlayer: Bool) -> Text {
var textString = ""
for colIndex in 0...col.count - 1 {
if colIndex == playerCol && drawPlayer {
textString += "🐰"
} else {
textString += col[colIndex]
}
}
return Text(textString)
}
func isValidMove(row: Int, col: Int) -> Bool {
let maze = data[currentMaze]
return maze[row][col] == "🟧" || maze[row][col] == "🥕"
}
var body: some View {
Spacer()
VStack {
ForEach(0..<data[currentMaze].count, id: \.self) { rowIndex in
HStack {
generateRow(col: data[currentMaze][rowIndex], drawPlayer:
playerRow == rowIndex)
}
}
}
Spacer()
HStack {
Button {
if playerRow > 0 {
if (isValidMove(row: playerRow - 1, col: playerCol)) {
playerRow -= 1
wonGame = playerRow == carrotRow && playerCol == carrotCol
}
}
} label: {
Text("⬆️").font(.system(size: 50))
}
Button {
let maze = data[currentMaze]
if playerRow < maze.count - 1 {
if (isValidMove(row: playerRow + 1, col: playerCol)) {
playerRow += 1
wonGame = playerRow == carrotRow && playerCol == carrotCol
}
}
} label: {
Text("⬇️").font(.system(size: 50))
}
Button {
if playerCol > 0 {
if (isValidMove(row: playerRow, col: playerCol - 1)) {
playerCol -= 1
wonGame = playerRow == carrotRow && playerCol == carrotCol
}
}
} label: {
Text("⬅️").font(.system(size: 50))
}
Button {
let maze = data[currentMaze]
if playerCol < maze[0].count - 1 {
if (isValidMove(row: playerRow, col: playerCol + 1)) {
playerCol += 1
wonGame = playerRow == carrotRow && playerCol == carrotCol
}
}
} label: {
Text("➡️").font(.system(size: 50))
}
}
.padding(.bottom)
.alert("Congrats! You won!", isPresented: $wonGame) {
Button("OK") {
currentMaze += 1
if currentMaze == data.count {
currentMaze = 0
}
carrotRow = carrotLocations[currentMaze][0]
carrotCol = carrotLocations[currentMaze][1]
playerRow = playerLocations[currentMaze][0]
playerCol = playerLocations[currentMaze][1]
}
}
Spacer()
}
}