[comp.sys.handhelds] Reversi program

grue@lance.hss.bu.oz (Frobozz) (11/30/89)

hiya,

	I'm posting a corrected version of the othello program to the world.
I have re-entered the program from this (corrected) listing and it still
seems to play correctly. Thus, I believe that this version is correct. The
lines that have changed have a '#' in column one. [ there are three changes ]

	If there are any residual problems, I'd love to hear about them.

	Could the people who enter this program send me mail indicating that
they've done so and perhaps give me some comments as their feeling towards
the program.

	As before, the program can be used for an non-profit purpose. Other
usages require my permission (which can be obtained by sending me some mail).

	Many thanks to Alan Weiss for finding most of the bugs in the program.



							Paul Dale
seeya
SNIF

Language Centre        internet    : grue@lance.hss.bu.oz{.au}
Bond University        JANET       : grue%lance.hss.bu.oz@uk.ac.ukc
Gold Coast, Qld 4229   ARPA, bitnet: grue%lance.hss.bu.oz.au@uunet.uu.net
Australia        UUCP  : ..!uunet!munnari!lance.hss.bu.oz!grue



--------------------------------------------------------------------------------
I suppose I should get round to this bit, the program follows:

PLAY [ A644 ]
  << FAST SETUP "You first?" 4 DISS
    IF GETK "Y" == THEN PMOV END
    WHILE 3 FC?
    REPEAT
      "Thinking..." 4 DISS CMOV
      IF DUP
      THEN 5 CF -1 MKMOV
      ELSE DROP2
        IF 5 FS?
        THEN 3 SF
        ELSE 5 SF "Pass" 1 DISS
        END
      END
      IF CCT PCT + 64 == THEN 3 SF END
      IF 3 FC? THEN PMOV END
      IF CCT PCT + 64 == THEN 3 SF END
    END SCOR PCT CCT -
    IF DUP 0 < THEN "I win"
    ELSE
      IF DUP 0 > THEN "You win"
      ELSE "Draw"
      END
    END 1 DISS ABS "by " SWAP ->STR + " disks" + 4 DISS CLEAN
  >>

CKPASS [433D]
  << BD NEG 'BD' STO CMOV
    IF NOT THEN 7 SF 5 SF END
    DROP BD NEG 'BD' STO
  >>

GETK [87A]
  << #11CAh SYSEVAL -> sttme
    <<
      DO
        IF #11CAh SYSEVAL sttme - B->R 491520 >
        THEN #18E58h SYSEVAL #11CAh SYSEVAL 'sttme' STO
        END
      UNTIL KEY
      END
    >>
  >>

CMOV [11AD]
  <<
    IF CCT DUP PCT + 64 SWAP - >
    THEN CM1
    ELSE CM2
    END DUP2 R->C
    IF DUP 0 ==
    THEN DROP "I pass"
    ELSE (1,1) - ->STR "My move " SWAP +
    END 1 DISS
  >>

CM2 [ 5F79 ]
  << { 10 10 } 0 CON 0 DUP DUP2 -> s maxs x y mct
    << 2 9
      FOR a 2 9
        FOR b
          IF BD a b 2 ->LIST GET -1 ==
          THEN -1 -1 fr -1 0 fr -1 1 fr 0 -1 fr 0 1 fr 1 -1 fr 1 0 fr 1 1 fr
          END
        NEXT
      NEXT 2 9
      FOR a 2 9
        FOR b
          IF s a b 2 ->LIST GET DUP
          THEN
#           IF WTS a b 2 ->LIST GET + DUP maxs DUP2 >
            THEN DROP2 a 'x' STO b 'y' STO 'maxs' STO 1 'mct' STO
            ELSE
              IF ==
              THEN 1 mct + 'mct' STO
                IF 0 > RAND mct INV < AND
                THEN a 'x' STO b 'y' STO
                END
              END
            END
          ELSE DROP
          END
        NEXT
      NEXT x y
    >>
  >>

MKFR [ 1FD4 ]
  << 0 DUP DUP -> s a b
    <<
      << 1 -> x y j
        <<
          WHILE BD a x j * + b y j * + 2 ->LIST GET 1 ==
          REPEAT j 1 + 'j' STO
          END
          IF j 1 > BD a x j * + b y j * + 2 ->LIST GET NOT AND
          THEN s a x j * + b y j * + 2 ->LIST DUP2 GET j 1 - + PUT 's' STO
          END
        >>
      >> 'fr' STO
    >>
  >>

SCOR [ 3CB1 ]
  << "  My total= " CCT ->STR + 2 DISS
    "Your total= " PCT ->STR + 3 DISS
  >>

SDBL [ 9958 ]
  << DUP + DUP + >>

CM1 [ C849 ]
  << 0 DUP DUP2 1 -> maxs curs x y mct
    << 2 9
      FOR a 2 9
        FOR b
          IF BD a b 2 ->LIST GET NOT
          THEN 0 'curs' STO -1 -1 ckrun -1 0 ckrun -1 1 ckrun 0 -1 ckrun
                0 1 ckrun 1 -1 ckrun 1 0 ckrun 1 1 ckrun
            IF curs 0 >
            THEN curs WTS a b 2 ->LIST GET +
              IF DUP maxs >
              THEN 'maxs' STO a 'x' STO b 'y' STO 1 'mct' STO
              ELSE
                IF maxs == THEN 1 mct + 'mct' STO
                  IF RAND mct INV <
                  THEN a 'x' STO b 'y' STO
                  END
                END
              END
            END
          END
        NEXT
      NEXT x y
    >>
  >>

PMOV [ C4A8 ]
  << 0 DUP -> c1 c2
    <<
      WHILE 7 FC?C
      REPEAT GETK 'c1' STO c1 1 DISS
        IF "1" c1  > "8" c1 < OR
        THEN { CKPASS << 3 6 7 SF SF SF >> << CLMF HALT FAST SCR ->LCD SCOR >>
                << #18E58h SYSEVAL >> } "PQHO" c1 POS
          IF DUP
          THEN GET EVAL 8 SF
          ELSE DROP
          END
        ELSE GETK 'c2' STO c1 c2 + 1 DISS
          IF "0" c2 < "9" c2 > AND
          THEN c1 STR-> 1 + c2 STR-> 1 +
            IF DUP2 2 ->LIST BD SWAP GET NOT
            THEN 1 CKMOV
              IF 4 FC?C THEN 7 SF END
            END
          END
        END
        IF 7 FC? 8 FC?C AND
        THEN "Illegal" 1 DISS ERRBELL
        END
      END
    >>
  >>

DRWP [ A43D ]
  << -> x y c
    <<
      IF c 1 == THEN [ 0 5 ] ELSE [ 7 2 ] END
      IF y 2 MOD THEN 16 * END
      ARRY-> DROP CHR SWAR CHR OVER + + x 4 * 102 + 8 y - 2 / IP 137 * + -> c p
      << SZER 1 p 1 - SUB c + SZER p 3 + 548 SUB + SCR OR DUP 'SCR' STO ->LCD
      >>
    >>
  >>

DISS [ 1F4F ]
  << DISP LCD-> SCR OR ->LCD
  >>

FLIPS [ 4112 ]
  << -> x y
    <<
      IF y 2 MOD THEN 112 ELSE 7 END
            CHR DUP DUP + + x 4 * 102 + 8 y - 2 / IP 137 * + -> c p
      << SZER 1 p 1 - SUB c + SZER p 3 + 548 SUB + SCR XOR DUP 'SCR' STO ->LCD
      >>
    >>
  >>

MKMOV [ AC89 ]
  << 0 DUP -> x y c j adj
    << x y 2 ->LIST 'BD' OVER c PUT WTS SWAP GET DUP 30 < SWAP 13 > 2 1 IFTE
          10 IFTE 'adj' STO x 1 - y 1 - c DRWP 1
      IF c -1 == THEN 'CCT' ELSE 'PCT' END STO+ -1 1
      FOR a -1 1
        FOR b 1 'j' STO
          WHILE BD x a j * + y b j * + 2 ->LIST GET c NEG ==
          REPEAT 1 j + 'j' STO
          END
          IF BD x a j * + y b j * + 2 ->LIST GET c ==
          THEN
            DO j 1 - 'j' STO
              IF 'BD' x a j * + y b j * + 2 ->LIST DUP2 GET c NEG ==
              THEN c PUT x a j * + 1 - y b j * + 1 - FLIPS 'PCT' 'CCT'
                IF c -1 ==
                THEN SWAP
                END -1 STO+ 1 STO+
              ELSE DROP2 9 SF
              END
            UNTIL 9 FS?C
            END
          END
          IF c -1 ==
          THEN 'WTS' x a + y b + 2 ->LIST DUP2 GET adj + PUT
          END
        NEXT
      NEXT
    >> SCOR
  >>

CKMOV [ A969 ]
  << 0 -> a b c curs
    << BD NEG 'BD' STO -1 1
      FOR p -1 1
        FOR q   
          IF p q OR
          THEN p q chrun
          END
        NEXT
      NEXT BD NEG 'BD' STO
      IF curs
      THEN a b c MKMOV
      ELSE 4 SF ERRBELL
      END
    >>
  >>

CLEAN [ BB6A ]
# << CLEAR STK LIST-> DROP FLG STOF
        { BD CCT ckrun FLG fr PCT SCR STK SZER WTS } PURGE
  >>

SETUP [ 784 ]
  << FAST RCLF 'FLG' STO HEX DEPTH ->LIST 'STK' STO 2 DUP 'PCT' STO 'CCT' STO
"[[0 0 0 0 0 0 0 0 0 0[0 30 4 15 12 12 15 4 30 0[0 4 2 6 7 7 6 2 4 0[0 15 6 10 9
 9 10 6 15 0[0 12 7 9 0 0 9 7 12 0[0 12 7 9 0 0 9 7 12 0[0 15 6 10 9 9 10 6 15 0
[0 4 2 6 7 7 6 2 4 0[0 30 4 15 12 12 15 4 30 0[0 0 0 0 0 0 0 0 0 0"
        STR-> 'WTS' STO
"1 9 FOR j j CF NEXT{10 10}0 CON{5 5}1 PUT{5 6}-1 PUT{6 5}-1 PUT{6 6}1 PUT"
        STR-> 'BD' STO 0 CHR SDBL DUP SDBL DUP + DUP SDBL SDBL + + 'SZER' STO
        SSCR 'SCR' STO MKCR MKFR SCR ->LCD SCOR
  >>

MKCR [ E5AD ]
  << 0 DUP DUP -> a b curs
    <<
      << 0 1 -> x y scr j
        <<
          WHILE BD a x j * + b y j * + 2 ->LIST GET 1 ==
          REPEAT 1 DUP scr + 'scr' STO j + 'j' STO
          END
          IF j 1 >
          THEN
#           IF BD a x j * + b y j * + 2 ->LIST GET -1 ==
            THEN scr curs + 'curs' STO
            END
          END
        >>
      >> 'ckrun' STO
    >>
  >>

SSCR [ CB29 ]:  This is a screen dump. Create it using the following procedure:

{ 0 .... 0 [ 92 zeros ]
  255 0 3 52 67 48 7 112 7 112 7 0 136 0 0 0 136 0 0 0 136 0 0 0 136 0 0 0
  136 0 0 0 136 0 0 0 136 0 0 0 136 0 0 0 136
  0 .... 0 [ 92 zeros ]
  255 0 0 0 3 52 67 48 7 0 0 0 136 0 0 0 136 0 0 0 136 0 0 0 136 32 112 32
  136 80 0 80 136 0 0 0 136 0 0 0 136 0 0 0 136
  0 .... 0 [ 92 zeros ]
  255 0 0 0 119 0 115 4 115 0 0 0 136 0 0 0 136 0 0 0 136 0 0 0 136 5 0 5
  136 2 7 2 136 0 0 0 136 0 0 0 136 0 0 0 136
  0 .... 0 [ 92 zeros ]
  255 0 0 0 0 7 112 7 0 0 0 0 136 0 0 0 136 0 0 0 136 0 0 0 136 0 0 0
  136 0 0 0 136 0 0 0 136 0 0 0 136 0 0 0 136
}
<< -> L
  << "" 1 L SIZE
    FOR j L j GET CHR +
    NEXT
  >>
>> EVAL 'SSCR' STO


--------------------------------------------------------------------------------