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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0313
ひろし配列同士の共通項の取り出し方3解決


ひろし

リンク

2020/3/13(Fri) 02:31:04|NO.89701

単語列挙ゲームをする作っています。
答えを30個ほど用意していて
ユーザーにも答えを沢山いれてもらおうと思っています。
文字列の配列をループで一つ一つ比較するしかないでしょうか?
ハッシュというものを使うのでしょうか?



この記事に返信する


玄冬

リンク

2020/3/13(Fri) 13:06:06|NO.89707

連想配列(ハッシュ)ってHSPの標準機能で実装されてましたっけ?

30個程度であれば、かかる時間も1秒程度でしょうし
2重ループが一番手っ取り早いと思います。

用意した答え = "こぶた","たぬき","きつね","ねこ","はりねずみ" 入力された答え = "ぶた","いぬ","ねずみ","とら","きつね" 正誤表 = "×","×","×","×","×" foreach 用意した答え n = cnt foreach 入力された答え if 用意した答え(n) = 入力された答え(cnt) : 正誤表(cnt) = "○" loop await 0 loop foreach 入力された答え mes 入力された答え(cnt) + ":" + 正誤表(cnt) await 0 loop

instrや正規表現などを使って部分文字列を探すという手もありますが、
うまくやらないと判定が狂う可能性があります。
(想定された答え「はりねずみ」に対して入力された「ねずみ」が○と判定される等)

用意した答え = ":こぶた:たぬき:きつね:ねこ:はりねずみ:" 入力された答え = "ぶた","いぬ","ねずみ","とら","きつね" 正誤表 = "×","×","×","×","×" foreach 入力された答え if 0 < instr( 用意した答え, 0, ":" + 入力された答え(cnt) + ":" ) : 正誤表(cnt) = "○" await 0 loop foreach 入力された答え mes 入力された答え(cnt) + ":" + 正誤表(cnt) await 0 loop



沢渡

リンク

2020/3/13(Fri) 13:27:42|NO.89708

こんな感じで正解データをコンマで区切る形で一つの文字列として持っておき、
ユーザーが入力した答えの前後にコンマを付加した上で検索すれば、
比較的楽にできるのではないかと思います。

//正解データ corr =",北海道,青森県,秋田県,岩手県,宮城県,山形県,福島県,茨城県,栃木県,群馬県," //最初の答えの前にもコンマを付ける corr+="埼玉県,千葉県,東京都,山梨県,神奈川県,静岡県,新潟県,富山県,石川県,福井県," corr+="長野県,愛知県,岐阜県,滋賀県,三重県,京都府,奈良県,和歌山県,大阪府,兵庫県," corr+="鳥取県,岡山県,島根県,広島県,山口県,香川県,愛媛県,徳島県,高知県,福岡県," corr+="大分県,佐賀県,長崎県,宮崎県,熊本県,鹿児島県,沖縄県," //最後の答えの後ろにもコンマを付ける sdim ans,64,5 //回答格納用 dim suc,5 //正解か不正解か(0は不正解、1は正解、-1は正しいが重複している) mes "日本の都道府県名を5つ挙げてください。\n後ろには『都』『道』『府』『県』を付けて答えてください。" objsize 100,30 repeat 5 pos 0,40+30*cnt : input ans(cnt) loop pos 0,200 : button gosub "答える",*answer stop *answer over="" //重複検出用 repeat 5 chk=ans(cnt) strrep chk," ","" //半角スペースを削除 strrep chk," ","" //全角スペースを削除 strrep chk,",","" //コンマを削除 chk=","+chk : chk+="," //前後にコンマを付加 if instr(over,0,chk)!=-1 { //重複検出 suc(cnt)=-1 } else { if instr(corr,0,chk)=-1 { //不正解 suc(cnt)=0 } else { //正解 suc(cnt)=1 over+=chk } } loop color 255,255,255 : boxf 0,40,300,200 repeat 5 pos 110,40+30*cnt switch suc(cnt) case 1 color 255,0,0 : mes "正解!" swbreak case -1 color 0,0,255 : mes "重複により不正解" swbreak default color 0,0,255 : mes "不正解" swbreak swend loop return



ひろし

リンク

2020/3/15(Sun) 09:23:40|NO.89728

ソーススクリプトまで書いてくださってありがとうございます!
大量の処理にはならないと思うので、二重ループで大丈夫そうですね!

正解データをコンマで区切るのは気づかなかったです!
提示してくださったこの方法でうまくいったので
解決です!

ありがとうございます!



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