|
|
2008/4/17(Thu) 20:22:51|NO.15179
こんばんは。早速ですが質問です。
今タイピングゲームを作ろうとしているのですが
例えば『ZIKAN』と『JIKAN』ZとJどちらも入力
しても成功と判断させるにはどうすれば良いのでしょうか?
その他には『janken』や『jyanken』など
|
|
2008/4/17(Thu) 20:38:07|NO.15181
switch〜case文を使えばいいんじゃないですか?
|
|
2008/4/18(Fri) 16:53:43|NO.15193
・・・。
むしろ、出題の方をプレイヤの環境に合わせて変更するべきでね?
|
|
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などで処理していくといいかもしれません。
|
|
2008/4/18(Fri) 23:18:04|NO.15201
逆に質問をします。
お手本となるデータを、おそらく文字列変数か何かに代入しているかと思うのですが
その内容は ローマ字 ですか?それとも、 ひらがなやカタカナ ですか?
そして、ユーザーにはどのような表示を見せますか?
|
|
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

| |
|
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
長々と失礼。

| |
|
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

| |
|
2008/4/21(Mon) 17:32:29|NO.15280
>皆様
いろいろアドバイスありがとうございましたm(_ _)m
是非参考にさせていただきます。
|
|