mers/examples/06_TicTacToe.mers

98 lines
2.6 KiB
Plaintext
Raw Normal View History

2023-11-09 15:17:55 +01:00
f1 := 0
f2 := 0
f3 := 0
f4 := 0
f5 := 0
f6 := 0
f7 := 0
f8 := 0
f9 := 0
player := false
2024-03-22 16:50:01 +01:00
load_color := clr -> "echo".run_command(("-n", "-e", clr)).try(
2023-11-09 15:17:55 +01:00
(s, o, e) -> o
e -> ""
2024-03-22 16:50:01 +01:00
)
2023-11-09 15:17:55 +01:00
c_reset := "\\033[0m".load_color
c_green := "\\033[92m".load_color
c_blue := "\\033[94m".load_color
c_gray := "\\033[90m".load_color
c_magenta := "\\033[95m".load_color
pbf := (n, o) -> if n.eq(0)
(c_gray, o, c_reset).concat
else if n.signum.eq(1)
(c_blue, "x", c_reset).concat
else
(c_green, "o", c_reset).concat
print_board := board -> {
((f1, f2, f3), (f4, f5, f6), (f7, f8, f9)).enumerate.for_each((i, (a, b, c)) -> {
(c_gray, "|---|---|---|", c_reset).concat.println
m := 2.subtract(i).product(3).sum(1)
n := m.sum(1)
o := m.sum(2)
(
c_gray, "| ", (a, m).pbf,
c_gray, " | ", (b, n).pbf,
c_gray, " | ", (c, o).pbf,
c_gray, " |"
).concat.println
})
(c_gray, "|---|---|---|", c_reset).concat.println
}
check_board := () -> {
if (f1, f2, f3, f4, f5, f6, f7, f8, f9).filter(f -> f.eq(0)).len.eq(0) 0
2023-11-09 15:17:55 +01:00
else if (f1.eq(0).eq(false), (f1, f2, f3).eq).all f1
else if (f4.eq(0).eq(false), (f4, f5, f6).eq).all f4
else if (f7.eq(0).eq(false), (f7, f8, f9).eq).all f7
else if (f1.eq(0).eq(false), (f1, f4, f7).eq).all f1
else if (f2.eq(0).eq(false), (f2, f5, f8).eq).all f2
else if (f3.eq(0).eq(false), (f3, f6, f9).eq).all f3
else if (f1.eq(0).eq(false), (f1, f5, f9).eq).all f1
else if (f3.eq(0).eq(false), (f3, f5, f7).eq).all f3
}
loop {
2023-11-09 15:17:55 +01:00
(if player c_blue else c_green, "Turn: ", if player "x" else "o", c_reset).concat.println
().print_board
loop {
2023-11-09 15:17:55 +01:00
(if player c_blue else c_green, "> ", c_gray).concat.print
input := ().read_line.trim
2024-03-22 16:50:01 +01:00
input.parse_int.try(
(field) -> {
2023-11-09 15:17:55 +01:00
if (field.gt(0), field.ltoe(9)).all {
(l, m, r) := if field.gt(6) (&f1, &f2, &f3) else if field.gt(3) (&f4, &f5, &f6) else (&f7, &f8, &f9)
col := field.subtract(1).modulo(3)
f := if col.eq(0) l else if col.eq(1) m else r
if f.deref.eq(0) {
f = if player 1 else -1
(())
} else "field already occupied".println
} else {
"number must be 1 <= n <= 9".println
}
}
() -> "not a number!".println
2024-03-22 16:50:01 +01:00
)
}
2023-11-09 15:17:55 +01:00
&player = player.eq(false)
2024-03-22 16:50:01 +01:00
().check_board.try(
2023-11-09 15:17:55 +01:00
() -> (),
winner -> {
"".println
().print_board
if winner.eq(1) {
(c_blue, "The winner is X!", c_reset).concat.println
} else if winner.eq(-1) {
(c_green, "The winner is O!", c_reset).concat.println
} else {
(c_magenta, "Tie", c_reset).concat.println
}
(())
}
2024-03-22 16:50:01 +01:00
)
}