/*--------------------------------------------------------------+ | | | REXX source code listing for DrRexx application | | | | File last modified on: 11/17/97 at: 02:56am | | Listing produced on: 11/22/97 at: 03:15am | | | +--------------------------------------------------------------*/ SIGNAL ON SYNTAX SIGNAL ON HALT SIGNAL INIT RETURN: SIGNAL VALUE DrRexxEvent() L1: EXIT -1 L2: INTERPRET DrRexxInterpret() SIGNAL RETURN /*--------------------------------------------------------------+ | | | Event handlers for dialog: Board | | | +--------------------------------------------------------------*/ /* Event handlers for: Board (DIALOG) */ Board_Open: ctrl = Board.C101.Position() CALL Speed 5000 CALL Initialize SIGNAL RETURN Board_Exit: CALL Exit SIGNAL RETURN Board_Init: /* (C) Copyright Y.MIURA(???????) 1997.08.15 All rights reserved */ IF RxFuncQuery( "SysLoadFuncs" ) THEN CALL RxFuncAdd "SysLoadFuncs", "RexxUtil", "SysLoadFuncs" CALL SysLoadFuncs SIGNAL RETURN /*--------------------------------------------------------------+ | | | Class handlers for dialog: Board | | | +--------------------------------------------------------------*/ /* Class handlers for: ICONBUTTON */ Board_ICONBUTTON_Click: CALL Analyze ID() SIGNAL RETURN /*--------------------------------------------------------------+ | | | Menu handlers for dialog: Board | | | +--------------------------------------------------------------*/ /* Exit */ /* - Action: */ CALL Exit SIGNAL RETURN /* Turn */ /* first */ /* - Label: Turn_F */ /* - Action: */ CALL Start 1 SIGNAL RETURN /* late */ /* - Label: Turn_L */ /* - Action: */ CALL Start -1 SIGNAL RETURN /* New */ /* Pass */ /* Speed */ /* Fast */ /* Medium */ /* Slow */ /* Help */ /* Y.MIURA */ /* miura@mrg.biglobe.ne.jp */ /*--------------------------------------------------------------+ | | | Global procedures: | | | +--------------------------------------------------------------*/ Speed: /* CALL Speed n */ PROCEDURE EXPOSE int. sp sp = ARG(1) int.13 = sp f = 0; m = 0; s = 0 IF sp = 0 THEN f = 1 IF sp = 5000 THEN m = 1 IF sp = 10000 THEN s = 1 CALL Board.Speed_F.MenuChecked f CALL Board.Speed_M.MenuChecked m CALL Board.Speed_S.MenuChecked s RETURN MyTurn_Sub3: /* kh = MyTurn_Sub3( kh ) */ PROCEDURE EXPOSE ad. bd. cd. xd. int. kh = ARG(1) int.10 = 0; kh = MyTurn_Sub1( 1, 1, kh ) int.10 = 0; kh = MyTurn_Sub1( 1, 8, kh ) int.10 = 0; kh = MyTurn_Sub1( 8, 1, kh ) int.10 = 0; kh = MyTurn_Sub1( 8, 8, kh ) RETURN kh reference: /* int.1 : black int.2 : white int.3 : count int.4 : turn (gt) int.5 : pass int.6 : c int.7 : hx int.8 : hy int.9 : m int.10 : z int.11 : zh int.12 : ini int.13 : speed int.14 : xn int.15 : yn */ RETURN MyTurn_Sub2: /* kh = MyTurn_Sub2( x, y, kh ) */ PROCEDURE EXPOSE ad. bd. cd. xd. int. x = ARG(1); y = ARG(2); kh = ARG(3) DO i = 1 TO 8; DO j = 1 TO 8; bd.i.j = ad.i.j; END; END wz = int.2; bz = int.1; int.9 = 1 int.10 = Appraise( x, y ) int.9 = 0; kh = 0 kh = MyTurn_Sub3( kh ) ky = kh; kh = 0; int.6 = int.6*(-1) kh = MyTurn_Sub3( kh ) kh = ky*2 - kh; int.2 = wz; int.1 = bz; int.6 = int.6*(-1) DO i = 1 TO 8; DO j = 1 TO 8; ad.i.j = bd.i.j; END; END RETURN kh MyTurn_Sub1: /* kh = MyTurn_Sub1( x, y, kh ) */ PROCEDURE EXPOSE ad. bd. cd. xd. int. x = ARG(1); y = ARG(2); kh = ARG(3) int.10 = Appraise( x, y ) IF int.10 <> 0 THEN kh = kh + 100 RETURN kh MyTurn: /* CALL MyTurn */ PROCEDURE EXPOSE ad. bd. cd. xd. int. int.3 = int.3 + 1 CALL Board.C169.Text int.3 int.9 = 0; int.8 = -9999; kh = 0 kh = MyTurn_Sub3( kh ) kz = kh; kh = 0; int.6 = int.6*(-1) kh = MyTurn_Sub3( kh ) kz = kz*2 - kh; int.6 = int.6*(-1) DO t = 1 TO 8 DO r = 1 TO 8 IF ad.t.r <> 0 THEN ITERATE int.11 = 0; int.10 = Appraise( t, r ) IF int.10 = 0 THEN ITERATE kh = 0; zy = int.10; zz = int.11 IF int.3 > 29 THEN DO IF (int.3 > 50) & (int.3 < 56) THEN kh = MyTurn_Sub2( t, r, kh ) IF (t < 4) & (r < 4) THEN kh = MyTurn_Sub2( t, r, kh ) IF (t > 5) & (r < 4) THEN kh = MyTurn_Sub2( t, r, kh ) IF (t < 4) & (r > 5) THEN kh = MyTurn_Sub2( t, r, kh ) IF (t > 5) & (r > 5) THEN kh = MyTurn_Sub2( t, r, kh ) END o = 0; p = 0; kq = 0 IF (t = 1) | (t = 8) THEN p = 1 IF (r = 1) | (r = 8) THEN o = 1 IF o <> p THEN DO t_o = t + o; r_p = r + p IF ad.t_o.r_p = 0 THEN DO t_oo = t + o + o; r_pp = r + p + p IF ad.t_oo.r_pp = int.6 THEN kq = 40 END t_o = t - o; r_p = r - p IF ad.t_o.r_p = 0 THEN DO t_oo = t - o - o; r_pp = r - p - p IF ad.t_oo.r_pp = int.6 THEN kq = 40 END END IF int.3 > 50 THEN cc = -1 ELSE cc = 0 rnd = RANDOM() / 1000 int.7 = xd.t.r + zz/2 + zy*cc*5 - zy*5 + rnd*3 + kz - kh + kq IF int.3 = 59 THEN DO DO i = 1 TO 8; DO j = 1 TO 8; bd.i.j = ad.i.j; END; END wz = int.2; bz = int.1; int.9 = 1 int.10 = Appraise( t, r ); int.6 = int.6*(-1) DO i = 1 TO 8 DO j = 1 TO 8 IF ad.i.j = 0 THEN int.10 = Appraise( i, j ) END END k = 0 DO i = 1 TO 8 DO j = 1 TO 8 gt = int.4*(-1) IF ad.i.j = gt THEN k = k + 1 END END IF int.10 = 0 THEN k = k - 10 int.7 = k DO i = 1 TO 8; DO j = 1 TO 8; ad.i.j = bd.i.j; END; END int.6 = int.6*(-1); int.2 = wz; int.1 = bz; int.9 = 0 END IF int.8 < int.7 THEN DO int.8 = int.7; int.14 = t; int.15 = r END END END int.5 = 0 IF int.8 = -9999 THEN DO int.5 = 1; int.3 = int.3 - 1; int.6 = int.6*(-1) CALL Board.C172.Text "Pass !!" DO i = 1 TO 30000; NOP; END END ELSE DO x = int.14; y = int.15; int.9 = 1 int.10 = Appraise( x, y ) END IF (ad.1.7 <> 0) & (ad.2.8 <> 0) THEN xd.2.7 = 100 IF (ad.1.2 <> 0) & (ad.2.1 <> 0) THEN xd.2.2 = 100 IF (ad.7.1 <> 0) & (ad.8.2 <> 0) THEN xd.7.2 = 100 IF (ad.7.8 <> 0) & (ad.8.7 <> 0) THEN xd.7.7 = 100 IF int.5 <> 1 THEN DO IF int.6 = 1 THEN int.2 = int.2 + 1 ELSE int.1 = int.1 + 1 int.6 = int.6*(-1) CALL SetIcon_1 x, y, 1 CALL SetIcon x, y END ELSE int.5 = 0 IF (int.2 = 0) | (int.1 = 0) | (int.3 > 59) THEN DO CALL GameOver int.4 RETURN END CALL Board.C172.Text "Your Turn" RETURN GameOver: /* CALL GameOver turn */ /* ????? */ PROCEDURE EXPOSE ad. bd. cd. xd. int. t = ARG(1) int.3 = 60 IF t = 1 THEN DO w = int.1; b = int.2 END ELSE DO w = int.2; b = int.1 END CALL Board.C172.Text "Game Over" IF w > b THEN CALL Board.C169.Text "I WIN !!" ELSE DO IF w < b THEN CALL Board.C169.Text "YOU WIN !!" ELSE CALL Board.C169.Text "DRAW !!" END RETURN Check_Pass: /* CALL Check_Pass */ /* ??????? */ PROCEDURE EXPOSE ad. bd. cd. xd. int. IF (int.4 = 0) | (int.3 > 59) THEN RETURN int.9 = 0; int.10 = 0 DO t = 1 TO 8 DO r = 1 TO 8 IF ad.t.r = 0 THEN int.10 = Appraise( t, r ) IF int.10 <> 0 THEN LEAVE r END IF int.10 <> 0 THEN LEAVE t END IF int.10 = 0 THEN DO CALL Board.C172.Text "Pass !!" int.6 = int.6*(-1) DO i = 1 TO 30000; NOP; END CALL Board.C172.Text " " CALL MyTurn END ELSE DO CALL Board.C172.Text "No Pass !!" DO i = 1 TO 30000; NOP; END CALL Board.C172.Text "Your Turn" END IF (int.10 = 0) & (int.8 = -9999) THEN DO CALL GameOver int.4 END RETURN SetIcon_1: /* CALL SetIcon_1 x, y, xy */ /* ??????????(BITMAP)?????? */ PROCEDURE EXPOSE ad. bd. cd. xd. int. sp x = ARG(1); y = ARG(2); xy = ARG(3) IF ad.x.y = 1 THEN DO bitmap = "LLOTHEO:#3" /* First */ END ELSE DO bitmap = "LLOTHEO:#2" /* Late */ END /* iconNum = (y-1)*8 + x + 100 */ iconNum = y*8 + x + 92 IF (int.12 = 1) & (xy = 0) THEN DO IF ad.x.y = 1 THEN DO CALL TextFor Board, 'C'||iconNum, "LLOTHEO:#4" DO i = 1 TO 2000; NOP; END CALL TextFor Board, 'C'||iconNum, "LLOTHEO:#5" DO i = 1 TO 2000; NOP; END END ELSE DO CALL TextFor Board, 'C'||iconNum, "LLOTHEO:#5" DO i = 1 TO 2000; NOP; END CALL TextFor Board, 'C'||iconNum, "LLOTHEO:#4" DO i = 1 TO 2000; NOP; END END END CALL TextFor Board, 'C'||iconNum, bitmap cd.x.y = ad.x.y DO i = 1 TO (int.13*2); NOP; END RETURN Appraise: /* z = Appraise( x, y ) */ /* ????? */ PROCEDURE EXPOSE ad. bd. cd. xd. int. x = ARG(1); y = ARG(2) z = 0 DO o = -1 TO 1 DO p = -1 TO 1 IF (o <> 0) | (p <> 0) THEN DO xa = x + o; ya = y + p; cx = int.6*(-1) IF ad.xa.ya = cx THEN DO xa = x + o + o; ya = y + p+ p; flag = 0 DO WHILE ad.xa.ya <> int.6 IF (ad.xa.ya = 10) | (ad.xa.ya = 0) THEN DO flag = 1; LEAVE END xa = xa + o; ya = ya + p END IF flag = 0 THEN DO DO UNTIL (xa = x) & (ya = y) xa = xa - o; ya = ya - p IF int.9 = 0 THEN int.11 = int.11 + xd.xa.ya ELSE DO ad.xa.ya = int.6 IF (xa <> x) | (ya <> y) THEN DO int.2 = int.2 + int.6; int.1 = int.1 - int.6 END END z = z + 1 END END END END END END RETURN z Analyze: /* CALL Analyze click_ID */ /* ????? */ PROCEDURE EXPOSE ad. bd. cd. xd. int. click_ID = ARG(1) click_ID = click_ID - 101 x = (click_ID // 8) + 1 y = (click_ID % 8) + 1 IF int.4 = 0 THEN RETURN IF ad.x.y <> 0 THEN RETURN int.9 = 1 int.10 = Appraise( x, y ) IF int.10 = 0 THEN RETURN CALL Board.C172.Text " " int.3 = int.3 + 1 CALL Board.C169.Text int.3 IF (ad.1.7 <> 0) & (ad.2.8 <> 0) THEN xd.2.7 = 100 IF (ad.1.2 <> 0) & (ad.2.1 <> 0) THEN xd.2.2 = 100 IF (ad.7.1 <> 0) & (ad.8.2 <> 0) THEN xd.7.2 = 100 IF (ad.7.8 <> 0) & (ad.8.7 <> 0) THEN xd.7.7 = 100 IF int.5 = 0 THEN DO IF int.6 = 1 THEN int.2 = int.2 + 1 ELSE int.1 = int.1 + 1 int.6 = int.6*(-1) CALL SetIcon_1 x, y, 1 CALL SetIcon x, y END ELSE int.5 = 0 DO i = 1 TO (int.13*2); NOP; END IF (int.2 = 0) | (int.1 = 0) | (int.3 > 59) THEN DO CALL GameOver int.4 RETURN END ELSE CALL MyTurn RETURN Start: /* CALL Start turn */ /* ????? */ PROCEDURE EXPOSE ad. bd. cd. xd. int. int.4 = ARG(1) CALL Board.Turn_F.MenuDisabled 1 /* Drop-Down Menu 'Game' Disable */ CALL Board.Turn_L.MenuDisabled 1 IF int.4 = -1 THEN DO /* Late */ CALL Board.C172.Text " " CALL Board.C173.Text " " CALL Board.C174.Text "-YOU-" CALL MyTurn END ELSE DO CALL Board.C172.Text "Your Turn" CALL Board.C173.Text "-YOU-" CALL Board.C174.Text " " END RETURN Exit: /* CALL SysDropFuncs */ EXIT RETURN SetIcon: /* CALL SetIcon x, y */ /* ????????????(BITMAP)?????? */ PROCEDURE EXPOSE ad. bd. cd. xd. int. xx = ARG(1); yy = ARG(2) DO x = 1 TO 8 DO y = 1 TO 8 IF ad.x.y <> cd.x.y THEN DO IF (x <> xx) | (y <> yy) THEN DO CALL SetIcon_1 x, y, 0 END END END END CALL Board.C168.Text int.1 /* First */ CALL Board.C167.Text int.2 /* Late */ RETURN Initialize: /* CALL Initialize */ /* ?????????? */ PROCEDURE EXPOSE ad. bd. cd. xd. int. ctrl sp ctrl_x = WORD( ctrl, 1 ) ctrl_y = WORD( ctrl, 2 ) CALL Board.Color, Board.C169.Color() CALL Board.C172.Text "Select Turn" CALL Board.C173.Text "(YOU)" CALL Board.C174.Text "(YOU)" k = 101 DO j = 0 TO 7 y = ctrl_y - j*40 DO i = 0 TO 7 x = i*40 + ctrl_x CALL PositionFor Board,'C'||k, x, y k = k + 1 END END DO i = 101 TO 164 CALL TextFor Board, 'C'||i, "LLOTHEO:#1" END int.0 = 15 DO i = 1 TO int.0; int.i = 0; END DO i = 0 TO 9; DO j = 0 TO 9; ad.i.j = 0; END; END DO i = 0 TO 9; DO j = 0 TO 9; bd.i.j = 0; END; END DO i = 0 TO 9; DO j = 0 TO 9; cd.i.j = 0; END; END DO i = 0 TO 9; DO j = 0 TO 9; xd.i.j = 0; END; END int.1 = 2; int.2 = 2 DO i = 0 TO 9 ad.i.9 = 10; ad.i.0 = 10 ad.9.i = 10; ad.0.i = 10 END ad.4.4 = 1; ad.4.5 = -1 ad.5.4 = -1; ad.5.5 = 1 hp.1 = 5; hp.2 = 10; hp.3 = 20; hp.4 = 20 hp.5 = 10; hp.6 = 10; hp.7 = -70; hp.8 = -120 hp.9 = 20; hp.10 = -70; hp.11 = -30; hp.12 = 100 hp.13 = 30; hp.14 = -120; hp.15 = 100; hp.16 = -400 DO i = 4 TO 1 BY -1 xx = 9 - i; h = 16 - i*4 DO j = 4 TO 1 BY -1 yy = 9 - j; h = h + 1; hyouka = hp.h xd.i.j = hyouka; xd.i.yy = hyouka xd.xx.j = hyouka; xd.xx.yy = hyouka END END int.6 = -1 CALL Board.C165.Text "LLOTHEO:#2" /* First */ CALL Board.C166.Text "LLOTHEO:#3" /* Late */ CALL Board.C169.Text int.3 int.13 = 0 CALL SetIcon 0, 0 int.13 = sp int.12 = 1 CALL Board.Turn_F.MenuDisabled 0 /* Drop-Down Menu 'Game' Enable */ CALL Board.Turn_L.MenuDisabled 0 RETURN /*--------------------------------------------------------------+ | | | Default initialization: | | | +--------------------------------------------------------------*/ INIT: SIGNAL RETURN /*--------------------------------------------------------------+ | | | Default error handlers: | | | +--------------------------------------------------------------*/ SYNTAX: SAY 'SYNTAX ERROR:' errortext( rc ) 'in:' SAY sourceline( sigl ) SIGNAL ON SYNTAX SIGNAL RETURN HALT: SAY 'HALT occurred in:' SAY sourceline( sigl ) SIGNAL ON HALT SIGNAL RETURN