grue@lance.hss.bu.oz (Frobozz) (11/27/89)
hiya, This program plays the game of reversi (othello). Usage is reasonably straight forward [ press the PLAY soft key or type PLAY to start ]. You are prompted to see if you wish to move first. Press 'Y' if so. To make a move enter the x,y coordinate of the square you wish to move to [ 1..8 then 1..8 ]. To pass your turn press 'P'. To quit the game, press 'Q'. To halt the program and be allowed to continue later press 'H' ( use CONT to start playing again ). To turn the machine off without losing the state of the game press 'O'. If you don't press anything for a minute the machine turns itself off anyway (and the game continues when the ON key is pressed). I have attempted to make the program play reasonably quickly. I think that the response time is acceptable (when compared to my chess program anything is fast ;-). The quality of play isn't fantastic (for a challenge try playing blindfold). The program was written for the version 2BB roms. If your machine does not have these roms then simply ignore all usages of SYSEVAL present in the program. Also if you don't have the FAST program, leave that out of the setup program. If anyone bothers to enter this program, could they send me a message indicating that they have done so. Apart from that, anyone can use this program for private (non profit making) purposes. If anyone wishes to use it for another purpose, could they send me mail & I'll reply. [ my email address is below ]. If more details are desired about the program's internals, I will be happy to provide them (after I write it up). Also, could any bug fixes and/or improvements be forwarded to me for inclusion (I like staying up to date). The only improvements that are easy ( I think ) are minor adjustments to the positional weights. The weights present are some numbers I thought up really quickly and are unlikely to be optimum. The dynamic adjustment of the weights is very crude and is another candidate for improvement. NOTE: This program uses quite a lot of memory while running --- I wrote it to be fast rather than small ( the HP-28S has heaps of memory :-). I'm also on the lookout for new ideas for games. Could anybody who feels so inclined send me any pet ideas that they haven't got time to program? Then I'll see what I can make of it. [ I'm a man without anything left to hack on afterhours ;-) ]. Thanx in advance. A big thanks to Alonzo Gariepy (alonzo@microsoft.UUCP) for the HP-28 processor notes. My next game might be in machine code --- speed speed speed! 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 s 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 * + y b 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 --------------------------------------------------------------------------------
steinbac@hpl-opus.HP.COM (Gunter Steinbach) (11/28/89)
> / hpl-opus:comp.sys.handhelds / grue@lance.hss.bu.oz (Frobozz) / 7:20 pm > Nov 26, 1989 / hiya, > I'm also on the lookout for new ideas for games. Could anybody who > feels so inclined send me any pet ideas that they haven't got time to program? > Then I'll see what I can make of it. [ I'm a man without anything left to hack > on afterhours ;-) ]. Thanx in advance. Hi, I used to play "Clue" with my wife on a Sharp PC-1211 (runs BASIC in 1.4k of RAM.) Clue is only fun if you have at least 3 players, so the calculator was the 3rd man. The program used all but one or two bytes and won once by sheer luck. It did the "shuffling" and "dealing" of the game cards, so we ended up not using the cards anymore. According to whether it beeped once or twice, player 1 or 2 would pick up the machine to read its display and mark their notepad. It could only encode the persons, rooms, and weapons as numbers (Colonel Mustard = 6 etc.) - think what you could do with the 28S's graphics and memory! Have Fun and Keep Up The Good Work!