setscreen ("offscreenonly,graphics:250;250,nobuttonbar")
type BestMove :
record
score, x, y : int
end record
var b : array 1 .. 3, 1 .. 3 of int
for i : 1 .. 3
for j : 1 .. 3
b (i, j) := 0
end for
end for
var mx, my, md, mn, moves : int
moves := 0
var nextMove : BestMove
fcn winner : int
var ret := 0
var h, v, d1, d2 : int
for i : 1 .. 3
h := 0
v := 0
d1 := 0
d2 := 0
for j : 1 .. 3
h += b (i, j)
v += b (j, i)
d1 += b (j, j)
d2 += b (4 - j, j)
end for
ret += h div 3 + v div 3 + d1 div 3 + d2 div 3
end for
result sign (ret)
end winner
proc drawBoard
for i : 1 .. 3
for j : 1 .. 3
drawfillbox (i * 50, j * 50, i * 50 + 50, j * 50 + 50, (b (i, j) + 2) * abs (b (i, j)))
drawbox (i * 50, j * 50, i * 50 + 50, j * 50 + 50, black)
end for
end for
View.Update
end drawBoard
fcn fullBoard : boolean
result moves = 9
end fullBoard
fcn minimax (p : int) : BestMove
var w := winner
if w ~= 0| fullBoard then
var ret : BestMove
ret.score := w
result ret
end if
var found := false
var bestMove, tempMove : BestMove
bestMove.score := 0
for i : 1 .. 3
for j : 1 .. 3
if b (i, j) = 0 then
b (i, j) := p
tempMove := minimax (p * -1)
b (i, j) := 0
if bestMove.score * p < tempMove.score * p or ~found then
found := true
bestMove.score := tempMove.score
bestMove.x := i
bestMove.y := j
end if
end if
end for
end for
result bestMove
end minimax
loop
drawBoard
exit when winner ~= 0| fullBoard
mousewhere (mx, my, md)
if md > 0 & mx div 50 > 0 & mx div 50 < 4 & my div 50 > 0 & my div 50 < 4 & b (mx div 50, my div 50) = 0 then
b (mx div 50, my div 50) := 1
moves += 1
drawBoard
if winner = 0 & ~fullBoard then
nextMove := minimax (-1)
b (nextMove.x, nextMove.y) := -1
moves += 1
end if
end if
end loop
if winner < 0 then
put "BLUE WINS!!!"
elsif winner > 0 then
put "GREEN WINS!!!"
else
put "DRAW!!!"
end if |