This is required "bomb11.aiff" file.
/*****************************************************************
// bomb sweeper
// Copyright (C) 1993,2012 by AIG-SOFT
/*****************************************************************
/* variable(like constant)
font("IPAGothic")
int fzenhan
int WX=64
int WY=width(WX,,fzenhan)
int xw=1
if fzenhan then xw=2
/*****************************************************************
int MX =(WX/2)-2 :/* map max x width (-2 for frame)
int MY =19 :/* map max y heigh
int MXX=5 :/* map min x width
int MYY=4 :/* map min y height
int BOMB='*' :/* bomb code:'*'=&h2a =< &h3f
int ERR=9 :/* Judgment mistake
int BMBIT=bit(7) :/* bit for should bomb
int CHBIT=bit(6) :/* unknown bit
int OPBIT=(BMBIT or CHBIT) :/* bits for open status
int NOPBIT=(not OPBIT) :/* bits for get character only
/* screen home position
int SX=2 :/* sx>=2 & sx+(MX+1)*2< screen x width
int SY=4 :/* sy>=4 & sy+MY+1 < screen y height
int ESC=&h1B
int CR =&h0d
/*****************************************************************
/* global variable
dim char map( (64/2),19) :/* current map
dim char map0((64/2),19) :/* virtual screen
dim int touchNo(10) :// Touch area No.
int touchCnt :// The number of touch area
int wx,wy :/* map width
int seed,bomb :/* the number of bomb and should bomb
int all :/* the number of point on all should open
int ts,dt :/* start time, elapsed time
/*****************************************************************
int ret
int minbomb,maxbomb
/* set field width and the number of bombs
str widthStr,heightStr,bombStr,defaultStr,messageStr
if isLocalizeJapan() then {
widthStr ="横幅"
heightStr="縦幅"
minbomb=MXX*MYY/8 :/* min 1/8
maxbomb=wx*wy/2 :/* max 1/2
bombStr="爆弾数"
defaultStr="標準"
messageStr="メッセージ"
} else {
widthStr ="width "
heightStr="height"
minbomb=MXX*MYY/8 :/* min=1/8
maxbomb=wx*wy/2 :/* max=1/2
bombStr="bombs"
defaultStr="default"
messageStr="message"
}
print widthStr ;"(";MXX;"~";MX;")";
dim str menues(3)={"10","20","30"}
menues(3)=defaultStr
wx=selectMenu(widthStr,menues):// last item of selectMenu() is special
if wx=3 then wx=2
wx=(wx+1)*10
print wx
// input wx
print heightStr;"(";MYY;"~";MY;")";
menues={"5","10","15","19"}
repeat
wy=selectMenu2(heightStr,menues)
until wy<>-1
wy=5*(wy+1)
print wy
// input wy
if wx<MXX then wx=MXX
if wx>MX then wx=MX
if wy<MYY then wy=MYY
if wy>MY then wy=MY
minbomb=MXX*MYY/8 :/* min=1/8
maxbomb=wx*wy/2 :/* max=1/2
print bombStr;"(";minbomb;"~";maxbomb")";
menues={"50","100","150","200"}
seed=selectMenuWithMessage(bombStr,messageStr,menues)
seed=50*(seed+1)
print seed
// input seed
if seed<minbomb then seed=minbomb
if seed>maxbomb then seed=maxbomb
int sno=a_setPlayData("bomb11.aiff")
a_play(sno)
/* main routine
repeat
/* initialize random number
srand2()
/* place bombs
all=BombSeed(seed)
bomb=0
BombCount()
dt=0:/* elapsed time
/* display initial screen
InitScreen()
/* key operation
ret=CursorMove()
/* end check
if ret=-2 then break:/* force end
switch ret
case -1:/* try again
MapPrintAll(YES):/* display all
break
case 0: /* Game clear
GameClear()
break
case 1: /* Game over
MapPrintAll(YES):/* display all
GameOver()
break
endswitch
/* Try again
locate(20,2)
if isLocalizeJapan() then {
print "《もう一度しますか?》";
setFunctionKey(0,"はい" ,CR)
setFunctionKey(1,"いいえ",ESC)
} else {
print "<< Try Again ? >>";
setFunctionKey(0,"YES",CR)
setFunctionKey(1,"NO" ,ESC)
}
displayFunctionKey(YES,0,1)
repeat
ret=inkey()
until ret<>0
displayFunctionKey(NO,0,1)
// remove touch area
// Once release and re-set up. Otherwise, it will continue to overlap area.
resetTouchArea()
until (ret=ESC)
a_end(sno):// release sound buffer
if isLocalizeJapan() then {
print "終了"
} else {
print "end"
}
end
/*****************************************************************
/* Functions
/*****************************************************************
func int CursorMove()
/* cursor move and operation
int x,y,c
int t
/* initial position
/* move cursor to no bomb place
for x=0 to wx-1
for y=0 to wy-1
if ((map(x,y) and NOPBIT)<>BOMB) then goto "CM1"
next
next
label "CM1"
ts=time():/* start time
while YES
/* reverse display at cursor point
c=map(x,y)
tatrb(ATRB_REVERSE)
locate2(x,y)
print printChr$(c);
tatrb(ATRB_NORMAL)
// timer count until key input
// int cnt=0
while (not kbhit())
/* until key input none
t=time()
if t-ts>dt then { :/* change second
dt=dt+1
PrintTime(dt)
// beep2(0)
// print "cnt=";cnt
}
// inc(cnt)
endwhile
/* normal display at cursor point
locate2(x,y)
print printChr$(c);
//
// key operation
c=inkey()
beep2(0) :// click sound
switch c
case &h1b: /* retry
return(-1)
/* cursor roll at screen edge
case '2': /* ↓
if y<wy-1 then y=y+1 else y=0
break
case '4': /* ←
if x>0 then x=x-1 else x=wx-1
break
case '6': /* →
if x<wx-1 then x=x+1 else x=0
break
case '8': /* ↑
if y>0 then y=y-1 else y=wy-1
break
case '5': /* Check
CheckMapPoint(x,y)
MapPrint()
/* The check should not be open to all
break
case ' ': /* Open
if OpenMapPoint(x,y) then return(YES):/* game over
/* display
if MapPrint() then return(NO)
break
endswitch
endwhile
return (YES)
endfunc
/*****************************************************************
func int MapPrint()
/* diaplay map and update virtual screen
/* return:0=It is not already open all , 1=open all
int x,y,c
int all0=0
for y=0 to wy-1
for x=0 to wx-1
c=map(x,y)
if map0(x,y)<>c then {
/* update screen
locate2(x,y)
print printChr$(c)
map0(x,y)=c:/* update virtual screen
}
/* count open point
if ((c and OPBIT)=OPBIT) then all0=all0+1
next
next
return(all0=all)
endfunc
/*****************************************************************
func MapPrintAll(mode;int)
/* display map all
/* mode : 0=is still , 1=all open (With a judgment mistake)
int x,y,c
str ls
for y=0 to wy-1
ls=""
for x=0 to wx-1
c=map(x,y)
if mode then {
if (c and OPBIT)=BMBIT then {
/* checked with 'bomb is here'
/* if there is no bomb then it is doubt
if (c and NOPBIT)<>BOMB then c=ERR
}
c=(c or OPBIT):/* open
}
ls=ls+printChr$(c)
next
locate2(0,y)
print ls
next
// color(7)
endfunc
/*****************************************************************
func str printChr$(c;int)
/* display character
/* c : bit6,7 = opened(11)/check mark(10)/bomb mark(01)/close(00)
/* bit0-5 = map status &h00 - &h3f
str cs
int cc=(c and OPBIT)
if cc=0 then {
/* close
return ("□")
}
if cc=CHBIT then {
/* CHBIT check marking
return ("?")
}
if cc=BMBIT then {
/* bomb is here marking
return ("☆")
}
if cc=OPBIT then {
/* opend
switch (c and NOPBIT)
case 0:cs= "・":break
case 1:cs= "1":break
case 2:cs= "2":break
case 3:cs= "3":break
case 4:cs= "4":break
case 5:cs= "5":break
case 6:cs= "6":break
case 7:cs= "7":break
case 8:cs= "8":break
case 9:/* mistake
cs= "×"
break
case '*':/* bomb
cs= "★"
break
endswitch
}
return (cs)
endfunc
/*****************************************************************
func locate2(x;int,y;int)
locate(SX+(x)*xw,SY+y) :/* *xw for double-width character
endfunc
/*****************************************************************
func WakuPrint(yoko;str,tate;str,kado;str,fall;int)
/* display map frame
int i
/* horizontal line
str yokos=""
for i=0 to wx-1:yokos=yokos+yoko:next
locate2(0,-1):print yokos
locate2(0,wy):print yokos
/* vertical line
if fall then {
// erase internal = fast
str tates=tate+space$(wx*xw)+tate
for i=0 to wy-1
locate2(-1,i):print tates;
next
} else {
// redraw border only = slow
for i=0 to wy-1
locate2(-1,i):print tate;
locate2(wx,i):print tate;
next
}
/* corner
locate2(-1,-1):print kado;
locate2(-1,wy):print kado;
locate2(wx,-1):print kado;
locate2(wx,wy):print kado;
endfunc
/*****************************************************************
func InitScreen()
/* display initial screen
cls()
WakuPrint("-","|","+",YES)
MapPrintAll(NO)
locate(5,0)
if isLocalizeJapan() then {
print using "マップ幅:##×## 爆弾数:###/### 時間:#####";wx,wy,bomb,seed,dt
/* 0 1 2 3 4
/* +0123456789012345678901234567890123456789012
/* +locate
} else {
print using "map size:##×## bombs :###/### time:#####";wx,wy,bomb,seed,dt
}
str open$,exit$
if isLocalizeJapan() then {
open$="開く"
exit$="中断"
} else {
open$="open"
exit$="exit"
}
int x=WX/2-18
int y=SY+wy+2
// 012345678901234567890123456789
locate(x,y+0):print " ┏━┓"
locate(x,y+1):print " ┃↑┃"
locate(x,y+2):print " ┗━┛"
locate(x,y+3):print "┏━┓┏━┓┏━┓ ┏━━┓"
locate(x,y+4):print "┃←┃┃?┃┃→┃ ┃";open$;"┃"
locate(x,y+5):print "┗━┛┗━┛┗━┛ ┗━━┛"
locate(x,y+6):print " ┏━┓"
locate(x,y+7):print " ┃↓┃"
locate(x,y+8):print " ┗━┛"
int i=0
touchNo(inc(i))=setTouchAreaWithText(x+ 6,y ,xw*3,3,'8',YES,125,0,5,100)
touchNo(inc(i))=setTouchAreaWithText(x+ 6,y+6,xw*3,3,'2',YES,125,0,5,100)
touchNo(inc(i))=setTouchAreaWithText(x ,y+3,xw*3,3,'4',YES,125,0,5,100)
touchNo(inc(i))=setTouchAreaWithText(x+12,y+3,xw*3,3,'6',YES,125,0,5,100)
//
touchNo(inc(i))=setTouchAreaWithText(x+ 6,y+3,xw*3,3,'5',YES,150,50, 5,120):/* check
touchNo(inc(i))=setTouchAreaWithText(x+22,y+3,xw*4,3,' ',YES,150, 5 ,5,120):/* open
touchCnt=i
//
setFunctionKey(0,exit$,ESC)
displayFunctionKey(YES,0,0)
endfunc
func resetTouchArea()
int i
for i=0 to touchCnt
removeTouchArea(touchNo(i))
next
touchCnt=0
endfunc
/*****************************************************************
func PrintBombCount()
/* display left bombs
locate(5+26,0)
print using "###";bomb
endfunc
/*****************************************************************
func PrintTime(dt;int)
/* display time
locate(5+42,0)
print using "#####";dt
endfunc
/*****************************************************************
func GameClear()
/* display game clear screen
/* change frame design
beep()
WakuPrint("◇","◇","◇",NO)
beep()
locate(6,1)
if isLocalizeJapan() then {
print "§§ おめでとう! あなたは総ての爆弾を捜し当てました §§";
} else {
print "<< Congratulations! You've turned up the bomb of all >>";
}
endfunc
/*****************************************************************
func GameOver()
/* display game over screen
/* change frame design
a_play(sno)
WakuPrint("☆","☆","☆",NO)
a_play(sno)
locate(10,1)
if isLocalizeJapan() then {
print "@@ あなたは爆弾にぶち当たってしまいました @@";
} else {
print "@@ You've hit a bomb @@";
}
endfunc
/*****************************************************************
func CheckMapPoint(x;int,y;int)
/* check point on the map
int c
c=map(x,y)
c=(c and OPBIT)
if c=OPBIT then {
/* already open
/* Reopen the place is open waste
beep()
return()
}
if c=0 then {
/* closed -> probable bomb
map(x,y)=(BMBIT or map(x,y))
bomb=bomb+1
PrintBombCount()
return()
}
if c=BMBIT then {
/* probable bomb -> check please
map(x,y)=(c and NOPBIT)or CHBIT
return()
}
if c=CHBIT then {
/* please check -> close
map(x,y)=(NOPBIT and map(x,y))
bomb=bomb-1
PrintBombCount()
}
endfunc
/*****************************************************************
func int OpenMapPoint(x;int,y;int)
/* open point on the map
int c
c=map(x,y)
if ((c and OPBIT)=OPBIT) then {
/* already open
/* Reopen the place is open waste
beep()
return(NO):/* nothing to do without warning
}
if ((c and NOPBIT)=BOMB) then {
/* open bomb
a_play(sno)
return(YES):/* game over
}
/* There is open so it is not already open
if (c=0) then {
/* If there is no bomb around open in the paint type
PaintMap(x,y)
} else {
/* When there is at least one bomb around, the only one open point
map(x,y)=(OPBIT or map(x,y)):/* opened symbol
}
return(NO)
endfunc
/*****************************************************************
func PaintMap(x;int,y;int)
/* open 0 point from map (x,y)
/* Basically it is same as the paint routine, but it is different to open border
int c,xs,xe
if map(x,y)<>0 then {
/* if the first point is not zero then end
return()
}
/* 0 <- x : left search
xe=x+1 :/* point that is search start right
while x>=0
c=map(x,y)
if ((c and OPBIT)=0) then {
map(x,y)=(OPBIT or map(x,y))
}
if (c<>0) then break:/* border
/* open border too
// Border is not bomb.
// Bacause there are from 1 to 8 around the bomb always.
x=x-1:/* to left
endwhile
if x<0 then xs=0 else xs=x
/* xs=Leftmost segment(include with border)
/* x -> wx-1 : right search
while xe<=wx-1
c=map(xe,y)
if (c and OPBIT)=0 then map(xe,y)=(OPBIT or map(xe,y))
if c<>0 then break:/* order
xe=xe+1 :/* to right
endwhile
if xe=wx then xe=xe-1
/* xe=rightmost segment(include with border)
if y>0 then PaintMapSub(xs,xe,y-1):/* upper check
if y<wy-1 then PaintMapSub(xs,xe,y+1):/* lower check
endfunc
/*****************************************************************
func PaintMapSub(xs;int,xe;int,yy;int)
/* PaintMap() subroutine : for upper/lower check
int x,c
for x=xs to xe
c=map(x,yy)
if c=0 then {
PaintMap(x,yy)
} else {
if (c and OPBIT)=0 then map(x,yy)=(OPBIT or map(x,yy)):/* open with border
}
next
endfunc
/*****************************************************************
func int BombSeed(seeds;int)
/* bomb placement in the map
/* seeds : the number of bomb < wx*wy
/* random initialize outside
int x,y
int all
/* map clear
for y=0 to wy-1
for x=0 to wx-1
map(x,y)=0
next
next
/* Number must be open to all non-bomb
all=wx*wy-seeds
/* bomb placement
while seeds>0
x=rand2(wx)
y=rand2(wy)
if map(x,y)=0 then {
/* Set bombs
map(x,y)=BOMB:/* map
map0(x,y)=BOMB:/* virtual screen
seeds=seeds-1 :/* decrement left bomb
}:/* When there is a bomb there already will look for another location
endwhile
return(all)
endfunc
/*****************************************************************
func BombCount()
/* Write bomb status in the map
/* Writing in advance the number of bomb around each point
int x,y,xx,yy,xs,ys,xe,ye,c
for y=0 to wy-1
ys=y-1:if ys<0 then ys=0
ye=y+1:if ye>wy-1 then ye=wy-1
for x=0 to wx-1
if map(x,y)=BOMB then continue:/* skip bomb
xs=x-1:if xs<0 then xs=0
xe=x+1:if xe>wx-1 then xe=wx-1
/* count around
c=0
for yy=ys to ye
for xx=xs to xe
if map(xx,yy)=BOMB then c=c+1
next
next
/* c=0~8
map(x,y)=c:/* map
map0(x,y)=c:/* virtual screen
next
next
endfunc
/*****************************************************************
/* General functions
/*****************************************************************
func srand2()
/* initialize rand()
int tm=time()
tm=tm and &h0fff
tm=tm * 16
srand(tm)
endfunc
func rand2(seed;int)
return (rand() mod seed):/* generate random number 0 to seed-1
endfunc
/*****************************************************************
Zip file including sound file is here :
XBbs.zip