Drops is falling from above until it is full.
It repeat from the beginning.
If you want to stop, tap "[X]".
/******************************************************************/
/* Cascade Demo
/******************************************************************/
/* These are variables. These are not constant. So they can not use for dim size or case value.
int WX ://=(80/2)
int WY ://=24
int MAX =75 :/* number of shelves
int LNG =5 :/* max length of cascade
/* internal character
int WALL='#' :/* wall
int BALL='o' :/* drop
int TANA='=' :/* shelf
int SPC =' ' :/* space
int dx,dy :/* move direction
int clng :/* move pointer
int retY :/* second return value is returned via the global variable
dim int drpx(5) :/* move x position buffer (LNG)
dim int drpy(5) :/* move y position buffer (LNG)
dim char tvram(96,96) :/* virtual video RAM
:/* Size is variable depending on the model, It set aside the maximum value.
int wtt :/* wait
/******************************************************************/
/* main routine
/******************************************************************/
getWidth(WX,WY):// get text screen size(system set)
setUpScroll(NO):// disable to up scroll (V2.0)
WX=WX/2
MAX=(WX*WY/13)
int ts,t
/*int c
srand2() /* random initialize
wtt=CalcWait()/100*8:/* calc wait time (8ms)
repeat
InitScreen() :/* screen initialize
if Cascades() then break:/* move cascade
beep()
locate(8,7)
if isLocalizeJapan() then {
print "もう一度見ますか? ";
} else {
print "Watch again ?";
}
/* c='Y';
ts =time()
repeat:/* automatic repeat after 15 seconds
t=time()
until t-ts>=15
until NO :/*(c<>'Y' && c<>CR)
end
/******************************************************************/
/* below are internal functions
/******************************************************************/
func InitScreen()
/* make initial screen
int i,j,x,y
cls()
print " CASCADES"
init_tvram()
/* make outside wall
for y=1 to WY-2:/* vertical
storexy( 0,y,WALL)
storexy(WX-1,y,WALL)
next
for x=0 to WX-1:/* horizontal
storexy(x,WY-1,WALL)
next
/* make shelf
for i=0 to MAX-1
x=1+rand2(WX-2) :/* Except both ends
y=2+rand2(WY-3) :/* Except for the bottom line and the top and the next
for j=0 to 3
if (x+j>=WX-1) then break /* x-over
if (scrn(x+j,y)=SPC) then storexy(x+j,y,TANA)
next
next
// full screen display
printScreenAll(1,WY-1)
endfunc
/******************************************************************/
func int Cascades()
/* cascade move
int x,y
//int ts=time():/* start time
//int t,dt=0
while CheckDropPoint()=0
/* if there is open
/* set initial position
x=SetFirstPoint()
y=1
repeat
//t=time()
//if t-ts>dt then { :/* change second
// dt=dt+1
// locate(30,0):print dt;
//}
//if inkey()=ESC then return(1)
/* move and display
Drop(x,y)
if clng=0 then break
clng=clng-1
x=drpx(clng)
y=drpy(clng)
until x=0 and y=0
endwhile
/* if top line is full then terminate
return(0)
endfunc
/******************************************************************/
func int CheckDropPoint()
/* check top line open
int x
for x=1 to WX-2
if scrn(x,1)=SPC then return(0) :/* open
next
return(1) :/* close
endfunc
/******************************************************************/
func int SetFirstPoint()
/* start point setting (top line)
int i,x
x=1+rand2(WX-2):/* set start point
while scrn(x,1)<>SPC
x=x+1
if (x=WX-1) then x=1
endwhile
clng=LNG-1
for i=0 to clng-1
drpx(i)=0
drpy(i)=0:/* 0=non record symbol
next
drpx(clng)=x
drpy(clng)=1
dx=0
dy=1: /* to down
return(x)
endfunc
/******************************************************************/
func Drop(x;int,y;int)
/* move and display
int r,l
while (YES)
/* display
printxy(x,y,BALL)
TWait(wtt):/* wait
/* Is bottom open?
if scrn(x,y+1)=SPC then {
/* down fall
dx=0
dy=1
x=Move(x,y)
y=retY
continue
}
/* check destination
if scrn(x+dx,y+dy)=SPC then {
/* enable to move
x=Move(x,y)
y=retY
continue
}
/* can't move the destination
if (dy=1) then { :/* fall down
/* check left and right
r=(scrn(x+1,y)=SPC):/* right
l=(scrn(x-1,y)=SPC):/* left
/* change left or right move if it can move
dx=0
if (r) then { :/* right side is open
dx=1
}
if (l) then { :/* left side is open
dx=-1
if (r) then { :/* right side is open too
/* select left or right
if rand2(2)=1 then dx=1
}
}
if dx<>0 then {:/* enable to move
dy=0
x=Move(x,y)
y=retY
continue
}
}
/* if can't move anywhere then loop out
break
endwhile
endfunc
/******************************************************************/
func int Move(x;int,y;int)
/* move and erase
int i
if (drpy(0)<>0) then printxy(drpx(0),drpy(0),SPC):/* erase previous position
x=x+dx
y=y+dy
if (clng>=1) then {
for i=1 to clng
drpx(i-1)=drpx(i)
drpy(i-1)=drpy(i)
next
}
drpx(clng)=x
drpy(clng)=y
retY=y:/* second return value is returned via the global variable
return(x)
endfunc
/******************************************************************/
/* virtual text VRAM system
/******************************************************************/
func str printChar$(c;char)
/* get display characters
str c$
switch (c)
case ' ': c$= " ":break :/* erase
case 'o': c$= "●":break :/* drops
case '#': c$= "■":break :/* wall
case '=': c$= "□":break :/* shelf
endswitch
return (c$)
endfunc
func printxy(x;int,y;int,c;char)
/* display characters
/* output for virtual text VRAM
tvram(x,y)=c
/* position transrate
locate(x*2,y)
/* display with character transrate
print printChar$(c);
endfunc
func storexy(x;int,y;int,c;char)
/* output for virtual text VRAM
tvram(x,y)=c
endfunc
func char scrn(x;int,y;int)
/* read virtual text VRAM
return(tvram(x,y))
endfunc
func printScreenAll(stY;int,edY;int)
/* full screen display
/* X-BASIC for iOS's text display is so slow. Therefore this function is measured.
/* Remnant of V1.0
int x,y
str linestr
for y=stY to edY
linestr=""
for x=0 to WX-1
linestr=linestr+printChar$(tvram(x,y))
next
locate(0,y):print linestr;
next
endfunc
func init_tvram()
/* virtual text VRAM initialize
int x,y
for y=0 to WY-1
for x=0 to WX-1
tvram(x,y)=SPC
next
next
endfunc
/******************************************************************/
/* misc function
/******************************************************************/
func srand2()
/* rand() initialize
int tm
t=time()
tm=tm and &h0fff
tm=tm*16
srand(tm)
endfunc
func int rand2(seed;int)
/* generate random number
return (rand() mod seed)
endfunc
/******************************************************************/
func int CalcWait()
/* calc wait
int tim,tm
int count
/* Zero clock check
tm=time()
repeat
tim=time()
until tim-tm<>0
count=0
repeat
tm=time()
count=count+1
until tm-tim<>0
return(count):/* count number per 1 second
endfunc
/******************************************************************/
func TWait(wt;int)
int i,tm
for i=0 to wt-1
tm=time()
next
endfunc
/******************************************************************/
Zip archive file : XBetc.zip
No comments:
Post a Comment