package main
import "core:fmt"
import "core:os"
import "core:strings"
import mcp "lib:minicactpot"
import console "lib:console"
read_flags :: proc(board: []int) {
if len(os.args) > 1 {
fmt.printf("%v\n", os.args)
for num, i in strings.split(os.args[1], ",") {
if i >= len(board) {
break
}
board[i] = int(num[0]) - '0'
}
}
}
draw_board :: proc(con: ^console.Console, board: []int) {
// vertical
for y in 2 ..< 7 {
left_char := '║' if (y - 1) % 2 != 0 else '╟'
right_char := '║' if (y - 1) % 2 != 0 else '╢'
con->putch(left_char, 1, y)
con->putch(right_char, 13, y)
con->putch('│', 5, y)
con->putch('│', 9, y)
}
// horizontal
for x in 2 ..< 13 {
top_char := '═' if (x - 1) % 4 != 0 else '╤'
bottom_char := '═' if (x - 1) % 4 != 0 else '╧'
con->putch(top_char, x, 1)
con->putch(bottom_char, x, 7)
con->putch('─', x, 3)
con->putch('─', x, 5)
}
// corners
con->putch('╔', 0, 0)
con->putch('╗', 13, 0)
con->putch('╝', 13, 7)
con->putch('╚', 0, 7)
// center
con->putch('┼', 5, 3)
con->putch('┼', 9, 3)
con->putch('┼', 9, 5)
con->putch('┼', 5, 5)
for v, i in board {
// ((index % board_width) * width_step) + x_start_offset
x := ((i % 3) * 4) + 3
// ((index / board_width) * height_step) + y_start_offset
y := (int(i / 3) * 2) + 2
con->putch('0' + rune(v), x, y)
}
}
draw_winning_pattern :: proc(con: ^console.Console, board: []int, pattern: []int) {
for i in pattern {
y := (int(i / 3) * 2) + 2
x := ((i % 3) * 4) + 2
con->write(fmt.tprintf(
console.CURSOR_POSITION + console.CSI + "%d;%dm[%d]",
y,
x,
console.BG_CYAN,
console.FG_BLACK,
board[i],
))
}
con->write(console.RESET_FORMAT)
}
main :: proc() {
board := [9]int{0, 0, 0, 0, 0, 0, 0, 0, 0}
read_flags(board[:])
con := console.create()
defer con->destroy()
con->clear()
draw_board(&con, board[:])
winning_pattern := mcp.solve(board[:])
draw_winning_pattern(&con, board[:], winning_pattern[:])
con->write(fmt.tprintf(console.CURSOR_POSITION, 8, 1))
}