// UTF8版
/* SHIFT-JIS 全文字コード表示プログラム
// テキスト画面がスクロールできないのでページ切り替え
font("Migu 1M")
int fzenhan:// YES=
width(64,,fzenhan)
print "fzenhan=";fzenhan
cls()
if isLocalizeJapan() then {
setFunctionKey(0,"次へ",&h0d)
setFunctionKey(1,"中断",&h1b)
print "半角文字"
} else {
setFunctionKey(0,"Next",&h0d)
setFunctionKey(1,"Break",&h1b)
print "Half-Width Character"
}
print_code0(fzenhan)
//
displayFunctionKey(YES,0,1)
//
while YES
if print_code(&h8100,&h9fff) then break
if print_code(&he000,&hefff) then break
print_head()
break
endwhile
//
// ファンクションキー表示は個数を変えても自動的に前の表示は消えないので、
// ユーザーが消す必要がある(そうしないと表示が重なる)
displayFunctionKey(NO,0,1)
if isLocalizeJapan() then {
setFunctionKey(0,"終了",&h0d)
} else {
setFunctionKey(0,"End",&h0d)
}
displayFunctionKey(YES,0,0)
int ky
repeat
ky=inkey()
until ky<>0
end
//--------------------------------
func print_head()
if fzenhan then {
print "-code-:-+0-+1-+2-+3-+4-+5-+6-+7-+8-+9-+A-+B-+C-+D-+E-+F-"
} else {
print "-code-:-0-1-2-3-4-5-6-7-8-9-A-B-C-D-E-F-"
}
endfunc
func print_skip()
print " : "
endfunc
func str hex4$(h;int)
return (right$("0000"+hex$(h),4))
endfunc
func str hex2$(h;int)
return (right$("00"+hex$(h),2))
endfunc
func printChr(h;int,l;int)
print chr$((h shl 16)or l);
endfunc
func int print_code(st;int,ed;int)
/* 全角文字表示
int i,li,hi
int j
for i=st to ed
hi=i / 256
li=i mod 256
if li=0 then {
print_head()
int ky
int ts=time()
int dt=0,t
repeat
ky=inkey()
t=time()
if t-ts>dt then { :/* 秒が変った
dt=dt+1
locate(40,0):print dt
beep2(0)
}
until ky<>0
if ky=&h1b then return (YES)
cls()
if isLocalizeJapan() then {
print "全角文字"
} else {
print "Double-Width character"
}
print_head()
}
if li<&h40 then continue:/* 下位8ビットが<$40の文字はない
/* アドレス表示
print " ";hex4$(i);" :";
for j=0 to 16-1
print " ";
int c=(i+j) and &hff
if c<&h40 or c=&h7f or c>=&hfd then { /* 未定義文字
if fzenhan then {
print "**";
} else {
print "*";
}
} else {
c=sjisToUtf8(i+j)
print chr$(c); /* 途中で桁上がりを起こさないことを前提にした処理
}
next
print
i=i+16-1:/* 次のnext +1されるから
next
return (NO)
endfunc
func print_code0(fzenhan;int)
/* 半角文字表示
int li
int j,c
print_head()
for li=&h20 to &he0-1
/* 途中表示しないエリア
if li=&h80 then print_skip()
if li>=&h80 and li<=&h9f then continue
/* アドレス表示
print " ";hex2$(li);" :";
/* 文字表示
for j=0 to 16-1
print " ";
c=li+j
if c=&h7f or c=&ha0 then c='*' else c=sjisToUtf8(c)
print chr$(c);
if fzenhan then print " ";:/* 全角=半角*2のフォントの時は後ろにスペースを入れる
next
print
li=li+16-1:/* 次のnext +1されるから
next
endfunc
//--------------------------------------------------------------------------------
/* BINGO
// for X-BASIC for iOS v2.0
//--------------------------------------------------------------------------------
if deviceType()<>DEVICE_IPAD and deviceType()<>DEVICE_IPAD_SIMULATOR then {
print localizedString("このプログラムはiPad専用です","This program only for iPad.")
end
}
dim int A(5,11),B(12,2)
dim int keyAreaNo(5,5)
int d,L,T,E,F
int WX,WY
int sx,sy,ex,ey
int OPEND=100:// 定数
/*
srand2()
width(64)
getWidth(WX,WY)
setUpScroll(NO):// テキスト画面の上スクロールを止める (V2.0)
apage(GPAGE0)
vpage(B_TPAGE or B_GPAGE0 or B_GPAGE1,YES)
//display_title()
d=0
dim str menues(1)
str title
int e
repeat
cls()
apage(GPAGE1):wipe()
apage(GPAGE0):wipe()
gcolor(-TWHITE,0,0,255)
symbol(128,2,"BINGO GAME","IPAGothic",48)
gcolor(-THWHITE,0,0,255)
symbol(129,3,"BINGO GAME","IPAGothic",48)
gcolor(-THRED,0,0,255)
box(13,64,748,614)
tcolor(-THWHITE,0,0,255)
shuffle():// 数字の設定
field_print():// 数字表示&タッチエリア設定
print_number(NO)
/*
if isLocalizeJapan() then {
menues={"先手","後手"}
title="順番選択"
} else {
menues={"First move","Passive move"}
title="Moving order"
}
repeat
L=selectMenu2(title,menues):// -1,0,1
until L>=0:// -1=BREAK/outside menu touch
L=L+1:// 0,1->1,2
sub_cls()
/*
for e=0 to 12
B(e,0)=0
B(e,1)=0
B(e,2)=0
next
E=0:F=0:T=0
repeat
T=T+1
tcolor(-THWHITE,0,0,255)
locate(6,17)
if isLocalizeJapan() then {
print"第";T;"手"
} else {
print"The";T;" hand"
}
repeat
switch L
case 1:
locate(11,19)
print localizedString("あなた:","You : ");
d=input_num()
L=2
break
case 2:
locate(38,19)
print localizedString("コンピューター:","Computer : ");
d=com_num()
//beep()
L=1
break
endswitch
int cx=pos()
int cy=csrlin()
int ffind=check_num(d)
if not ffind then {
// 見つからなかった
// 人間側のみありえる
L=1
beep()
// 選択しなおし
}
until ffind
locate(cx,cy):print d
until (F>=5) or (E>=5)
resetALlKeys():// タッチエリアの解除
sub_cls()
print_number(YES)
hantei(E,F)
locate(11,24)
if isLocalizeJapan() then {
print "御苦労さまでした"
menues={"はい","いいえ"}
title="もう一度しますか?"
} else {
print "Cheers for hard work was."
menues={"YES","NO"}
title="Try again ?"
}
L=selectMenu2(title,menues):// -1=stop,0=YES,1=NO
until L=1 or L=-1
end
//--------------------------------------------------------------------------------
// functions
//--------------------------------------------------------------------------------
func hantei(E;int,F;int)
/* 勝ち負け判定
tcolor(-THYELLOW,0,0,255)
locate(10,23)
if isLocalizeJapan() then {
print E;" 対";F;"で ";
}
if F<E then {
print localizedString("あなたの勝ち","You win");
} else {
if E<F then {
print localizedString("コンピューターの勝ち","Computer win");
} else {
print localizedString("引き分け","Draw");
}
}
if not isLocalizeJapan() then {
print " in the";E;"-for-";F
}
endfunc
/*
func int input_num()
/* 人間の数字選択
int num
// kbclr()
// キー入力待ち
while not kbhit()
endwhile
// エリアをタッチすると、数字がキーコードとして返ってくる
num=inkey()
return(num)
endfunc
/*
func int check_num(d;int)
/* 番号チェック&マスオープン
int h,x,y,ac,bb,i,j
for h=1 to 2:// 両方を調べる
// 数字からマス座標を得る
int ffind=NO
for i=1 to 5
for j=1 to 5
ac=A(i,j+(h-1)*6)
if ac=d then {
x=i:y=j
ffind=YES
break
}
next
if ffind then break
next
if not ffind then {
// 見つからない
locate(0,5):print "見つからない"
return (NO)
}
//
apage(GPAGE1)
switch h
case 1:gcolor(-THMAGENTA,0,0,200):break
case 2:gcolor(-THGREEN ,0,0,200):break
endswitch
calc_grid_gxy(x,y,h-1):// ->sx,sy,ex,ey
fill(sx,sy,ex,ey)
apage(GPAGE0)
//
A(x,y+(h-1)*6)=ac+OPEND:/* 開いたの印
bb=0
if x=y then bb=B(12,h):B(12,h)=bb+1
if x=6-y then bb=B(11,h):B(11,h)=bb+1
bb=B(x,h) :B(x ,h)=bb+1
bb=B(y+5,h):B(y+5,h)=bb+1
x=0
for i=1 to 12
x=x+B(i,h)\5
next
if (h=1) and (E<x) then {
locate(11,15)
if isLocalizeJapan() then {
print "あなた:";x;"列"
} else {
print "You :";x;" lines"
}
E=x
beep2(7)
} else {
if (h=2)*(F<x) then {
locate(38,15)
if isLocalizeJapan() then {
print "コンピューター:";x;"列"
} else {
print "Computer :";x;" lines"
}
F=x
beep2(8)
}
}
next
// 見つかって処理した
return (YES)
endfunc
/*
func int com_num()
/* コンピューターの番号考え
int i,j,m,bb,c
m=0
for i=1 to 5
for j=1 to 5
bb=0
if A(i,j+6)<OPEND then {
if i=j then bb= 1+B(12,2)
if i=6-j then bb=bb+1+B(11,2)
bb=bb+2+B(i,2)+B(j+5,2)
if bb>m then c=A(i,j+6):m=bb
}
next
next
// locate(0,26):print "com=";c
return(c)
endfunc
/*
func sub_cls()
/* 画面一部クリア
int y
for y=16 to WY
locate(0,y):print space$(WX);
next
endfunc
/*
func shuffle()
/* マス内数字シャッフル
int i,j,l,h
int c,x,y
for l=0 to 1:/* l=0:あなた , 1=コンピューター
/* まずはマス内に順番に数字を入れる
/* A(i,j) : j=1〜5:あなた , 6〜11:コンピューター
h=0
for i=1 to 5
for j=1 to 5
h=h+1
A(i,j+l*6)=h
next
next
/* マスを入れ替える
for i=1 to 5
for j=1 to 5
x=rand() mod 5+1
y=rand() mod 5+1+l*6
c=A(i,j+l*6)
A(i,j+l*6)=A(x,y)
A(x,y)=c
next
next
next
endfunc
/*
func print_number(mode;int)
/* マス内番号表示
// mode : NO=人側のみ開く , YES=コンピューター側を開く
int i,j,c
int x,y
tcolor(-THWHITE,0,0,255)
for i=1 to 5
x=(i-1)*5
for j=1 to 5
y=j*2+2
if not mode then {
// 人側(Human)のみ開く
c=A(i,j)
if c>OPEND then c=c-OPEND:/* すでに開いているマスの時
locate(x+ 7,y):print using "##";c
locate(x+36,y):print "??"
} else {
// コンピューター側(Computer)を開く
c=A(i,j+6)
if c>OPEND then c=c-OPEND:/* すでに開いているマスの時
locate(x+36,y):print using "##";c
}
next
next
endfunc
/*
func field_print()
/* フィールド描画
// 先にshuffle()で数字を確定しておくこと
int l,i,j
for l=0 to 1:/* l=0:あなた , 1=コンピューター
if l=0 then {
tcolor(-THCYAN,0,0,255)
locate(11,14)
print localizedString("あなたのマス目","Your grid")
} else {
tcolor(-THYELLOW,0,0,255)
locate(36,14)
print localizedString("コンピューターのマス目"," Computer grid ")
}
// ます線描画
gcolor(-THMAGENTA,0,0,255)
for i=1 to 5
for j=1 to 5
calc_grid_gxy(i,j,l):// ->sx,sy,ex,ey
box(sx,sy,ex,ey)
if l=0 then {
// タッチエリアの設定
// 人間側のみ
// キーコードに数字を入れておく
keyAreaNo(i,j)=setTouchArea(sx,sy,(ex-sx),(ey-sy),A(i,j),YES)
// save touch area No into keyAreaNo()
}
next
next
next
tcolor(-THWHITE,0,0,255)
endfunc
/*
func resetALlKeys()
// 全タッチアリアの解除(重要)
int i,j
for i=1 to 5
for j=1 to 5
removeTouchArea(keyAreaNo(i,j))
next
next
endfunc
/*
func calc_grid_gxy(i;int,j;int,l;int)
// マス目座標からグラフィック表示座標を得る
int x,y
x=textX2Gx((i-1)*5+7)+l*340
y=textY2Gy(j*2+2)
// 以下リターン値(グローバル変数)
ex=textX2Gx((i-1+1)*5+7)+l*340-12
ey=textY2Gy((j+1)*2+2)-12
sx=x-12
sy=y-12
endfunc
/*
func display_title()
/* タイトル描画
int i,x
str s,s1
wipe()
lineWidth(2)
gcolor(-THRED,0,0,255)
box(61,4,448,128)
gcolor(-THMAGENTA,0,0,200)
fill(63,6,446,126)
s="BINGO"
for i=0 to 4
x=i*70+90
s1=utf8Mid$(s,i+1,1)
gcolor(-TWHITE,0,0,255)
symbol(x-11,16,s1,"Times New Roman",64)
gcolor(-THWHITE,0,0,255)
symbol(x-9 ,18,s1,"Times New Roman",64)
next
/*
gcolor(-TGREEN,0,0,255) :fill(112,180,400,320)
//
str copyright="Presented by AIG-SOFT"
str forMachine="for X-BASIC or iOS"
gcolor(-TWHITE,0,0,255)
symbol(170,201,copyright,"IPAGothic",16)
symbol(180,231,forMachine,"IPAGothic",16)
gcolor(-THWHITE,0,0,255)
symbol(169,200,copyright,"IPAGothic",16)
symbol(179,230,forMachine,"IPAGothic",16)
//
gcolor(-THRED,0,0,255)
box(109,178,403,324)
hitKey()
endfunc
/*
func srand2()
/* 乱数初期化
int t
t=val(right$(time$,2))+val(mid$(time$,4,2))
srand(t*16)
endfunc
/*
func hitKey()
setFunctionKey(0,localizedString("ここを押してください","Hit This Button"),'!')
displayFunctionKey(YES,0,0)
while inkey()=0
endwhile
cls()
displayFunctionKey(NO,0,0)
endfunc
func str localizedString(js;str,es;str)
if isLocalizeJapan() then return(js)
return (es)
endfunc
//--------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
// compass test
//----------------------------------------------------------------------------------------------
print "version Motion=";versionXBiOSMotion$()
font("Cochin",6):// ファンクションキーのフォントを設定
setFunctionKey(0,"end" ,'!')
setFunctionKey(1,"pause" ,'p')
setFunctionKey(2,"start" ,'s')
setFunctionKey(3,"clear" ,'c')
displayFunctionKey(YES,0,3)
kBackgroundAlpha(0.9)
font("IPAGothic")
if compassStart(10) then {
print localizedString("方位取得は使えません","Can't use compass.")
end
}
float degree,magnetic
int ky,cnt,i
while YES
if not kbhit() then {
i=0
cnt=compassCount()
if cnt>0 then locate(0,1):print "cnt=";cnt
while cnt>0
degree=compassGetData(magnetic)
locate(0,2+i)
if isLocalizeJapan() then {
print using "極北からの角度=###.####,磁北からの角度=###.####";degree,magnetic
} else {
print using "true=###.####,magnetic=###.####";degree,magnetic
}
cnt=cnt-1
i=i+1
if kbhit() then break
endwhile
} else {
ky=inkey()
switch ky
case 'p'
compassPause(YES)
print "Pause"
break
case 's'
compassPause(NO)
print "Start"
break
case 'c'
cls()
compassClear()
break
default:
// 念のため
beep()
break
endswitch
if ky='!' then break
}
endwhile
compassEnd()
end
//----------------------------------------------------------------------------------------------
func str localizedString(js;str,es;str)
if isLocalizeJapan() then return(js)
return (es)
endfunc
//----------------------------------------------------------------------------------------------
// audio test
// ↓手持ちの音声ファイルを指定してください
// サンプルは満開製作所「Muff&Huff」より
int sno=a_setPlayData("EARTH SONG #1.mp3")
if (sno=-2) then {
print "sound file not found."
end
}
int wx
//
dim int touchNo(10) :// タッチエリア番号
int touchCnt :// タッチエリア数
font("IPAGothic")
int fzenhan
int WX=64:if deviceType()<>1 then WX=48
int WY=width(WX,,fzenhan)
int xw=1:/* 全角1文字の桁数
if fzenhan then xw=2
str exit$
if isLocalizeJapan() then {
exit$="中断"
} else {
exit$="exit"
}
int x=WX/2-18
int y=WY/2
// 012345678901234567890123456789
locate(x,y+0):print " ┏━┓"
locate(x,y+1):print " ┃8┃"
locate(x,y+2):print " ┗━┛"
locate(x,y+3):print "┏━┓┏━┓┏━┓ ┏━━┓"
locate(x,y+4):print "┃4┃┃?┃┃6┃ ┃";exit$;"┃"
locate(x,y+5):print "┗━┛┗━┛┗━┛ ┗━━┛"
locate(x,y+6):print " ┏━┓"
locate(x,y+7):print " ┃2┃"
locate(x,y+8):print " ┗━┛"
int i=0
touchNo(inc(i))=setTouchArea(textX2Gx(x+ 6),textY2Gy(y ),textX2Gx(xw*3),textY2Gy(3),'8',YES, 0,50,55,220)
touchNo(inc(i))=setTouchArea(textX2Gx(x+ 6),textY2Gy(y+6),textX2Gx(xw*3),textY2Gy(3),'2',YES, 0,50,55,220)
touchNo(inc(i))=setTouchArea(textX2Gx(x ),textY2Gy(y+3),textX2Gx(xw*3),textY2Gy(3),'4',YES, 0,50,55,220)
touchNo(inc(i))=setTouchArea(textX2Gx(x+12),textY2Gy(y+3),textX2Gx(xw*3),textY2Gy(3),'6',YES, 0,50,55,220)
//
touchNo(inc(i))=setTouchArea(textX2Gx(x+ 6),textY2Gy(y+3),textX2Gx(xw*3),textY2Gy(3),'?',YES,150,50, 5,120)
touchNo(inc(i))=setTouchArea(textX2Gx(x+22),textY2Gy(y+3),textX2Gx(xw*4),textY2Gy(3),'!',YES,150, 5 ,5,120)
touchCnt=i
//
keyRepeatTime(0,0):// リピート無し
//
setFunctionKey(0,exit$,'!')
setFunctionKey(1,"V-UP",'u')
setFunctionKey(2,"V-DN",'d')
setFunctionKey(3,"SPD",'S')
setFunctionKey(4,"LP=1",'1')
setFunctionKey(5,"LP∞" ,'0')
setFunctionKey(6,"LP=2",'2')
setFunctionKey(7,"PAN",'c')
setFunctionKey(8,"stop",'s')
setFunctionKey(9,"cont",'C')
setFunctionKeyBackgroundImage("funcBack.png")
displayFunctionKeyAll(YES)
int speed=0
int pan=0
str cs
int dt=0,t
int ts=time():/* 開始時間
locate(20,1)
a_play(sno)
while YES
// while a_stat(sno)
// キー入力待ちしながら時計を回す
while (not kbhit())
/* キー入力の無い間
t=time()
if t-ts>dt then { :/* 秒が変った
dt=dt+1
locate(20,0):print dt;
beep2(0)
locate(20,1)
}
endwhile
// キー操作判定
cs=inkey$()
switch cs
case "u":a_volume(sno,1.0):break
case "d":a_volume(sno,0.05):break
case "S":
switch speed
case 0:a_speed(sno,2.0):break
case 1:a_speed(sno,0.5):break
case 2:a_speed(sno,1.0):break
endswitch
speed=speed+1
break
case "1":
a_loop(sno,1):print "loop=1"
break
case "2":
a_loop(sno,2):print "loop=2"
break
case "0":
a_loop(sno,0):print "loop=∞"
break
case "c":
switch pan
case 0:a_pan(sno,-1.0):inc(pan):break
case 1:a_pan(sno, 0.0):inc(pan):break
case 2:a_pan(sno, 1.0):pan=0:break
endswitch
break
case "r"
break
case "s":a_stop(sno):break
case "C":a_cont(sno):break
endswitch
print cs;
if cs="!" then break
endwhile
a_end(sno)
print "end"
end
func resetTouchArea()
// タッチエリアの解除
int i
for i=0 to touchCnt
removeTouchArea(touchNo(i))
next
touchCnt=0
endfunc
// Sound player
// for X-BASIC for iOS v1.7 later
width(64)
//
vpriority(TPAGE,GPAGE0,GPAGE1,GPAGE2,GPAGE3)
vpage(B_TPAGE or B_GPAGE0 or B_GPAGE1 or B_GPAGE2 or B_GPAGE3,YES)
apage(GPAGE0)
//
// 全ファイルリストを得る
dim str fileList(256):// ()内は扱える最大ファイル数
int allcnt
int i,ret
str ext
//
// 拡張子(大文字小文字を区別するので注意)
// 正規表現
ext="PCM|pcm|wav|WAV|aiff|AIFF|M44|P16|M30":
allcnt=files(fileList,"",ext,YES,FILES_FILE,YES)
if allcnt<=0 then {
locate(0,0)
print localizedString("音声ファイルがありません":"Sound file not found.")
} else {
int no
for i=0 to allcnt-1
locate(0,0):print fileList(i)
str pext=pathExtension(fileList(i))
strupr(pext)
if pext="PCM" then {
print "(ADPCM)"
no=a_setPlayData(fileList(i),0)
} else {
no=a_setPlayData(fileList(i))
}
a_play(no)
hitKey()
a_end(no)
next
}
end
//---------
func hitKey()
setFunctionKey(0,localizedString("ここを押してください","Hit This Button"),'!')
displayFunctionKey(YES,0,0)
while inkey()=0
endwhile
cls()
displayFunctionKey(NO,0,0)
endfunc
//---------
func str localizedString(js;str,es;str)
if isLocalizeJapan() then return(js)
return (es)
endfunc
//---------
/******************************************************************/
/* しずくデモ
/******************************************************************/
/* 内蔵フォントを使うので、全角文字も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
/******************************************************************/
// 画像ファイルの表示
width(64)
//
vpriority(TPAGE,GPAGE0,GPAGE1,GPAGE2,GPAGE3)
vpage(B_TPAGE or B_GPAGE0 or B_GPAGE1 or B_GPAGE2 or B_GPAGE3,YES)
apage(GPAGE0)
//
// 全ファイルリストを得る
dim str fileList(256):// ()内は扱える最大ファイル数
int allcnt
int i,ret
str ext
//
// 拡張子(大文字小文字を区別するので注意)
// 正規表現
ext="PIC|pic|PNG|png|JPG|jpg|CUT|cut":
allcnt=files(fileList,"",ext,YES,FILES_FILE,YES)
if allcnt<=0 then {
locate(0,0)
print localizedString("画像ファイルがありません":"Graphic file not found.")
} else {
for i=0 to allcnt-1
locate(0,0):print fileList(i)
wipe()
str pext=pathExtension(fileList(i))
strupr(pext)
switch pext
case "PIC"
ret=picLoader(128,128,fileList(i))
if ret<>0 then {
locate(0,1):print "Error=";ret
}
break
case "CUT"
ret=cutLoader(128,128,fileList(i))
if ret<>0 then {
locate(0,1):print "Error=";ret
}
break
default:
ret=imgLoad(128,128,0,0,fileList(i))
break
endswitch
hitKey()
next
}
end
//---------
func hitKey()
setFunctionKey(0,localizedString("ここを押してください","Hit This Button"),'!')
displayFunctionKey(YES,0,0)
while inkey()=0
endwhile
cls()
displayFunctionKey(NO,0,0)
endfunc
//---------
func str localizedString(js;str,es;str)
if isLocalizeJapan() then return(js)
return (es)
endfunc
//---------
//------------------------------------------------
/* ファイルの一覧表示と削除を行うプログラム
/* サンプルのようでいて、実は実用プログラムである
/* File list display and delete program
/* This is sample program and this is practical program actually.
//------------------------------------------------
// for X-BASIC for iOS v2.1
// 初期化 / initialize
font("IPAGothic")
int fzenhan
int WX=64:if deviceType()<>1 then WX=48
int WY=width(WX,,fzenhan)
int xw=1:/* 全角1文字の桁数 / zenkaku 1 character columus
if fzenhan then xw=2
// タッチキー位置 / touch key area
int tx=WX-20:// <WX/2にすること
int ty=3
//
// 画面作成 / screen make
int lns=20:// 表示行数 / display lines
if lns>=WY-2 then lns=WY-2
makeScreen()
//
// 全ファイルリストを得る / get all file list
dim str fileList(256):// ()内は扱える最大ファイル数
int allcnt
str ext="":// 全ファイルを示す拡張子 / extension for all files
//
// 初期ファイル検索 / initial file search
int top:// 表示している先頭行要素番号:fileList(top)
// 表示範囲は(top)〜(top+lns-1)
int cur:// カーソル位置:0〜lns-1
searchFiles(ext)
tcolor(-THWHITE,0,0,255)
int page=0
int fafterMessage=NO
//
repeat
int top0=top,cur0=cur
int fdel=NO
str ext0=ext
//
int ky=inkey()
switch ky
// カーソル移動 / cursor move
case '8'
// カーソル上 / cursor up
if fafterMessage then messageDisp("")
if cur=0 then {
if top>0 then top=top-1
} else {
cur=cur-1
}
break
case '2'
// カーソル下 / cursor down
if fafterMessage then messageDisp("")
if cur=lns-1 then {
if top+lns<allcnt then top=top+1
} else {
if top+cur<allcnt-1 then cur=cur+1
}
break
// ページ単位移動 / page move
case '4'
// 前ページ / prev. page
if fafterMessage then messageDisp("")
if allcnt>lns then {
// ページ切り替えが可能なとき / When paging is enabled
top=top-(lns-1):// 1行残す / left 1 line
if top<0 then top=0 else page=page-1
}
break
case '6'
// 次ページ / next page
if fafterMessage then messageDisp("")
if allcnt>lns then {
// ページ切り替えが可能なとき / When paging is enabled
top=top+(lns-1):// 1行残す / left 1 line
if top+lns>allcnt then {
top=allcnt-lns
} else {
page=page+1
}
}
break
// 削除 / delete
case 'd'
if fafterMessage then messageDisp("")
allcnt=allcnt-1
str fname=fileList(top+cur)
int ret
str title$,errmes$
dim str mn$(1)
if isLocalizeJapan() then {
mn$(0)="いいえ"
mn$(1)="はい"
} else {
mn$(0)="NO"
mn$(1)="YES"
}
if fname[strlen(fname)-1]='/' then {
// ディレクトリだったとき
if isLocalizeJapan() then {
title$="このディレクトリを削除しますか?"
errmes$="削除できません(空でない)"
} else {
title$="Delete this directory ?"
errmes$="Can't delete(Not empty)"
}
if selectMenu(title$,mn$)=1 then {
// ただし、空ディレクトリでないと削除できない
if rmdir(fname)=0 then {
fdel=YES:// 表示も変更が必要
} else {
messageDisp(errmes$+":"+fname)
}
}
} else {
// ファイルだった時
if isLocalizeJapan() then {
title$="このファイルを削除しますか?"+chr$(DISP_CTRL_LF)+fname
errmes$="削除できません"
} else {
title$="Delete this file ?"
errmes$="Can't delete"
}
if pathExtension(fname)="bas" then {
// .basファイルは消せないようにしておく(プログラムを削除するのはプログラム選択メニューから)
// Disable to delete .bas file (if you will do, do in program select menu)
messageDisp(errmes$+"(.bas):"+fname)
break
}
if selectMenu(title$,mn$)=1 then {
if fdelete(fname)=0 then {
fdel=YES:// 表示も変更が必要
} else {
messageDisp(errmes$+":"+fname)
}
}
}
break
// 拡張子変更 / change extension
case 'j'
if fafterMessage then messageDisp("")
ext="jpg"
break
case 'p'
if fafterMessage then messageDisp("")
ext="png"
break
case 'a'
if fafterMessage then messageDisp("")
ext=""
break
default
break
endswitch
if ext<>ext0 or fdel=YES then {
// 拡張子変更 / extension changed
// またはファイルの数が変わった / Or the number of files is changed
// ファイルの再検索をするが、このページの先頭は変更しなくても良い
int top1=top
int cur1=cur
searchFiles(ext)
if top1+cur1>=allcnt then {
if cur1>0 then cur=cur1-1:// 一番後ろを消したときは、1つ上に上げる。でもそれが最上行を消すものなら、前ページに移動する・・・のは大変なので、最初から表示しなおし
} else {
// 新しいページにまだ収まるとき
top=top1
cur=cur1
}
// ページは変わらないけど、再表示は必要
printList()
}
if top<>top0 then {
// ページが変わる / page changed
printList()
fdel=NO
} else {
if cur<>cur0 then {
// カーソル位置が変わった / cursor moved
printList1(cur0) // 元の位置を反転解除 / non-reverse old position
printList1(cur) // 新しい位置を反転 / revese new position
}
}
until ky='!'
end
//------------------------------------------------
// 関数 / functions
//------------------------------------------------
func printKeys(x;int,y;int)
// 012345678901 *2
locate(x,y+0):print "┏━┓┏━┓┏━┓┏━┓"
locate(x,y+1):print "┃←┃┃↑┃┃↓┃┃→┃"
locate(x,y+2):print "┗━┛┗━┛┗━┛┗━┛"
endfunc
func makeScreen()
// タッチキー / touch key
dim int touchNo(10) :// タッチエリア番号 / touch area number
int touchallcnt :// タッチエリア数 / the number of touch area
//
int x=0
int y=1+lns+1
printKeys(x,y)
int i=0
touchNo(inc(i))=setTouchArea(textX2Gx(x+ 0),textY2Gy(y),textX2Gx(xw*3),textY2Gy(3),'4',YES, 125,0,5,100)
touchNo(inc(i))=setTouchArea(textX2Gx(x+ 6),textY2Gy(y),textX2Gx(xw*3),textY2Gy(3),'8',YES, 125,0,5,100)
touchNo(inc(i))=setTouchArea(textX2Gx(x+12),textY2Gy(y),textX2Gx(xw*3),textY2Gy(3),'2',YES, 125,0,5,100)
touchNo(inc(i))=setTouchArea(textX2Gx(x+18),textY2Gy(y),textX2Gx(xw*3),textY2Gy(3),'6',YES, 125,0,5,100)
touchallcnt=i
// ファンクションキー / fucntion key
str exit$,ext$,prev$,next$,del$
if isLocalizeJapan() then {
exit$="終了"
ext$="全て"
prev$="前頁"
next$="後頁"
del$="削除"
} else {
exit$="exit"
ext$="all"
prev$="Prev"
next$="Next"
del$="Del"
}
setFunctionKey(0,prev$,'4')
setFunctionKey(1,next$,'6')
setFunctionKey(2," ",'?')
setFunctionKey(3,del$ ,'d')
setFunctionKey(4," ",'?')
setFunctionKey(5,"jpg",'j')
setFunctionKey(6,"png",'p')
setFunctionKey(7,ext$ ,'a')
setFunctionKey(8," ",'?')
setFunctionKey(9,exit$,'!')
setFunctionKeyBackgroundImage("funcBack.png")
displayFunctionKeyAll(YES,YES):// v2.0
endfunc
func messageDisp(mes;str)
locate(0,lns+1)
if len(mes)=0 then {
print chr$(DISP_CTRL_CLEARLINE)
fafterMessage=NO:// メッセージ表示してない / Message is not displaying
} else {
print mes
fafterMessage=YES:// メッセージ表示中 / Now message is displaying
}
endfunc
//------------------------------------------------
func printList1(i;int)
// 1行表示 / 1line display
locate(0,1+i)
if i=cur then tatrb(ATRB_REVERSE):// 選択行 / selected line
if top+i<allcnt then {
print using "###:";top+i;
print fileList(top+i);
// print lastPathComponent(fileList(top+i));
if i=cur then tatrb(ATRB_NORMAL)
}
print chr$(DISP_CTRL_CLEARLINE):// 行末まで消す / clear to end of line
endfunc
func printList()
// 画面内表示 / display in screen
int i
int max=lns
for i=0 to max-1
printList1(i)
next
locate(WX-10,0):print "page=";page
endfunc
func searchFiles(ext;str)
// 新しく表示し直すので各種ポインターをリセット
top=0 :// 表示している先頭行要素番号:fileList(top)
// 表示範囲は(top)〜(top+lns-1)
cur=0 :// カーソル位置:0〜lns-1
//
allcnt=files(fileList,"",ext,YES,FILES_ALL)
cls()
printKeys(0,1+lns+1)
//
locate(0,0)
if isLocalizeJapan() then {
print "拡張子=";ext,,
print "ファイル数=";allcnt
} else {
print "extension=";ext,,
print allcnt;" files"
}
printList()
endfunc
//------------------------------------------------
/* ハノイの塔 for X68
// Oh!X 1988/5 p54
int n
str a="A",b="B",c="C"
while 1
input "n(0=end)=" , n
if n=0 then break
hanoi( n , a ,c , b)
print
endwhile
end
func hanoi(n;int,a;str,c;str,b;str)
if n>0 then {
hanoi(n-1,a,b,c)
print a; "->" ; c; ",";
hanoi(n-1,b,c,a)
}
endfunc
int fscroll=YES:// YES=scroll(V2.00以降専用) / NO=page
if isLocalizeJapan() then {
print "エラトステネスのふるい(〜10000)"
} else {
print "Sieve of Eratosthenes(to 10000)"
}
print "start:";time$
//
int i,p
int max=10000
dim nt(10000):/* 確保時の初期値は0=NO
for i=2 to max/2
nt(i*2)=YES
next
p=3
while p*p<=max
for i=p to max/p
nt(i*p)=YES
i=i+1:/* step2
next
p=p+1
while nt(p):p=p+1:endwhile
endwhile
int cnt=0
for i=2 to max
if nt(i)=0 then {
print i,
if not fscroll then {
inc(cnt)
if cnt>=30*8 then {
// スクロールできないので一定数ごとに画面クリアして継続
hitKey()
cls()
cnt=0
}
}
}
next
print
print "end:";time$
end
//---------
func hitKey()
setFunctionKey(0,localizedString("ここを押してください","Hit This Button"),'!')
displayFunctionKey(YES,0,0)
while inkey()=0
endwhile
cls()
displayFunctionKey(NO,0,0)
endfunc
//---------
func str localizedString(js;str,es;str)
if isLocalizeJapan() then return(js)
return (es)
endfunc
//---------
// 自己平方根フラクタル図形描画
// pset()利用型
int wx,wy
width(0)
getWidth(wx,wy):/* グラフィック幅を得る
width(64)
// same as X68000 size
if wx>=512 then wx=512
if wy>=512 then wy=512
//
locate(0,0):print "wx*wy=";wx;"*";wy
locate(0,1):print "start=";time$
vpriority(TPAGE,GPAGE0,GPAGE1,GPAGE2,GPAGE3)
vpage(B_TPAGE or B_GPAGE0 or B_GPAGE1 or B_GPAGE2 or B_GPAGE3,YES)
apage(GPAGE0)
int MAXREP=50
int MAXDOT=wx
int MAXCOL=255
float remin=-0.5#
float remax= 0.5#
float immin=-0.5#
float immax= 0.5#
float recon=-0.04#
float imcon=-0.695#
int rep,ix,iy
float x,y,re,im,dx,dy
//
dx=(remax-remin)/MAXDOT
dy=(immax-immin)/MAXDOT
/*
for iy=0 to MAXDOT-1
locate(0,2):print "line=";iy
for ix=0 to MAXDOT-1
x=remin+ix*dx
y=immin+iy*dy
for rep=0 to MAXREP
re=x*x-y*y+recon
im=2#*x*y+imcon
if ((re*re+im*im)>4#) then break
x=re:y=im
next
int c=(rep mod MAXCOL)*4
gcolor(c,c,c,255)
pset(ix,iy)
next
next
locate(0,2):print "end=";time$
//
end