It's minesweeper. Pretty simple, I'm sure we've all played it.
Has nearly every feature as the windows one.
Right click, flag
Crappy graphics though
To start:
/mines [# of mines] [s | m | l]
s(small), m(medium), large(large)
alias mines {
set %m.mines $iif($1 < 40,$1,15)
set %m.size $iif($istok(s m l,$2,32),$2,m)
set %m.time 0
set %m.gameOn 1
window -pdCk0 @mines 1 1 $replace(%m.size,s,155,m,260,l,470) $replace(%m.size,s,220,m,320,l,320)
drawfill -r @mines $rgb(255,255,255) $rgb(255,255,255) 1 1
.timermtime 0 1 m.time
if ($hget(mines)) { hfree mines }
hadd -m mines mines %m.mines
hadd -m mines size %m.size
m.drawMap
m.makeMines
}
menu @mines {
uclick: {
;Show mine
if ($getdot(@mines,$mouse.x,$mouse.y) == 8421504 && %m.gameOn == 1) {
var %xy = $m.getCoord($mouse.x,$mouse.y)
tokenize 32 %xy
;Check if cell is flagged.
if (!$hget(mines,$+(flag.,$1,.,$2))) {
if ($hget(mines,$+(cell.,$1,.,$2)) == m) { m.gameOver }
else if ($hget(mines,$+(cell.,$1,.,$2)) == 0) {
drawrect -fr @mines $rgb(192,192,192) 1 $calc(6+(($1 -1)*15)) $calc(46+(($2 -1)*15)) 14 14
;Show nearby clear ones?
}
else {
if ($hget(mines,$+(cell.,$1,.,$2))) { drawtext -r @mines $rgb(0,0,0) Tahoma 12 $calc(9+ (($1 -1) *15)) $calc(45+ (($2 -1) *15)) $hget(mines,$+(cell.,$1,.,$2)) }
hdel mines $+(cell.,$1,.,$2)
}
}
}
if ($inellipse($mouse.x,$mouse.y,$calc(($window(@mines).w /2) -20),5,25,25)) {
;new Game
window -c @mines
mines $hget(mines,mines) $hget(mines,size)
}
}
rclick: {
;Show flag/question mark/none
if ($getdot(@mines,$mouse.x,$mouse.y) == 8421504 || $getdot(@mines,$mouse.x,$mouse.y) == 255 && %m.gameOn == 1) {
var %xy = $m.getCoord($mouse.x,$mouse.y)
tokenize 32 %xy
;Flag is there already
if ($hget(mines,$+(flag.,$1,.,$2)) && $istok(0 1 2 3 4 5 6 m,$hget(mines,$+(cell.,$1,.,$2)),32)) {
hdel mines $+(flag.,$1,.,$2)
drawfill -r @mines $rgb(128,128,128) $rgb(0,0,0) $calc((($1 -1) * 15) + 9) $calc((($2 -1) * 15) + 49)
drawline -r @mines $rgb(255,255,255) 1 $calc(6+(($1 -1)*15)) $calc(46+(($2 -1)*15)) $calc(19+(($1 -1)*15)) $calc(46+(($2 -1)*15))
drawline -r @mines $rgb(255,255,255) 1 $calc(6+(($1 -1)*15)) $calc(46+(($2 -1)*15)) $calc(6+(($1 -1)*15)) $calc(59+(($2 -1)*15))
inc %m.mines
drawrect -rf @mines $rgb(0,0,0) 1 5 5 40 25
drawtext -r @mines $rgb(142,0,0) Tahoma 18 6 6 %m.mines
}
;Add flag
else {
hadd mines $+(flag.,$1,.,$2) 1
drawrect -fer @mines $rgb(255,0,0) 1 $calc(10+(($1 -1)*15)) $calc(50+(($2 -1)*15)) 5 5
dec %m.mines
drawrect -rf @mines $rgb(0,0,0) 1 5 5 40 25
drawtext -r @mines $rgb(142,0,0) Tahoma 18 6 6 %m.mines
}
}
}
}
alias m.time {
inc %m.time
if (%m.time == 1000) {
;game over
.timermtime off
}
else {
drawrect -rf @mines $rgb(0,0,0) 1 $calc($window(@mines).w - 55) 5 40 25
drawtext -r @mines $rgb(142,0,0) Tahoma 18 $calc($window(@mines).w - 50) 6 %m.time
}
}
alias m.drawMap {
;draw top
;Flags left
drawrect -rf @mines $rgb(0,0,0) 1 5 5 40 25
drawtext -r @mines $rgb(142,0,0) Tahoma 18 6 6 %m.mines
;Time
drawrect -rf @mines $rgb(0,0,0) 1 $calc($window(@mines).w - 55) 5 40 25
;New Game
drawrect -ref @mines $rgb(255,255,0) 1 $calc(($window(@mines).w /2) -20) 5 25 25
drawrect -ref @mines $rgb(0,0,0) 1 $calc(($window(@mines).w /2) -15) 12 5 5
drawrect -ref @mines $rgb(0,0,0) 1 $calc(($window(@mines).w /2) -5) 12 5 5
drawrect -re @mines $rgb(0,0,0) 1 $calc(($window(@mines).w /2) -10) 20 5 5
drawline -r @mines $rgb(0,0,0) 1 0 35 $window(@mines).w 35
var %x 5, %y 45, %w $replace(%m.size,s,9,m,16,l,30), %h $replace(%m.size,s,9,m,16,l,16)
var %i 1
while (%i <= %w) {
var %j 1
while (%j <= %h) {
;draw cells
drawrect -r @mines $rgb(0,0,0) 1 $calc(((%i -1) * 15) + %x) $calc(((%j -1) * 15) + %y) 15 15
drawfill -r @mines $rgb(128,128,128) $rgb(0,0,0) $calc(((%i -1) * 15) + %x + 1) $calc(((%j -1) * 15) + %y + 1)
drawline -r @mines $rgb(255,255,255) 1 $calc(6+((%i -1)*15)) $calc(46+((%j -1)*15)) $calc(19+((%i -1)*15)) $calc(46+((%j -1)*15))
drawline -r @mines $rgb(255,255,255) 1 $calc(6+((%i -1)*15)) $calc(46+((%j -1)*15)) $calc(6+((%i -1)*15)) $calc(59+((%j -1)*15))
hadd -m mines $+(cell.,%i,.,%j) 0
hadd -m mines cells $hget(mines,cells) $+(%i,.,%j)
inc %j
}
inc %i
}
}
alias m.makeMines {
var %zyx %m.mines
while (%m.mines > 0) {
var %xy = $m.getRandMineCoord
tokenize 32 %xy
hadd mines $+(cell.,$1,.,$2) m
var %z $hget(mines,cells)
hdel mines cells
hadd mines cells $remove(%z,$+($1,.,$2))
;increment surrounding mines
;(-1,-1) (0,-1) (+1,-1)
;(-1,0) (x,y) (+1,0)
;(-1,+1) (0,+1) (+1,+1)
if ($hget(mines,$+(cell.,$calc($1 -1),.,$calc($2 -1))) != m) { hinc mines $+(cell.,$calc($1 -1),.,$calc($2 -1)) }
if ($hget(mines,$+(cell.,$1,.,$calc($2 -1))) != m) { hinc mines $+(cell.,$1,.,$calc($2 -1)) }
if ($hget(mines,$+(cell.,$calc($1 +1),.,$calc($2 -1))) != m) { hinc mines $+(cell.,$calc($1 +1),.,$calc($2 -1)) }
if ($hget(mines,$+(cell.,$calc($1 +1),.,$2)) != m) { hinc mines $+(cell.,$calc($1 +1),.,$2) }
if ($hget(mines,$+(cell.,$calc($1 +1),.,$calc($2 +1))) != m) { hinc mines $+(cell.,$calc($1 +1),.,$calc($2 +1)) }
if ($hget(mines,$+(cell.,$1,.,$calc($2 +1))) != m) { hinc mines $+(cell.,$1,.,$calc($2 +1)) }
if ($hget(mines,$+(cell.,$calc($1 -1),.,$calc($2 +1))) != m) { hinc mines $+(cell.,$calc($1 -1),.,$calc($2 +1)) }
if ($hget(mines,$+(cell.,$calc($1 -1),.,$2)) != m) { hinc mines $+(cell.,$calc($1 -1),.,$2) }
dec %m.mines
}
set %m.mines %zyx
}
alias m.getRandMineCoord {
var %x $hget(mines,cells)
return $replace($gettok(%x,$r(1,$numtok(%x,32)),32),$chr(46),$chr(32))
}
alias m.getCoord {
return $ceil($calc(($1 -5) /15)) $ceil($calc(($2 -45) /15))
}
alias m.gameOver {
set %m.gameOn 0
.timermtime off
;show Mines
var %x $hfind(mines,cell.*,0,w), %p
while (%x > 0) {
%p = $hfind(mines,cell.*,%x,w)
if ($hget(mines,%p) == m) {
tokenize 32 $gettok(%p,2,46) $gettok(%p,3,46)
drawrect -fer @mines $rgb(0,0,0) 1 $calc(10+(($1 -1)*15)) $calc(50+(($2 -1)*15)) 5 5
}
dec %x
}
drawrect -ref @mines $rgb(255,255,0) 1 $calc(($window(@mines).w /2) -20) 5 25 25
drawrect -ref @mines $rgb(0,0,0) 1 $calc(($window(@mines).w /2) -15) 12 5 5
drawrect -ref @mines $rgb(0,0,0) 1 $calc(($window(@mines).w /2) -5) 12 5 5
drawline -r @mines $rgb(0,0,0) 1 $calc(($window(@mines).w /2) -15) 23 $calc(($window(@mines).w /2)) 23
}
on 1:CLOSE:@mines: {
unset %m.*
.timermtime off
}