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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0417
kingタイピングのローマ字について8解決


king

リンク

2008/4/17(Thu) 20:22:51|NO.15179

こんばんは。早速ですが質問です。
今タイピングゲームを作ろうとしているのですが
例えば『ZIKAN』と『JIKAN』ZとJどちらも入力
しても成功と判断させるにはどうすれば良いのでしょうか?
その他には『janken』や『jyanken』など



この記事に返信する


nozomu-jhs

リンク

2008/4/17(Thu) 20:38:07|NO.15181

switch〜case文を使えばいいんじゃないですか?



f

リンク

2008/4/18(Fri) 16:53:43|NO.15193

・・・。
むしろ、出題の方をプレイヤの環境に合わせて変更するべきでね?



As

リンク

2008/4/18(Fri) 23:08:57|NO.15200

タイピングゲームでユーザーに入力してほしいキーがある場合、そのキーの入力に向けて
待機することになるとおもいます。

「じ」を入力待機する場合、「ji」 もしくは 「zi」があります。
このときに条件式では

if (key='J')|(key='Z'){〜}
というふうにしてあげれば、いいわけです。

しかし、「jya」の場合は、「ja」、「zha」など入力する必要のある文字数が変わってきます。
こういう場合は、「j」が入力されたあとに「a」または「y」両方の入力待機に移ります。

if (key='A')|(key='Y'){〜}

また、この入力をkey_oldのような変数に保持しておき、次の処理で
前回の入力が”key='Y'”だった場合、

if key='A'{〜}
という条件に限ることができます。



処理に関して、だいたいこういう流れにはなるのですが、こういった複雑な処理をいちいち
組んでいくのは大変な作業ですので、この処理を統括できるように、
前々回のキー入力までの値を保持しておき、過去のキー入力と今のキー入力の条件を
合せてswitchなどで処理していくといいかもしれません。



SYAM

リンク

2008/4/18(Fri) 23:18:04|NO.15201

逆に質問をします。

お手本となるデータを、おそらく文字列変数か何かに代入しているかと思うのですが
その内容は ローマ字 ですか?それとも、 ひらがなやカタカナ ですか?

そして、ユーザーにはどのような表示を見せますか?



king

リンク

2008/4/19(Sat) 06:09:50|NO.15207

>nozomu-jhsさん
ご返信ありがとうございました

>fさん
私も,最初はそう考えていました(^^;

>Asさん
ご丁寧にありがとうございます!
是非アドバイスを参考にさせていただきます(^^

>SYAMさん
え〜とですね。HSPのサンプルデモに簡単なサンプル
がありましたので、おおまかにいうとこの様な
感じで表示させたいと思ってます。
(他にsdim&ノートパットを使う方法もありますが・・・(^^;))

;
; タイピングゲーム サンプル
;
title "タイピングゲーム"
randomize
*start
; ゲーム開始
score=0
*greset
; 問題の準備
cursor=0
timer=250
typemode=0
m=rnd(3)
if m=0 : mondai="HOTSOUPPROCESSOR":mondai2="ホットスーププロセッサ"
if m=1 : mondai="HSPSCRIPTEDITOR":mondai2="HSPスクリプトエディタ"
if m=2 : mondai="HSPTVDEASOBOU":mondai2="HSPTVで遊ぼう"
onkey gosub *typein
*main
; ゲームメイン
redraw 0
color 192,192,192:boxf
font msgothic,16
color 0,0,0
pos 80,20:mes "残り時間:"+timer
pos 80,40:mes "スコア:"+score
font msgothic,30,1
color 0,120,160
pos 170,198:mes mondai2
pos 170,238:mes mondai
pos 170,238:color 255,0,0:mes strmid(mondai,0,cursor)
redraw 1
await 50
if typemode>0 : onkey 0 : goto *greset
if timer<=0 : onkey 0 : goto *gameover
timer=timer-1
goto *main
*gameover
onkey 0
dialog "ゲームオーバー"
end

*typein
; キーを押した時の処理
a=peek(mondai,cursor)
if a!=iparam : goto *typemiss
len=strlen(mondai)
cursor=cursor+1:if cursor<len : return
goto *win
*typemiss
; ミスタッチをした時
return
*win
; タイピング成功
typemode=1
score+=10
return



YRIN

リンク

2008/4/19(Sat) 13:19:43|NO.15218

跡形もなく書き換えてしまった気もします。しかも自分でもあまり理解していないです。
ですが、万が一にも参考になるかもしれませんので。
「じゃ」以外で入力が複数通りある文字や、小さい「つ」の字はやってません。
まあ 「って」を「tte」と打つ人はいても、「xtute」と打つ人は少ないでしょうけど。
それに 「ん」を「n」と「nn」の両方に対応させるのも、これだと面倒だと思います。

ですが、mondai = "JA", "NN", "KE", "NN" というようにするのはいいアイディアだと思ってます。
ちなみに"JA", "JYA", "ZYA", "JIXYA", "JILYA", "ZIXYA", "ZILYA"には対応させました。
#module
; 初期化 #deffunc initmodule key_ja = "JA", "JYA", "ZYA", "JIXYA", "JILYA", "ZIXYA", "ZILYA" return ; ; キー入力が正しいかどうかを判定する ; ; int _keycount : 何番目のキーまで入力されたか ; str _inputkey : 入力されたキーのバッファ(配列) ; var _key : 入力されるべきキーが格納された文字列型の変数 ; ; 結果は stat に, 正しければ 0, 間違っていれば 1 が入る. ; #deffunc check int _keycount, array _inputkey, var _key if( _keycount <= 0 ) { ; 引数がおかしい dialog "error" } return_code = 0 switch _key ; じゃ ( ja, jya, zya, jixya, jilya, zixya, zilya ) case "JA" case "JYA" case "ZYA" case "JIXYA" case "JILYA" case "ZIXYA" case "ZILYA" ; この部分はさらに関数化するべきだと思う repeat length(key_ja) cnt1 = cnt return_code = 0 repeat _keycount if peek( key_ja.cnt1, cnt) != _inputkey.cnt { return_code = 1 break } loop if return_code == 0 { if _key != key_ja.cnt1 { ; 例えば, JA と書かれているのに ZYA と押そうとしている場合は, ; 問題を JA から ZYA に変える. _key = key_ja.cnt1 } break } loop swbreak ; 普通のキーの場合 default repeat _keycount if( peek( _key, cnt) != _inputkey.cnt ) { return_code = 1 break } loop swbreak swend return return_code #global title "タイピングゲーム" randomize font msgothic,16 initmodule *start gosub *greset goto *main ; ゲームメイン *main gosub *draw if typemode = 1 { onkey 0 gosub *win gosub *greset } wait 1 goto *main ; キーを押した時の処理 *typein key_input.key_cursor = iparam check key_cursor + 1, key_input, mondai.kana_count if stat == 1 { ; ミスタッチ gosub *typemiss return } key_cursor += 1 if key_cursor == strlen( mondai.kana_count) { ; 次のひらがなに進む kana_count += 1 key_cursor = 0 if( kana_count == length( mondai) ) { ; 次のひらがながなかった場合は成功(全てタイプし終えた). typemode = 1 } } return ; ミスタッチをした時 *typemiss return ; タイピング成功 *win wait 10 return ; 表示 *draw redraw 0 color 192,192,192 boxf color 0,0,0 ; 日本語を表示 pos 170,198 mes mondai_kana ; キーのほう(アルファベット)を表示 buf = "" repeat length(mondai) buf += mondai.cnt loop pos 170,238 mes buf ; すでに入力された文字を赤で上書き buf = "" repeat kana_count buf += mondai.cnt loop repeat key_cursor buf += strf( "%c", peek( mondai.kana_count, cnt)) loop pos 170,238 color 255,0,0 mes buf redraw 1 return ; 問題の準備 *greset ; mondai.kana_count は, ひらがなでkana_count番目のキーを示す. ; mondai.kana_count の cursor 番目の文字が, 入力するべきキー. kana_count = 0 ; かな で何文字目かをカウントする key_cursor = 0 dim key_input, 16 ; キーの入力をためておく配列 typemode = 0 mondai = "JA", "N", "KE", "NN" mondai_kana = "じゃんけん" onkey gosub *typein return

長々と失礼。




SYAM

リンク

2008/4/19(Sat) 15:50:50|NO.15222

既に回答ありましたか…出遅れた。
自分もやってみました。
入力したローマ字を単純にひらがなにしますので、答えはひらがなの文字列で持っておけばOKです。
サンプルでは入力中の(ローマ字として未完成の)文字をタイトルバーに表示します。
[BS]キーで一字戻りますがタイトルバー更新しないのでそこだけおかしくなります。

あまり難しい命令を使っていませんが、やっていることはややっこしいです。
そのかわり、Windowsでできるローマ字入力方法全部対応できてるはずです。一応。
jaでもzyaでもjyaでもzilyaでもzixyaでも、なんでもこいです。

-----------------

sdim buf,1024 sdim table_1, 3,5 ; アルファベット1字でできる文字 sdim table_2, 5,21,5 ; アルファベット2字でできる文字 sdim table_3, 5,20,3,5 ; ア(以下略 sdim allkana,1280; 文字テーブル生成の作業用 sdim k,2; iparam→文字変数への変換用 sdim s,6; 完成したローマ字の読み gosub *ROUTINE_SET_TABLES screen 0,320,240,0 mesbox buf,320,240,0 dim keyidx,3 sdim keystr,2,3 nb_keyin=0 t="" onkey *PROCEDURE_KEYIN *MAIN_ROUTINE stop *PROCEDURE_KEYIN if iparam=' ' :goto *MAIN_ROUTINE if (iparam=8 && nb_keyin>0) :nb_keyin-=1:goto *MAIN_ROUTINE ;[BS]キー. poke k,0,iparam keystr(nb_keyin)=k i=instr(keytbl1,0,k) if(i>=0){ // 母音が入力された gosub *PROCEDURE_OUTCHAR if(s!="") : buf+=s : objprm 0,buf nb_keyin=0 : t="" }else{ if( nb_keyin=1 && instr(keytbl2b,0,k)<0):goto *MAIN_ROUTINE nb_keyin++ if(nb_keyin=3):nb_keyin=2 t+=k } title strmid(t,0,nb_keyin+1) goto *MAIN_ROUTINE *PROCEDURE_OUTCHAR if(nb_keyin=0){ s=table_1(i) } if(nb_keyin=1){ i2 =instr(keytbl2a,0,keystr(0)) if(i2=-1):return s=table_2(i2,i) } if(nb_keyin=2){ i3 = instr(keytbl3,0,keystr(0)) i2 = instr(keytbl2b,0,keystr(1)) if((i3=-1)||(i2=-1)):return s=table_3(i3,i2,i) } return *ROUTINE_SET_TABLES keytbl1="AIUEO" keytbl2a="BCDFGHJKLMNPQRSTVWXYZ" keytbl2b="HSY" keytbl3= "BCDFGHJKLMNPQRSTVWXZ" allkana="あいうえお" repeat 5 table_1(cnt)=strmid(allkana,cnt*2,2) loop allkana ="ば,び,ぶ,べ,ぼ,か,し,く,せ,こ,だ,ぢ,づ,で,ど," allkana+="ふぁ,ふぃ,ふ,ふぇ,ふぉ,が,ぎ,ぐ,げ,ご,は,ひ,ふ,へ,ほ," allkana+="じゃ,じ,じゅ,じぇ,じょ,か,き,く,け,こ,ぁ,ぃ,ぅ,ぇ,ぉ," allkana+="ま,み,む,め,も,な,に,ぬ,ね,の,ぱ,ぴ,ぷ,ぺ,ぽ,くぁ,くぃ,く,くぇ,くぉ," allkana+="ら,り,る,れ,ろ,さ,し,す,せ,そ,た,ち,つ,て,と,ヴぁ,ヴぃ,ヴ,ヴぇ,ヴぉ," allkana+="わ,ゐ,う,ゑ,を,ぁ,ぃ,ぅ,ぇ,ぉ,や,い,ゆ,いぇ,よ,ざ,じ,ず,ぜ,ぞ" idx=0 repeat 21:cnt1=cnt:repeat 5 getstr table_2(cnt1,cnt), allkana, idx, ',' idx+=strsize loop:loop allkana =",,,,,,,,,,びゃ,びぃ,びゅ,びぇ,びょ,";B allkana+="ちゃ,ち,ちゅ,ちぇ,ちょ,,,,,,ちゃ,ちぃ,ちゅ,ちぇ,ちょ,";C allkana+="でゃ,でぃ,でゅ,でぇ,でょ,,,,,,ぢゃ,ぢぃ,ぢゅ,ぢぇ,ぢょ,";D allkana+=",,,,,,,,,,ふゃ,ふぃ,ふゅ,ふぇ,ふょ,";F allkana+=",,,,,,,,,,ぎゃ,ぎぃ,ぎゅ,ぎぇ,ぎょ,";G allkana+=",,,,,,,,,,ひゃ,ひぃ,ひゅ,ひぇ,ひょ,";H allkana+=",,,,,,,,,,じゃ,じぃ,じゅ,じぇ,じょ,";J allkana+=",,,,,,,,,,きゃ,きぃ,きゅ,きぇ,きょ,";K allkana+=",,,,,,,,,,ゃ,ぃ,ゅ,ぇ,ょ,";L allkana+=",,,,,,,,,,みゃ,みぃ,みゅ,みぇ,みょ,";M allkana+=",,,,,,,,,,にゃ,にぃ,にゅ,にぇ,にょ,";N allkana+=",,,,,,,,,,ぴゃ,ぴぃ,ぴゅ,ぴぇ,ぴょ,";P allkana+=",,,,,,,,,,くゃ,くぃ,くゅ,くぇ,くょ,";Q allkana+=",,,,,,,,,,りゃ,りぃ,りゅ,りぇ,りょ,";R allkana+="しゃ,し,しゅ,しぇ,しょ,,,,,,しゃ,しぃ,しゅ,しぇ,しょ,";S allkana+="てゃ,てぃ,てゅ,てぇ,てょ,つぁ,つぃ,つ,つぇ,つぉ,ちゃ,ちぃ,ちゅ,ちぇ,ちょ,";T allkana+=",,,,,,,,,,う゛ゃ,う゛ぃ,う゛ゅ,う゛ぇ,う゛ょ,";V allkana+="うぁ,うぃ,う,うぇ,うぉ,,,,,,,,,,,";W allkana+=",,,,,,,,,,ゃ,ぃ,ゅ,ぇ,ょ,";X allkana+=",,,,,,,,,,じゃ,じぃ,じゅ,じぇ,じょ";Z idx=0 repeat 20:cnt1=cnt:repeat 3:cnt2=cnt:repeat 5 getstr table_3(cnt1,cnt2,cnt), allkana, idx, ',' idx+=strsize loop:loop:loop sdim allkana,1 return



king

リンク

2008/4/21(Mon) 17:32:29|NO.15280

>皆様
いろいろアドバイスありがとうございましたm(_ _)m
是非参考にさせていただきます。



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