HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0803
ミント表示された数に対して、数字を消す12解決


ミント

リンク

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

多分、やりたいことが多くってごっちゃになっているんでないかとわかってます。
けれど砕いたソースでさえうまく実現できそうもなかったため、質問することにしました。


そんなわけですが、アドバイスや考え方などの指摘ありましたらお願いいたします。



この記事に返信する


ht.

リンク

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グループとして、管理すればできると思ったが、こういう方法もあるのかー・・・

とりあえずソースの流れは大体把握できたので、自分のソースと融合してみます。
そして特に不具合が無ければ、今週中に解決したいと思います。
今日は・・・眠い・・・すまない。後、最近集中力も落ちている気がする。夏か。



123

リンク

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



ONION software Copyright 1997-2023(c) All rights reserved.