Tic-tac-toe: Difference between revisions

m (→‎{{header|RapidQ}}: Board(9) and WInPos(8, ...) are not necessary.)
Line 4,458:
#
func init . .
linewidth 2
clear
color 666
move 34 496
line 34 8020
move 62 496
line 62 8020
move 10 2872
line 86 2872
move 10 5644
line 86 5644
linewidth 2.5
for i = 1 to 9
f[i] = 0
.
if state = 1
timer 0.2
.
.
func draw ind . .
c = (ind - 1) mod 3
r = (ind - 1) div 3
x = c * 28 + 20
y = r * 28 + 1430
if f[ind] = 4
color 900
move x - 7 y - 7
line x + 7 y + 7
move x + 7 y - 7
line x - 7 y + 7
elif f[ind] = 1
color 009
move x y
circle 10
color -2
circle 7.5
.
.
func sum3 a d . st .
for i = 1 to 3
s += f[a]
a += d
.
if s = 3
st = -1
elif s = 12
st = 1
.
.
func rate . res done .
res = 0
for i = 1 step 3 to 7
call sum3 i 1 res
.
for i = 1 to 3
call sum3 i 3 res
.
call sum3 1 4 res
call sum3 3 2 res
cnt = 1
for i = 1 to 9
if f[i] = 0
cnt += 1
.
.
res *= cnt
done = 1
if res = 0 and cnt > 1
done = 0
.
.
func minmax player alpha beta . rval rmov .
call rate rval done
if done = 1
if player = 1
rval = -rval
.
else
rval = alpha
start = random 9
mov = start
repeat
if f[mov] = 0
f[mov] = player
call minmax (5 - player) (-beta) (-rval) val h
val = -val
f[mov] = 0
if val > rval
rval = val
rmov = mov
.
.
else
mov = mov mod 9 + 1
until mov = start or rval >= betaalpha
start = random 9
.
rval mov = alphastart
.
repeat
if f[mov] = 0
f[mov] = player
call minmax (5 - player) (-beta) (-rval) val h
val = -val
f[mov] = 0
if val > rval
rval = val
rmov = mov
.
.
mov = mov mod 9 + 1
until mov = start or rval >= beta
.
.
.
func show_result val . .
color 555
move 16 844
if val < 0
# this never happens
text "You won"
elif val > 0
text "You lost"
else
text "Tie"
.
state += 2
.
func computer . .
call minmax 4 -11 11 val mov
f[mov] = 4
call draw mov
call rate val done
state = 0
if done = 1
call show_result val
.
.
func human . .
mov = floor ((mouse_x - 6) / 28) + 3 * floor ((mouse_y - 16) / 28) + 1
if f[mov] = 0
f[mov] = 1
call draw mov
state = 1
timer 0.5
.
.
on timer
call rate val done
if done = 1
call show_result val
else
call computer
.
.
on mouse_down
if state = 0
if mouse_x > 6 and mouse_x < 90 and mouse_y <> 8416
call human
.
elif state >= 2
state -= 2
call init
.
.
call init
2,060

edits