Skip to content

Instantly share code, notes, and snippets.

func getBestMove(players: [Player], whoseTurn: Player, position: Board) async -> Move? {
var best: Move?
switch appState.game.aiType {
case .random:
best = getRandomMove(moves: position.generateMoves(player: whoseTurn))
case .kamikaze:
best = miniMax(position: position, players: players, whoseTurn: players[1], depth: 0)
case .minimax:
best = miniMax(position: position, players: players, whoseTurn: players[1], depth: appState.searchDepth)
case .pruner:
public func generateMoves(player: Player) -> [Move]
{
var moves = [Move]()
for rank in 0..<squaresHigh {
for file in 0..<squaresWide {
if let man = squares[file][rank].man {
if man.player == player {
moves += (man.generateMoves(board: self, x: file, y: rank))
}
}
import SwiftUI
struct GhostModifier: ViewModifier {
let hasGhost: Bool
let isInAWall: Bool
func body(content: Content) -> some View {
if hasGhost {
if isInAWall {
content
func blockedByWall(man: Man, targetSquare: Square) -> Bool {
return targetSquare.squareType == .wall && !man.tools.contains(.ghost)
}
squareView(file: file, rank: rank, color: viewModel.getBackgroundColor(file: file, rank: rank))
.artifactModifier(tool: viewModel.showTool(file: file, rank: rank), squareSize: viewModel.squareSize)
.handoffableModifier(isHighlighted: viewModel.handOffable[file][rank])
import SwiftUI
struct HandoffableModifier: ViewModifier {
let isHighlighted: Bool
func body(content: Content) -> some View {
if isHighlighted {
ZStack {
GeometryReader { geometry in
content
func markHandoffableSquares() {
// the piece handing off the tool can't hand it to itself
notHandOffable[moveStart!.0][moveStart!.1] = true
var handoffables = [(moveStart!.0, moveStart!.1)]
repeat {
handoffables = markHandoffablesAndReturnNextSet(handoffables)
} while !handoffables.isEmpty
}
func getHandoffableNeighbors(file: Int, rank: Int) -> [(Int, Int)] {
var neighbors: [(Int, Int)] = [(Int, Int)]()
for i in file - 1...file + 1 {
for j in rank - 1...rank + 1 {
if i >= 0 && i < board.squaresWide && j >= 0 && j < board.squaresHigh {
if !(i == file && j == rank) {
if !(handOffable[i][j] || notHandOffable[i][j]) {
if board.squares[i][j].man == nil {
notHandOffable[i][j] = true
func markSquare(file: Int, rank: Int) {
if file >= 0 && file < board.squaresWide && rank >= 0 && rank < board.squaresHigh {
if !handOffable[file][rank] && !notHandOffable[file][rank] {
if board.squares[file][rank].man == nil {
notHandOffable[file][rank] = true
}
else if board.squares[file][rank].man!.player != board.whoseTurn {
notHandOffable[file][rank] = true
}
else {
func handOff(_ doit: Bool) {
handingOffTool = doit
if doit {
markHandoffableSquares()
}
else {
handOffable = Array(repeating: Array(repeating: false, count: board.squaresHigh), count: board.squaresWide)
notHandOffable = Array(repeating: Array(repeating: false, count: board.squaresHigh), count: board.squaresWide)
}
}