' Stuart MacGillivray ' April/May, 2002 MAINMODULE: GOSUB SETUP GOSUB GAME END SETUP: CLS INPUT "Size of the grid"; S INPUT "Number of mines"; M CREATOR$ = "Stuart MacGillivray" CLS DIM SQUARE$(S, S) DIM MINE(S + 1, S + 1) FOR A = 1 TO S FOR B = 1 TO S SQUARE$(A, B) = " " NEXT B NEXT A RANDOMIZE TIMER GOSUB PLACEMINES RETURN PLACEMINES: FOR X = 1 TO M DO FLAG = 0 A = RND * 10000 MOD S + 1 B = RND * 10000 MOD S + 1 IF MINE(A, B) = 0 THEN FLAG = 1 MINE(A, B) = 1 ELSE PRINT "BLEH." END IF LOOP UNTIL FLAG = 1 NEXT X GAME: DO UNTIL VICTORY <> 0 GOSUB PLAYERCHOICE GOSUB CHECKFORWIN LOOP GOSUB CHEER RETURN PLAYERCHOICE: GOSUB PRINTOUT DO FLAG = 0 INPUT "Where"; TARGET GOSUB VERIFY LOOP UNTIL FLAG = 0 GOSUB SETSQUARE ROUNDS = ROUNDS + 1 RETURN PRINTOUT: CLS FMT1$ = "|\\" FOR A = 1 TO S FOR B = 1 TO S: PRINT "---"; : NEXT B PRINT FOR B = 1 TO S: PRINT USING FMT1$; SQUARE$(B, A); : NEXT B PRINT "|" NEXT A RETURN VERIFY: XVAR = TARGET MOD S IF XVAR = 0 THEN XVAR = S YVAR = TARGET \ S IF XVAR <> S THEN YVAR = YVAR + 1 IF SQUARE$(XVAR, YVAR) <> " " THEN FLAG = 1 RETURN SETSQUARE: IF MINE(XVAR, YVAR) = 1 THEN VICTORY = 2 ELSE NEAR = 0 IF MINE(XVAR - 1, YVAR) = 1 THEN NEAR = NEAR + 1 IF MINE(XVAR + 1, YVAR) = 1 THEN NEAR = NEAR + 1 IF MINE(XVAR, YVAR + 1) = 1 THEN NEAR = NEAR + 1 IF MINE(XVAR, YVAR - 1) = 1 THEN NEAR = NEAR + 1 IF MINE(XVAR + 1, YVAR + 1) = 1 THEN NEAR = NEAR + 1 IF MINE(XVAR - 1, YVAR + 1) = 1 THEN NEAR = NEAR + 1 IF MINE(XVAR + 1, YVAR - 1) = 1 THEN NEAR = NEAR + 1 IF MINE(XVAR - 1, YVAR - 1) = 1 THEN NEAR = NEAR + 1 SQUARE$(XVAR, YVAR) = STR$(NEAR) END IF RETURN CHECKFORWIN: FOR A = 1 TO S FOR B = 1 TO S IF SQUARE$(A, B) = " " THEN IF MINE(A, B) = 0 THEN FLAG = 1 END IF END IF NEXT B NEXT A IF FLAG <> 1 THEN VICTORY = 1 RETURN CHEER: GOSUB REVEAL GOSUB PRINTOUT IF VICTORY = 2 THEN PRINT "You lose!" IF VICTORY = 1 THEN PRINT "You win!" PRINT PRINT CREATOR$; " made this program. No stealing." RETURN REVEAL: FOR C = 1 TO S FOR D = 1 TO S IF MINE(C, D) = 1 THEN SQUARE$(C, D) = " X" NEXT NEXT RETURN