清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
CONST COPYRIGHTNUMBER = "HeiBaiQi V1.0" CONST COPYRIGHT = "Copyright (C) sosei" CONST NO = "2CFD4E6D12DA4469" CONST PROGRAMNAME = "OTHELLO" CONST REGCODELEN = 16 CONST VERIFYLENGTH = 32 CONST COMPUTERNAME = "Snowman" CONST E = 2.718281828459045# CONST PI = 3.141592653589793# CONST DEGREE = PI / 180 CONST CIRCLEANGLE = 2 * PI CONST SECOND = 1, MINUTE = 60, HOUR = 60, HALFDAY = 12 CONST DAY = 2& * HALFDAY * HOUR * MINUTE * SECOND CONST BOARDSIZE = 8 CONST MAXUNITIME = 2 * MINUTE, MAXEXTRATIME = 6 * MINUTE CONST WARNTIME = 10 * SECOND CONST HUMAN = 0, COMPUTER = 1 CONST OVER = -1, BLACKSIDE = 0, WHITESIDE = 1 CONST BLACKWIN = -1, EQUAL = 0, WHITEWIN = 1 CONST BLANK = -1, BLACKSTONE = 0, WHITESTONE = 1 CONST BEFORETIME = 0, NOWTIME = 1 CONST ORIGINALSCREEN = -1, BLACKSTATESCREEN = 0, WHITESTATESCREEN = 1, BOARDSCREEN = 2, BUTTONSCREEN = 3 CONST EVENTOFF = -1, EVENTSTOP = 0, EVENTON = 1 CONST TRAPINIT = -1, TRAPOFF = 0, TRAPON = 1 CONST SET = 0, USE = 1 CONST TRUE = -1, FALSE = 0 CONST SHOW = 1, DISAPPEAR = 0 CONST REPOSE = 0, THINK = 1, LOSE = 2, QUIET = 3, WIN = 4 CONST INIT = 0, REST = 1, TURN = 2 CONST FINISH = -1, RENEW = 0 CONST BLACK = 0, WHITE = 3, RED = 2, BLUE = 1 CONST ZEROOFCLOCKANGLE = PI / 2 CONST C = 4294967296# TYPE playdata playname AS STRING * 10 playtype AS INTEGER END TYPE DECLARE SUB Install () DECLARE FUNCTION RandomNum# () DECLARE FUNCTION ERandomNum# (n AS DOUBLE) DECLARE FUNCTION PIRandomNum# (n AS DOUBLE) DECLARE FUNCTION PasswordSwitch# (password AS DOUBLE) DECLARE SUB PasswordToPAB (password AS STRING, passworda AS DOUBLE, passwordb AS DOUBLE) DECLARE FUNCTION HexToDec# (hex AS STRING) DECLARE SUB DataLock (datastring AS STRING, password AS STRING) DECLARE SUB DataUnLock (datastring AS STRING, password AS STRING) DECLARE FUNCTION Verify$ (filenum AS INTEGER, startadd AS LONG, endadd AS LONG) DECLARE FUNCTION CheckBit () DECLARE FUNCTION TestCode () DECLARE SUB RandomSide (gameorder AS INTEGER, bothname() AS playdata) DECLARE SUB InputName (humanside AS INTEGER, bothname() AS playdata) DECLARE SUB othelloscreen (screentype AS INTEGER, screenstate AS INTEGER) DECLARE SUB trapcontrol (control AS INTEGER) DECLARE SUB boardinit (board() AS INTEGER) DECLARE SUB stonenumshow (board() AS INTEGER, stonenum() AS INTEGER) DECLARE SUB faceshow (nowside AS INTEGER, facetype AS INTEGER) DECLARE SUB clock (nowside AS INTEGER, clockstate AS INTEGER, recoverscreen AS INTEGER, unitime() AS LONG, extratime() AS LONG, notime AS INTEGER) DECLARE SUB turnstone (board() AS INTEGER, x AS INTEGER, y AS INTEGER) DECLARE SUB overjudge (nowside AS INTEGER, board() AS INTEGER) DECLARE SUB humanthink (nowside AS INTEGER, board() AS INTEGER, x AS INTEGER, y AS INTEGER) DECLARE SUB computerthink (nowside AS INTEGER, board() AS INTEGER, x AS INTEGER, y AS INTEGER) DECLARE SUB stoneshow (stone AS INTEGER, x AS INTEGER, y AS INTEGER) DECLARE SUB lightmark (nowside AS INTEGER, background AS INTEGER, x AS INTEGER, y AS INTEGER, cursor AS INTEGER) DECLARE FUNCTION CheckPlace (nowside AS INTEGER, board() AS INTEGER, x AS INTEGER, y AS INTEGER) DECLARE FUNCTION winsidejudge (nowside AS INTEGER, notime AS INTEGER, accpetlose AS INTEGER, stonenum() AS INTEGER) DECLARE SUB winshow (winside AS INTEGER) DECLARE SUB AdmitDefeat (accpetlose AS INTEGER) DECLARE SUB Quit (choose AS INTEGER) DECLARE SUB Recorder (bothname() AS playdata) DIM nn AS STRING DIM nowscreen AS INTEGER DIM gameorder AS INTEGER DIM timetrap AS INTEGER DIM keytrap AS INTEGER DIM bothname(BLACKSIDE TO WHITESIDE) AS playdata DIM stonenum(BLACKSIDE TO WHITESIDE) AS INTEGER DIM unitime(BLACKSIDE TO WHITESIDE, BEFORETIME TO NOWTIME) AS LONG DIM extratime(BLACKSIDE TO WHITESIDE, BEFORETIME TO NOWTIME) AS LONG DIM notime AS INTEGER DIM accpetlose AS INTEGER DIM board(1 TO BOARDSIZE, 1 TO BOARDSIZE) AS INTEGER DIM nowside AS INTEGER DIM x AS INTEGER DIM y AS INTEGER DIM winside AS INTEGER DIM choose AS INTEGER IF CheckBit = TRUE THEN IF UCASE$(COMMAND$) = "/INSTALL" THEN CALL Install END IF IF TestCode = TRUE THEN nn = STRING$(INT(LOG(BOARDSIZE * BOARDSIZE) / LOG(10#)) + 1, "#") nowscreen = ORIGINALSCREEN gameorder = 0 SCREEN 1 PLAY "mb" ON TIMER(SECOND) GOSUB clocklabel ON KEY(10) GOSUB keylabel DO CLS TIMER OFF timetrap = EVENTOFF KEY(10) OFF keytrap = EVENTOFF CALL trapcontrol(TRAPINIT) LOCATE 25, 3: PRINT COPYRIGHTNUMBER; " "; COPYRIGHT; CALL RandomSide(gameorder, bothname()) stonenum(BLACKSIDE) = 0 stonenum(WHITESIDE) = 0 LOCATE 1, 1: PRINT "Name:"; bothname(BLACKSIDE).playname LOCATE 2, 1: PRINT USING "Stones:" + nn; stonenum(BLACKSIDE); CALL othelloscreen(BLACKSTATESCREEN, SET) CALL faceshow(BLACKSIDE, REPOSE) CALL clock(BLACKSIDE, INIT, FALSE, unitime(), extratime(), notime) LOCATE 11, 1: PRINT "Name:"; bothname(WHITESIDE).playname LOCATE 12, 1: PRINT USING "Stones:" + nn; stonenum(WHITESIDE); CALL othelloscreen(WHITESTATESCREEN, SET) CALL faceshow(WHITESIDE, REPOSE) CALL clock(WHITESIDE, INIT, FALSE, unitime(), extratime(), notime) CALL othelloscreen(BOARDSCREEN, SET) LOCATE 21, 1: PRINT "F10=Defeat"; LOCATE 22, 19: PRINT "No:"; NO; IF gameorder = 0 THEN IF bothname(BLACKSIDE).playtype = HUMAN THEN CALL InputName(BLACKSIDE, bothname()) END IF IF bothname(WHITESIDE).playtype = HUMAN THEN CALL InputName(WHITESIDE, bothname()) END IF END IF CALL boardinit(board()) FOR x = 1 TO BOARDSIZE FOR y = 1 TO BOARDSIZE CALL stoneshow(board(x, y), x, y) NEXT y NEXT x CALL stonenumshow(board(), stonenum()) nowside = BLACKSIDE accpetlose = FALSE x = 4 y = 4 CALL Recorder(bothname()) gameorder = gameorder + 1 keytrap = EVENTON KEY(10) ON PLAY "c8d8" DO UNTIL nowside = OVER CALL faceshow(nowside, THINK) IF bothname(nowside).playtype = HUMAN THEN CALL humanthink(nowside, board(), x, y) ELSEIF bothname(nowside).playtype = COMPUTER THEN CALL computerthink(nowside, board(), x, y) END IF CALL clock(nowside, REST, FALSE, unitime(), extratime(), notime) CALL faceshow(nowside, REPOSE) CALL turnstone(board(), x, y) CALL stonenumshow(board(), stonenum()) CALL overjudge(nowside, board()) LOOP overlabel: TIMER OFF timetrap = EVENTOFF KEY(10) OFF keytrap = EVENTOFF winside = winsidejudge(nowside, notime, accpetlose, stonenum()) CALL winshow(winside) CALL Recorder(bothname()) CALL Quit(choose) LOOP UNTIL choose = FINISH PLAY "mf" SCREEN 0 CLS ELSE BEEP PRINT "time code!" END IF ELSE BEEP PRINT "Found Virus!" END IF END clocklabel: timetrap = EVENTSTOP CALL clock(nowside, TURN, TRUE, unitime(), extratime(), notime) IF notime = FALSE THEN timetrap = EVENTON RETURN ELSEIF notime = TRUE THEN timetrap = EVENTOFF RETURN overlabel END IF keylabel: keytrap = EVENTOFF KEY(10) OFF CALL AdmitDefeat(accpetlose) IF accpetlose = FALSE THEN keytrap = EVENTON RETURN ELSEIF accpetlose = TRUE THEN keytrap = EVENTOFF RETURN overlabel END IF SUB AdmitDefeat (accpetlose AS INTEGER) CONST TWINKLETIME = 1 / 6 DIM RefTime AS SINGLE DIM TimeBalance AS SINGLE DIM cw AS STRING * 1 DIM ct AS STRING * 1 DIM check AS STRING LOCATE 23, 1 PRINT SPACE$(40); cw = "?" ct = " " RefTime = TIMER DO LOCATE 23, 1: PRINT "Admit defeat(Y/N)" + cw; TimeBalance = TIMER - RefTime TimeBalance = TimeBalance + DAY TimeBalance = TimeBalance - FIX(TimeBalance / DAY) * DAY IF TimeBalance >= TWINKLETIME THEN SWAP cw, ct RefTime = TIMER END IF check = INKEY$ LOOP UNTIL check = "Y" OR check = "y" OR check = "N" OR check = "n" LOCATE 23, 1: PRINT "Admit defeat(Y/N)?" + check; IF check = "Y" OR check = "y" THEN accpetlose = TRUE ELSEIF check = "N" OR check = "n" THEN accpetlose = FALSE END IF LOCATE 23, 1 PRINT SPACE$(40); END SUB SUB boardinit (board() AS INTEGER) DIM x AS INTEGER DIM y AS INTEGER FOR x = 1 TO BOARDSIZE FOR y = 1 TO BOARDSIZE board(x, y) = BLANK NEXT y NEXT x board(BOARDSIZE / 2, BOARDSIZE / 2 + 1) = BLACKSTONE board(BOARDSIZE / 2 + 1, BOARDSIZE / 2 + 1) = WHITESTONE board(BOARDSIZE / 2, BOARDSIZE / 2) = WHITESTONE board(BOARDSIZE / 2 + 1, BOARDSIZE / 2) = BLACKSTONE END SUB FUNCTION CheckBit DIM filenumber AS INTEGER DIM length AS LONG DIM newvdc AS STRING * VERIFYLENGTH DIM oldvdc AS STRING * VERIFYLENGTH filenumber = FREEFILE OPEN PROGRAMNAME + ".EXE" FOR BINARY AS filenumber length = LOF(filenumber) newvdc = Verify$(filenumber, 1, length) CLOSE filenumber filenumber = FREEFILE OPEN PROGRAMNAME + ".VDC" FOR BINARY AS filenumber length = LOF(filenumber) IF length = VERIFYLENGTH THEN GET filenumber, 1, oldvdc END IF CLOSE filenumber IF length = VERIFYLENGTH CALL DataUnLock(oldvdc, NO) IF oldvdc = newvdc THEN CheckBit = TRUE ELSE CheckBit = FALSE END IF ELSE CheckBit = FALSE END IF END FUNCTION FUNCTION CheckPlace (nowside AS INTEGER, board() AS INTEGER, x AS INTEGER, y AS INTEGER) DIM stone AS INTEGER DIM xplus AS INTEGER DIM yplus AS INTEGER DIM xpointer AS INTEGER DIM ypointer AS INTEGER IF nowside = BLACKSIDE THEN stone = BLACKSTONE ELSEIF nowside = WHITESIDE THEN stone = WHITESTONE END IF FOR xplus = -1 TO 1 FOR yplus = -1 TO 1 xpointer = x + xplus ypointer = y + yplus DO WHILE (xpointer >= 1 AND xpointer <= BOARDSIZE) AND (ypointer >= 1 AND ypointer <= BOARDSIZE) IF board(xpointer, ypointer) = stone THEN IF x + xplus <> xpointer OR y + yplus <> ypointer THEN CheckPlace = TRUE EXIT FUNCTION ELSE EXIT DO END IF ELSEIF board(xpointer, ypointer) = BLANK THEN EXIT DO END IF xpointer = xpointer + xplus ypointer = ypointer + yplus LOOP NEXT yplus NEXT xplus CheckPlace = FALSE END FUNCTION SUB clock (nowside AS INTEGER, clockstate AS INTEGER, recoverscreen AS INTEGER, unitime() AS LONG, extratime() AS LONG, notime AS INTEGER) STATIC CONST SA = CIRCLEANGLE / MINUTE CONST MA = CIRCLEANGLE / HOUR CONST HA = CIRCLEANGLE / HALFDAY SHARED nowscreen AS INTEGER DIM unitclockface AS INTEGER DIM unitclockpointer AS INTEGER DIM extraclockface AS INTEGER DIM extraclockpointer AS INTEGER DIM befscreen AS INTEGER DIM a AS SINGLE DIM ot AS INTEGER DIM nt AS INTEGER DIM os AS INTEGER DIM om AS INTEGER DIM oh AS INTEGER DIM unitsecond(BLACKSIDE TO WHITESIDE) AS INTEGER DIM unitminute(BLACKSIDE TO WHITESIDE) AS INTEGER DIM unithour(BLACKSIDE TO WHITESIDE) AS INTEGER DIM extrasecond(BLACKSIDE TO WHITESIDE) AS INTEGER DIM extraminute(BLACKSIDE TO WHITESIDE) AS INTEGER DIM extrahour(BLACKSIDE TO WHITESIDE) AS INTEGER IF clockstate = INIT THEN unitime(nowside, BEFORETIME) = -1 unitime(nowside, NOWTIME) = MAXUNITIME extratime(nowside, BEFORETIME) = -1 extratime(nowside, NOWTIME) = MAXEXTRATIME notime = FALSE unitclockface = TRUE: unitclockpointer = TRUE extraclockface = TRUE: extraclockpointer = TRUE ELSEIF clockstate = REST THEN unitime(nowside, BEFORETIME) = unitime(nowside, NOWTIME) unitime(nowside, NOWTIME) = MAXUNITIME unitclockface = FALSE: unitclockpointer = TRUE extraclockface = FALSE: extraclockpointer = FALSE ELSEIF clockstate = TURN THEN IF unitime(nowside, NOWTIME) > 0 THEN unitime(nowside, BEFORETIME) = unitime(nowside, NOWTIME) unitime(nowside, NOWTIME) = unitime(nowside, NOWTIME) - SECOND unitclockface = FALSE: unitclockpointer = TRUE extraclockface = FALSE: extraclockpointer = FALSE ELSEIF unitime(nowside, NOWTIME) = 0 THEN extratime(nowside, BEFORETIME) = extratime(nowside, NOWTIME) extratime(nowside, NOWTIME) = extratime(nowside, NOWTIME) - SECOND unitclockface = FALSE: unitclockpointer = FALSE extraclockface = FALSE: extraclockpointer = TRUE IF extratime(nowside, NOWTIME) = 0 THEN notime = TRUE END IF END IF END IF IF recoverscreen = TRUE THEN befscreen = nowscreen END IF IF nowside = BLACKSIDE THEN CALL othelloscreen(BLACKSTATESCREEN, USE) ELSEIF nowside = WHITESIDE THEN CALL othelloscreen(WHITESTATESCREEN, USE) END IF IF unitclockface = TRUE THEN CIRCLE (11, 11), 10, WHITE: PAINT (11, 11), BLACK, WHITE CIRCLE (11, 11), .5, WHITE FOR a = ZEROOFCLOCKANGLE TO ZEROOFCLOCKANGLE - CIRCLEANGLE STEP -(CIRCLEANGLE / HALFDAY) LINE (9 * COS(a) + 11, 9 * SIN(a) + 11)-(8.5 * COS(a) + 11, 8.5 * SIN(a) + 11), WHITE NEXT a END IF IF unitclockpointer = TRUE THEN IF unitime(nowside, NOWTIME) < WARNTIME THEN IF unitime(nowside, NOWTIME) < MAXUNITIME THEN PLAY "c8" END IF END IF ot = unitime(nowside, BEFORETIME) nt = unitime(nowside, NOWTIME) IF nt <> ot THEN os = ot MOD MINUTE unitsecond(nowside) = nt MOD MINUTE a = ZEROOFCLOCKANGLE - SA * os LINE (1 * COS(a) + 11, 1 * SIN(a) + 11)-(7 * COS(a) + 11, 7 * SIN(a) + 11), BLACK ot = INT(ot / MINUTE) nt = INT(nt / MINUTE) IF nt <> ot THEN om = ot MOD HOUR unitminute(nowside) = nt MOD HOUR a = ZEROOFCLOCKANGLE - MA * om LINE (1 * COS(a) + 11, 1 * SIN(a) + 11)-(6 * COS(a) + 11, 6 * SIN(a) + 11), BLACK ot = INT(ot / HOUR) nt = INT(nt / HOUR) IF nt <> ot THEN oh = ot MOD HALFDAY unithour(nowside) = nt MOD HALFDAY a = ZEROOFCLOCKANGLE - HA * oh LINE (1 * COS(a) + 11, 1 * SIN(a) + 11)-(4.5 * COS(a) + 11, 4.5 * SIN(a) + 11), BLACK END IF END IF a = ZEROOFCLOCKANGLE - SA * unitsecond(nowside) LINE (1 * COS(a) + 11, 1 * SIN(a) + 11)-(7 * COS(a) + 11, 7 * SIN(a) + 11), RED a = ZEROOFCLOCKANGLE - MA * unitminute(nowside) LINE (1 * COS(a) + 11, 1 * SIN(a) + 11)-(6 * COS(a) + 11, 6 * SIN(a) + 11), BLUE a = ZEROOFCLOCKANGLE - HA * unithour(nowside) LINE (1 * COS(a) + 11, 1 * SIN(a) + 11)-(4.5 * COS(a) + 11, 4.5 * SIN(a) + 11), WHITE END IF END IF IF extraclockface = TRUE THEN CIRCLE (35, 15.5), 14, WHITE: PAINT (35, 15.5), BLACK, WHITE CIRCLE (35, 15.5), .5, WHITE FOR a = ZEROOFCLOCKANGLE TO ZEROOFCLOCKANGLE - CIRCLEANGLE STEP -(CIRCLEANGLE / HALFDAY) LINE (13.5 * COS(a) + 35, 13.5 * SIN(a) + 15.5)-(12 * COS(a) + 35, 12 * SIN(a) + 15.5), WHITE NEXT a END IF IF extraclockpointer = TRUE THEN ot = extratime(nowside, BEFORETIME) nt = extratime(nowside, NOWTIME) IF nt <> ot THEN os = ot MOD MINUTE extrasecond(nowside) = nt MOD MINUTE IF extrasecond(nowside) = 0 THEN IF extratime(nowside, NOWTIME) < MAXEXTRATIME THEN PLAY "e8" END IF END IF a = ZEROOFCLOCKANGLE - SA * os LINE (1 * COS(a) + 35, 1 * SIN(a) + 15.5)-(11 * COS(a) + 35, 11 * SIN(a) + 15.5), BLACK ot = INT(ot / MINUTE) nt = INT(nt / MINUTE) IF nt <> ot THEN om = ot MOD HOUR extraminute(nowside) = nt MOD HOUR a = ZEROOFCLOCKANGLE - MA * om LINE (1 * COS(a) + 35, 1 * SIN(a) + 15.5)-(9 * COS(a) + 35, 9 * SIN(a) + 15.5), BLACK ot = INT(ot / HOUR) nt = INT(nt / HOUR) IF nt <> ot THEN oh = ot MOD HALFDAY extrahour(nowside) = nt MOD HALFDAY a = ZEROOFCLOCKANGLE - HA * oh LINE (1 * COS(a) + 35, 1 * SIN(a) + 15.5)-(7 * COS(a) + 35, 7 * SIN(a) + 15.5), BLACK END IF END IF a = ZEROOFCLOCKANGLE - SA * extrasecond(nowside) LINE (1 * COS(a) + 35, 1 * SIN(a) + 15.5)-(11 * COS(a) + 35, 11 * SIN(a) + 15.5), RED a = ZEROOFCLOCKANGLE - MA * extraminute(nowside) LINE (1 * COS(a) + 35, 1 * SIN(a) + 15.5)-(9 * COS(a) + 35, 9 * SIN(a) + 15.5), BLUE a = ZEROOFCLOCKANGLE - HA * extrahour(nowside) LINE (1 * COS(a) + 35, 1 * SIN(a) + 15.5)-(7 * COS(a) + 35, 7 * SIN(a) + 15.5), WHITE END IF END IF IF recoverscreen = TRUE THEN CALL othelloscreen(befscreen, USE) END IF END SUB SUB computerthink (nowside AS INTEGER, board() AS INTEGER, x AS INTEGER, y AS INTEGER) SHARED timetrap AS INTEGER DIM Place AS INTEGER DIM xx AS INTEGER DIM yy AS INTEGER Place = FALSE timetrap = EVENTON TIMER ON FOR xx = 1 TO BOARDSIZE FOR yy = 1 TO BOARDSIZE IF board(xx, yy) = BLANK THEN Place = CheckPlace(nowside, board(), xx, yy) IF Place = TRUE THEN TIMER OFF timetrap = EVENTOFF x = xx y = yy IF nowside = BLACKSIDE THEN board(x, y) = BLACKSTONE ELSEIF nowside = WHITESIDE THEN board(x, y) = WHITESTONE END IF CALL stoneshow(board(x, y), x, y) EXIT SUB END IF END IF NEXT yy NEXT xx END SUB SUB DataLock (datastring AS STRING, password AS STRING) DIM passworda AS DOUBLE DIM passwordb AS DOUBLE DIM datalength AS INTEGER DIM tm AS DOUBLE DIM i AS INTEGER DIM byte AS STRING * 1 DIM add(1 TO 2) AS INTEGER DIM bit(1 TO 2) AS STRING * 1 CALL PasswordToPAB(password, passworda, passwordb) datalength = LEN(datastring) tm = PIRandomNum#(PasswordSwitch#((passworda))) FOR i = 1 TO datalength byte = CHR$(ASC(MID$(datastring, i, 1)) XOR FIX(256 * PIRandomNum#(-1))) MID$(datastring, i, 1) = byte NEXT i tm = ERandomNum#(PasswordSwitch#((passwordb))) FOR i = 1 TO datalength add(1) = FIX(datalength * ERandomNum#(-1) + 1) add(2) = FIX(datalength * ERandomNum#(-1) + 1) bit(1) = MID$(datastring, add(1), 1) bit(2) = MID$(datastring, add(2), 1) MID$(datastring, add(1), 1) = bit(2) MID$(datastring, add(2), 1) = bit(1) NEXT i tm = ERandomNum#(PasswordSwitch#((passworda))) FOR i = 1 TO datalength byte = CHR$(ASC(MID$(datastring, i, 1)) XOR FIX(256 * ERandomNum#(-1))) MID$(datastring, i, 1) = byte NEXT i tm = PIRandomNum#(PasswordSwitch#((passwordb))) FOR i = 1 TO datalength add(1) = FIX(datalength * PIRandomNum#(-1) + 1) add(2) = FIX(datalength * PIRandomNum#(-1) + 1) bit(1) = MID$(datastring, add(1), 1) bit(2) = MID$(datastring, add(2), 1) MID$(datastring, add(1), 1) = bit(2) MID$(datastring, add(2), 1) = bit(1) NEXT i tm = ERandomNum#((passworda)) tm = PIRandomNum#((passworda)) FOR i = 1 TO datalength add(1) = FIX(datalength * ERandomNum#(-1) + 1) add(2) = FIX(datalength * ERandomNum#(-1) + 1) bit(1) = MID$(datastring, add(1), 1) bit(2) = MID$(datastring, add(2), 1) bit(1) = CHR$(ASC(bit(1)) XOR FIX(256 * PIRandomNum#(-1))) bit(2) = CHR$(ASC(bit(2)) XOR FIX(256 * PIRandomNum#(-1))) MID$(datastring, add(1), 1) = bit(2) MID$(datastring, add(2), 1) = bit(1) NEXT i tm = PIRandomNum#((passwordb)) tm = ERandomNum#((passwordb)) FOR i = 1 TO datalength add(1) = FIX(datalength * PIRandomNum#(-1) + 1) add(2) = FIX(datalength * PIRandomNum#(-1) + 1) bit(1) = MID$(datastring, add(1), 1) bit(2) = MID$(datastring, add(2), 1) bit(1) = CHR$(ASC(bit(1)) XOR FIX(256 * ERandomNum#(-1))) bit(2) = CHR$(ASC(bit(2)) XOR FIX(256 * ERandomNum#(-1))) MID$(datastring, add(1), 1) = bit(2) MID$(datastring, add(2), 1) = bit(1) NEXT i END SUB SUB DataUnLock (datastring AS STRING, password AS STRING) DIM passworda AS DOUBLE DIM passwordb AS DOUBLE DIM datalength AS INTEGER DIM tm AS DOUBLE DIM i AS INTEGER DIM bit(1 TO 2) AS STRING * 1 DIM byte AS STRING * 1 datalength = LEN(datastring) DIM add(1 TO datalength, 1 TO 2) AS INTEGER DIM rn(1 TO datalength, 1 TO 2) AS STRING * 1 CALL PasswordToPAB(password, passworda, passwordb) tm = PIRandomNum#((passwordb)) tm = ERandomNum#((passwordb)) FOR i = 1 TO datalength add(1, i) = FIX(datalength * PIRandomNum#(-1) + 1) add(2, i) = FIX(datalength * PIRandomNum#(-1) + 1) rn(i, 1) = CHR$(FIX(256 * ERandomNum#(-1))) rn(i, 2) = CHR$(FIX(256 * ERandomNum#(-1))) NEXT i FOR i = datalength TO 1 STEP -1 bit(1) = MID$(datastring, add(i, 2), 1) bit(2) = MID$(datastring, add(i, 1), 1) bit(1) = CHR$(ASC(bit(1)) XOR ASC(rn(i, 1))) bit(2) = CHR$(ASC(bit(2)) XOR ASC(rn(i, 2))) MID$(datastring, add(i, 1), 1) = bit(1) MID$(datastring, add(i, 2), 1) = bit(2) NEXT i tm = ERandomNum#((passworda)) tm = PIRandomNum#((passworda)) FOR i = 1 TO datalength add(i, 1) = FIX(datalength * ERandomNum#(-1) + 1) add(i, 2) = FIX(datalength * ERandomNum#(-1) + 1) rn(i, 1) = CHR$(FIX(256 * PIRandomNum#(-1))) rn(i, 2) = CHR$(FIX(256 * PIRandomNum#(-1))) NEXT i FOR i = datalength TO 1 STEP -1 bit(1) = MID$(datastring, add(i, 2), 1) bit(2) = MID$(datastring, add(i, 1), 1) bit(1) = CHR$(ASC(bit(1)) XOR ASC(rn(i, 1))) bit(2) = CHR$(ASC(bit(2)) XOR ASC(rn(i, 2))) MID$(datastring, add(i, 1), 1) = bit(1) MID$(datastring, add(i, 2), 1) = bit(2) NEXT i tm = PIRandomNum#(PasswordSwitch#((passwordb))) FOR i = 1 TO datalength add(i, 1) = FIX(datalength * PIRandomNum#(-1) + 1) add(i, 2) = FIX(datalength * PIRandomNum#(-1) + 1) NEXT i FOR i = datalength TO 1 STEP -1 bit(1) = MID$(datastring, add(i, 2), 1) bit(2) = MID$(datastring, add(i, 1), 1) MID$(datastring, add(i, 1), 1) = bit(1) MID$(datastring, add(i, 2), 1) = bit(2) NEXT i tm = ERandomNum#(PasswordSwitch#((passworda))) FOR i = 1 TO datalength byte = CHR$(ASC(MID$(datastring, i, 1)) XOR FIX(256 * ERandomNum#(-1))) MID$(datastring, i, 1) = byte NEXT i tm = ERandomNum#(PasswordSwitch#((passwordb))) FOR i = 1 TO datalength add(i, 1) = FIX(datalength * ERandomNum#(-1) + 1) add(i, 2) = FIX(datalength * ERandomNum#(-1) + 1) NEXT i FOR i = datalength TO 1 STEP -1 bit(1) = MID$(datastring, add(i, 2), 1) bit(2) = MID$(datastring, add(i, 1), 1) MID$(datastring, add(i, 1), 1) = bit(1) MID$(datastring, add(i, 2), 1) = bit(2) NEXT i tm = PIRandomNum#(PasswordSwitch#((passworda))) FOR i = 1 TO datalength byte = CHR$(ASC(MID$(datastring, i, 1)) XOR FIX(256 * PIRandomNum#(-1))) MID$(datastring, i, 1) = byte NEXT i END SUB FUNCTION ERandomNum# (n AS DOUBLE) STATIC x AS DOUBLE SELECT CASE n CASE IS >= 0 x = LOG(n + PI) CASE IS < 0 x = LOG(x * C + PI) END SELECT x = x / 10 ^ INT(LOG(x) / LOG(10#) - 4) x = x - FIX(x) ERandomNum# = x END FUNCTION SUB faceshow (nowside AS INTEGER, facetype AS INTEGER) DIM forecolor AS INTEGER DIM backcolor AS INTEGER IF nowside = BLACKSIDE THEN CALL othelloscreen(BLACKSTATESCREEN, USE) ELSEIF nowside = WHITESIDE THEN CALL othelloscreen(WHITESTATESCREEN, USE) END IF IF nowside = BLACKSIDE THEN forecolor = WHITE backcolor = BLACK ELSEIF nowside = WHITESIDE THEN forecolor = BLACK backcolor = WHITE END IF CIRCLE (6, 25), 3.9, RED PAINT (6, 25), BLUE, RED PAINT (6, 25), backcolor, RED IF facetype = THINK THEN CIRCLE (4.8, 26), .6, forecolor CIRCLE (7.2, 26), .6, forecolor LINE (5, 23)-(7, 23), forecolor ELSEIF facetype = LOSE THEN CIRCLE (4.8, 26), .6, forecolor CIRCLE (7.2, 26), .6, forecolor CIRCLE (6, 21), 2.4, forecolor, 60 * DEGREE, 120 * DEGREE ELSEIF facetype = QUIET THEN CIRCLE (4.8, 26), .6, forecolor CIRCLE (7.2, 26), .6, forecolor CIRCLE (6, 23), 1, forecolor, , , .4 ELSEIF facetype = WIN THEN CIRCLE (4.8, 26), .6, forecolor CIRCLE (7.2, 26), .6, forecolor CIRCLE (6, 25), 2, forecolor, 240 * DEGREE, 300 * DEGREE END IF END SUB FUNCTION HexToDec# (hex AS STRING) DIM dec AS DOUBLE DIM length AS INTEGER DIM i AS INTEGER DIM byte AS STRING * 1 dec = 0 length = LEN(hex) FOR i = 1 TO length byte = MID$(hex, i, 1) SELECT CASE byte CASE "0" TO "9" dec = dec + (ASC(byte) - 48) * 16# ^ (length - i) CASE "A" TO "F" dec = dec + (ASC(byte) - 55) * 16# ^ (length - i) END SELECT NEXT i HexToDec# = dec END FUNCTION SUB humanthink (nowside AS INTEGER, board() AS INTEGER, x AS INTEGER, y AS INTEGER) CONST TWINKLETIME = 1 / 3 SHARED timetrap AS INTEGER DIM Left AS STRING * 2 DIM Right AS STRING * 2 DIM Up AS STRING * 2 DIM Down AS STRING * 2 DIM Enter AS STRING * 1 DIM State AS INTEGER DIM RefTime AS SINGLE DIM TimeBalance AS SINGLE DIM check AS STRING DIM Place AS INTEGER Left = CHR$(0) + CHR$(75) Right = CHR$(0) + CHR$(77) Up = CHR$(0) + CHR$(72) Down = CHR$(0) + CHR$(80) Enter = CHR$(13) Place = FALSE timetrap = EVENTON TIMER ON DO State = SHOW CALL lightmark(nowside, board(x, y), x, y, State) RefTime = TIMER DO TimeBalance = TIMER - RefTime TimeBalance = TimeBalance + DAY TimeBalance = TimeBalance - FIX(TimeBalance / DAY) * DAY IF TimeBalance >= TWINKLETIME THEN IF State = SHOW THEN State = DISAPPEAR ELSEIF State = DISAPPEAR THEN State = SHOW END IF CALL lightmark(nowside, board(x, y), x, y, State) RefTime = TIMER END IF check = INKEY$ LOOP WHILE check = "" State = DISAPPEAR CALL lightmark(nowside, board(x, y), x, y, State) LOCATE 23, 1 PRINT SPACE$(40); SELECT CASE check CASE Left x = x - 1 IF x < 1 THEN x = BOARDSIZE END IF CASE Right x = x + 1 IF x > BOARDSIZE THEN x = 1 END IF CASE Up y = y + 1 IF y > BOARDSIZE THEN y = 1 END IF CASE Down y = y - 1 IF y < 1 THEN y = BOARDSIZE END IF CASE Enter IF board(x, y) = BLANK THEN Place = CheckPlace(nowside, board(), x, y) IF Place = TRUE THEN TIMER OFF timetrap = EVENTOFF IF nowside = BLACKSIDE THEN board(x, y) = BLACKSTONE ELSEIF nowside = WHITESIDE THEN board(x, y) = WHITESTONE END IF CALL stoneshow(board(x, y), x, y) ELSEIF Place = FALSE THEN LOCATE 23, 1 PRINT "No strones capture."; BEEP END IF ELSE LOCATE 23, 1 PRINT "Occupied square."; BEEP END IF CASE ELSE BEEP END SELECT LOOP WHILE Place = FALSE END SUB SUB InputName (humanside AS INTEGER, bothname() AS playdata) CONST BLACKW = 1 CONST BLACKH = 6 CONST WHITEW = 11 CONST WHITEH = 6 CONST TWINKLETIME = 1 / 6 DIM w AS INTEGER DIM h AS INTEGER DIM i AS INTEGER DIM RefTime AS SINGLE DIM TimeBalance AS SINGLE DIM cw AS STRING * 1 DIM ct AS STRING * 1 DIM check AS STRING DIM humanname AS STRING IF humanside = BLACKSIDE THEN w = BLACKW h = BLACKH ELSEIF humanside = WHITESIDE THEN w = WHITEW h = WHITEH END IF humanname = "" i = 0 cw = "?" ct = " " RefTime = TIMER DO LOCATE w, h: PRINT humanname + cw + SPACE$(10 - i - 1) TimeBalance = TIMER - RefTime TimeBalance = TimeBalance + DAY TimeBalance = TimeBalance - FIX(TimeBalance / DAY) * DAY IF TimeBalance >= TWINKLETIME THEN SWAP cw, ct RefTime = TIMER END IF check = INKEY$ IF check >= "A" AND check <= "Z" OR check >= "a" AND check <= "z" OR check = " " OR check = "-" THEN humanname = humanname + check i = i + 1 END IF IF check = CHR$(8) AND i > 0 THEN i = i - 1 humanname = LEFT$(humanname, i) END IF LOOP UNTIL i >= 10 OR check = CHR$(13) bothname(humanside).playname = humanname LOCATE w, h: PRINT bothname(humanside).playname END SUB SUB Install END SUB SUB lightmark (nowside AS INTEGER, background AS INTEGER, x AS INTEGER, y AS INTEGER, cursor AS INTEGER) CALL trapcontrol(TRAPOFF) CALL othelloscreen(BOARDSCREEN, USE) IF cursor = SHOW THEN IF background = BLANK THEN IF nowside = BLACKSIDE THEN CIRCLE (x - .5, y - .5), .2, BLACK PAINT (x - .5, y - .5), BLACK, BLACK ELSEIF nowside = WHITESIDE THEN CIRCLE (x - .5, y - .5), .2, WHITE PAINT (x - .5, y - .5), WHITE, WHITE END IF ELSE CIRCLE (x - .5, y - .5), .2, RED PAINT (x - .5, y - .5), RED, RED END IF ELSEIF cursor = DISAPPEAR THEN IF background = BLANK THEN PAINT (x - .5, y - .5), BLUE, BLUE ELSEIF background = BLACKSTONE THEN PAINT (x - .5, y - .5), BLACK, BLACK ELSEIF background = WHITESTONE THEN PAINT (x - .5, y - .5), WHITE, WHITE END IF END IF CALL trapcontrol(TRAPON) END SUB SUB othelloscreen (screentype AS INTEGER, screenstate AS INTEGER) SHARED nowscreen AS INTEGER DIM i AS INTEGER IF screentype = BLACKSTATESCREEN THEN IF screenstate = SET THEN nowscreen = BLACKSTATESCREEN VIEW (1, 18)-(120, 77), BLUE, WHITE WINDOW (1, 1)-(50, 30) ELSEIF screenstate = USE AND nowscreen <> BLACKSTATESCREEN THEN nowscreen = BLACKSTATESCREEN VIEW (1, 18)-(120, 77) WINDOW (1, 1)-(50, 30) END IF ELSEIF screentype = WHITESTATESCREEN THEN IF screenstate = SET THEN nowscreen = WHITESTATESCREEN VIEW (1, 98)-(120, 157), BLUE, WHITE WINDOW (1, 1)-(50, 30) ELSEIF screenstate = USE AND nowscreen <> WHITESTATESCREEN THEN nowscreen = WHITESTATESCREEN VIEW (1, 98)-(120, 157) WINDOW (1, 1)-(50, 30) END IF ELSEIF screentype = BOARDSCREEN THEN IF screenstate = SET THEN nowscreen = BOARDSCREEN VIEW (126, 1)-(318, 161), BLUE, WHITE WINDOW (0, 0)-(BOARDSIZE, BOARDSIZE) FOR i = 0 TO BOARDSIZE LINE (i, 0)-(i, BOARDSIZE), BLACK NEXT i FOR i = 0 TO BOARDSIZE LINE (0, i)-(BOARDSIZE, i), BLACK NEXT i ELSEIF screenstate = USE AND nowscreen <> BOARDSCREEN THEN nowscreen = BOARDSCREEN VIEW (126, 1)-(318, 161) WINDOW (0, 0)-(BOARDSIZE, BOARDSIZE) END IF ELSEIF screentype = BUTTONSCREEN THEN END IF END SUB SUB overjudge (nowside AS INTEGER, board() AS INTEGER) DIM refnowside AS INTEGER DIM x AS INTEGER DIM y AS INTEGER refnowside = nowside DO IF nowside = BLACKSIDE THEN nowside = WHITESIDE ELSEIF nowside = WHITESIDE THEN nowside = BLACKSIDE END IF FOR x = 1 TO BOARDSIZE FOR y = 1 TO BOARDSIZE IF board(x, y) = BLANK THEN IF CheckPlace(nowside, board(), x, y) = TRUE THEN EXIT SUB END IF END IF NEXT y NEXT x LOOP UNTIL nowside = refnowside nowside = OVER END SUB FUNCTION PasswordSwitch# (password AS DOUBLE) DIM i AS INTEGER DIM tm AS DOUBLE DIM rn AS DOUBLE tm = password - FIX(password / 65536) * 65536 rn = PIRandomNum#((tm)) rn = ERandomNum#((tm)) FOR i = 1 TO 16 IF PIRandomNum#(-1) * 999999 < 500000 THEN password = password + FIX(C * PIRandomNum#(-1)) END IF IF ERandomNum#(-1) * 999999 >= 500000 THEN password = password + FIX(C * ERandomNum#(-1)) END IF NEXT i PasswordSwitch# = password - FIX(password / C) * C END FUNCTION SUB PasswordToPAB (password AS STRING, passworda AS DOUBLE, passwordb AS DOUBLE) passworda = HexToDec(MID$(password, 1, 4) + MID$(password, 5, 4)) passwordb = HexToDec(MID$(password, 9, 4) + MID$(password, 13, 4)) END SUB FUNCTION PIRandomNum# (n AS DOUBLE) STATIC x AS DOUBLE SELECT CASE n CASE IS >= 0 x = (n + E) ^ PI CASE IS < 0 x = (x * C + E) ^ PI END SELECT x = x / 10 ^ INT(LOG(x) / LOG(10#) - 4) x = x - FIX(x) PIRandomNum# = x END FUNCTION SUB Quit (choose AS INTEGER) CONST TWINKLETIME = 1 / 6 DIM RefTime AS SINGLE DIM TimeBalance AS SINGLE DIM cw AS STRING * 1 DIM ct AS STRING * 1 DIM check AS STRING cw = "?" ct = " " RefTime = TIMER DO LOCATE 23, 1: PRINT "Quit(Y/N)" + cw; TimeBalance = TIMER - RefTime TimeBalance = TimeBalance + DAY TimeBalance = TimeBalance - FIX(TimeBalance / DAY) * DAY IF TimeBalance >= TWINKLETIME THEN SWAP cw, ct RefTime = TIMER END IF check = INKEY$ LOOP UNTIL check = "Y" OR check = "y" OR check = "N" OR check = "n" LOCATE 23, 1: PRINT "Quit(Y/N)?" + check; IF check = "Y" OR check = "y" THEN choose = FINISH ELSEIF check = "N" OR check = "n" THEN choose = RENEW END IF LOCATE 23, 1 PRINT SPACE$(40); END SUB FUNCTION RandomNum# DIM rn AS DOUBLE DIM rb AS INTEGER DIM i AS INTEGER DIM j AS LONG rn = 0 RANDOMIZE TIMER FOR i = 3 TO 0 STEP -1 rb = INP(&H40) rn = rn + rb * 256# ^ i FOR j = 1 TO FIX(65536 * RND + 256) NEXT j NEXT i RandomNum# = rn END FUNCTION SUB RandomSide (gameorder AS INTEGER, bothname() AS playdata) DIM cl AS STRING IF gameorder = 0 THEN cl = UCASE$(COMMAND$) IF cl = "/C-C" THEN bothname(BLACKSIDE).playname = COMPUTERNAME bothname(BLACKSIDE).playtype = COMPUTER bothname(WHITESIDE).playname = COMPUTERNAME bothname(WHITESIDE).playtype = COMPUTER ELSEIF cl = "/H-H" THEN bothname(BLACKSIDE).playname = "" bothname(BLACKSIDE).playtype = HUMAN bothname(WHITESIDE).playname = "" bothname(WHITESIDE).playtype = HUMAN ELSE RANDOMIZE TIMER IF RND < .5 THEN bothname(BLACKSIDE).playname = "" bothname(BLACKSIDE).playtype = HUMAN bothname(WHITESIDE).playname = COMPUTERNAME bothname(WHITESIDE).playtype = COMPUTER ELSE bothname(BLACKSIDE).playname = COMPUTERNAME bothname(BLACKSIDE).playtype = COMPUTER bothname(WHITESIDE).playname = "" bothname(WHITESIDE).playtype = HUMAN END IF END IF ELSE SWAP bothname(BLACKSIDE).playname, bothname(WHITESIDE).playname SWAP bothname(BLACKSIDE).playtype, bothname(WHITESIDE).playtype END IF END SUB SUB Recorder (bothname() AS playdata) DIM filename AS STRING filename = LEFT$(bothname(BLACKSIDE).playname, 1) + "&" + LEFT$(bothname(WHITESIDE).playname, 1) + "_" + "xxxx" + ".HBQ" END SUB SUB stonenumshow (board() AS INTEGER, stonenum() AS INTEGER) SHARED nn AS STRING DIM x AS INTEGER DIM y AS INTEGER stonenum(BLACKSIDE) = 0 stonenum(WHITESIDE) = 0 FOR x = 1 TO BOARDSIZE FOR y = 1 TO BOARDSIZE IF board(x, y) = BLACKSTONE THEN stonenum(BLACKSIDE) = stonenum(BLACKSIDE) + 1 ELSEIF board(x, y) = WHITESTONE THEN stonenum(WHITESIDE) = stonenum(WHITESIDE) + 1 END IF NEXT y NEXT x LOCATE 2, 8: PRINT USING nn; stonenum(BLACKSIDE); LOCATE 12, 8: PRINT USING nn; stonenum(WHITESIDE); END SUB SUB stoneshow (stone AS INTEGER, x AS INTEGER, y AS INTEGER) CALL othelloscreen(BOARDSCREEN, USE) IF stone = BLACKSTONE THEN CIRCLE (x - .5, y - .5), .4, BLACK PAINT (x - .5, y - .5), BLACK, BLACK ELSEIF stone = WHITESTONE THEN CIRCLE (x - .5, y - .5), .4, WHITE PAINT (x - .5, y - .5), WHITE, WHITE END IF END SUB FUNCTION TestCode DIM filenumber AS INTEGER DIM length AS LONG DIM pdc AS STRING * PDCLENGTH DIM datastring AS STRING DIM regcod AS STRING filenumber = FREEFILE OPEN PROGRAMNAME + ".PDC" FOR BINARY AS filenumber length = LOF(filenumber) IF length = PDCLENGTH THEN GET filenumber, 1, pdc END IF CLOSE filenumber IF length = PDCLENGTH THEN datastring = pdc CALL DataUnLock(datastring, NO) regcod = MID$(datastring, 1, REGCODELEN) datastring = MID$(datastring, REGCODELEN + 1) CALL DataUnLock(datastring, NO) CALL DataUnLock(datastring, regcod) ELSE TestCode = FALSE END IF END FUNCTION SUB trapcontrol (control AS INTEGER) STATIC SHARED timetrap AS INTEGER SHARED keytrap AS INTEGER DIM n AS INTEGER DIM timetrapstack(1 TO 64) AS INTEGER DIM keytrapstack(1 TO 64) AS INTEGER IF control = TRAPINIT THEN FOR n = 1 TO 64 timetrapstack(n) = EVENTOFF keytrapstack(n) = EVENTOFF NEXT n n = 0 ELSEIF control = TRAPOFF THEN n = n + 1 timetrapstack(n) = timetrap IF timetrap = EVENTON THEN TIMER STOP timetrap = EVENTSTOP END IF keytrapstack(n) = keytrap IF keytrap = EVENTON THEN KEY(10) STOP keytrap = EVENTSTOP END IF ELSEIF control = TRAPON THEN SELECT CASE timetrapstack(n) CASE EVENTOFF TIMER OFF timetrap = EVENTOFF CASE EVENTSTOP TIMER STOP timetrap = EVENTSTOP CASE EVENTON timetrap = EVENTON TIMER ON END SELECT SELECT CASE keytrapstack(n) CASE EVENTOFF KEY(10) OFF keytrap = EVENTOFF CASE EVENTSTOP KEY(10) STOP keytrap = EVENTSTOP CASE EVENTON keytrap = EVENTON KEY(10) ON END SELECT n = n - 1 END IF END SUB SUB turnstone (board() AS INTEGER, x AS INTEGER, y AS INTEGER) DIM stone AS INTEGER DIM xplus AS INTEGER DIM yplus AS INTEGER DIM xpointer AS INTEGER DIM ypointer AS INTEGER DIM i AS INTEGER DIM j AS INTEGER stone = board(x, y) FOR xplus = -1 TO 1 FOR yplus = -1 TO 1 xpointer = x + xplus ypointer = y + yplus DO WHILE (xpointer >= 1 AND xpointer <= BOARDSIZE) AND (ypointer >= 1 AND ypointer <= BOARDSIZE) IF board(xpointer, ypointer) = stone THEN i = x + xplus j = y + yplus DO UNTIL i = xpointer AND j = ypointer board(i, j) = stone CALL stoneshow(board(i, j), i, j) i = i + xplus j = j + yplus LOOP EXIT DO ELSEIF board(xpointer, ypointer) = BLANK THEN EXIT DO END IF xpointer = xpointer + xplus ypointer = ypointer + yplus LOOP NEXT yplus NEXT xplus END SUB FUNCTION Verify$ (filenumber AS INTEGER, startadd AS LONG, endadd AS LONG) CONST TEMPSTRINGLEN = 8192 DIM i AS INTEGER DIM p AS LONG DIM s AS LONG DIM l AS INTEGER DIM tempstring AS STRING DIM q AS INTEGER DIM t AS LONG DIM u AS DOUBLE DIM tc AS STRING * 2 DIM verifyhex(0 TO 15) AS LONG DIM verifynum(0 TO 15) AS LONG DIM verifystring AS STRING tc = CHR$(0) + CHR$(0) FOR i = 0 TO 15 verifyhex(i) = 0 verifynum(i) = 0 NEXT i p = startadd i = 0 DO WHILE p <= endadd s = endadd - p + 1 IF s < TEMPSTRINGLEN THEN l = s ELSE l = TEMPSTRINGLEN END IF tempstring = STRING$(l, 0) GET filenumber, p, tempstring IF l MOD 2 = 1 THEN l = l + 1 tempstring = tempstring + CHR$(0) END IF FOR q = 1 TO l STEP 2 t = CVL(MID$(tempstring, q, 2) + tc) verifyhex(15 - i) = verifyhex(15 - i) XOR t u = CDBL(t + 1) * FIX(65536 * RND + 1) + verifynum(i) verifynum(i) = u - FIX(u / 65536#) * 65536# i = (i + 1) MOD 16 NEXT q p = p + l LOOP FOR i = 0 TO 15 verifynum(i) = verifynum(i) XOR verifyhex(i) NEXT i verifystring = "" FOR i = 0 TO 15 verifystring = verifystring + LEFT$(MKL$(verifynum(i)), 2) NEXT i Verify$ = verifystring END FUNCTION SUB winshow (winside AS INTEGER) IF winside = BLACKWIN THEN CALL faceshow(BLACKSIDE, WIN) CALL faceshow(WHITESIDE, LOSE) ELSEIF winside = WHITEWIN THEN CALL faceshow(BLACKSIDE, LOSE) CALL faceshow(WHITESIDE, WIN) ELSEIF winside = EQUAL THEN CALL faceshow(BLACKSIDE, QUIET) CALL faceshow(WHITESIDE, QUIET) END IF END SUB FUNCTION winsidejudge (nowside AS INTEGER, notime AS INTEGER, accpetlose AS INTEGER, stonenum() AS INTEGER) IF nowside = OVER THEN IF stonenum(BLACKSIDE) > stonenum(WHITESIDE) THEN winsidejudge = BLACKWIN ELSEIF stonenum(BLACKSIDE) = stonenum(WHITESIDE) THEN winsidejudge = EQUAL ELSEIF stonenum(BLACKSIDE) < stonenum(WHITESIDE) THEN winsidejudge = WHITEWIN END IF ELSEIF nowside <> OVER THEN IF notime = TRUE OR accpetlose = TRUE THEN IF nowside = BLACKSIDE THEN winsidejudge = BLACKWIN ELSEIF nowside = WHITESIDE THEN winsidejudge = WHITEWIN END IF END IF END IF END FUNCTION