Minesweeper
Platform: mIRC
Published Jul 26, 2009
Updated Jul 26, 2009
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
}