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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0429
ympテキストファイルの行数の取得8解決


ymp

リンク

2008/4/29(Tue) 12:20:51|NO.15483

hsp初心者です。
クイズをランダムに出したいのですが、どうすればいいでしょうか?
教えてください。



この記事に返信する


TODO

リンク

2008/4/29(Tue) 12:34:04|NO.15484

rnd命令を使えばいいと思います
1だったらこの問題
2だったらこの問題
としていけばランダムになります



Kpan

リンク

2008/4/29(Tue) 14:03:15|NO.15487

タイトルと内容が一致してないので、どっちの質問でしょう?(^^;
テキストファイルを扱うならメモリノートパッド(note〜系)。

たとえば、ものすごいテキトーですが文字をランダム表示〜。
rnd関数ですな。>TODOさん

randomize data = "あ", "い", "う", "え", "お", "か", "き", "く", "け", "こ" button "", *jump stop *jump value = rnd(9) title ""+value mes data.value



TODO

リンク

2008/4/29(Tue) 14:25:58|NO.15488


randomize r=rnd(3) if r=0 { goto*問題1} r=rnd(2) if r=1 { goto*問題2} r=rnd(2) if r=2 { goto*問題3} *問題1 mes"問題!寒いのは南極?北極?" stop *問題2 mes"問題!12+34=?" stop *問題3 mes"問題!ABC□DE?" stop

これでランダムです。
>>rnd関数ですな。>TODOさん
命令だと思ってた



SYAM

リンク

2008/4/29(Tue) 15:15:31|NO.15489

タイトルが
「テキストファイルの行数の取得」…なんですよね。はて。

「テキストファイルに用意した問題から、ランダムに出題したい」
ってことだと解釈して、おおよそ必要な命令と何をするかだけ列挙します。
各命令や関数の具体的な使い方はヘルプを参照してください。


【用意】
出題したい問題を書き込んだテキストファイルを用意します。
とりあえず1行1問で、最後に余計な改行などは入れないように書いておきます。
表示のしかたにもよりますが、mes命令で表示するのであれば、文字列の中に "\n" があると、その部分は表示の時には改行扱いになります。

【1】
noteload 命令で、テキストファイルから問題をメモリノートに読み込みます。
このとき、システム変数 notemax に、読み込んだテキストファイルの行数が自動的に代入されています。

【2】
rnd() 関数で、何番目の問題を出題するかを決定します。
randomize 命令を使っておかないと毎回同じ順番になってしまいますので注意。

【3】
noteget 命令で、メモリノートから1行ぶんを抽出します。
取り出す行のインデックスとして、2で作った番号を使います。



べなりあ

リンク

2008/4/29(Tue) 15:26:24|NO.15490

基本的なやり方は、SYAMさんが仰っている通りです。

多少メモリを食いますが、最初に問題を読み込んで配列変数に突っ込んでしまうのも1つの手です。
こうした方が、問題表示部分のソースはすっきりします。
逆に読み込み部分のソースは複雑になりますが。



SYAM

リンク

2008/4/29(Tue) 15:30:50|NO.15491

>TODOさん

そのサンプルは何度か実行してみましたか?
出題の頻度にばらつきがあるばかりか、3 問めが決して出てきません。
1 問めが 2/3の確率、2問めが 1/3 の確率で出てきます。

まず、rnd(3)を一回実行した時点で、「どの問題を出すか」は決定しているのですから、1 問目を出さなかった時点でもう一度 rnd()関数を実行する意味はありません。
このスクリプトであれば、r=rnd(3)のあとに r が 0,1,2 の場合についてそれぞれ問題を表示するルーチンにジャンプするだけでいいはずです。

さらに、 r=rnd(2) の結果として r に代入されるのは 0 か 1 です。
したがって、 r=2 が成立することは絶対にありません。
分岐の後に 1 問めを表示するルーチンが書かれておりそこがたまたま実行されているためエラーにはなりませんが、むしろそれがバグを気づきにくくさせています。
※これに関しては、どの if の条件にも引っかからなかったことに自分が気づくため、(本来実行されてはいけないはずの)dialog 命令などを埋め込んでおく習慣をつけておくとよいでしょう。



というか、別のスレッドでも出てますが
せめて配列変数を使いましょう。こんな分岐のしかたでは"時間が・・"って悲鳴をあげることになります :-P
"



べなりあ

リンク

2008/4/29(Tue) 15:36:24|NO.15492

割と使うのか使わないのか微妙なことですが。
仮に10問あるとして、それをランダムに出題するとかぶってしまうことがあったり…
そういう時にお使いください。


dim n,10 repeat 10 c=rnd(10) if n.c=1 : continue cnt n.c=1 mes c loop

なんかすごい無駄がある気もしますが。
他にいい方法無いもんかな…



ymp

リンク

2008/5/5(Mon) 22:05:17|NO.15675

ありがとうございます。
タイトルとずれたことに関しては、
ある人から、「行数を取得すればできる。」と言われたので・・・。

参考になりました。

またよろしくおねがいします。



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