終了するには「×」を押してください。
/******************************************************************/
/* しずくデモ
/******************************************************************/
/* 内蔵フォントを使うので、全角文字もOK
/* これらは変数であって定数ではないので、グローバル配列の大きさ指定やcase値には使えない
int WX ://=(80/2)
int WY ://=24
int MAX =75 :/* 棚の本数
int LNG =5 :/* 滴の最大長さ
/* 内部キャラクター
int WALL='#' :/* 外壁
int BALL='o' :/* 滴
int TANA='=' :/* 棚
int SPC =' ' :/* 空間
int dx,dy :/* 移動方向
int clng :/* 動作中ポインター
int retY :/* X-BASICレベルでは2つのリターン値を戻せないのでグローバル変数を経由する
dim int drpx(5) :/* 移動x座標バッファー
dim int drpy(5) :/* 移動y座標バッファー
dim char tvram(96,96) :/* 仮想VRAM / virtual video RAM
:/* 機種によってサイズが可変なので、最大値で確保しておく
int wtt :/* ウエイト
/******************************************************************/
/* メインルーチン
/******************************************************************/
getWidth(WX,WY):// システムの設定したテキスト画面サイズを得る
setUpScroll(NO):// テキスト画面の上スクロールを止める (V2.0)
WX=WX/2
MAX=(WX*WY/13)
int ts,t
/*int c
srand2() /* 乱数初期化
wtt=CalcWait()/100*8:/* ウエイト算出(8ms)
repeat
InitScreen() :/* 画面初期化
if Cascades() then break:/* 滴移動
beep()
locate(8,7)
if isLocalizeJapan() then {
print "もう一度見ますか? ";
} else {
print "Watch again ?";
}
/* c='Y';
ts =time()
repeat:/* 15秒たったら自動的に再開する
t=time()
until t-ts>=15
until NO :/*(c<>'Y' && c<>CR)
end
/******************************************************************/
/* 以下内部関数
/******************************************************************/
func InitScreen()
/* 初期画面作成
int i,j,x,y
cls()
print " CASCADES"
init_tvram()
/* 外枠作成
for y=1 to WY-2:/* 縦
storexy( 0,y,WALL)
storexy(WX-1,y,WALL)
next
for x=0 to WX-1:/* 横
storexy(x,WY-1,WALL)
next
/* 棚作成
for i=0 to MAX-1
x=1+rand2(WX-2) :/* 両端を除く
y=2+rand2(WY-3) :/* 一番上とその次と最下行を除く
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
// 全画面一気表示
printScreenAll(1,WY-1)
endfunc
/******************************************************************/
func int Cascades()
/* 滴処理
int x,y
//int ts=time():/* 開始時間
//int t,dt=0
while CheckDropPoint()=0
/* 開いているとき
/* 初期位置設定
x=SetFirstPoint()
y=1
repeat
//t=time()
//if t-ts>dt then { :/* 秒が変った
// dt=dt+1
// locate(30,0):print dt;
//}
//if inkey()=ESC then return(1)
/* 移動&表示
Drop(x,y)
if clng=0 then break
clng=clng-1
x=drpx(clng)
y=drpy(clng)
until x=0 and y=0
endwhile
/* 最上行が開いていなかったら終わり
return(0)
endfunc
/******************************************************************/
func int CheckDropPoint()
/* 最上行が開いているかどうかを調べる
int x
for x=1 to WX-2
if scrn(x,1)=SPC then return(0) :/* 開いている
next
return(1) :/* 開いていない
endfunc
/******************************************************************/
func int SetFirstPoint()
/* スタートポイント設定(最上行)
int i,x
x=1+rand2(WX-2):/* 始点決定
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=未記録の印
next
drpx(clng)=x
drpy(clng)=1
dx=0
dy=1: /* 下へ
return(x)
endfunc
/******************************************************************/
func Drop(x;int,y;int)
/* 移動&表示
int r,l
while (YES)
/* 表示
printxy(x,y,BALL)
TWait(wtt):/* ウエイト
/* 下が開いている?
if scrn(x,y+1)=SPC then {
/* 無条件に下に落ちる
dx=0
dy=1
x=Move(x,y)
y=retY
continue
}
/* 移動先チェック
if scrn(x+dx,y+dy)=SPC then {
/* 移動可能
x=Move(x,y)
y=retY
continue
}
/* 移動先に移動できない時
if (dy=1) then { :/* 下に落ちるはずだった時
/* 左右チェック
r=(scrn(x+1,y)=SPC):/* 右
l=(scrn(x-1,y)=SPC):/* 左
/* 動けるなら左右移動に変更
dx=0
if (r) then { :/* 右が開いている
dx=1
}
if (l) then { :/* 左が開いている
dx=-1
if (r) then { :/* 右も開いている
/* 左右どちらかを選ぶ
if rand2(2)=1 then dx=1
}
}
if dx<>0 then {:/* 動ける時
dy=0
x=Move(x,y)
y=retY
continue
}
}
/* 動けないときはループ終了
break
endwhile
endfunc
/******************************************************************/
func int Move(x;int,y;int)
/* 移動&消し
int i
if (drpy(0)<>0) then printxy(drpx(0),drpy(0),SPC):/* 前の場所を消す
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:/* 2つ目のリターン値はグローバル変数経由で返す
return(x)
endfunc
/******************************************************************/
/* 仮想VRAMシステム
/******************************************************************/
func str printChar$(c;char)
/* 表示文字取得
str c$
switch (c)
case ' ': c$= " ":break :/* 消す
case 'o': c$= "●":break :/* しずく
case '#': c$= "■":break :/* 外壁
case '=': c$= "□":break :/* 棚
endswitch
return (c$)
endfunc
func printxy(x;int,y;int,c;char)
/* 文字表示
/* 仮想VRAMに出力
tvram(x,y)=c
/* 座標変換
locate(x*2,y)
/* キャラクター変換して表示
print printChar$(c);
endfunc
func storexy(x;int,y;int,c;char)
/* 仮想VRAMに出力
tvram(x,y)=c
endfunc
func char scrn(x;int,y;int)
/* 仮想テキストVRAMを読み出す
return(tvram(x,y))
endfunc
func printScreenAll(stY;int,edY;int)
/* 全画面一気表示
/* X-BASIC for iOSはテキスト画面表示が遅いので対策(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()
/* 仮想テキストVRAM初期化
int x,y
for y=0 to WY-1
for x=0 to WX-1
tvram(x,y)=SPC
next
next
endfunc
/******************************************************************/
/* 汎用関数
/******************************************************************/
func srand2()
/* rand()乱数を初期化する
int tm
t=time()
tm=tm and &h0fff
tm=tm*16
srand(tm)
endfunc
func int rand2(seed;int)
/* 0~seed-1の乱数発生
return (rand() mod seed)
endfunc
/******************************************************************/
func int CalcWait()
/* ウエイト量算出
int tim,tm
int count
/* 0クロックチェック
tm=time()
repeat
tim=time()
until tim-tm<>0
count=0
repeat
tm=time()
count=count+1
until tm-tim<>0
return(count):/* 1秒に必要なカウント数
endfunc
/******************************************************************/
func TWait(wt;int)
int i,tm
for i=0 to wt-1
tm=time()
next
endfunc
/******************************************************************/
Zipファイル :XBetc.zip
0 件のコメント:
コメントを投稿