DECLARE SUB Display (l1%, c1%, l2%, c2%) DECLARE SUB Initialize () DECLARE SUB PlayTheGame () DECLARE SUB ShowLocation (l%, c%) DECLARE SUB OpenLocation (l%, c%) CLEAR , , 16384 '$DYNAMIC DEFINT A-Z RANDOMIZE TIMER COLOR 7, 1 VIEW PRINT 1 TO 25 WIDTH 40 CLS PRINT "Minesweeper 1.0" PRINT "Copyright (c) WendelSoft, 1997-2001" PRINT DIM SHARED maxL, maxC, maxM, GameOver, csrL, csrC INPUT "# de linhas :", maxL INPUT "# de colunas :", maxC INPUT "# de minas :", maxM DIM SHARED table(1 TO maxL, 1 TO maxC), hidden(1 TO maxL, 1 TO maxC) CLS Initialize PlayTheGame IF GameOver THEN LOCATE 1, 10: PRINT "Game Over"; k$ = INPUT$(1) FOR l = 1 TO maxL: FOR c = 1 TO maxC hidden(l, c) = 0 NEXT c, l Display 1, 1, maxL, maxC END IF k$ = INPUT$(1) WIDTH 80 COLOR 7, 0 CLS SYSTEM REM $STATIC SUB Display (l1, c1, l2, c2) FOR l = l1 TO l2 IF l >= 1 AND l <= maxL THEN FOR c = c1 TO c2 IF c >= 1 AND c <= maxC THEN IF l = csrL AND c = csrC THEN COLOR 15, 1 ShowLocation l, c COLOR 7, 1 END IF NEXT END IF NEXT END SUB SUB Initialize FOR l = 1 TO maxL FOR c = 1 TO maxC table(l, c) = 0 hidden(l, c) = -1 NEXT NEXT FOR i = 1 TO maxM LOCATE , 1: PRINT i; DO DO l = INT(RND * maxL + 1) c = INT(RND * maxC + 1) LOOP UNTIL table(l, c) = 0 ok = -1 FOR xl = l - 1 TO l + 1 IF xl >= 1 AND xl <= maxL THEN FOR xc = c - 1 TO c + 1 IF xc >= 1 AND xc <= maxC THEN IF table(xl, xc) = -1 AND (xl = l OR xc = c) THEN ok = 0: xc = c + 1: xl = l + 1 END IF NEXT END IF NEXT LOOP UNTIL ok table(l, c) = -1 NEXT PRINT FOR l = 1 TO maxL FOR c = 1 TO maxC LOCATE , 1: PRINT l; c; " "; IF table(l, c) = 0 THEN FOR xl = l - 1 TO l + 1 IF xl >= 1 AND xl <= maxL THEN FOR xc = c - 1 TO c + 1 IF xc >= 1 AND xc <= maxC THEN IF table(xl, xc) = -1 AND (xl = l OR xc = c) THEN table(l, c) = table(l, c) + 1 END IF NEXT END IF NEXT END IF NEXT NEXT LOCATE 2, 1: PRINT SPACE$(20); END SUB SUB OpenLocation (l, c) IF NOT hidden(l, c) THEN EXIT SUB hidden(l, c) = 0 SELECT CASE table(l, c) CASE -1: GameOver = -1: ShowLocation l, c CASE 1 TO 4: ShowLocation l, c CASE 0 IF l > 1 THEN IF hidden(l - 1, c) THEN OpenLocation l - 1, c IF l < maxL THEN IF hidden(l + 1, c) THEN OpenLocation l + 1, c IF c > 1 THEN IF hidden(l, c - 1) THEN OpenLocation l, c - 1 IF c < maxC THEN IF hidden(l, c + 1) THEN OpenLocation l, c + 1 Display l - 1, c - 1, l + 1, c + 1 END SELECT END SUB SUB PlayTheGame csrL = maxL \ 2 + 1 csrC = maxC \ 2 + 1 Display 1, 1, maxL, maxC mark = maxM DO aL = csrL: aC = csrC SELECT CASE INKEY$ CASE CHR$(27): GameOver = -1 CASE CHR$(0) + "H" csrL = csrL - 1: IF csrL = 0 THEN csrL = maxL CASE CHR$(0) + "P" csrL = csrL + 1: IF csrL = maxL + 1 THEN csrL = 1 CASE CHR$(0) + "K" csrC = csrC - 1: IF csrC = 0 THEN csrC = maxC CASE CHR$(0) + "M" csrC = csrC + 1: IF csrC = maxC + 1 THEN csrC = 1 CASE CHR$(13) OpenLocation csrL, csrC 'BEEP CASE " " hidden(csrL, csrC) = 0 IF table(csrL, csrC) = -1 THEN maxM = maxM - 1 table(csrL, csrC) = -2 mark = mark - 1 IF mark = 0 THEN IF maxM > 0 THEN GameOver = -1 ELSE LOCATE 1, 10: PRINT "Voce venceu !"; END IF END IF LOCATE 1, 1: PRINT mark; ShowLocation csrL, csrC 'BEEP END SELECT IF aL <> csrL OR aC <> csrC THEN ShowLocation aL, aC ShowLocation csrL, csrC END IF LOOP UNTIL GameOver OR maxM = 0 END SUB SUB ShowLocation (l, c) IF l = csrL AND c = csrC THEN COLOR 15, 1 LOCATE l + 2, c + 1 IF hidden(l, c) THEN PRINT ""; ELSE n = table(l, c) SELECT CASE n CASE 0 IF l = csrL AND c = csrC THEN PRINT "Û"; ELSE PRINT " "; CASE -1: PRINT "*"; : GameOver = -1 CASE -2: PRINT "X"; CASE 1 TO 4: PRINT USING "#"; n; END SELECT END IF COLOR 7, 1 END SUB