home *** CD-ROM | disk | FTP | other *** search
- # test file for tcl
-
- source {<tcl$Dir>.!Choices}
-
- proc beep {} {puts -nonewline \a}
-
- w_init oxo
-
- source {<tcl$Dir>.library.debug}
-
- w_box progInfo create "About this program"\
- { vlist {info Name OXO}
- {info Purpose "Game"}
- {info "Author" C.T.Stretch}
- {info Version 0.00}
- }
-
- w_bar -menu { OXO {Info -dbox progInfo}
- {Quit -click exit}
- }\
- -click {w_draw mainwin open}
-
- proc restart {}\
- { global board game winner player game free finished mainwin wait
- set game(X) ""
- set game(O) ""
- set free 012345678
- set player $winner
- set finished 0
- swap
- set stuff [array names board]
- set ii ""
- foreach i $stuff\
- { lappend ii $board($i)
- unset board($i)
- }
- eval w_draw mainwin delete $ii
- if {!$wait&&($player=="X")} findmove
- }
-
- proc swap {}\
- { global player opponent
- set opponent $player
- if {$player == "X"} {set player O} else {set player X}
- }
-
- proc square { x y}\
- {
- set x [expr int($x)-1]
- if {$x<0} {set x 0}
- if {$x>2} {set x 2}
- set y [expr int($y)-1]
- if {$y<0} {set y 0}
- if {$y>2} {set y 2}
- set z [expr $x+3*$y]
- }
-
- proc point {z}\
- { set x [expr $z%3+1.5]
- set y [expr $z/3+1.5]
- set p ($x,$y)
- }
-
- proc makemove {z}\
- { global player opponent free board mainwin game lines winner finished
- set game($player) $game($player)$z
- regsub -all \[a$game(X)$game(O)\] 012345678 "" free
- set board($z) [w_draw mainwin text [point $z] $player -fn@50p -ocm ]
- foreach line $lines\
- { if {![regexp \[$line\] $game($opponent)$free]}\
- { set winner $player
- set finished 1
- set board($line)\
- [w_draw mainwin above -1 path\
- [point [string index $line 0]]-[point [string index $line 2]]\
- -t.05i -c255:0:0\
- ]
- }
- }
- if {[string length $free]==0}\
- { set finished 1
- set winner $player
- }
- swap
- }
-
- proc findmove {}\
- { global free rand lines scores game
- set opt -1
- set f [split $free ""]
- foreach s $f \
- { set score 0
- foreach l $lines \
- { if {[string match *$s* $l]} \
- { regsub -all \[^$game(X).\] $l "" mine
- regsub -all \[^$game(O).\] $l "" yours
- incr score $scores([string length $mine][string length $yours])
- }
- }
- if {$score>$opt} {set opt $score;set n $s}
- }
- makemove $n
- }
-
- proc getmove {z}\
- { global free
- if {[string match *$z* $free]} {makemove $z}\
- else beep
- }
-
- proc clickproc { x y }\
- { global player game finished wait
- if { $finished } { beep; return}
- set z [square $x $y]
- if {$player=="X"} findmove\
- else {getmove $z;if {!$wait&&!$finished} findmove}
- }
-
- set winner X
- set wait 1
- set board(1) x
- unset board(1)
- set lines {012 345 678 036 147 258 048 246}
- set scores(00) 40
- set scores(01) 70
- set scores(10) 100
- set scores(02) 10000
- set scores(11) 0
- set scores(20) 100000
-
- w_draw mainwin create -page 5ix5i -click {clickproc %x %y}\
- -close {list 2}\
- -menu {OXO {Info }
- {Wait -tick wait}
- {Clear -click restart}
- {Quit -click exit}
- }
-
- w_draw mainwin \
- path (2,1)-(2,4)(3,1)-(3,4)(1,2)-(4,2)(1,3)-(4,3) -t.1i -r
-
- w_draw mainwin open
-
- restart
-
-
-
-