|
|
|
2013/8/3(Sat) 07:56:44|NO.56093
こんにちは。そうでないかたは始めまして。
ビンゴゲームおかげさまで形になりました。
しかしビンゴゲームを出して数日後、
「玉を引いた数に対して、シートの数字を消せないのか」という要望があり修理することになりました。
しかし、実装しようとするものの、うまくその動作を実現させる方法を思いつませんでした。
【やりたいこと】
・「玉を引く」ボタンを押して表示された数値に対して、ビンゴシートの数値も消したい
・消すと後でわからなくなるので、できれば数字の上に「--」とかでかぶせたい。
・サンプルソースはビンゴシート1枚だが、本ソースは9枚あるのでそれら全てに対応できるようにする。
(必要であれば本ソースはレスに書きます)
ってなわけでソース。
----------------------------------------------------
objsize 100,20 ;ボタンの大きさ
button goto "シートを作成する",*ビンゴシート
pos 300,20 ;ボタンの位置
objsize 100,20 ;ボタンの大きさ
button goto "玉を引く",*玉を引く
;***************玉を引く準備************
dim tama, 45
randomize ;乱数発生の初期化
tama(0) = 0,1,2,3,4,5, 6,7,8,9,10,11, 12,13,14,15,16,17, 18,19
tama(20) = 20,21,22,23,24,25, 26,27,28,29,30,31, 32,33,34,35,36,37, 38,39
;シャッフル
repeat 200 ;200回繰り返す
r1 = rnd(40) ;変数「r1」に、39までの乱数を代入
r2 = rnd(40) ;変数「r2」に、39までの乱数を代入
wk = tama(r1) ;変数「wk」に、「tama」配列の「r1」番目を代入
tama(r1) = tama(r2) ;tama配列の「r1」番目に、tama配列の「r2」番目を代入
tama(r2) = wk ;tama配列の「r2」番目に、変数の「wk」を代入
loop
stop
;***************玉を引く****************
*玉を引く
TASU = TASU+1 ;玉を引くを押すたびに+1される
repeat TASU
color 185,185,185 : boxf 550,50,630,10 ;玉の数は・・・を灰色で塗り潰す
color 0,0,0 ;黒色
pos 430,20 : mes "玉の数字は・・・" + tama(cnt) ;玉の数を表示
pos 540,140+(20*cnt) : mes tama(cnt) ;出た数を表示
loop
stop
;***************ビンゴシート************
*ビンゴシート
SIT_x = 45 : SIT_y = 60 ;1枚目のシート
if TI_HE >= 1 : SIT_x = -100 : SIT_y = -100; (勢いあまって押した用)
TI_HE + 1 ;条件式の為の数値
;シートに入る数字
dim card, 40 ;配列,40個確保
card(0) = 0,1,2,3,4,5, 6,7,8,9,10,11, 12,13,14,15,16,17, 18,19
card(20) = 20,21,22,23,24,25, 26,27,28,29,30,31, 32,33,34,35,36,37, 38,39
;シャッフル
randomize ;乱数発生の初期化
repeat 200
r1 = rnd(40) ;変数「r1」に、39までの乱数を代入
r2 = rnd(40) ;変数「r2」に、39までの乱数を代入
wk = card(r1) ;変数「wk」に、「card」配列の「r1」番目の数を代入
card(r1) = card(r2) ;card配列の「r1」番目に、card配列の「r2」番目を代入
card(r2) = wk ;card配列の「r2」番目に、変数の「wk」を代入
// if card(0) = r1 : pos 45, 60 : mes "--";これだと引く前に実行される
; こっちで改善する場合は、if文で、玉を引いた数値を比較?
loop
;結果表示
repeat 25
color ,,255 ;青色
;\ 余り , / 割り算
pos SIT_x+(cnt \ 5) * 24, SIT_y+cnt / 5 * 17 ;数字を表示する位置をずらす
mes card(cnt) ;数字を表示
pos 200,70 : mes "【何が入っているのか確認用】 "
pos 220,100 : mes "card(0) " + card(0)
pos 220,120 : mes "card(1) " + card(1)
pos 220,140 : mes "card(2) " + card(2)
pos 220,160 : mes "card(3) " + card(3)
pos 220,180 : mes "card(4) " + card(4)
;文字を潰す
color 255 ;赤色
// if card(0) = r1 : pos 45, 60 : mes "--" ;r1の情報が無いので通らない
; こっちで改善する場合は、r1の情報をなんとかして取得する(配列変数とか)
/*/
if card(0) = 0 : pos 300,100 : mes "--" ;card(0)の入っている数値が0の「場合のみ」実行するので、
if card(1) = 1 : pos 300,120 : mes "--" ;↑card(0)に対して1個しか条件が見れない。
if card(2) = 2 : pos 300,140 : mes "--"
if card(3) = 3 : pos 300,160 : mes "--"
if card(4) = 4 : pos 300,180 : mes "--"
/*/
; 全シートに配置されている数値を引っこ抜く
;例えば、玉を引いて「10」だとしたら、シートの10が表示されている物を全部消す
loop
------------------------------------------------------------------------
最初は54行にある。
// if card(0) = r1 : pos 45, 60 : mes "--";これだと引く前に実行される
; こっちで改善する場合は、if文で、玉を引いた数値を比較?
を考えたのだけど、どうやって数値を比較したらいいのか思いつかず断念。
次に75行目。
// if card(0) = r1 : pos 45, 60 : mes "--" ;r1の情報が無いので通らない
; こっちで改善する場合は、r1の情報をなんとかして取得する(配列変数とか)
これだと「r1」をとってこれない。
配列を作って、その中に「r1」の情報を入れとけばいけそうな気がしたけど、ループ回数が違うのでダメ。
やりたいことが多いので、乱数という要素をとっぱらってみた
---------------------------------------------------------------
pos 10,20 ;ボタンの位置
objsize 100,20 ;ボタンの大きさ
button goto "シートを作成する",*ビンゴシート
pos 300,20 ;ボタンの位置
objsize 100,20 ;ボタンの大きさ
button goto "玉を引く",*玉を引く
;***************玉を引く準備************
dim tama, 45
tama(0) = 0,1,2,3,4,5, 6,7,8,9,10,11, 12,13,14,15,16,17, 18,19
tama(20) = 20,21,22,23,24,25, 26,27,28,29,30,31, 32,33,34,35,36,37, 38,39
stop
;***************玉を引く****************
*玉を引く
TASU = TASU+1 ;玉を引くを押すたびに+1される
repeat TASU
color 185,185,185 : boxf 550,50,630,10 ;玉の数は・・・を灰色で塗り潰す
color 0,0,0 ;黒色
pos 430,20 : mes "玉の数字は・・・" + tama(cnt) ;玉の数を表示
pos 540,140+(20*cnt) : mes tama(cnt) ;出た数を表示
if TASU = cnt { ;↓のやつをまとめようとしてもうまくいかん・・・
if tama(cnt) = cnt : pos 45+(20*cnt),60 : mes "--"
}
/*/
if TASU = 1 {
if tama(0) = 0 : pos 45,60 : mes "--"
}
if TASU = 2 {
if tama(1) = 1 : pos 65,60 : mes "--"
}
if TASU = 3 {
if tama(2) = 2 : pos 85,60 : mes "--"
}
if TASU = 4 {
if tama(3) = 3 : pos 105,60 : mes "--"
}
/*/
; 全シートに配置されている数値を引っこ抜く
;例えば、玉を引いて「10」だとしたら、シートの10が表示されている物を全部消す
/*/ ;単純に考えると多分これ
if tama(cnt) = 0 : シートに表示されている「0」を消すっていう処理を入れる
if tama(cnt) = 1 : シートに表示されている「1」を消すっていう処理を入れる
if tama(cnt) = 2 : シートに表示されている「2」を消すっていう処理を入れる
この動作が素直に行ったら、40回までソース書くわけもいかないので、まとめる→どうやって?
/*/
loop
stop
;***************ビンゴシート************
*ビンゴシート
;シートに入る数字
dim card, 40
card(0) = 0,1,2,3,4,5, 6,7,8,9,10,11, 12,13,14,15,16,17, 18,19
card(20) = 20,21,22,23,24,25, 26,27,28,29,30,31, 32,33,34,35,36,37, 38,39
;結果表示
repeat 25
color ,,255 ;青色
;\ 余り , / 割り算
pos 45+(cnt \ 5) * 24, 60+cnt / 5 * 17 ;数字を表示する位置をずらす
mes card(cnt)
loop
---------------------------------------------------------------
結局乱数無しでもうまくいかず困っていますorz
多分、やりたいことが多くってごっちゃになっているんでないかとわかってます。
けれど砕いたソースでさえうまく実現できそうもなかったため、質問することにしました。
そんなわけですが、アドバイスや考え方などの指摘ありましたらお願いいたします。
| |
|
2013/8/3(Sat) 08:30:26|NO.56094
引いた数のマスを消してなおかつ後からその情報を参照できるようにするという点に
絞ってソースを書いてみましたがご所望に合っているでしょうか。
gosub *initialize
gosub *draw_sheet
pos 10, 10
button gosub "玉を引く", *pull_ball
stop
// シートの初期化
*initialize
dim sheet_number, 5, 5 // マス情報(番号)
dim sheet_hit, 5, 5 // マス情報(ヒットフラグ)
repeat 5
x = cnt
repeat 5
y = cnt
sheet_number(x, y) = y + x * 5
sheet_hit(x, y) = 0
loop
loop
return
// 玉を引く
*pull_ball
ball = rnd(5 * 5)
title "引かれた玉:" + ball
repeat 5
x = cnt
repeat 5
y = cnt
if sheet_number(x, y) == ball {
sheet_hit(x, y) = 1
}
loop
loop
gosub *draw_sheet
return
// シートを表示
*draw_sheet
redraw 0
color 255, 255, 255 : boxf : color
repeat 5
x = cnt
repeat 5
y = cnt
pos x * 30 + 20, y * 30 + 50
if sheet_hit(x, y) == 0 {
mes sheet_number(x, y)
} else {
mes "--"
}
loop
loop
redraw 1
return
|
|
2013/8/3(Sat) 16:00:44|NO.56106
ht.さん。
>>絞ってソースを書いてみましたがご所望に合っているでしょうか。
ご所望どおりですね!ソースありがとうございます。
しかしこんなに短く作れるもんですね・・・
まだまだ無駄が多いなぁ・・・orz
ソースの流れは大体つかみました。
1.二次元配列で数字を代入していく。
2.その結果を表示させる。
3.二次元配列に玉を引いた数を代入。その後フラグを立てる。
4.シート表示に戻って、フラグが立っているので「--」が実行される。
なるほど、これならどんな数字がこようが消せますね。
ちなみにやりたかった数字の潰し方はこんな感じです。
if sheet_hit(x, y) == 0 {
mes sheet_number(x, y) ;シートを表示させる
} else {
mes sheet_number(x, y) ;シートを表示させる
pos x * 30 + 20, y * 30 + 50
mes "--" ;違う場合は--を表示
}
改造していき、9シート文対応するようにします。
ってなわけで改造中。
|
|
2013/8/3(Sat) 18:43:32|NO.56108
新しい配列増やさなくても目的の事はできたりする
NO.56093の上のほうの奴の
>*玉を引く
> TASU = TASU+1 ;玉を引くを押すたびに+1される
の部分を
*玉を引く
repeat 25
if card(cnt)=tama(TASU) {
card(cnt) | $10000 //チェックされた番号に$10000を追加(シート再描画時には card(cnt)>$ffff でチェックされてるか判定し card(cnt)&$ffff で番号を取り出せる)
pos SIT_x+(cnt \ 5) * 24, SIT_y+cnt / 5 * 17
color 255
mes "○"
}
loop
TASU = TASU+1 ;玉を引くを押すたびに+1される
に置き換える
|
|
2013/8/3(Sat) 19:57:07|NO.56109
暇人さん。アドバイスありがとうございます。
|を初めて見ました。パイプライン(|)って言うんですね。ふむふむ。
なんかの略?っていうのを思い出させずに調べたら「or」と同じ効果なのですね。
>>card(cnt) | $10000 //チェックされた番号に$10000を追加(シート再描画時には card(cnt)>$ffff でチェックされてるか判定し card(cnt)&$ffff で番号を取り出せる)
これも「$」初めてみた。
細かく書くと 「card(0) or ($10000)の16進数」っていう意味かなっと思ったら
card(cnt) > $10000 でも動くのか。んー・・・
ちょっと小さいソース作ってみてみるか・・・
|
|
2013/8/3(Sat) 20:43:03|NO.56111
>細かく書くと 「card(0) or ($10000)の16進数」っていう意味かなっと思ったら
あれは 変数+数値 と同じような意味 +と違うのは変数に入ってる数値に関係なく
必ず与えた数値のビットは1になる
変数=1
変数 | 1
mes 変数
変数 + 1
mes 変数
$10000は65536で玉の数が増えても絶対に必要ないような数値をフラグとして使用した
NO.56108のに追加で
>stop
>;***************ビンゴシート************
のstopより前に下のを貼り付けるとビンゴ完成ラインが引かれる
//ナンバーがチェックされてるライン上の数を数える
dim bg_line,12 //0〜4を横ライン用 5〜9を縦ライン用 10,11を斜めライン用に初期化
repeat 25 //横5ライン
bg_line(cnt/5)+(card(cnt)>>16) //$10000を16ビットシフトして1にして足す $10000じゃない場合は0になるだけ
loop
repeat 25 //縦5ライン
bg_line(5+cnt/5)+(card(((cnt\5)*5)+(cnt/5))>>16)
loop
repeat 5 //右下がりライン
bg_line(10)+(card(cnt*6)>>16)
loop
repeat 5 //左下がりライン
bg_line(11)+(card(4+cnt*4)>>16)
loop
color 255
repeat 12 //ビンゴラインを表示
if bg_line(cnt)=5 {
if cnt<5 {
line SIT_x,SIT_y+cnt*17+8,SIT_x+4*24+14,SIT_y+cnt*17+8
}else{
if cnt<10 {
line SIT_x+(cnt\5)*24+6,SIT_y,SIT_x+(cnt\5)*24+6,SIT_y+5*17
}else{
if cnt=10 {
line SIT_x,SIT_y+4,SIT_x+4*24+14,SIT_y+4*17+12
}else{
line SIT_x+4*24+14,SIT_y+4,SIT_x,SIT_y+4*17+12
}
}
}
}
loop
|
|
2013/8/4(Sun) 13:34:15|NO.56116
暇人さん。ありがとうございます。
>>あれは 変数+数値 と同じような意味 +と違うのは変数に入ってる数値に関係なく
>>必ず与えた数値のビットは1になる
ビット・・・これも使ったことがないものだ・・・
↓色々探したり、試したりしてみた。↓
ti = 3
ti | 1
mes ti
;ti=1→1,ti=2→3,ti=3→3,ti=4→5,ti=5→5,ti=6→7,ti=7→7
;なんでこんな風に数字が増えるんだ・・・余計意味がわからなくなったorz
ti + 1
mes ti
「ビット操作」
http://hspdev-wiki.net/?%BE%AE%A5%EF%A5%B6%2F%A5%D3%A5%C3%A5%C8%C1%E0%BA%EE
>$で始まる数値->16進数
> $00は8bitで0
> $0001は16bitで1
> $000000FFは32bitで255
http://homepage1.nifty.com/mstak/Computer/JavaScript/program-form2.html
>3. 16進数10進変換(16bit FFFFとかフルカラーの24bitFFFFFFを大文字でいれてみてください。)
16進数を10進数に変換させれば、65536になりますね。これならわかるぞい。
でも「16進数を10進数に変換」の処理はどこでやってるんだろうか?
>>card(cnt) | $10000
>>あれは 変数+数値 と同じような意味 +と違うのは変数に入ってる数値に関係なく
>>必ず与えた数値のビットは1になる
http://hspdev-wiki.net/?%BE%AE%A5%EF%A5%B6%2F%A5%D3%A5%C3%A5%C8%C1%E0%BA%EE
のURLを見てもよくわからなかったorz
とりあえず作り直したソースがこちら
-----------------------------------------------
color 185,185,185 : boxf ;灰色で塗りつぶす
pos 10,20 ;ボタンの位置
objsize 100,20 ;ボタンの大きさ
button goto "シートを作成する",*ビンゴシート
pos 300,20 ;ボタンの位置
objsize 100,20 ;ボタンの大きさ
button goto "玉を引く",*玉を引く
;***************玉を引く準備************
dim tama, 40
randomize ;乱数発生の初期化
tama(0) = 0,1,2,3,4,5, 6,7,8,9,10,11, 12,13,14,15,16,17, 18,19
tama(20) = 20,21,22,23,24,25, 26,27,28,29,30,31, 32,33,34,35,36,37, 38,39
;シャッフル
repeat 200
r1 = rnd(40) ;変数「r1」に、39までの乱数を代入
r2 = rnd(40) ;変数「r2」に、39までの乱数を代入
wk = tama(r1) ;変数「wk」に、「tama」配列の「r1」番目を代入
tama(r1) = tama(r2) ;tama配列の「r1」番目に、tama配列の「r2」番目を代入
tama(r2) = wk ;tama配列の「r2」番目に、変数の「wk」を代入
loop
stop
;***************玉を引く****************
*玉を引く
;玉を引いた数の上に「○」を表示
repeat 25
if card(cnt) = tama(TASU) { ;card(0) = tama(0) ;玉を引いた分だけ実行
//card(cnt) | $10000 //チェックされた番号に$10000を追加
;(シート再描画時には card(cnt)>$ffff でチェックされてるか判定し card(cnt)&$ffff で番号を取り出せる)
pos SIT_x+(cnt \ 5) * 24, SIT_y+cnt / 5 * 17 ;数字を表示する位置をずらす
color 255 : mes "○"
}loop
;***************2枚目のシート***********
;2枚目
repeat 25
if card_n(cnt) = tama(TASU) { ;card(0) = tama(0) ;玉を引いた分だけ実行
//card(cnt) | $10000 //チェックされた番号に$10000を追加
;(シート再描画時には card(cnt)>$ffff でチェックされてるか判定し card(cnt)&$ffff で番号を取り出せる)
pos NI_x+(cnt \ 5) * 24, NI_y+cnt / 5 * 17 ;数字を表示する位置をずらす
color 255 : mes "○"
}loop
;***************玉を引く****************
TASU = TASU+1 ;玉を引くを押すたびに+1される
repeat TASU
color ,255 : boxf 555,50,630,10 ;「玉の数は・・・」を緑で塗り潰す(本当は灰色だけど、デバッグ用に緑色)
color 0,0,0 ;黒色
pos 430,20 : mes "玉の数字は・・・" + tama(cnt) ;引いた玉の数を表示
loop
stop
;***************ビンゴシート************
*ビンゴシート
;シートに表示される数字の位置を変える
SIT_x = 45 : SIT_y = 60 ;1枚目のシート
NI_x = 205 : NI_y = 60 ;2枚目のシート
;シートに入る数字
dim card, 40
card(0) = 0,1,2,3,4,5, 6,7,8,9,10,11, 12,13,14,15,16,17, 18,19
card(20) = 20,21,22,23,24,25, 26,27,28,29,30,31, 32,33,34,35,36,37, 38,39
;シャッフル
randomize ;乱数発生の初期化
repeat 200
r1 = rnd(40) ;変数「r1」に、39までの乱数を代入
r2 = rnd(40) ;変数「r2」に、39までの乱数を代入
wk = card(r1) ;変数「wk」に、「card」配列の「r1」番目の数を代入
card(r1) = card(r2) ;card配列の「r1」番目に、card配列の「r2」番目を代入
card(r2) = wk ;card配列の「r2」番目に、変数の「wk」を代入
loop
;結果表示
repeat 25
color ,,255 ;青色
;\ 余り , / 割り算
pos SIT_x+(cnt \ 5) * 24, SIT_y+cnt / 5 * 17 ;数字を表示する位置をずらす
mes card(cnt) ;数字を表示
loop
;***************2枚目のシート***********
;シートに入る数字
dim card_n, 40
card_n(0) = 0,1,2,3,4,5, 6,7,8,9,10,11, 12,13,14,15,16,17, 18,19
card_n(20) = 20,21,22,23,24,25, 26,27,28,29,30,31, 32,33,34,35,36,37, 38,39
;シャッフル
repeat 200
n1 = rnd(40) ;変数「r1」に、39までの乱数を代入
n2 = rnd(40) ;変数「r2」に、39までの乱数を代入
wk = card_n(n1) ;変数「wk」に、「card」配列の「r1」番目の数を代入
card_n(n1) = card_n(n2) ;card配列の「r1」番目に、card配列の「r2」番目を代入
card_n(n2) = wk ;card配列の「r2」番目に、変数の「wk」を代入
loop
;2枚目のシート
repeat 25
color ,,255 ;青色
;\ 余り , / 割り算
pos NI_x+(cnt \ 5) * 24, NI_y+cnt / 5 * 17
mes card_n(cnt) ;数字を表示
loop
-----------------------------------------------------------
一応望みどおりの動作はするが・・・するが・・・
無駄多いだろこれ・・・orz
なんでだろう・・・最近何も思い浮かばない・・・
いつもなら効率化できそうな部分なのにどうしたし・・・
とりあえず、改良までにまだまだ時間がかかりそう。
| |
|
2013/8/4(Sun) 15:20:04|NO.56118
>でも「16進数を10進数に変換」の処理はどこでやってるんだろうか?
スクリプト上の表記が違うだけで同じデータ
変数=$10000
mes 変数
if (変数=65536) and (変数=$10000) {mes "同じ数値"}
シートの数変えるだけでスクリプトいじるのは面倒だと思う
randomize ;乱数発生の初期化
color 185,185,185 : boxf ;灰色で塗りつぶす
pos 10,0
sheet_cnt=2 //シート数初期設定
input sheet_cnt,100,18
pos 10,20 ;ボタンの位置
objsize 100,20 ;ボタンの大きさ
button goto "シートを作成する",*ビンゴシート
pos 300,20 ;ボタンの位置
objsize 100,20 ;ボタンの大きさ
button goto "玉を引く",*玉を引く
;***************玉を引く準備************
tama_max=40 //玉の数
dim tama, tama_max
repeat tama_max
tama(cnt)=cnt
loop
stop
;***************玉を引く****************
*玉を引く
if (sheet_max > 0) and (TASU ! tama_max) {
repeat sheet_max
sheet_id=cnt
addx=cnt\3*160
addy=(cnt/3)*100
;玉を引いた数の上に「○」を表示
repeat 25
if card(cnt,sheet_id) = tama(TASU) {
pos SIT_x+addx+(cnt \ 5) * 24, SIT_y+addy+cnt / 5 * 17 ;数字を表示する位置をずらす
color 255 : mes "○"
}
loop
loop
;***************玉を引く****************
TASU = TASU+1 ;玉を引くを押すたびに+1される
repeat TASU
color ,255 : boxf 555,50,630,10 ;「玉の数は・・・」を緑で塗り潰す(本当は灰色だけど、デバッグ用に緑色)
color 0,0,0 ;黒色
pos 430,20 : mes "玉の数字は・・・" + tama(cnt) ;引いた玉の数を表示
loop
}
title "玉数:"+TASU+"/"+tama_max
stop
;***************ビンゴシート************
*ビンゴシート
TASU=0
title "玉数:"+TASU+"/"+tama_max
color 185,185,185 : boxf ;灰色で塗りつぶす
;シャッフル
repeat 200
r1 = rnd(tama_max) ;変数「r1」に、39までの乱数を代入
r2 = rnd(tama_max) ;変数「r2」に、39までの乱数を代入
wk = tama(r1) ;変数「wk」に、「tama」配列の「r1」番目を代入
tama(r1) = tama(r2) ;tama配列の「r1」番目に、tama配列の「r2」番目を代入
tama(r2) = wk ;tama配列の「r2」番目に、変数の「wk」を代入
loop
;シートに表示される数字の位置を変える
SIT_x = 45 : SIT_y = 60 ;1枚目のシート
sheet_max=sheet_cnt //シート数設定
dim card, tama_max,sheet_max
repeat sheet_max
sheet_id=cnt
;シートに入る数字
repeat tama_max
card(cnt,sheet_id)=cnt
loop
;シャッフル
repeat 200
r1 = rnd(tama_max) ;変数「r1」に、39までの乱数を代入
r2 = rnd(tama_max) ;変数「r2」に、39までの乱数を代入
wk = card(r1,sheet_id) ;変数「wk」に、「card」配列の「r1」番目の数を代入
card(r1,sheet_id) = card(r2,sheet_id) ;card配列の「r1」番目に、card配列の「r2」番目を代入
card(r2,sheet_id) = wk ;card配列の「r2」番目に、変数の「wk」を代入
loop
addx=cnt\3*160
addy=(cnt/3)*100
;結果表示
color ,,255 ;青色
repeat 25
;\ 余り , / 割り算
pos SIT_x+addx+(cnt \ 5) * 24, SIT_y+addy+cnt / 5 * 17 ;数字を表示する位置をずらす
mes card(cnt,sheet_id) ;数字を表示
loop
loop
| |
|
2013/8/5(Mon) 22:07:53|NO.56169
暇人さん。ありがとうございます!
>>変数=$10000
>>mes 変数
>>if (変数=65536) and (変数=$10000) {mes "同じ数値"}
す・・・すげぇ・・・
こんな方法もあるんですね。
なんで、65536という数値かと思ったら・・・
>>$10000は65536で玉の数が増えても絶対に必要ないような数値をフラグとして使用した
書いてありましたね・・・orz
ソース解析をしました。
ふむふむ。二次元配列か。
1シートを1グループとして、管理すればできると思ったが、こういう方法もあるのかー・・・
とりあえずソースの流れは大体把握できたので、自分のソースと融合してみます。
そして特に不具合が無ければ、今週中に解決したいと思います。
今日は・・・眠い・・・すまない。後、最近集中力も落ちている気がする。夏か。
|
|
2013/8/6(Tue) 02:20:24|NO.56173
ちらりと拝見して、すさまじいサンプルを見て驚いてましたが、
本筋から少し外れるんですけど気になった点が一つだけあったので書きこまさせて頂きます。
シャッフルのとこrepeat200になってたのでその辺のソースが気になって見たんですけど
r1を動かすとあちこち行っちゃって安定しないので
repeat 40で r1=cntで順番にrndでいいんじゃないかなーと思ったんだけど、どうなのかな?
最近全てのソースを解析するパワーがないのでぱっと見で
書き込んでしまいました…すみません。
|
|
2013/8/6(Tue) 20:27:25|NO.56181
123さん。
>>シャッフルのとこrepeat200
この200というのはわざと大きい数字にしてあります。
40回繰り返しだと、
r1 = rnd(40)
ってなりますよね。40までの数値のどれかランダムで代入されます。
プログラムを実行すると、こんな感じになります。
1回目:r1 = 5
2回目:r1 = 7
3回目:r1 = 11
4回目:r1 = 5
数字が、かならずどこかで被りますね。
40回しか実行しないので、もし数字が被りまくった場合、
全ての数字をシャッフルすることが出来ません。
そこで、わざと200回という大きさでループさせております。
200回ぐらい繰り返せば、どこかで数値が被ってもシャッフルする望みはあります。
まぁ、このソースの欠点は、出てくる数字が均等にならないんですよね。
この均等にならないことに関してアドバイスを貰いましたが、
今の私では理解に時間がかかりそうと思ったのと、
なじんでいるソースで理解してから手を出しても遅くはないと思って、
こういうソースになっております。
|
|
2013/8/6(Tue) 22:18:16|NO.56182
>全ての数字をシャッフルすることが出来ません。
勘違いしてる?
r1,r2の両方をrnd(40)にするんじゃなく
片方をcntにして必ず一度はrnd(40)で入れ替えするようにする
一つのナンバーがシャッフルされない確立は1/40
シャッフル実験用スクリプト
randomize
sy=150
sa={"repeat 200
\tr1 = rnd(40)
\tr2 = rnd(40)
\twk = a(r1)
\ta(r1) = a(r2)
\ta(r2) = wk
loop"}
mesbox sa,150,100,0
button goto "シャッフルA",*シャッフルA
aid=stat
pos 200,0
sa={"repeat 40
\tr1 = rnd(40)
\twk = a(cnt)
\ta(cnt) = a(r1)
\ta(r1) = wk
loop"}
mesbox sa,150,100,0
button goto "シャッフルB",*シャッフルB
bid=stat
st(bid)=0
sysfont 17
stop
*シャッフルA
sid=stat
title "シャッフルA"
gosub *gbcls
repeat 20
repeat 40
a(cnt)=cnt
loop
repeat 2000
r1 = rnd(40)
r2 = rnd(40)
wk = a(r1)
a(r1) = a(r2)
a(r2) = wk
loop
gosub *draw
loop
color 255
pos 360,0
mes "シャッフルA:"
sid=aid
mes "シャッフル回数:"+st(sid)
mes "1個以上シャッフルされなかったシート数:"+scf(sid)+" ("+(100.0*scf(sid)/(st(sid)))+"%)"
mes "シャッフルされなかったナンバー総数:"+sct(sid)+" ("+(100.0*sct(sid)/(st(sid)*40))+"%)"
color
pos 360,60
sid=bid
if st(sid){
mes "シャッフルB:"
mes "シャッフル回数:"+st(sid)
mes "1個以上シャッフルされなかったシート数:"+scf(sid)+" ("+(100.0*scf(sid)/(st(sid)))+"%)"
mes "シャッフルされなかったナンバー総数:"+sct(sid)+" ("+(100.0*sct(sid)/(st(sid)*40))+"%)"
}
stop
*シャッフルB
sid=stat
title "シャッフルB"
gosub *gbcls
repeat 20
repeat 40
a(cnt)=cnt
loop
repeat 40
r1 = rnd(40)
wk = a(cnt)
a(cnt) = a(r1)
a(r1) = wk
loop
gosub *draw
loop
color
pos 360,0
sid=aid
if st(sid){
mes "シャッフルA:"
mes "シャッフル回数:"+st(sid)
mes "1個以上シャッフルされなかったシート数:"+scf(sid)+" ("+(100.0*scf(sid)/(st(sid)))+"%)"
mes "シャッフルされなかったナンバー総数:"+sct(sid)+" ("+(100.0*sct(sid)/(st(sid)*40))+"%)"
}
pos 360,60
color 255
sid=bid
mes "シャッフルB:"
mes "シャッフル回数:"+st(sid)
mes "1個以上シャッフルされなかったシート数:"+scf(sid)+" ("+(100.0*scf(sid)/(st(sid)))+"%)"
mes "シャッフルされなかったナンバー総数:"+sct(sid)+" ("+(100.0*sct(sid)/(st(sid)*40))+"%)"
stop
*draw
st(sid)++
sc=0
y=sy+cnt*16
repeat 40
x=cnt*16
if a(cnt)=cnt {
color 255*(cnt<25),,255*(cnt>24)
boxf x,y,x+11,y+11
color 255,255,255
sc++
}else{
color
}
pos x,y
mes a(cnt)
loop
if sc{
color 0,0,limit((sc*128),0,255)
line 0,y+11,640,y+11
if sc>2{
color limit(((sc-2)*128),0,255)
line 0,y+10,640,y+10
}
scf(sid)++
}
sct(sid)+sc
return
*gbcls
color 255,255,255
boxf
color 255
repeat 40
pos cnt*16,sy-20
mes cnt
loop
line 25*16-2,sy-20,25*16-2,sy+20*16
return
どっちの方法もシャッフルされないナンバーの実際の出現率は2.5%程度
連続してシャッフルされないのは多くて2個程度
シャッフルAの方がシャッフルされないナンバーが出現する感じ
| |
|
2013/8/7(Wed) 22:23:26|NO.56195
暇人さん。
>>勘違いしてる?
私の回答は良く見たら
>>r1を動かすとあちこち行っちゃって安定しないので
>>repeat 40で r1=cntで順番にrndでいいんじゃないかなーと思ったんだけど、どうなのかな?
の部分に関して抜けてましたね・・・orz
私の回答は自分自身のソースに対してです!
ちなみにソースの融合に関してはできました!
cntを使ったものを理解したほうがいいのかな・・・
一応私の悩みに関しては解決はしているので、チェックしますね。
アドバイスとかありがとうございます。時間が出来次第ソースを解読しときますorz
|
|