'=========================================================================== ' Subject: MAD MAD MAD MAZES Date: Year of 1989 ' Author: Frederick Volking Code: QB, QBasic, PDS ' Origin: x2ftp.oulu.fi Packet: GAMES.ABC '=========================================================================== CLS LOCATE 25,1 PRINT "MAD MAD MAD MAZES! Copyright 1989 Frederick Volking Version: 1.0"; LOCATE 13,20 : PRINT " = Color Graphics Adapter (CGA)"; LOCATE 14,20 : PRINT " = Enhanced Graphics Adapter (EGA)"; LOCATE 15,20 : PRINT " = Video Graphics Adapter (VGA)"; LOCATE 11,20 : PRINT "Which Graphics Adapter? : "; DO : GMode$ = INKEY$ : LOOP WHILE (GMODE$ = "") IF GMode$ = "" THEN END GMode$ = UCASE$(GMode$) IF INSTR("CEV",Gmode$) = 0 THEN END IF GMode$ = "C" THEN GMode% = 2 IF GMode$ = "E" THEN GMode% = 8 IF GMode$ = "V" THEN GMode% = 12 '================================== Initialize Hardware & Random Seed Generator Screen GMode% ScoreFile$ = "MAZESCOR.DAT" DEFINT A-Z K% = VAL(MID$(DATE$,4,2))+VAL(RIGHT$(TIME$,2))+VAL(LEFT$(TIME$,2))+VAL(MID$(TIME$,4,2)) Randomize K% '============================================ Define Static Substitution Macros %FALSE = 0 %TRUE = 1 %UP = 1 %LEFT = 2 %DOWN = 3 %RIGHT = 4 %OUP = 1 %ORIGHT = 2 %ODOWN = 4 %OLEFT = 8 %TUP = 16 %TRIGHT = 32 %TDOWN = 64 %TLEFT = 128 '====================================================== Define Default settings IF GMode% = 2 THEN Xaxis% = 191 : Yaxis% = 639 END IF IF GMode% = 8 THEN Xaxis% = 191 : Yaxis% = 639 : PcolorON% = 3 END IF IF GMode% = 12 THEN Xaxis% = 380 : Yaxis% = 639 : PcolorON% = 3 END IF DIM STATIC HighTimes&(10),Whose(10) IF GMode% = 2 THEN TokenColor% = 1 CrumbColor% = 1 WallColor% = 1 ELSE TokenColor% = 12 CrumbColor% = 11 WallColor% = 7 GOSUB SetUpColors END IF Cmd$ = UCASE$(COMMAND$) CountDown% = %TRUE '===================================================== Main Program Loop Begins Cycle% = 1 WHILE (Cycle% < 11) CLS SELECT CASE Cycle% CASE = 1 : CellSize% = 30 CASE = 2 : CellSize% = 25 CASE = 3 : CellSize% = 20 CASE = 4 : CellSize% = 15 CASE = 5 : CellSize% = 12 CASE = 6 : CellSize% = 9 CASE = 7 : CellSize% = 7 CASE = 8 : CellSize% = 5 CASE = 9 : CellSize% = 3 CASE = 10 : CellSize% = 2 END SELECT GOSUB PrintLine25 '=========================================== Calculate global default values CellsTall% = ( FIX(Xaxis% / CellSize%)) CellsWide% = ( FIX((Yaxis% / CellSize%) / 2 )) FrameBottom% = (CellsTall% * CellSize%) FrameRight% = (CellsWide% * (CellSize% * 2)) WallsToDraw% = ((CellsTall%+1) * (CellsWide%+1)) - ((CellsTall%+CellsWide%) * 2 ) '============================================== Dimension appropriate arrays DIM DYNAMIC Walls%(CellsTall%,CellsWide%) '=================================================== Initialize array values FOR C% = 0 to CellsWide% Walls%(0,C%) = 1 Walls%(CellsTall%,C%) = 1 NEXT FOR C% = 0 to CellsTall% Walls%(C%,0) = 1 Walls%(C%,CellsWide%) = 1 NEXT '================================================================= Draw maze GOSUB DrawMaze ERASE Walls% DIM DYNAMIC Pfield%(CellsTall%+1,CellsWide%+1) '============================================================ One Maze Cycle DoorOut% = (FnR%(CellsTall%-2))+1 LINE (0,DoorOut%*CellSize%) - (0,(DoorOut%*CellSize%)+(CellSize%)), 0 OriginX% = (FnR%(CellsTall%-2))+1 CurX% = OriginX% CurY% = CellsWide% LastCurX% = CurX% LastCurY% = CurY% IF Cmd$ = "DEMO" THEN KeepGoing% = %FALSE AutoSolve% = %TRUE ELSE KeepGoing% = %TRUE AutoSolve% = %FALSE END IF INCR DoorOut% MazeIsDrawn% = %TRUE BeginTimer! = TIMER WHILE (KeepGoing%) IF PField%(CurX%,CurY%) = 1 THEN CALL DrawPiece(LastCurX%,LastCurY%,0,0) PField%(LastCurX%,LastCurY%) = 0 ELSE CALL DrawPiece(LastCurX%,LastCurY%,TokenColor%,1) END IF CALL DrawPiece(CurX%,CurY%,TokenColor%,0) PField%(CurX%,CurY%) = 1 LastCurX% = CurX% LastCurY% = CurY% DO K$ = INKEY$ GOSUB ShowElapsed LOOP WHILE (K$ = "") IF (LEN(K$) = 2) THEN K% = 1000 ELSE K% = 0 K% = K% + ASC(RIGHT$(K$,1)) Xnext% = CurX% Ynext% = CurY% SELECT CASE K% CASE 1072 : DECR Xnext% ' Up CASE 1077 : INCR Ynext% ' Right CASE 1080 : INCR Xnext% ' Down CASE 1075 : DECR Ynext% ' Left CASE 27 : GOSUB ExitRequested ' ESC END SELECT IF ((Xnext% = DoorOut%) AND (Ynext% = 0)) THEN KeepGoing% = %FALSE ELSE IF FnBlocked%(CurX%,CurY%,XNext%,Ynext%) THEN XNext% = CurX% YNext% = CurY% END IF END IF CurX% = Xnext% CurY% = Ynext% WEND MazeIsDrawn% = %FALSE IF AutoSolve% THEN BeginTimer! = TIMER GOSUB YouDoIt GOSUB ShowTotalMazeTime IF Cmd$ = "DEMO" THEN W% = FnStartTimer%(10) WHILE FnSecondsElapsed%(25,70) > 0 IF INKEY$ > "" THEN GOSUB ExitRequested WEND ELSE LOCATE 25,1 : PRINT SPACE$(79); LOCATE 25,21 : PRINT "Press to return to DOS"; WHILE INKEY$ = "" : WEND CLS END END IF ELSE GOSUB ShowTotalMazeTime END IF ERASE Pfield% INCR Cycle% IF Cmd$ = "DEMO" THEN IF Cycle% = 11 THEN Cycle% = 1 END IF WEND LOCATE 25,1 : PRINT SPACE$(79); LOCATE 25,21 : PRINT "Press to return to DOS"; WHILE INKEY$ = "" : WEND END 'of main program loop '============================================================================== '===================== Functions & Subroutines Begin ========================== '============================================================================== '================================================ Define Random Number Function DEF FnR%(X%) = INT(RND * X%) + 1 '=================================================== Automatically solve a maze YouDoIt: '========================================= Erase old path & return to origin KeepBacking% = %True WHILE KeepBacking% PField%(CurX%,CurY%) = 0 CALL DrawPiece(CurX%,CurY%,0,0) IF ((CurX% = OriginX%) AND (CurY% = CellsWide%)) THEN KeepBacking% = %FALSE ELSE Trim% = 0 IF FnBlocked%(CurX%,CurY%,CurX%-1,CurY% ) = %FALSE THEN _ IF (PField%(CurX%-1,CurY% ) = 1) THEN Trim% = %UP IF FnBlocked%(CurX%,CurY%,CurX% ,CurY%-1) = %FALSE THEN _ IF (PField%(CurX% ,CurY%-1) = 1) THEN Trim% = %LEFT IF FnBlocked%(CurX%,CurY%,CurX%+1,CurY% ) = %FALSE THEN _ IF (PField%(CurX%+1,CurY% ) = 1) THEN Trim% = %DOWN IF FnBlocked%(CurX%,CurY%,CurX% ,CurY%+1) = %FALSE THEN _ IF (PField%(CurX% ,CurY%+1) = 1) THEN Trim% = %RIGHT SELECT CASE Trim% CASE %UP : DECR CurX% CASE %LEFT : DECR CurY% CASE %DOWN : INCR CurX% CASE %RIGHT : INCR CurY% END SELECT END IF WEND '================================================================ Solve Maze AllTested% = %TUP + %TRIGHT + %TDOWN + %TLEFT PField%(CurX%,CurY%) = %ORIGHT + %TRIGHT NotFoundYet% = %TRUE MazeIsDrawn% = %FALSE IF Cmd$ = "DEMO" THEN CALL DrawPiece(CurX%,CurY%,TokenColor%,0) W% = FnStartTimer%(10) WHILE FnSecondsElapsed%(25,70) > 0 IF INKEY$ > "" THEN GOSUB ExitRequested WEND END IF DO IF INKEY$ > "" THEN GOSUB ExitRequested GOSUB ShowElapsed IF ((PField%(LastCurX%,LastCurY%) AND AllTested) = AllTested) THEN _ CALL DrawPiece(LastCurX%,LastCurY%,0,0) _ ELSE CALL DrawPiece(LastCurX%,LastCurY%,TokenColor%,1) CALL DrawPiece(CurX%,CurY%,TokenColor%,0) LastCurX% = CurX% LastCurY% = CurY% IF ((PField%(CurX%,CurY%) AND %TUP) <> %TUP) THEN IF FnBlocked%(CurX%,CurY%,CurX%-1,CurY%) = %TRUE THEN PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TUP ELSE IF ((PField%(CurX%-1,CurY%) AND AllTested%) = AllTested%) THEN _ PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TUP END IF END IF IF ((PField%(CurX%,CurY%) AND %TDOWN) <> %TDOWN) THEN IF FnBlocked%(CurX%,CurY%,CurX%+1,CurY%) = %TRUE THEN PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TDOWN ELSE IF ((PField%(CurX%+1,CurY%) AND AllTested%) = AllTested%) THEN _ PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TDOWN END IF END IF IF ((PField%(CurX%,CurY%) AND %TLEFT) <> %TLEFT) THEN IF FnBlocked%(CurX%,CurY%,CurX%,CurY%-1) = %TRUE THEN PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TLEFT ELSE IF ((PField%(CurX%,CurY%-1) AND AllTested%) = AllTested%) THEN _ PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TLEFT END IF END IF IF ((PField%(CurX%,CurY%) AND %TRIGHT) <> %TRIGHT) THEN IF FnBlocked%(CurX%,CurY%,CurX%,CurY%+1) = %TRUE THEN PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TRIGHT ELSE IF ((PField%(CurX%,CurY%+1) AND AllTested%) = AllTested%) THEN _ PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TRIGHT END IF END IF IF ((PField%(CurX%,CurY%) AND AllTested) = AllTested) THEN IF ((PField%(CurX%,CurY%) AND %ORIGHT) = %ORIGHT) THEN INCR CurY% PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TLEFT ELSE IF ((PField%(CurX%,CurY%) AND %OLEFT) = %OLEFT) THEN DECR CurY% PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TRIGHT ELSE IF ((PField%(CurX%,CurY%) AND %OUP) = %OUP) THEN DECR CurX% PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TDOWN ELSE INCR CurX% PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TUP END IF END IF END IF ELSE IF ((PField%(CurX%,CurY%) AND %TRIGHT) <> %TRIGHT) THEN INCR CurY% PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TLEFT + %OLEFT ELSE IF ((PField%(CurX%,CurY%) AND %TLEFT) <> %TLEFT) THEN DECR CurY% PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TRIGHT + %ORIGHT ELSE IF ((PField%(CurX%,CurY%) AND %TUP) <> %TUP) THEN DECR CurX% PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TDOWN + %ODOWN ELSE INCR CurX% PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TUP + %OUP END IF END IF END IF END IF IF ((CurX% = DoorOut%) AND (CurY% = 1)) THEN NotFoundYet% = %FALSE LOOP WHILE (NotFoundYet% = %TRUE) CALL DrawPiece(LastCurX%,LastCurY%,TokenColor%,1) CALL DrawPiece(CurX%,CurY%,TokenColor%,0) IF Cmd$ <> "DEMO" THEN SOUND 500,10 RETURN '=========================================== Determine if XY to XY move is Okay DEF FnBlocked%(OldX%,OldY%,NewX%,NewY%) SHARED CellSize%,CellsTall%,CellsWide% LOCAL TestDirect%,XPoint%,YPoint% IF ((NewX%<1) OR (NewX%>CellsTall%) OR _ (NewY%<1) OR (NewY%>CellsWide%)) THEN FnBlocked% = %TRUE ELSE IF OldX% = NewX% THEN IF OldY% > NewY% THEN TestDirect% = %LEFT ELSE TestDirect% = %RIGHT ELSE IF OldX% > NewX% THEN TestDirect% = %Up ELSE TestDirect% = %DOWN END IF Xpoint% = ((CurX% - 1) * CellSize%) + 1 Ypoint% = ((CurY% - 1) * (CellSize% * 2)) + 1 SELECT CASE TestDirect% CASE %UP : DECR Xpoint% ' Up CASE %RIGHT : Ypoint%=Ypoint%+((CellSize%*2)-1) ' Right CASE %DOWN : Xpoint%=Xpoint%+(CellSize%-1) ' Down CASE %LEFT : DECR Ypoint% ' Left END SELECT IF POINT(Ypoint%,Xpoint%) THEN FnBlocked% = %TRUE ELSE FnBlocked% = %FALSE END IF END DEF '==================================================================== Draw Maze DrawMaze: LINE (0,0) - (FrameRight%, FrameBottom%), WallColor%, B HalfWallsToDraw% = int(WallsToDraw% / 2) WHILE (WallsToDraw% > HalfWallsToDraw%) IF INKEY$>"" THEN GOSUB ExitRequested DO MostX% = FnR%(CellsTall%) MostY% = FnR%(CellsWide%) LOOP WHILE (Walls%(MostX%,MostY%) = 1) GOSUB DrawWall WEND CyclicMostX% = 1 CyclicMostY% = 1 WHILE (WallsToDraw% > 0) IF INKEY$>"" THEN GOSUB ExitRequested DO INCR CyclicMostY% IF CyclicMostY% = CellsWide% THEN CyclicMostY% = 1 INCR CyclicMostX% IF CyclicMostX% = CellsTall% THEN CyclicMostX% = 1 END IF LOOP WHILE (Walls%(CyclicMostX%,CyclicMostY%) = 1) MostX% = CyclicMostX% MostY% = CyclicMostY% GOSUB DrawWall WEND RETURN '=========================================================== Draw players piece SUB DrawPiece(AtX%, AtY%, UseColor%, DroppingMark%) LOCAL TopXcoord%,TopYcoord%,BotXcoord%,BotYCoord%,CenterY%,CenterX%,Rads% SHARED CellSize%, PColorON%, CrumbColor% TopXcoord% = ((AtX% - 1) * CellSize%) + 1 TopYcoord% = ((AtY% - 1) * (CellSize% * 2)) + 1 BotXcoord% = (TopXcoord% + CellSize%) - 2 BotYcoord% = (TopYcoord% + (CellSize% * 2)) - 2 IF DroppingMark% THEN LINE (TopYcoord%, TopXcoord%) - (BotYcoord%, BotXcoord%), 0, BF CenterY% = TopYcoord%+CellSize% CenterX% = TopXcoord%+FIX(CellSize%/2) Rads% = INT(CellSize% / 3) IF CellSize% = 2 THEN PSET (TopYcoord%+1, TopXCoord%), CrumbColor% ELSE IF Rads% < 3 THEN PSET (CenterY%, CenterX%), CrumbColor% ELSE CIRCLE (CenterY%, CenterX%), Rads%, CrumbColor% END IF END IF ELSE LINE (TopYcoord%, TopXcoord%) - (BotYcoord%, BotXcoord%), UseColor%, BF END IF END SUB '================================================== Print Title & Current Level PrintLine25: LOCATE 25,1 PRINT SPACE$(79); LOCATE 25,1 PRINT "MAD MAZES! Copyright 1989 Frederick Volking V:1.0 Level: "; PRINT USING "## of 10";Cycle%; RETURN '==================================================================== Draw Wall DrawWall: FOR Which% = 1 TO 0 STEP (-1) Direc% = FnR%(4) InitMostX% = MostX% InitMostY% = MostY% WHILE (Walls%(MostX%,MostY%) = Which%) SELECT CASE Direc% CASE = 1 : DECR MostX% 'Up CASE = 2 : INCR MostY% 'Right CASE = 3 : INCR MostX% 'Down CASE = 4 : DECR MostY% 'Left END SELECT IF ((MostX% < 0) OR (MostX% > CellsTall%) OR _ (MostY% < 0) OR (MostY% > CellsWide%)) THEN IF Direc% = 4 THEN Direc% = 1 _ ELSE INCR Direc% MostX% = InitMostX% MostY% = InitMostY% END IF WEND NEXT SELECT CASE Direc% CASE = 1 : LastDirec% = 3 'Up CASE = 2 : LastDirec% = 4 'Right CASE = 3 : LastDirec% = 1 'Down CASE = 4 : LastDirec% = 2 'Left END SELECT LastX% = MostX% * CellSize% LastY% = (MostY% * 2) * CellSize% DeadEndReached% = %FALSE DO Cycles% = 0 KeepLooking% = %TRUE DO INCR Cycles% NewX% = LastX% NewY% = LastY% Direc% = LastDirec% Turn% = (FnR%(3)-2) IF Turn%<>0 THEN Direc% = Direc% + Turn% IF Direc% > 4 THEN Direc% = 1 IF Direc% < 1 THEN Direc% = 4 END IF SELECT CASE Direc% CASE = 1 : NewX% = LastX% - CellSize% 'up CASE = 2 : NewY% = LastY% + (CellSize% * 2) 'right CASE = 3 : NewX% = LastX% + CellSize% 'down CASE = 4 : NewY% = LastY% - (CellSize% * 2) 'left END SELECT IF Cycles% < 10 THEN IF ((NewX% => FrameBottom%) OR (NewX% <= 0) OR _ (NewY% => FrameRight% ) OR (NewY% <= 0) ) THEN KeepLooking% = %TRUE ELSE XC% = FIX(NewX% / CellSize%) YC% = FIX(NewY% / (CellSize% * 2)) IF Walls%(XC%,YC%) = 0 THEN KeepLooking% = %FALSE _ ELSE KeepLooking% = %TRUE END IF ELSE KeepLooking% = %FALSE END IF LOOP WHILE (KeepLooking% = %TRUE) IF Cycles% < 10 THEN LINE (LastY%,LastX%) - (NewY%,NewX%), WallColor% Walls%(XC%,YC%) = 1 DECR WallsToDraw% LastX% = NewX% LastY% = NewY% LastDirec% = Direc% DeadEndReached% = %FALSE ELSE DeadEndReached% = %TRUE END IF LOOP WHILE (DeadEndReached% = %FALSE) RETURN '============================================================== Exit Requested? ExitRequested: LOCATE 25,1 : PRINT SPACE$(79); LOCATE 25,34 PRINT "Quit? (Y/N) : "; DO K$ = UCASE$(INKEY$) LOOP WHILE ((K$ <> "Y") AND (K$ <> "N") AND (K$ <> CHR$(27))) IF K$ = "Y" THEN IF MazeIsDrawn% = %TRUE THEN LOCATE 25,1 : PRINT SPACE$(79); LOCATE 25,25 PRINT "Shall I Solve It? (Y/N) : "; DO K$ = UCASE$(INKEY$) LOOP WHILE ((K$ <> "Y") AND (K$ <> "N") AND (K$ <> CHR$(27))) IF K$ = "N" THEN SCREEN 0,0 CLS END END IF IF K$ = "Y" THEN AutoSolve% = %TRUE KeepGoing% = %FALSE END IF ELSE SCREEN 0,0 CLS END END IF END IF GOSUB PrintLine25 RETURN '============================= Display Total elapsed playing time for this maze ShowElapsed: TimerNow! = TIMER TotTime! = TimerNow! - BeginTimer! Minutes% = FIX(TotTime! / 60) Seconds% = INT(TotTime! - (Minutes% * 60)) IF Seconds% <> LastSeconds% THEN LOCATE 25, 73, 0 PRINT USING "###";Minutes%; PRINT ":"; PRINT RIGHT$(STR$(Seconds%+100),2); LastSeconds% = Seconds% END IF RETURN '======================================= Display Time required to complete maze ShowTotalMazeTime: TimerNow! = TIMER TotTime! = TimerNow! - BeginTimer! Minutes% = FIX(TotTime! / 60) LSeconds! = TotTime! - (Minutes% * 60) LOCATE 25,1 : PRINT SPACE$(79); LOCATE 25,1 IF AutoSolve% = %TRUE THEN PRINT "COMPUTER's "; _ ELSE PRINT "Your "; PRINT "time to complete level";Cycle%;"was: "; IF Minutes% > 0 THEN PRINT Minutes%; "Minute(s) "; PRINT USING "##.# Seconds - Press ";LSeconds!; IF Cmd$ <> "DEMO" THEN WHILE INKEY$ = "" : WEND END IF RETURN '====================================================== ReDefine and Set Colors SetUpColors: CLS DIM DYNAMIC TempColor%(3) TempColor%(1) = WallColor% TempColor%(2) = TokenColor% TempColor%(3) = CrumbColor% FOR C% = 1 to 15 LINE (29+(c%*32),30) - (29+(C%*32)+20,70), C%, BF LOCATE 10, (c%*4)+5 PRINT USING "##";C%; NEXT LOCATE 14,20 : PRINT "Color for Maze Walls : "; LOCATE 16,20 : PRINT "Color for Player's Token : "; LOCATE 18,20 : PRINT "Color for Bread Crumbs : "; LOCATE 21,20 : PRINT "Press - & to Select"; LOCATE 22,20 : PRINT " - & to change color"; LOCATE 2,20 : PRINT " when finished"; CurLine% = 1 DO IF CurLine% < 1 THEN CurLine% = 3 IF CurLine% > 3 THEN CurLine% = 1 FOR C% = 1 to 3 IF TempColor%(C%) < 1 THEN TempColor%(C%)= 15 IF TempColor%(C%) > 15 THEN TempColor%(C%) = 1 LOCATE ((C% - 1) * 2) + 14, 47 PRINT USING "## ";TempColor%(C%); NEXT LOCATE ((CurLine% - 1) * 2) + 14, 50 PRINT "<--"; DO KeyChoice$ = INKEY$ LOOP WHILE KeyChoice$ = "" Choice% = ASC(RIGHT$(KeyChoice$,1)) SELECT CASE Choice% CASE 72 : DECR CurLine% ' Up CASE 80 : INCR CurLine% ' Down CASE 77 : INCR TempColor%(CurLine%) ' Right CASE 75 : DECR TempColor%(CurLine%) ' Left CASE 27 : GOSUB ExitRequested END SELECT LOOP WHILE (KeyChoice$ <> CHR$(13)) CLS WallColor% = TempColor%(1) TokenColor% = TempColor%(2) CrumbColor% = TempColor%(3) ERASE TempColor% RETURN '============================================================================= DEF FnStartTimer%(Long%) SHARED Elapsed&,CountDown% IF Long% = 0 THEN CountDown% = %FALSE Elapsed& = 0 ELSE CountDown% = %TRUE Elapsed& = (CLNG(Long%)) * 997564 END IF MTIMER END DEF '============================================================================= DEF FnSecondsElapsed%(TUR%,TUC%) SHARED Elapsed&,CountDown% LOCAL TimeSinceLast&, K% TimeSinceLast&=MTIMER MTIMER Elapsed& = Elapsed& - TimeSinceLast& IF Elapsed& < 0 THEN Elapsed& = 0 K% = FnShowTime(Elapsed&) FnSecondsElapsed% = K% END DEF '============================================================================= DEF FnShowTime%(HowMuch&) SHARED LastSecond%,CountDown% LOCAL Minutes%, HoldSeconds% HoldSeconds%=INT(FIX(HowMuch&/997564)) Minutes%=INT(FIX(HowMuch&/59853831)) HowMuch&=HowMuch&-(CLNG(Minutes%) * 59853831) Seconds%=INT(FIX(HowMuch&/997564)) IF LastSecond%<>HoldSeconds% THEN LOCATE 25,73 PRINT USING "###";Minutes%; PRINT ":"; PRINT RIGHT$(STR$(Seconds%+100),2); LastSecond%=HoldSeconds% END IF FnShowTime%=HoldSeconds% END DEF '=========================================================== End Of Programming