Randomize Timer Const RAND_MAX = 32767 Const FILL = 1 Const RWALL = 2 Const BWALL = 4 Dim Shared As Integer x = 10, y = 10 Dim Shared As Integer grid(x * (y + 2)) Dim Shared As Integer m, n Dim Shared As Integer cells, endPos Sub makeGrid(p As Double) Dim As Integer i, j, thresh, r1, r2, r3 thresh = Int(p * RAND_MAX) m = x n = y For i = 0 To Ubound(grid) : grid(i) = 0 : Next For i = 0 To m-1: grid(i) = BWALL Or RWALL : Next cells = m endPos = m For i = 0 To y-1 For j = x-1 To 1 Step -1 r1 = Int(Rnd * (RAND_MAX + 1)) r2 = Int(Rnd * (RAND_MAX + 1)) grid(endPos) = Iif(r1 < thresh, BWALL, 0) Or Iif(r2 < thresh, RWALL, 0) endPos += 1 Next r3 = Int(Rnd * (RAND_MAX + 1)) grid(endPos) = RWALL Or Iif(r3 < thresh, BWALL, 0) endPos += 1 Next End Sub Sub showGrid() Dim As Integer i, j For j = 0 To m-1 Print "+--"; Next Print "+" For i = 0 To n Print Iif(i = n, " ", "|"); For j = 0 To m-1 Print Iif((grid(i * m + j + cells) And FILL) <> 0, "[]", " "); Print Iif((grid(i * m + j + cells) And RWALL) <> 0, "|", " "); Next Print If i = n Then Exit Sub For j = 0 To m-1 Print Iif((grid(i * m + j + cells) And BWALL) <> 0, "+--", "+ "); Next Print "+" Next End Sub Function filled(p As Integer) As Boolean If (grid(p) And FILL) <> 0 Then Return False grid(p) = grid(p) Or FILL If p >= endPos Then Return True Return ((grid(p + 0) And BWALL) = 0 Andalso filled(p + m)) Orelse _ ((grid(p + 0) And RWALL) = 0 Andalso filled(p + 1)) Orelse _ ((grid(p - 1) And RWALL) = 0 Andalso filled(p - 1)) Orelse _ ((grid(p - m) And BWALL) = 0 Andalso filled(p - m)) End Function Function percolate() As Boolean Dim i As Integer = 0 While i < m Andalso Not filled(cells + i) i += 1 Wend Return i < m End Function ' Main program makeGrid(0.5) percolate() showGrid() Print !"\nRunning " & x & " x " & y & " grids 10,000 times for each p:" For p As Integer = 1 To 9 Dim As Integer cnt = 0 Dim As Double pp = p / 10 For i As Integer = 0 To 9999 makeGrid(pp) If percolate() Then cnt += 1 Next Print Using "p = #.# : #.####"; pp; cnt / 10000 Next Sleep