Board Logo
« Winter fun 2016 Minesweeper »

Welcome Guest. Please Login or Register.
Jan 16th, 2018, 3:42pm


Conforums Terms of Service | Membership Rules | Home | Search | Recent Posts | Notification | Format Your Message | Installation FAQ

Please use the forums Search feature before asking.
Please post code using the code box described in Format Your Messages.
This will keep indentation, separate it better form the message and prevent gibberish.
If the code is too long for one post or additional files are needed, upload a ZIP archive to the Just BASIC Files Archive Site.

« Previous Topic | Next Topic »
Pages: 1 2  Notify Send Topic Print
 veryhotthread  Author  Topic: Winter fun 2016 Minesweeper  (Read 2441 times)
TyCamden
Global Moderator
ImageImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 1431
xx Re: Winter fun 2016 Minesweeper
« Reply #15 on: Nov 11th, 2016, 6:30pm »

on Nov 11th, 2016, 5:16pm, TyCamden wrote:
I was not sure how to add suggestion 1, but I finished suggestion 2. The code was too long to post here.

For Facundo's MineSweeper program with Difficulty levels, see the code at this site:

http://jbfilesarchive.com/phpBB3/viewtopic.php?f=4&t=2124


I added an EXPERT difficulty. See as follows:

http://jbfilesarchive.com/phpBB3/viewtopic.php?f=4&t=2125

EDIT: I just beat it on Expert difficulty, but it wasn't easy!
« Last Edit: Nov 11th, 2016, 8:14pm by TyCamden » User IP Logged

TyCamden

Please give credit if you use code I post, no need to ask for permission.


Just BASIC 1.01, Windows 7 Home Premium version (2009), AMD Athelon II 320 Dual-Core Processor 2.10 GHz - 4.00 GB RAM (3.75 usable) - 64-bit OS
bplus
Senior Member
ImageImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 1255
xx Re: Winter fun 2016 Minesweeper
« Reply #16 on: Nov 20th, 2016, 8:46pm »

Here is Rod's Minesweeper very modified!

No external files, no line labels.
Customize rows up to 25, cols up to 20, mines up to 50% of cells.
Right click toggles Flag = "F", "?" and back to clear for Left click.

Code:
nomainwin
WindowWidth=200 ' Anatoly's tip
WindowHeight=200
open "Ajusting..." for graphics_nf_nsb as #1
#1, "home ; down ; posxy w h"
w=200-2*w:h=200-2*h
close #1

'set globals
global wins, boards, nMines, nRows, nCols
wins=0:boards=0:nRows=12:nCols=12:nMines=20
m$="Minesweeper board:"+chr$(13)+"Standard board is 12 x 12, 20 mines."
Confirm m$+chr$(10)+"Press yes to customize your playing board.";yes$
if yes$="yes" then 'customize
    t$="Custom Board"+chr$(13)
    prompt t$+"Enter the number of cells you want in a row.";test
    if test>3 and test<26 then nCols=test else nCols=12
    prompt t$+"Enter the number of rows you want.";test
    if test>3 and test<21 then nRows=test else nRows=12
    prompt t$+"Enter the number of mines you want.";test
    RC=nRows*nCols
    if test>.04*RC and test<.51*RC then
        nMines=int(test)
    else
        nMines=int(.2*RC)
    end if
end if
notice "Board: Columns = ";nCols;", Rows = ";nRows;", Mines = ";nMines
WindowWidth=60+30*nCols+w
WindowHeight=60+30*nRows+h
UpperLeftX=(DisplayWidth-WindowWidth)/2
UpperLeftY=(DisplayHeight-WindowHeight)/2
graphicbox #1.g,0,0,WindowWidth+2,WindowHeight+2
open "Minesweeper v2016-11-20 B+" for window_nf as #1
print #1, "trapclose quit"
#1.g "font arial 14"
#1.g "down"
call playAgain
wait

sub playAgain
    #1.g "when leftButtonDown leftclick"
    #1.g "when rightButtonDown rightclick"
    boards=boards+1
    dim grid(nCols,nRows)
    dim mine(nCols,nRows)
    mines = nMines
    while mines>0 'mines layout
        c=int(rnd(0)*nCols+1)
        r=int(rnd(0)*nRows+1)
        if mine(c,r)<>9 then mine(c,r)=9:mines=mines-1
    wend
    call hue 0,200,0
    call fbox 30,30,nCols*30+30,nRows*30+30
    #1.g "color white"
    for r=1 to nRows     'count mine neighbors
        for c=1 to nCols
            cmin=c-(c>1)
            cmax=c+(c<nCols)
            rmin=r-(r>1)
            rmax=r+(r<nRows)
            m=0
            for rr=rmin to rmax
                for cc=cmin to cmax
                    if not (cc=c and rr=r) then
                        if mine(cc,rr)=9 then m=m+1
                    end if
                next
            next
            if mine(c,r)<>9 then mine(c,r)=m
            grid(c,r)=7
            call box c*30,r*30,c*30+30,r*30+30
        next
    next
    #1.g "flush"
end sub

sub leftclick h$, mx, my
    c=int(mx/30)      'check the cell clicked
    r=int(my/30)
    if c<1 or c>nCols or r<1 or r>nRows then exit sub
    'if we clicked on a flag or ? do nothing!!
    if grid(c,r)=8 or grid(c,r)=6 then exit sub
    'if we found a mine then boom!
    if mine(c,r)=9 then
        #1.g "when leftButtonDown"
        #1.g "when rightButtonDown"
        call boom
        exit sub
    end if
    'if not a flag or a mine then draw what we found
    call drawNbox c,r
    grid(c,r)=-1 'mark it played
    if mine(c,r)=0 then 'Rod's sweep for more blank cells
        stackctr=1
        dim stack(nCols*nRows,2)
        stack(stackctr,1)=c
        stack(stackctr,2)=r
        while stackctr>0
            cc=stack(stackctr,1)
            rr=stack(stackctr,2)
            stackctr=stackctr-1
            cmin=cc-(cc>1)
            cmax=cc+(cc<nCols)
            rmin=rr-(rr>1)
            rmax=rr+(rr<nRows)
            for cc=cmin to cmax
                for rr=rmin to rmax
                    if not (cc=c and rr=r) then
                        if not (grid(cc,rr)=-1) then
                            if mine(cc,rr)<9 then
                                if mine(cc,rr)=0 then
                                    stackctr=stackctr+1
                                    stack(stackctr,1)=cc
                                    stack(stackctr,2)=rr
                                end if
                                call drawNbox cc,rr
                                grid(cc,rr)=-1  'mark cell played
                            end if
                        end if
                    end if
                next
            next
        wend
    end if
    freeCells=0 'did we get all the cells swept?
    for c=1 to nCols
        for r=1 to nRows
            if grid(c,r)=-1 then freeCells=freeCells+1
        next
    next
    if freeCells=nRows*nCols-nMines then
        wins=wins+1
        confirm "Success! surely you want to play again?";again$
        if again$="yes" then call playAgain else call quit "h"
    end if
end sub

sub rightclick h$,mx,my     'set or unset warning flag or ?
    c=int(mx/30):r=int(my/30)
    if c<1 or c>nCols or r<1 or r>nRows then exit sub
    if grid(c,r)=8 then 'flagged, draw ?
        call hue 255,0,0
        call fbox c*30,r*30,c*30+30,r*30+30
        #1.g "color white"
        call box c*30,r*30,c*30+30,r*30+30
        #1.g "place ";c*30+9;" ";(r+1)*30-8
        #1.g "|?"
        grid(c,r)=6
    else
        if grid(c,r)=7 then 'empty, draw flag
            call hue 255,0,0
            call fbox c*30,r*30,c*30+30,r*30+30
            #1.g "color white"
            call fbox c*30,r*30,c*30+30,r*30+30
            #1.g "place ";c*30+9;" ";(r+1)*30-8
            #1.g "|F"
            grid(c,r)=8
        else
            if grid(c,r)=6 then '?, draw clear
                call hue 0,200,0
                call fbox c*30,r*30,c*30+30,r*30+30
                #1.g "color white"
                call fbox c*30,r*30,c*30+30,r*30+30
                grid(c,r)=7
            end if
        end if
    end if
    #1.g "flush"
end sub

sub boom
    for c=1 to nCols
        for r=1 to nRows
            if mine(c,r)=9 then
                call hue 255,0,0
                call fbox c*30,r*30,c*30+30,r*30+30
                #1.g "color white"
                call fbox c*30,r*30,c*30+30,r*30+30
            end if
        next
    next
    #1.g "flush"
    confirm "Game Over. Play again?";again$
    if again$="yes" then call playAgain else call quit "h"
end sub

sub quit h$
    notice "Today's win count is ";wins;" in ";boards;" boards."
    close #1
end sub

sub hue r,g,b 'fore and back
    #1.g "color ";r;" ";g;" ";b
    #1.g "backcolor ";r;" ";g;" ";b
end sub

sub box x0,y0,x1,y1
    #1.g "place ";x0;" ";y0
    #1.g "box ";x1;" ";y1
end sub

sub fbox x0,y0,x1,y1
    #1.g "place ";x0;" ";y0
    #1.g "boxfilled ";x1;" ";y1
end sub

sub drawNbox c,r
    call hue 110,225,255
    call fbox c*30,r*30,c*30+30,r*30+30
    if mine(c,r)>0 then
        #1.g "color blue"
        #1.g "place ";c*30+9;" ";(r+1)*30-8
        #1.g "|";mine(c,r)
    end if
    #1.g "color white"
    call box c*30,r*30,c*30+30,r*30+30
    #1.g "flush"
end sub
 
« Last Edit: Nov 21st, 2016, 11:22am by bplus » User IP Logged

B+
bplus
Senior Member
ImageImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 1255
xx Re: Winter fun 2016 Minesweeper
« Reply #17 on: Nov 21st, 2016, 11:09am »

Now with proper recursive sweep for zero mine neighbor cells:
Code:
nomainwin '2016-11-21 now with recursive sweep
WindowWidth=200 ' Anatoly's tip
WindowHeight=200
open "Ajusting..." for graphics_nf_nsb as #1
#1, "home ; down ; posxy w h"
w=200-2*w:h=200-2*h
close #1

'set globals
global wins, boards, nMines, nRows, nCols
wins=0:boards=0:nRows=12:nCols=12:nMines=20
m$="Minesweeper board:"+chr$(13)+"Standard board is 12 x 12, 20 mines."
Confirm m$+chr$(10)+"Press yes to customize your playing board.";yes$
if yes$="yes" then 'customize
    t$="Custom Board"+chr$(13)
    prompt t$+"Enter the number of cells you want in a row.";test
    if test>3 and test<26 then nCols=test else nCols=12
    prompt t$+"Enter the number of rows you want.";test
    if test>3 and test<21 then nRows=test else nRows=12
    prompt t$+"Enter the number of mines you want.";test
    RC=nRows*nCols
    if test>.04*RC and test<.51*RC then
        nMines=int(test)
    else
        nMines=int(.2*RC)
    end if
end if
notice "Board: Columns = ";nCols;", Rows = ";nRows;", Mines = ";nMines
WindowWidth=60+30*nCols+w
WindowHeight=60+30*nRows+h
UpperLeftX=(DisplayWidth-WindowWidth)/2
UpperLeftY=(DisplayHeight-WindowHeight)/2
graphicbox #1.g,0,0,WindowWidth+2,WindowHeight+2
open "Minesweeper v2016-11-21 B+" for window_nf as #1
print #1, "trapclose quit"
#1.g "font arial 14"
#1.g "down"
call playAgain
wait

sub playAgain
    #1.g "when leftButtonDown leftclick"
    #1.g "when rightButtonDown rightclick"
    boards=boards+1
    dim grid(nCols,nRows)
    dim mine(nCols,nRows)
    mines = nMines
    while mines>0 'mines layout
        c=int(rnd(0)*nCols+1)
        r=int(rnd(0)*nRows+1)
        if mine(c,r)<>9 then mine(c,r)=9:mines=mines-1
    wend
    call hue 0,200,0
    call fbox 30,30,nCols*30+30,nRows*30+30
    #1.g "color white"
    for r=1 to nRows     'count mine neighbors
        for c=1 to nCols 'with Rod's limit sets
            cmin=c-(c>1):cmax=c+(c<nCols)
            rmin=r-(r>1):rmax=r+(r<nRows):m=0
            for rr=rmin to rmax
                for cc=cmin to cmax
                    if not (cc=c and rr=r) then
                        if mine(cc,rr)=9 then m=m+1
                    end if
                next
            next
            if mine(c,r)<>9 then mine(c,r)=m
            grid(c,r)=7
            call box c*30,r*30,c*30+30,r*30+30
        next
    next
    #1.g "flush"
end sub

sub leftclick h$, mx, my
    c=int(mx/30)      'check the cell clicked
    r=int(my/30)
    if c<1 or c>nCols or r<1 or r>nRows then exit sub
    'if we clicked on a flag or ? do nothing!!
    if grid(c,r)=8 or grid(c,r)=6 then exit sub
    'if we found a mine then boom!
    if mine(c,r)=9 then
        #1.g "when leftButtonDown"
        #1.g "when rightButtonDown"
        call boom
        exit sub
    end if
    'if not a flag or a mine then draw what we found
    call drawNbox c,r
    grid(c,r)=-1 'mark it played
    if mine(c,r)=0 then call sweepZeros c,r
    freeCells=0 'did we get all the cells swept?
    for c=1 to nCols
        for r=1 to nRows
            if grid(c,r)=-1 then freeCells=freeCells+1
        next
    next
    if freeCells=nRows*nCols-nMines then
        wins=wins+1
        confirm "Success! surely you want to play again?";again$
        if again$="yes" then call playAgain else call quit "h"
    end if
end sub

sub rightclick h$,mx,my     'set or unset warning flag or ?
    c=int(mx/30):r=int(my/30)
    if c<1 or c>nCols or r<1 or r>nRows then exit sub
    if grid(c,r)=8 then 'flagged, draw ?
        call hue 255,0,0
        call fbox c*30,r*30,c*30+30,r*30+30
        #1.g "color white"
        call box c*30,r*30,c*30+30,r*30+30
        #1.g "place ";c*30+9;" ";(r+1)*30-8
        #1.g "|?"
        grid(c,r)=6
    else
        if grid(c,r)=7 then 'empty, draw flag
            call hue 255,0,0
            call fbox c*30,r*30,c*30+30,r*30+30
            #1.g "color white"
            call fbox c*30,r*30,c*30+30,r*30+30
            #1.g "place ";c*30+9;" ";(r+1)*30-8
            #1.g "|F"
            grid(c,r)=8
        else
            if grid(c,r)=6 then '?, draw clear
                call hue 0,200,0
                call fbox c*30,r*30,c*30+30,r*30+30
                #1.g "color white"
                call fbox c*30,r*30,c*30+30,r*30+30
                grid(c,r)=7
            end if
        end if
    end if
    #1.g "flush"
end sub

sub boom
    for c=1 to nCols
        for r=1 to nRows
            if mine(c,r)=9 then
                call hue 255,0,0
                call fbox c*30,r*30,c*30+30,r*30+30
                #1.g "color white"
                call fbox c*30,r*30,c*30+30,r*30+30
            end if
        next
    next
    #1.g "flush"
    confirm "Game Over. Play again?";again$
    if again$="yes" then call playAgain else call quit "h"
end sub

sub quit h$
    notice "Today's win count is ";wins;" in ";boards;" boards."
    close #1
end sub

sub hue r,g,b 'fore and back
    #1.g "color ";r;" ";g;" ";b
    #1.g "backcolor ";r;" ";g;" ";b
end sub

sub box x0,y0,x1,y1
    #1.g "place ";x0;" ";y0
    #1.g "box ";x1;" ";y1
end sub

sub fbox x0,y0,x1,y1
    #1.g "place ";x0;" ";y0
    #1.g "boxfilled ";x1;" ";y1
end sub

sub drawNbox c,r
    call hue 110,225,255
    call fbox c*30,r*30,c*30+30,r*30+30
    if mine(c,r)>0 then
        #1.g "color blue"
        #1.g "place ";c*30+9;" ";(r+1)*30-8
        #1.g "|";mine(c,r)
    end if
    #1.g "color white"
    call box c*30,r*30,c*30+30,r*30+30
    #1.g "flush"
end sub

sub sweepZeros c,r    ' recursive sweep with Rod's limits set
    cmin=c-(c>1):cmax=c+(c<nCols):rmin=r-(r>1):rmax=r+(r<nRows)
    for row=rmin TO rmax
        scan
        for col=cmin TO cmax
            scan
            if not (grid(col,row)=-1) then
                m=mine(col,row)
                if m=0 then
                    grid(col,row)=-1 'mark played
                    call drawNbox col,row
                    call sweepZeros col,row
                else
                    if m>=1 AND m<=8 then
                        call drawNbox col,row
                        grid(col,row)=-1 'mark played
                    end if
                end if
            end if
        next
    next
end sub
 


Edit: cleaned up with Rod's neat limit sets in recursive sub
« Last Edit: Nov 21st, 2016, 11:48am by bplus » User IP Logged

B+
Facundo
Board Moderator


member is offline

Avatar




PM

Gender: Male
Posts: 1302
xx Re: Winter fun 2016 Minesweeper
« Reply #18 on: Nov 21st, 2016, 4:12pm »

on Nov 11th, 2016, 6:30pm, TyCamden wrote:
I added an EXPERT difficulty. See as follows:

http://jbfilesarchive.com/phpBB3/viewtopic.php?f=4&t=2125

EDIT: I just beat it on Expert difficulty, but it wasn't easy!
Thank you for adding the modifications Ty.


bplus minesweeper is really well done, and so small code.

I will tell you something, sometimes I found myself playing my own minesweeper, it is not perfect, but the feeling is there. And each time I test one of these minesweepers I start playing until I do it right. grin
User IP Logged

cundo aka MSlayer
TyCamden
Global Moderator
ImageImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 1431
xx Re: Winter fun 2016 Minesweeper
« Reply #19 on: Nov 21st, 2016, 8:24pm »

on Nov 21st, 2016, 4:12pm, Facundo wrote:
Thank you for adding the modifications Ty. ...


Facundo,

I am working on "Mega-sweeper" based on your code, but am stuck, it works fairly well for a bit, but as I work on more and more of the board, scrolling right, it gets kind of weird. Like it doesn't show cleared spaces or something.

Since I am rusty, and tweaking your code without understanding it all, perhaps you can review my minor changes, and fix it huh My guess is that the program is just not designed to handle searching and "cleaning" the board for that many spaces.

Here is the code so far...

http://jbfilesarchive.com/phpBB3/viewtopic.php?f=4&t=2126
User IP Logged

TyCamden

Please give credit if you use code I post, no need to ask for permission.


Just BASIC 1.01, Windows 7 Home Premium version (2009), AMD Athelon II 320 Dual-Core Processor 2.10 GHz - 4.00 GB RAM (3.75 usable) - 64-bit OS
bplus
Senior Member
ImageImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 1255
xx Re: Winter fun 2016 Minesweeper
« Reply #20 on: Nov 21st, 2016, 11:17pm »

Thanks Facundo!

Ty, you are very ambitious!!!

Does anyone want to go treasure hunting with me in a minefield?

:-))
Code:
nomainwin '2016-11-22 try treasure hunt modification?
WindowWidth=200 ' Anatoly's tip
WindowHeight=200
open "Ajusting..." for graphics_nf_nsb as #1
#1, "home ; down ; posxy w h"
w=200-2*w:h=200-2*h
close #1

'set globals
global wins, boards, nMines, nRows, nCols, fC, fR
wins=0:boards=0:nRows=12:nCols=12:nMines=20
m$="Minesweeper board:"+chr$(13)+"Standard board is 12 x 12, 20 mines."
Confirm m$+chr$(10)+"Press yes to customize your playing board.";yes$
if yes$="yes" then 'customize
    t$="Custom Board"+chr$(13)
    prompt t$+"Enter the number of cells you want in a row.";test
    if test>3 and test<26 then nCols=test else nCols=12
    prompt t$+"Enter the number of rows you want.";test
    if test>3 and test<21 then nRows=test else nRows=12
    prompt t$+"Enter the number of mines you want.";test
    RC=nRows*nCols
    if test>.04*RC and test<.51*RC then
        nMines=int(test)
    else
        nMines=int(.2*RC)
    end if
end if
notice "Board: Columns = ";nCols;", Rows = ";nRows;", Mines = ";nMines
WindowWidth=60+30*nCols+w
WindowHeight=60+30*nRows+h
UpperLeftX=(DisplayWidth-WindowWidth)/2
UpperLeftY=(DisplayHeight-WindowHeight)/2
graphicbox #1.g,0,0,WindowWidth+2,WindowHeight+2
open "Treasure Hunt in a Minefield" for window_nf as #1
print #1, "trapclose quit"
#1.g "font arial 14"
#1.g "down"
call playAgain
wait

sub playAgain
    #1.g "when leftButtonDown leftclick"
    #1.g "when rightButtonDown rightclick"
    boards=boards+1
    dim grid(nCols,nRows)
    dim mine(nCols,nRows)
    mines = nMines
    while mines>0 'mines layout
        c=int(rnd(0)*nCols+1)
        r=int(rnd(0)*nRows+1)
        if mine(c,r)<>9 then mine(c,r)=9:mines=mines-1
    wend
    call hue 0,200,0
    call fbox 30,30,nCols*30+30,nRows*30+30
    #1.g "color white"
    for r=1 to nRows     'count mine neighbors
        for c=1 to nCols 'with Rod's limit sets
            cmin=c-(c>1):cmax=c+(c<nCols)
            rmin=r-(r>1):rmax=r+(r<nRows):m=0
            for rr=rmin to rmax
                for cc=cmin to cmax
                    if not (cc=c and rr=r) then
                        if mine(cc,rr)=9 then m=m+1
                    end if
                next
            next
            if mine(c,r)<>9 then mine(c,r)=m
            grid(c,r)=7
            call box c*30,r*30,c*30+30,r*30+30
        next
    next
    #1.g "flush"
    treasure=1               'What safer place than minefield
    while treasure>0              'to bury a treasure? :-))
        c=int(rnd(0)*nCols+1)
        r=int(rnd(0)*nRows+1)
        if mine(c,r)<>9 then mine(c,r)=10:treasure=0
    wend
    fC=0:fR=0
end sub

sub leftclick h$, mx, my
    c=int(mx/30)      'check the cell clicked
    r=int(my/30)
    if c<1 or c>nCols or r<1 or r>nRows then exit sub
    'if we clicked on a flag or ? do nothing!!
    if grid(c,r)=8 or grid(c,r)=6 then exit sub
    'if we found a mine then boom!
    if mine(c,r)=9 then
        call boom
        exit sub
    end if
    if mine(c,r)=10 then
        call foundTreasure c,r
        exit sub
    end if
    'if not a flag or a mine then draw what we found
    call drawNbox c,r
    grid(c,r)=-1 'mark it played
    if mine(c,r)=0 then call sweepZeros c,r
    'did the sweep find a treasure
    if fC then
        call foundTreasure fC,fR  'yes sweep found treasure
        exit sub
    end if
end sub

sub rightclick h$,mx,my     'set or unset warning flag or ?
    c=int(mx/30):r=int(my/30)
    if c<1 or c>nCols or r<1 or r>nRows then exit sub
    if grid(c,r)=8 then 'flagged, draw ?
        call hue 255,0,0
        call fbox c*30,r*30,c*30+30,r*30+30
        #1.g "color white"
        call box c*30,r*30,c*30+30,r*30+30
        #1.g "place ";c*30+9;" ";(r+1)*30-8
        #1.g "|?"
        grid(c,r)=6
    else
        if grid(c,r)=7 then 'empty, draw flag
            call hue 255,0,0
            call fbox c*30,r*30,c*30+30,r*30+30
            #1.g "color white"
            call fbox c*30,r*30,c*30+30,r*30+30
            #1.g "place ";c*30+9;" ";(r+1)*30-8
            #1.g "|F"
            grid(c,r)=8
        else
            if grid(c,r)=6 then '?, draw clear
                call hue 0,200,0
                call fbox c*30,r*30,c*30+30,r*30+30
                #1.g "color white"
                call fbox c*30,r*30,c*30+30,r*30+30
                grid(c,r)=7
            end if
        end if
    end if
    #1.g "flush"
end sub

sub boom
    for c=1 to nCols
        for r=1 to nRows
            if mine(c,r)=9 then
                call hue 255,0,0
                call fbox c*30,r*30,c*30+30,r*30+30
                #1.g "color white"
                call box c*30,r*30,c*30+30,r*30+30
            end if
        next
    next
    #1.g "flush"
    confirm "Boom! Game Over. Play again?";again$
    if again$="yes" then call playAgain else call quit "h"
end sub

sub foundTreasure c,r
    call hue 255,255,0
    call fbox c*30,r*30,c*30+30,r*30+30
    #1.g "color black"
    call box c*30,r*30,c*30+30,r*30+30
    wins=wins+1
    confirm "Treasure Found! Surely you want to play again?";again$
    if again$="yes" then call playAgain else call quit "h"
end sub

sub quit h$
    notice "Today's win count is ";wins;" in ";boards;" boards."
    close #1
end sub

sub hue r,g,b 'fore and back
    #1.g "color ";r;" ";g;" ";b
    #1.g "backcolor ";r;" ";g;" ";b
end sub

sub box x0,y0,x1,y1
    #1.g "place ";x0;" ";y0
    #1.g "box ";x1;" ";y1
end sub

sub fbox x0,y0,x1,y1
    #1.g "place ";x0;" ";y0
    #1.g "boxfilled ";x1;" ";y1
end sub

sub drawNbox c,r
    call hue 110,225,255
    call fbox c*30,r*30,c*30+30,r*30+30
    if mine(c,r)>0 then
        #1.g "color blue"
        #1.g "place ";c*30+9;" ";(r+1)*30-8
        #1.g "|";mine(c,r)
    end if
    #1.g "color white"
    call box c*30,r*30,c*30+30,r*30+30
    #1.g "flush"
end sub

sub sweepZeros c,r    ' recursive sweep with Rod's limits set
    cmin=c-(c>1):cmax=c+(c<nCols):rmin=r-(r>1):rmax=r+(r<nRows)
    for row=rmin TO rmax
        scan
        for col=cmin TO cmax
            scan 
            if not (grid(col,row)=-1) then
                m=mine(col,row)
                if m=0 then
                    grid(col,row)=-1 'mark played
                    call drawNbox col,row
                    call sweepZeros col,row
                else
                    if m>=1 AND m<=8 then
                        call drawNbox col,row
                        grid(col,row)=-1 'mark played
                    else
                        if m=10 then fC=col:fR=row 'treasure found!
                        'we have to finish sweep so record place
                    end if
                end if
            end if
        next
    next
end sub
 
« Last Edit: Nov 21st, 2016, 11:36pm by bplus » User IP Logged

B+
tsh73
JB-Supporter


member is offline

Avatar




PM

Gender: Male
Posts: 3635
xx Re: Winter fun 2016 Minesweeper
« Reply #21 on: Nov 22nd, 2016, 02:43am »

Quote:
treasure hunting ... in a minefield?

Brrr wink
But plays nice, wink
User IP Logged

Q: "And if I took your codes and compile them, and sell them for a profit"?
A: Go ahead. I had my share of good then I coded it for fun, if you can make better use of it - please do.
(enjoying JB 1.01 on WinXP, netbook and desktop)
TyCamden
Global Moderator
ImageImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 1431
xx Re: Winter fun 2016 Minesweeper
« Reply #22 on: Nov 22nd, 2016, 6:42pm »

on Nov 21st, 2016, 11:17pm, bplus wrote:
Thanks Facundo!

Ty, you are very ambitious!!!

Does anyone want to go treasure hunting with me in a minefield?

:-))
(CODE)


Thanks!

I like your treasure hunting program. However, I made some modifications under customization.

I wanted the range of values shown on each question.

Also, it now shows the range of mines allowed, and a recommendation based on the size of the board.

Also, if any of the entries do not fit, it asks again, instead of locking the default.

Hope you like with the changes :)

Code:
nomainwin '2016-11-22 try treasure hunt modification?
WindowWidth=200 ' Anatoly's tip
WindowHeight=200
open "Ajusting..." for graphics_nf_nsb as #1
#1, "home ; down ; posxy w h"
w=200-2*w:h=200-2*h
close #1

'set globals
global wins, boards, nMines, nRows, nCols, fC, fR
wins=0:boards=0:nRows=12:nCols=12:nMines=20
m$="Minesweeper board:"+chr$(13)+"Standard board is 12 x 12, 20 mines."
Confirm m$+chr$(10)+"Press yes to customize your playing board.";yes$
if yes$="yes" then 'customize
    t$="Custom Board"+chr$(13)
    [COLQ]
    prompt t$+"Enter the number of cells you want in a row (4-25).";test
    if test>3 and test<26 then
        nCols=test
    else
       goto [COLQ]
    end if
    [ROWSQ]
    prompt t$+"Enter the number of rows you want (4-20).";test
    if test>3 and test<21 then
        nRows=test
    else
       goto [ROWSQ]
    end if
    RC=nRows*nCols
    TRC1 = INT(.04*RC)
    if TRC1<1 then TRC1=1
    TRC2 = INT(.51*RC)
    if TRC2<1 then TRC2=1
    RECM = INT(RC/7)
    if RECM<1 then RECM=1
    extra$ = t$+"Enter #mines ("+STR$(TRC1)+"-"+STR$(TRC2)+") ("+STR$(RECM)+" recommended)."
    [MINESQ]
    prompt extra$;test
    if test>=TRC1 and test<=TRC2 then
        nMines=int(test)
    else
        goto [MINESQ]
    end if
end if
notice "Board: Columns = ";nCols;", Rows = ";nRows;", Mines = ";nMines
WindowWidth=60+30*nCols+w
WindowHeight=60+30*nRows+h
UpperLeftX=(DisplayWidth-WindowWidth)/2
UpperLeftY=(DisplayHeight-WindowHeight)/2
graphicbox #1.g,0,0,WindowWidth+2,WindowHeight+2
open "Treasure Hunt in a Minefield" for window_nf as #1
print #1, "trapclose quit"
#1.g "font arial 14"
#1.g "down"
call playAgain
wait

sub playAgain
    #1.g "when leftButtonDown leftclick"
    #1.g "when rightButtonDown rightclick"
    boards=boards+1
    dim grid(nCols,nRows)
    dim mine(nCols,nRows)
    mines = nMines
    while mines>0 'mines layout
        c=int(rnd(0)*nCols+1)
        r=int(rnd(0)*nRows+1)
        if mine(c,r)<>9 then mine(c,r)=9:mines=mines-1
    wend
    call hue 0,200,0
    call fbox 30,30,nCols*30+30,nRows*30+30
    #1.g "color white"
    for r=1 to nRows     'count mine neighbors
        for c=1 to nCols 'with Rod's limit sets
            cmin=c-(c>1):cmax=c+(c<nCols)
            rmin=r-(r>1):rmax=r+(r<nRows):m=0
            for rr=rmin to rmax
                for cc=cmin to cmax
                    if not (cc=c and rr=r) then
                        if mine(cc,rr)=9 then m=m+1
                    end if
                next
            next
            if mine(c,r)<>9 then mine(c,r)=m
            grid(c,r)=7
            call box c*30,r*30,c*30+30,r*30+30
        next
    next
    #1.g "flush"
    treasure=1               'What safer place than minefield
    while treasure>0              'to bury a treasure? :-))
        c=int(rnd(0)*nCols+1)
        r=int(rnd(0)*nRows+1)
        if mine(c,r)<>9 then mine(c,r)=10:treasure=0
    wend
    fC=0:fR=0
end sub

sub leftclick h$, mx, my
    c=int(mx/30)      'check the cell clicked
    r=int(my/30)
    if c<1 or c>nCols or r<1 or r>nRows then exit sub
    'if we clicked on a flag or ? do nothing!!
    if grid(c,r)=8 or grid(c,r)=6 then exit sub
    'if we found a mine then boom!
    if mine(c,r)=9 then
        call boom
        exit sub
    end if
    if mine(c,r)=10 then
        call foundTreasure c,r
        exit sub
    end if
    'if not a flag or a mine then draw what we found
    call drawNbox c,r
    grid(c,r)=-1 'mark it played
    if mine(c,r)=0 then call sweepZeros c,r
    'did the sweep find a treasure
    if fC then
        call foundTreasure fC,fR  'yes sweep found treasure
        exit sub
    end if
end sub

sub rightclick h$,mx,my     'set or unset warning flag or ?
    c=int(mx/30):r=int(my/30)
    if c<1 or c>nCols or r<1 or r>nRows then exit sub
    if grid(c,r)=8 then 'flagged, draw ?
        call hue 255,0,0
        call fbox c*30,r*30,c*30+30,r*30+30
        #1.g "color white"
        call box c*30,r*30,c*30+30,r*30+30
        #1.g "place ";c*30+9;" ";(r+1)*30-8
        #1.g "|?"
        grid(c,r)=6
    else
        if grid(c,r)=7 then 'empty, draw flag
            call hue 255,0,0
            call fbox c*30,r*30,c*30+30,r*30+30
            #1.g "color white"
            call fbox c*30,r*30,c*30+30,r*30+30
            #1.g "place ";c*30+9;" ";(r+1)*30-8
            #1.g "|F"
            grid(c,r)=8
        else
            if grid(c,r)=6 then '?, draw clear
                call hue 0,200,0
                call fbox c*30,r*30,c*30+30,r*30+30
                #1.g "color white"
                call fbox c*30,r*30,c*30+30,r*30+30
                grid(c,r)=7
            end if
        end if
    end if
    #1.g "flush"
end sub

sub boom
    for c=1 to nCols
        for r=1 to nRows
            if mine(c,r)=9 then
                call hue 255,0,0
                call fbox c*30,r*30,c*30+30,r*30+30
                #1.g "color white"
                call box c*30,r*30,c*30+30,r*30+30
            end if
        next
    next
    #1.g "flush"
    confirm "Boom! Game Over. Play again?";again$
    if again$="yes" then call playAgain else call quit "h"
end sub

sub foundTreasure c,r
    call hue 255,255,0
    call fbox c*30,r*30,c*30+30,r*30+30
    #1.g "color black"
    call box c*30,r*30,c*30+30,r*30+30
    wins=wins+1
    confirm "Treasure Found! Surely you want to play again?";again$
    if again$="yes" then call playAgain else call quit "h"
end sub

sub quit h$
    notice "Today's win count is ";wins;" in ";boards;" boards."
    close #1
end sub

sub hue r,g,b 'fore and back
    #1.g "color ";r;" ";g;" ";b
    #1.g "backcolor ";r;" ";g;" ";b
end sub

sub box x0,y0,x1,y1
    #1.g "place ";x0;" ";y0
    #1.g "box ";x1;" ";y1
end sub

sub fbox x0,y0,x1,y1
    #1.g "place ";x0;" ";y0
    #1.g "boxfilled ";x1;" ";y1
end sub

sub drawNbox c,r
    call hue 110,225,255
    call fbox c*30,r*30,c*30+30,r*30+30
    if mine(c,r)>0 then
        #1.g "color blue"
        #1.g "place ";c*30+9;" ";(r+1)*30-8
        #1.g "|";mine(c,r)
    end if
    #1.g "color white"
    call box c*30,r*30,c*30+30,r*30+30
    #1.g "flush"
end sub

sub sweepZeros c,r    ' recursive sweep with Rod's limits set
    cmin=c-(c>1):cmax=c+(c<nCols):rmin=r-(r>1):rmax=r+(r<nRows)
    for row=rmin TO rmax
        scan
        for col=cmin TO cmax
            scan
            if not (grid(col,row)=-1) then
                m=mine(col,row)
                if m=0 then
                    grid(col,row)=-1 'mark played
                    call drawNbox col,row
                    call sweepZeros col,row
                else
                    if m>=1 AND m<=8 then
                        call drawNbox col,row
                        grid(col,row)=-1 'mark played
                    else
                        if m=10 then fC=col:fR=row 'treasure found!
                        'we have to finish sweep so record place
                    end if
                end if
            end if
        next
    next
end sub 

« Last Edit: Nov 22nd, 2016, 6:43pm by TyCamden » User IP Logged

TyCamden

Please give credit if you use code I post, no need to ask for permission.


Just BASIC 1.01, Windows 7 Home Premium version (2009), AMD Athelon II 320 Dual-Core Processor 2.10 GHz - 4.00 GB RAM (3.75 usable) - 64-bit OS
bplus
Senior Member
ImageImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 1255
xx Re: Winter fun 2016 Minesweeper
« Reply #23 on: Nov 22nd, 2016, 7:34pm »

Thanks Anatoly!

Ty, it pleases me greatly that you choose to customize the customize section of the program! ;-))

I did debate with myself some standard set of boards to meet your suggestion of easy, medium and hard levels. I also considered a dialog window. I chose flexibility over 3-5 board sets and I thought a dialog would cost too much in code.

Board sets and recommendations are very good for new players unfamiliar with Minesweeper and/or for wide distribution of copies.

Append: Going over customize changes, I propose some more:
+ remove line labels for loops and use loop structures
+ I reserve all capitals variable names for globals/constants (if I use them at all)
+ the minimum rc value is 16 so upped low mines number to .065X so that is >1 even with INT
+ reduced hi mines # to .33X (still very high!)
+ tried to keep extra lines added low so all fits in one post should I decide to draw bombs, flags and treasures!

Code:
if yes$="yes" then 'customize
    t$="Custom Board"+chr$(13):test=12
    do
        prompt t$+"Enter the # of Cells you want in a row (4-25).";test
        if test=0 then test=12  'if cancel
    loop until test>3 and test<26:nCols=test
    do
        prompt t$+"Enter the # of Rows you want (4-20).";test
        if test=0 then test=12 'if cancel
    loop until test>3 and test<21:nRows=test
    rc=nRows*nCols
    low = int(.065*rc):hi=int(.33*rc):recm=int(rc/7):test=recm
    t$ = t$;"Enter # of Mines (";low;"-";hi;"), ";test;" recommended."
    do
        prompt t$;test
        if test=0 then test=recm 'if cancel
    loop until test>=low and test<=hi:nMines=int(test)
end if
 


+ odd, getting gray background when use custom board dialogs but not if accept Standard Board. ???
after:
Code:
#1.g "down" 

add:
Code:
#1.g "fill white"
 


Ty, you are right not to force numbers after one try but one can get stuck in loop (that SCAN wont exit!) if one wants to quit customize process (with Cancel), so if Cancel is pressed at prompt I do go to default settings for quickest way out of customize process.
« Last Edit: Nov 22nd, 2016, 9:02pm by bplus » User IP Logged

B+
tsh73
JB-Supporter


member is offline

Avatar




PM

Gender: Male
Posts: 3635
xx Re: Winter fun 2016 Minesweeper
« Reply #24 on: Nov 24th, 2016, 09:02am »

Minewin minesweeper.
Type "35" to open cell in row 3 column 5, "355" (anything extra will do) to mark that cell.
Code:
'JB Minesweeper
'attempt by tsh73 , Nov 2016
'v.08 - playable
global fSize, n    'field size
global cellsLeft
fSize = 9'7'9'12'16    '0, fSize+1 are never used boundary (prevents out of bounds error)
'debug = 1   'uncomment to see mines and neighbours

n = fSize+1
dim mine(n,n)  '0/1
dim neighbours(n,n) 'count, 0/8
dim visual(n,n) 'thing to be visualised

gosub [initMines]
gosub [initNeighbours]
'visuals - init by DIMming (empty - not known)
gosub [initMisc]
gosub [instructions]

gosub [showStuff]
do  'main loop
[tryInput]
    input "Enter coords RowCol ";RowCol$
    if RowCol$="" then print "Bye then!": end
    'validate  next move against numLine$
    'i=val(left$(RowCol$,1))
    i=instr(numLine$,left$(RowCol$,1))
    'j=val(mid$(RowCol$,2,1))
    j=instr(numLine$,mid$(RowCol$,2,1))
    if i<1 or i > fSize or j <1 or j > fSize then print "Not a valid move": goto [tryInput]
    'process
    if len(RowCol$)>2 then  'like "12+", consider right click
        '0=>-2=>-3=>0
        select case visual(i,j)
        case 0: visual(i,j)=-2:mLeft=mLeft-1
        case -2: visual(i,j)=-3:mLeft=mLeft+1
        case -3: visual(i,j)=0
        end select
    else
        select case
        case visual(i,j) <> -2 and mine(i,j)=1    'end of game
            gameOver=1
            'show other mines
            for i1=1 to fSize
                for j1=1 to fSize
                    if mine(i1,j1) then visual(i1,j1)=-4  'mine
                next
            next
            visual(i,j)=-5  'activated mine
        case (visual(i,j) =0 or visual(i,j) =-3) and neighbours(i,j)>0
            visual(i,j)=neighbours(i,j)
            cellsLeft=cellsLeft-1
        case (visual(i,j) =0 or visual(i,j) =-3) and neighbours(i,j)=0
            'should open recursively
            call RecursOpen i,j
        end select
    end if

    gosub [showStuff]
    if cellsLeft=0 then gameOver=2
loop until gameOver
if gameOver=1 then
    print "You lose!"
else
    print "You win!"
end if
end

[initMines]
'init mines
    'totalMines=4'10
    'or
    'ratio = 0.2
    'totalMines=int(fSize*fSize*ratio)
    'Win: 9x9 - 10, 16x16 - 40, 16x30 - 99
    totalMines=int(0.04*fSize^2.5)
    mLeft=totalMines
    cellsLeft=fSize*fSize-mLeft
    c = 0
    while c < totalMines
        i=randI(1, fSize)
        j=randI(1, fSize)
        if not(mine(i,j)) then
            mine(i,j)=1
            c=c+1
        end if
    wend
return

[initNeighbours]
'neighbours
    for i = 1 to fSize
        for j = 1 to fSize
            for di=-1 to 1
                for dj=-1 to 1
                    neighbours(i,j) = neighbours(i,j) + mine(i+di,j+dj)*((di<>0)or(dj<>0))
                next
            next
        next
    next
return

[initMisc]
    dash$="": for i = 1 to fSize: dash$=dash$+"-": next
    numLine$="": for i = 1 to fSize
    if i <10 then
        numLine$=numLine$;i
    else
        numLine$=numLine$;chr$(i-10+asc("a"))
    end if
    next
return

[showStuff]
'show
    cls
    print at$(1,1);"Field is ";fSize;"x";fSize; _
    "   Mines left ";mLeft; _
    "   To open "; cellsLeft
    '"   totalMines ";totalMines; _
    offX = 1
    offY = 2
if not(debug) then [skipDebug]
    print at$(offX,offY);"mines"
    print at$(offX+2,offY+1);numLine$
    print at$(offX+2,offY+2);dash$
    for i = 1 to fSize
        aLine$=mid$(numLine$,i,1);"|"
        for j = 1 to fSize
            aLine$=aLine$;mine(i,j)
        next
        print at$(offX,offY+2+i);aLine$
    next
    print at$(offX+2,offY+fSize+3); dash$
    print at$(offX+2,offY+fSize+4);numLine$

    'neihgbours
    offX = fSize+5+1
    offY=2
    print at$(offX,offY);"neihgbours"
    print at$(offX+2,offY+1);numLine$
    print at$(offX+2,offY+2);dash$
    for i = 1 to fSize
        aLine$=mid$(numLine$,i,1);"|"
        for j = 1 to fSize
            aLine$=aLine$;neighbours(i,j)
        next
        print at$(offX,offY+2+i);aLine$
    next
    print at$(offX+2,offY+fSize+3); dash$
    print at$(offX+2,offY+fSize+4);numLine$

    'visual
    offX = 2*(fSize+5)+1
    offY=2
    print at$(offX,offY);"visual"
[skipDebug]
    print at$(offX+2,offY+1);numLine$
    print at$(offX+2,offY+2);dash$
    for i = 1 to fSize
        aLine$=mid$(numLine$,i,1);"|"
        for j = 1 to fSize
            select case
            case visual(i,j) = -5
                c$="#"  'activated mine (one)
            case visual(i,j) = -4
                c$="o"  'mine
            case visual(i,j) = -3
                c$="?"  'not sure
            case visual(i,j) = -2
                c$="P"  'marked mine
            case visual(i,j) = -1
                c$=" "  'open, no neighbours
            case visual(i,j) = 0
                c$="."  'not known
            case else '>0 : number of mines, visible
                c$="";visual(i,j)
            end select
            aLine$=aLine$;c$
        next
        print at$(offX,offY+2+i);aLine$
    next
    print at$(offX+2,offY+fSize+3); dash$
    print at$(offX+2,offY+fSize+4);numLine$
return

[instructions]
print "Hello there"
print
print "Here is console (minewin... err.. mainwin) Minesweeper clone"
print "That mean, no mouse."
print "What? No mouse? But how am I...?"
print "Easy, man ;)"
print "You just type row and column and press Enter"
print "Like, to open row 3 column 5 you type"
print "   35"
print "and press <Enter>"
print "(rows and columns are labeled for you convenience. After '89' goes 'ab')"
print "And to mark cell, you just add extra letter to RowColumn,"
print "like, 144 means 'mark that (1,4) cell'"
print "The win condition is to open all empty cells."
print "Empty input (just Enter) end game."
print
input "Press Enter to begin";dummy
return

'------------------------
sub RecursOpen i,j
    if not(valid(i,j)) then exit sub
    if mine(i,j) then exit sub  '???
    if visual(i,j)>0 OR visual(i,j)=-1 then exit sub
    if neighbours(i,j)>0 then visual(i,j)=neighbours(i,j):cellsLeft=cellsLeft-1:exit sub
    'else open and all recursive
    'print
    visual(i,j)=-1
    cellsLeft=cellsLeft-1
    for di=-1 to 1
        for dj=-1 to 1
            if (di<>0)or(dj<>0) then call RecursOpen i+di,j+dj
        next
    next
end sub

function valid(x,y)
    valid=(x>0)and(x<n)and(y>0)and(y<n)
end function

function randI(mn, mx)    'inclusive
    randI=mn+int(rnd(1)*(mx-mn+1))
end function

function at$(x,y)
'to be used in PRINT for side effect
    locate x, y
end function
 
User IP Logged

Q: "And if I took your codes and compile them, and sell them for a profit"?
A: Go ahead. I had my share of good then I coded it for fun, if you can make better use of it - please do.
(enjoying JB 1.01 on WinXP, netbook and desktop)
Rod
Administrator
ImageImageImageImageImage


member is offline

Avatar

Graphics = Goosebumps!


PM

Gender: Male
Posts: 3151
xx Re: Winter fun 2016 Minesweeper
« Reply #25 on: Nov 24th, 2016, 09:19am »

Ha! retro. Can imagine being hunched over a teletype machine waiting for the matrix to scroll down the paper.
User IP Logged

bplus
Senior Member
ImageImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 1255
xx Re: Winter fun 2016 Minesweeper
« Reply #26 on: Nov 24th, 2016, 11:21am »

Ha! Retro or novelty?

Nice Anatoly!

I see the ? state does not save one from blowing up if clicked... err entered.
User IP Logged

B+
tsh73
JB-Supporter


member is offline

Avatar




PM

Gender: Male
Posts: 3635
xx Re: Winter fun 2016 Minesweeper
« Reply #27 on: Nov 24th, 2016, 11:43am »

>> I see the ? state does not save one from blowing up if clicked... err entered.
That's by design wink
User IP Logged

Q: "And if I took your codes and compile them, and sell them for a profit"?
A: Go ahead. I had my share of good then I coded it for fun, if you can make better use of it - please do.
(enjoying JB 1.01 on WinXP, netbook and desktop)
Facundo
Board Moderator


member is offline

Avatar




PM

Gender: Male
Posts: 1302
xx Re: Winter fun 2016 Minesweeper
« Reply #28 on: Nov 24th, 2016, 2:08pm »

on Nov 21st, 2016, 8:24pm, TyCamden wrote:
Facundo,

I am working on "Mega-sweeper" based on your code, but am stuck, it works fairly well for a bit, but as I work on more and more of the board, scrolling right, it gets kind of weird. Like it doesn't show cleared spaces or something.

Since I am rusty, and tweaking your code without understanding it all, perhaps you can review my minor changes, and fix it huh My guess is that the program is just not designed to handle searching and "cleaning" the board for that many spaces.

Here is the code so far...

http://jbfilesarchive.com/phpBB3/viewtopic.php?f=4&t=2126

A quick fix would be to use Flush on each right|left click, without managing the segments there on that Branch. Then deleting the old segments on each restart. A better way would be to keep track of each Segment, and deleting them while adding new in the same position. We can not use CLS because I have the playing board on the segment called "mainSegID", to avoid re-drawing it. Anyway, I'm posting a code there on the Files Site, it is not polished or anything but it works on my 16 years old PC, but not so fast. I don't know how it works on a faster computer, like the one I used to code the game in first place.

Link
« Last Edit: Nov 24th, 2016, 2:10pm by Facundo » User IP Logged

cundo aka MSlayer
Pages: 1 2  Notify Send Topic Print
« Previous Topic | Next Topic »

Conforums Terms of Service | Membership Rules | Home | Search | Recent Posts | Notification | Format Your Message | Installation FAQ

Donate $6.99 for 50,000 Ad-Free Pageviews!

| |

This forum powered for FREE by Conforums ©
Sign up for your own Free Message Board today!
Terms of Service | Privacy Policy | Conforums Support | Parental Controls