ÐÏࡱá>þÿ þÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ*0_šîÏ»òÀð^à6Áè(ÆþÿÿÿContentsÿÿÿÿÿÿÿÿÿÿÿÿJ*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ !"#$%&'()*+,-./þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ*0_šîÏ»òÀð^Ð/¼è(ÆþÿÿÿContentsÿÿÿÿÿÿÿÿÿÿÿÿJ*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿýÿÿÿ þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì‹{\rtf1\ansi\deff0\deftab720{\fonttbl{\f0\fswiss MS Sans Serif;}{\f1\froman\fcharset2 Symbol;}{\f2\fmodern Courier New;}{\f3\fswiss\fprq2 System;}} {\colortbl\red0\green0\blue0;\red0\green175\blue0;\red0\green0\blue255;} \deflang1033\pard\plain\f2\fs20\cf2 model\plain\f2\fs20\cf0 : \par \par \plain\f2\fs20\cf1 !Two players (X and Y) "square off" in a familiar child's game;\plain\f2\fs20\cf0 \par \par \plain\f2\fs20\cf2 sets\plain\f2\fs20\cf0 : \par dim /1..3/:; \par board( dim, dim): score, x, y; \par \plain\f2\fs20\cf1 ! there are 8 winning combinations;\plain\f2\fs20\cf0 \par winners/w1..w8/: \par x_wins_w, \plain\f2\fs20\cf1 !=1 if x wins this combo;\plain\f2\fs20\cf0 \par y_wins_w, \plain\f2\fs20\cf1 !=1 if y wins this combo;\plain\f2\fs20\cf0 \par x_blocks_w, \plain\f2\fs20\cf1 !=1 if x blocks y from winning this combo;\plain\f2\fs20\cf0 \par y_blocks_w, \plain\f2\fs20\cf1 !=1 if y blocks x from winning this combo;\plain\f2\fs20\cf0 \par x_checks_w, \plain\f2\fs20\cf1 !=1 if x checks this combo (i.e., holds two squares to y's none);\plain\f2\fs20\cf0 \par y_checks_w, \plain\f2\fs20\cf1 !=1 if y checks this combo;\plain\f2\fs20\cf0 \par x_count_w, \plain\f2\fs20\cf1 !number of squares held by x in this combo;\plain\f2\fs20\cf0 \par y_count_w \plain\f2\fs20\cf1 !number of squares held by y in this combo;\plain\f2\fs20\cf0 \par ; \par wxb( winners, dim, dim) / \par \plain\f2\fs20\cf1 ! horizontal winning combos;\plain\f2\fs20\cf0 \par w1,1,1 w1,1,2 w1,1,3 \par w2,2,1 w2,2,2 w2,2,3 \par w3,3,1 w3,3,2 w3,3,3 \par \plain\f2\fs20\cf1 ! vertical winning combos;\plain\f2\fs20\cf0 \par w4,1,1 w4,2,1 w4,3,1 \par w5,1,2 w5,2,2 w5,3,2 \par w6,1,3 w6,2,3 w6,3,3 \par \plain\f2\fs20\cf1 ! diagonal winners;\plain\f2\fs20\cf0 \par w7,1,1 w7,2,2 w7,3,3 \par w8,1,3 w8,2,2 w8,3,1 \par /:; \par \plain\f2\fs20\cf2 endsets\plain\f2\fs20\cf0 \par \par \plain\f2\fs20\cf2 calc\plain\f2\fs20\cf0 : \par \plain\f2\fs20\cf1 ! the value of each square on the grid is set to the number \par of winning combos it appears in;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( board: score = 0); \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( wxb( w, i, j): score( i, j) = score( i, j) + 1); \par \plain\f2\fs20\cf2 endcalc\plain\f2\fs20\cf0 \par \par \plain\f2\fs20\cf1 ! The primary objective is to win, followed by blocking, followed by checking, \par followed by maximizing the raw score of squares held;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf1 ! Note: set some of the obj coefficients to 0 to allow a player to "beat" \par a handicapped opponent;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 max\plain\f2\fs20\cf0 = \par ( 10000 * x_wins + 1000 * x_blocks + 100 * x_checks + x_score) * x_wt + \par ( 10000 * y_wins + 1000 * y_blocks + 100 * y_checks + y_score) * y_wt \par ; \par \par \plain\f2\fs20\cf1 ! can only have one player on a square;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( board: x + y <= 1); \par \par \plain\f2\fs20\cf1 ! each player gets one square per turn;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( board: x) = x_turns; \par \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( board: y) = y_turns; \par \par \plain\f2\fs20\cf1 ! a player wins if he has three squares in a row;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( winners( w): \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( wxb( w, i, j): \par x_wins_w( w) <= x( i, j); \par y_wins_w( w) <= y( i, j); \par )); \par \plain\f2\fs20\cf1 ! sum up total wins for each player;\plain\f2\fs20\cf0 \par x_wins = \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( winners: x_wins_w); \par y_wins = \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( winners: y_wins_w); \par \par \plain\f2\fs20\cf1 ! count how many squares each player holds in each winning combo;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( winners( w): \par x_count_w( w) = \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( wxb( w, i, j): x( i, j)); \par y_count_w( w) = \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( wxb( w, i, j): y( i, j)); \par ); \par \par \plain\f2\fs20\cf1 ! a player blocks if he spoils an opponent's winning combination;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( winners: \par \plain\f2\fs20\cf1 ! x blocks y if x holds one square and y holds 2;\plain\f2\fs20\cf0 \par 2 * x_blocks_w <= y_count_w; \par y_count_w <= 3 - x_blocks_w; \par x_blocks_w <= x_count_w; \par x_count_w <= 3 - 2 * x_blocks_w; \par \plain\f2\fs20\cf1 ! y blocks x if y holds one square and x holds 2;\plain\f2\fs20\cf0 \par 2 * y_blocks_w <= x_count_w; \par x_count_w <= 3 - y_blocks_w; \par y_blocks_w <= y_count_w; \par y_count_w <= 3 - 2 * y_blocks_w; \par ); \par \plain\f2\fs20\cf1 ! sum up total blocks for each player;\plain\f2\fs20\cf0 \par x_blocks = \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( winners: x_blocks_w); \par y_blocks = \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( winners: y_blocks_w); \par \par \plain\f2\fs20\cf1 ! a player checks a winning combination if he holds two squares \par versus his opponent's none;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( winners: \par \plain\f2\fs20\cf1 ! x checks combo?;\plain\f2\fs20\cf0 \par 2 * x_checks_w <= x_count_w; \par x_count_w <= 3 - x_checks_w; \par y_count_w <= 3 - 3 * x_checks_w; \par \plain\f2\fs20\cf1 ! y checks combo?;\plain\f2\fs20\cf0 \par 2 * y_checks_w <= y_count_w; \par y_count_w <= 3 - y_checks_w; \par x_count_w <= 3 - 3 * y_checks_w; \par ); \par \plain\f2\fs20\cf1 ! sum up total checks for each player;\plain\f2\fs20\cf0 \par x_checks = \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( winners: x_checks_w); \par y_checks = \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( winners: y_checks_w); \par \par \plain\f2\fs20\cf1 ! compute the raw score of squares held by each player;\plain\f2\fs20\cf0 \par x_score = \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( board: score * x); \par y_score = \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( board: score * y); \par \par \plain\f2\fs20\cf1 ! binaries;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( board: \plain\f2\fs20\cf2 @bin\plain\f2\fs20\cf0 ( x); \plain\f2\fs20\cf2 @bin\plain\f2\fs20\cf0 ( y)); \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( winners: \plain\f2\fs20\cf2 @bin\plain\f2\fs20\cf0 ( x_blocks_w); \plain\f2\fs20\cf2 @bin\plain\f2\fs20\cf0 ( y_blocks_w)); \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( winners: \plain\f2\fs20\cf2 @bin\plain\f2\fs20\cf0 ( x_checks_w); \plain\f2\fs20\cf2 @bin\plain\f2\fs20\cf0 ( y_checks_w)); \par \par \par \plain\f2\fs20\cf2 data\plain\f2\fs20\cf0 : \par \plain\f2\fs20\cf1 ! Displays the layout of the final grid;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @text\plain\f2\fs20\cf0 () = \plain\f2\fs20\cf2 @write\plain\f2\fs20\cf0 ( \plain\f2\fs20\cf2 @newline\plain\f2\fs20\cf0 (1), "Board #", x_turns + y_turns,":",\plain\f2\fs20\cf2 @newline\plain\f2\fs20\cf0 ( 1)); \par \plain\f2\fs20\cf2 @text\plain\f2\fs20\cf0 () = \plain\f2\fs20\cf2 @writefor\plain\f2\fs20\cf0 ( board( i, j): 3*" ",\plain\f2\fs20\cf2 @if\plain\f2\fs20\cf0 ( x, "X", \plain\f2\fs20\cf2 @if\plain\f2\fs20\cf0 ( y, "O", ".")), \par \plain\f2\fs20\cf2 @if\plain\f2\fs20\cf0 ( j #eq# \plain\f2\fs20\cf2 @size\plain\f2\fs20\cf0 ( dim), \plain\f2\fs20\cf2 @newline\plain\f2\fs20\cf0 ( 1), "")); \par \plain\f2\fs20\cf2 @text\plain\f2\fs20\cf0 () = \plain\f2\fs20\cf2 @write\plain\f2\fs20\cf0 ( \plain\f2\fs20\cf2 @newline\plain\f2\fs20\cf0 ( 1)); \par \plain\f2\fs20\cf2 @text\plain\f2\fs20\cf0 () = \plain\f2\fs20\cf2 @write\plain\f2\fs20\cf0 ( \plain\f2\fs20\cf2 @if\plain\f2\fs20\cf0 ( x_wins, "!!!X WINS!!!", \plain\f2\fs20\cf2 @if\plain\f2\fs20\cf0 ( y_wins, "!!!Y WINS!!!", ""))); \par \plain\f2\fs20\cf2 @text\plain\f2\fs20\cf0 () = \plain\f2\fs20\cf2 @write\plain\f2\fs20\cf0 ( \plain\f2\fs20\cf2 @if\plain\f2\fs20\cf0 ( x_turns + y_turns #eq# \plain\f2\fs20\cf2 @size\plain\f2\fs20\cf0 ( board) #and# \par x_wins #lt# 1 #and# y_wins #lt# 1, "!!!CAT...NO WINNER!!!","")); \par \plain\f2\fs20\cf2 enddata\plain\f2\fs20\cf0 \par \par \plain\f2\fs20\cf2 init\plain\f2\fs20\cf0 : \par x_wins = 0; \par y_wins = 0; \par \plain\f2\fs20\cf2 endinit\plain\f2\fs20\cf0 \par \par \plain\f2\fs20\cf2 calc\plain\f2\fs20\cf0 : \par \par \plain\f2\fs20\cf1 ! Set patameters;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @set\plain\f2\fs20\cf0 ( 'DEFAULT'); \par \plain\f2\fs20\cf2 @set\plain\f2\fs20\cf0 ( 'OROUTE', 1); \par \plain\f2\fs20\cf2 @set\plain\f2\fs20\cf0 ( 'TERSEO', 2); \par \plain\f2\fs20\cf2 @set\plain\f2\fs20\cf0 ( 'WNLINE', 10000); \par \plain\f2\fs20\cf2 @set\plain\f2\fs20\cf0 ( 'LINLEN', 150); \par \plain\f2\fs20\cf2 @set\plain\f2\fs20\cf0 ( 'STAWIN', 0); \par \par \plain\f2\fs20\cf1 ! no turns taken yet;\plain\f2\fs20\cf0 \par x_turns = 0; \par y_turns = 0; \par \par \plain\f2\fs20\cf1 ! let's play;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( board | x_wins #lt# 1 #and# y_wins #lt# 1 #and# \par ( x_turns + y_turns) #lt# \plain\f2\fs20\cf2 @size\plain\f2\fs20\cf0 ( board): \par \par \plain\f2\fs20\cf1 ! x moves first;\plain\f2\fs20\cf0 \par x_turns = x_turns + 1; \par x_wt = 1; y_wt = 1 - x_wt; \par \plain\f2\fs20\cf2 @solve\plain\f2\fs20\cf0 (); \par \par \plain\f2\fs20\cf1 ! fix all of x's moves;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( board: \par \plain\f2\fs20\cf2 @ifc\plain\f2\fs20\cf0 ( x: \par x = 1; \par ); \par ); \par \par \plain\f2\fs20\cf1 ! y moves next;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @ifc\plain\f2\fs20\cf0 ( x_wins #lt# 1 #and# x_turns + y_turns #lt# \plain\f2\fs20\cf2 @size\plain\f2\fs20\cf0 ( board): \par y_turns = y_turns + 1; \par x_wt = 0; y_wt = 1 - x_wt; \par \plain\f2\fs20\cf2 @solve\plain\f2\fs20\cf0 (); \par \par \plain\f2\fs20\cf1 !fix all y's moves;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( board: \par \plain\f2\fs20\cf2 @ifc\plain\f2\fs20\cf0 ( y: \par y = 1; \par ); \par ); \par ); \par ); \par \par \plain\f2\fs20\cf2 endcalc\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 end\plain\f2\fs20\cf0 \par \par } ì‹{\rtf1\ansi\deff0\deftab720{\fonttbl{\f0\fswiss MS Sans Serif;}{\f1\froman\fcharset2 Symbol;}{\f2\fmodern Courier New;}{\f3\fswiss\fprq2 System;}} {\colortbl\red0\green0\blue0;\red0\green175\blue0;\red0\green0\blue255;} \deflang1033\pard\plain\f2\fs20\cf2 model\plain\f2\fs20\cf0 : \par \par \plain\f2\fs20\cf1 !Two players (X and Y) "square off" in a familiar child's game;\plain\f2\fs20\cf0 \par \par \plain\f2\fs20\cf2 sets\plain\f2\fs20\cf0 : \par dim /1..3/:; \par board( dim, dim): score, x, y; \par \plain\f2\fs20\cf1 ! there are 8 winning combinations;\plain\f2\fs20\cf0 \par winners/w1..w8/: \par x_wins_w, \plain\f2\fs20\cf1 !=1 if x wins this combo;\plain\f2\fs20\cf0 \par y_wins_w, \plain\f2\fs20\cf1 !=1 if y wins this combo;\plain\f2\fs20\cf0 \par x_blocks_w, \plain\f2\fs20\cf1 !=1 if x blocks y from winning this combo;\plain\f2\fs20\cf0 \par y_blocks_w, \plain\f2\fs20\cf1 !=1 if y blocks x from winning this combo;\plain\f2\fs20\cf0 \par x_checks_w, \plain\f2\fs20\cf1 !=1 if x checks this combo (i.e., holds two squares to y's none);\plain\f2\fs20\cf0 \par y_checks_w, \plain\f2\fs20\cf1 !=1 if y checks this combo;\plain\f2\fs20\cf0 \par x_count_w, \plain\f2\fs20\cf1 !number of squares held by x in this combo;\plain\f2\fs20\cf0 \par y_count_w \plain\f2\fs20\cf1 !number of squares held by y in this combo;\plain\f2\fs20\cf0 \par ; \par wxb( winners, dim, dim) / \par \plain\f2\fs20\cf1 ! horizontal winning combos;\plain\f2\fs20\cf0 \par w1,1,1 w1,1,2 w1,1,3 \par w2,2,1 w2,2,2 w2,2,3 \par w3,3,1 w3,3,2 w3,3,3 \par \plain\f2\fs20\cf1 ! vertical winning combos;\plain\f2\fs20\cf0 \par w4,1,1 w4,2,1 w4,3,1 \par w5,1,2 w5,2,2 w5,3,2 \par w6,1,3 w6,2,3 w6,3,3 \par \plain\f2\fs20\cf1 ! diagonal winners;\plain\f2\fs20\cf0 \par w7,1,1 w7,2,2 w7,3,3 \par w8,1,3 w8,2,2 w8,3,1 \par /:; \par \plain\f2\fs20\cf2 endsets\plain\f2\fs20\cf0 \par \par \plain\f2\fs20\cf2 calc\plain\f2\fs20\cf0 : \par \plain\f2\fs20\cf1 ! the value of each square on the grid is set to the number \par of winning combos it appears in;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( board: score = 0); \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( wxb( w, i, j): score( i, j) = score( i, j) + 1); \par \plain\f2\fs20\cf2 endcalc\plain\f2\fs20\cf0 \par \par \plain\f2\fs20\cf1 ! The primary objective is to win, followed by blocking, followed by checking, \par followed by maximizing the raw score of squares held;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf1 ! Note: set some of the obj coefficients to 0 to allow a player to "beat" \par a handicapped opponent;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 max\plain\f2\fs20\cf0 = \par ( 10000 * x_wins + 1000 * x_blocks + 100 * x_checks + x_score) * x_wt + \par ( 10000 * y_wins + 1000 * y_blocks + 100 * y_checks + y_score) * y_wt \par ; \par \par \plain\f2\fs20\cf1 ! can only have one player on a square;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( board: x + y <= 1); \par \par \plain\f2\fs20\cf1 ! each player gets one square per turn;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( board: x) = x_turns; \par \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( board: y) = y_turns; \par \par \plain\f2\fs20\cf1 ! a player wins if he has three squares in a row;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( winners( w): \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( wxb( w, i, j): \par x_wins_w( w) <= x( i, j); \par y_wins_w( w) <= y( i, j); \par )); \par \plain\f2\fs20\cf1 ! sum up total wins for each player;\plain\f2\fs20\cf0 \par x_wins = \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( winners: x_wins_w); \par y_wins = \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( winners: y_wins_w); \par \par \plain\f2\fs20\cf1 ! count how many squares each player holds in each winning combo;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( winners( w): \par x_count_w( w) = \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( wxb( w, i, j): x( i, j)); \par y_count_w( w) = \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( wxb( w, i, j): y( i, j)); \par ); \par \par \plain\f2\fs20\cf1 ! a player blocks if he spoils an opponent's winning combination;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( winners: \par \plain\f2\fs20\cf1 ! x blocks y if x holds one square and y holds 2;\plain\f2\fs20\cf0 \par 2 * x_blocks_w <= y_count_w; \par y_count_w <= 3 - x_blocks_w; \par x_blocks_w <= x_count_w; \par x_count_w <= 3 - 2 * x_blocks_w; \par \plain\f2\fs20\cf1 ! y blocks x if y holds one square and x holds 2;\plain\f2\fs20\cf0 \par 2 * y_blocks_w <= x_count_w; \par x_count_w <= 3 - y_blocks_w; \par y_blocks_w <= y_count_w; \par y_count_w <= 3 - 2 * y_blocks_w; \par ); \par \plain\f2\fs20\cf1 ! sum up total blocks for each player;\plain\f2\fs20\cf0 \par x_blocks = \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( winners: x_blocks_w); \par y_blocks = \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( winners: y_blocks_w); \par \par \plain\f2\fs20\cf1 ! a player checks a winning combination if he holds two squares \par versus his opponent's none;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( winners: \par \plain\f2\fs20\cf1 ! x checks combo?;\plain\f2\fs20\cf0 \par 2 * x_checks_w <= x_count_w; \par x_count_w <= 3 - x_checks_w; \par y_count_w <= 3 - 3 * x_checks_w; \par \plain\f2\fs20\cf1 ! y checks combo?;\plain\f2\fs20\cf0 \par 2 * y_checks_w <= y_count_w; \par y_count_w <= 3 - y_checks_w; \par x_count_w <= 3 - 3 * y_checks_w; \par ); \par \plain\f2\fs20\cf1 ! sum up total checks for each player;\plain\f2\fs20\cf0 \par x_checks = \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( winners: x_checks_w); \par y_checks = \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( winners: y_checks_w); \par \par \plain\f2\fs20\cf1 ! compute the raw score of squares held by each player;\plain\f2\fs20\cf0 \par x_score = \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( board: score * x); \par y_score = \plain\f2\fs20\cf2 @sum\plain\f2\fs20\cf0 ( board: score * y); \par \par \plain\f2\fs20\cf1 ! binaries;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( board: \plain\f2\fs20\cf2 @bin\plain\f2\fs20\cf0 ( x); \plain\f2\fs20\cf2 @bin\plain\f2\fs20\cf0 ( y)); \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( winners: \plain\f2\fs20\cf2 @bin\plain\f2\fs20\cf0 ( x_blocks_w); \plain\f2\fs20\cf2 @bin\plain\f2\fs20\cf0 ( y_blocks_w)); \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( winners: \plain\f2\fs20\cf2 @bin\plain\f2\fs20\cf0 ( x_checks_w); \plain\f2\fs20\cf2 @bin\plain\f2\fs20\cf0 ( y_checks_w)); \par \par \par \plain\f2\fs20\cf2 data\plain\f2\fs20\cf0 : \par \plain\f2\fs20\cf1 ! Displays the layout of the final grid;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @text\plain\f2\fs20\cf0 () = \plain\f2\fs20\cf2 @write\plain\f2\fs20\cf0 ( \plain\f2\fs20\cf2 @newline\plain\f2\fs20\cf0 (1), "Board #", x_turns + y_turns,":",\plain\f2\fs20\cf2 @newline\plain\f2\fs20\cf0 ( 1)); \par \plain\f2\fs20\cf2 @text\plain\f2\fs20\cf0 () = \plain\f2\fs20\cf2 @writefor\plain\f2\fs20\cf0 ( board( i, j): 3*" ",\plain\f2\fs20\cf2 @if\plain\f2\fs20\cf0 ( x, "X", \plain\f2\fs20\cf2 @if\plain\f2\fs20\cf0 ( y, "O", ".")), \par \plain\f2\fs20\cf2 @if\plain\f2\fs20\cf0 ( j #eq# \plain\f2\fs20\cf2 @size\plain\f2\fs20\cf0 ( dim), \plain\f2\fs20\cf2 @newline\plain\f2\fs20\cf0 ( 1), "")); \par \plain\f2\fs20\cf2 @text\plain\f2\fs20\cf0 () = \plain\f2\fs20\cf2 @write\plain\f2\fs20\cf0 ( \plain\f2\fs20\cf2 @newline\plain\f2\fs20\cf0 ( 1)); \par \plain\f2\fs20\cf2 @text\plain\f2\fs20\cf0 () = \plain\f2\fs20\cf2 @write\plain\f2\fs20\cf0 ( \plain\f2\fs20\cf2 @if\plain\f2\fs20\cf0 ( x_wins, "!!!X WINS!!!", \plain\f2\fs20\cf2 @if\plain\f2\fs20\cf0 ( y_wins, "!!!Y WINS!!!", ""))); \par \plain\f2\fs20\cf2 @text\plain\f2\fs20\cf0 () = \plain\f2\fs20\cf2 @write\plain\f2\fs20\cf0 ( \plain\f2\fs20\cf2 @if\plain\f2\fs20\cf0 ( x_turns + y_turns #eq# \plain\f2\fs20\cf2 @size\plain\f2\fs20\cf0 ( board) #and# \par x_wins #lt# 1 #and# y_wins #lt# 1, "!!!CAT...NO WINNER!!!","")); \par \plain\f2\fs20\cf2 enddata\plain\f2\fs20\cf0 \par \par \plain\f2\fs20\cf2 init\plain\f2\fs20\cf0 : \par x_wins = 0; \par y_wins = 0; \par \plain\f2\fs20\cf2 endinit\plain\f2\fs20\cf0 \par \par \plain\f2\fs20\cf2 calc\plain\f2\fs20\cf0 : \par \par \plain\f2\fs20\cf1 ! Set patameters;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @set\plain\f2\fs20\cf0 ( 'DEFAULT'); \par \plain\f2\fs20\cf2 @set\plain\f2\fs20\cf0 ( 'OROUTE', 1); \par \plain\f2\fs20\cf2 @set\plain\f2\fs20\cf0 ( 'TERSEO', 2); \par \plain\f2\fs20\cf2 @set\plain\f2\fs20\cf0 ( 'WNLINE', 10000); \par \plain\f2\fs20\cf2 @set\plain\f2\fs20\cf0 ( 'LINLEN', 150); \par \plain\f2\fs20\cf2 @set\plain\f2\fs20\cf0 ( 'STAWIN', 0); \par \par \plain\f2\fs20\cf1 ! no turns taken yet;\plain\f2\fs20\cf0 \par x_turns = 0; \par y_turns = 0; \par \par \plain\f2\fs20\cf1 ! let's play;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( board | x_wins #lt# 1 #and# y_wins #lt# 1 #and# \par ( x_turns + y_turns) #lt# \plain\f2\fs20\cf2 @size\plain\f2\fs20\cf0 ( board): \par \par \plain\f2\fs20\cf1 ! x moves first;\plain\f2\fs20\cf0 \par x_turns = x_turns + 1; \par x_wt = 1; y_wt = 1 - x_wt; \par \plain\f2\fs20\cf2 @solve\plain\f2\fs20\cf0 (); \par \par \plain\f2\fs20\cf1 ! fix all of x's moves;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( board: \par \plain\f2\fs20\cf2 @ifc\plain\f2\fs20\cf0 ( x: \par x = 1; \par ); \par ); \par \par \plain\f2\fs20\cf1 ! y moves next;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @ifc\plain\f2\fs20\cf0 ( x_wins #lt# 1 #and# x_turns + y_turns #lt# \plain\f2\fs20\cf2 @size\plain\f2\fs20\cf0 ( board): \par y_turns = y_turns + 1; \par x_wt = 0; y_wt = 1 - x_wt; \par \plain\f2\fs20\cf2 @solve\plain\f2\fs20\cf0 (); \par \par \plain\f2\fs20\cf1 !fix all y's moves;\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 @for\plain\f2\fs20\cf0 ( board: \par \plain\f2\fs20\cf2 @ifc\plain\f2\fs20\cf0 ( y: \par y = 1; \par ); \par ); \par ); \par ); \par \par \plain\f2\fs20\cf2 endcalc\plain\f2\fs20\cf0 \par \plain\f2\fs20\cf2 end\plain\f2\fs20\cf0 \par \par }