ノベル風のcase文で

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
polpol

ノベル風のcase文で

#1

投稿記事 by polpol » 14年前

以下のサイト→http://homepage2.nifty.com/natupaji/DxL ... m.html#N20
を参考にしてノベル風画面を作成しており
case文でcase'a'、case'a2'、case'a3'・・・という風に作っていきたいのですが
なぜかcase'a2'、case'a3'が読み込まれません。(case'a'は読みこまれます)
どうも2文字以上になると読みこまれないみたいで。。。
条件分岐等でcase文を大量に作る必要があるので
原因が分かる方よろしくお願いします

:polpol

無題

#2

投稿記事 by :polpol » 14年前

すいません。
タイトル欄と名前間違えましたw

Dixq (管理人)

Re:polpol

#3

投稿記事 by Dixq (管理人) » 14年前

'a'
は変数を表しているのではなく、文字コードを表しているんですよ。
文字というものは、「文字」で管理されているのではなく、文字を表す数字すなわち文字コードで管理されています。

試しに

char str[10]="hello";

printf("%d %d %d %d %d", str[0],str[1],str[2],str[3],str[4]);

こんな感じで文字がいくつの数字で表されているか確認して見て下さい。
詳しくは
http://e-words.jp/p/r-ascii.html

そして、シングルコーテーションで文字を囲むとその文字の文字コードが表せます。
すなわち上記場合であれば

if( str[0] == 'h' )

は真となります。

if( str[0] == 104 )

でも同じですね。
しかし、'a2'という文字コードはありません。a2を表そうとすると

char str[3] = "a2";

のように文字列に格納する必要があります。aと2は別の文字コードで表され、文字列の最後には終端記号が入ります。

ところで何故そんなにも大量なcaseが必要なのでしょう?

polpol

Re:polpol

#4

投稿記事 by polpol » 14年前

>Dixqさん

case'a'
aFlag = 1 ;
case'a2'
a2Flag = 1 ;

if(aFlag==1){
DrawGraph( 0 ,0 , map7 , FALSE ) ;
      }
if(a2Flag==1){
DrawGraph( 0 ,0 , map8 , FALSE ) ;
      }
という原始的な感じで画面遷移を作ろうと思ってるのですが
もっといい方法があるのでしょうか。。。

Dixq (管理人)

Re:polpol

#5

投稿記事 by Dixq (管理人) » 14年前

aやa2は何故その文字である必要があるのです?
switch( *** )
の *** には何が入っています?

特定の文字に達すると背景を変えるような事が行いたいのでしょうか?

softya

Re:polpol

#6

投稿記事 by softya » 14年前

画面遷移が沢山あるならテーブル化して関数ポインタを作ったほうがシンプルになります。
ただ、メッセージ量や遷移の多いものを作ろうとしているなら、もっと考えないと破綻します。

こちらを参考にするとか。
http://www.usamimi.info/~guiprog/game/
こちらのスクリプトプレーヤーを参考にしてみてください。
http://homepage2.nifty.com/natupaji/DxLib/dxsample.html

polpol

Re:polpol

#7

投稿記事 by polpol » 14年前

>Dixqさん

switch( Moji ) という感じで基本コードは上のサイトと同じになります。

char String[/url][ 256 ] =
{
"○○○○○○○○a" ,
"××××××××a2" ,
} ;
>特定の文字に達すると背景を変えるような事が行いたいのでしょうか?
はい。a2に達するとフラグを立てて画像を変えます

polpol

Re:polpol

#8

投稿記事 by polpol » 14年前

>softyaさん

サンプルがあるとは助かります。
ちょっとダウンロードしてみます。

polpol

Re:polpol

#9

投稿記事 by polpol » 14年前

char String[/url][ 256 ] =
{
"○○○○○○○○100" ,
"××××××××101" ,
} ;
switch( Moji )
{
case 100;
case 101;
}
というようにできないでしょうか
式が整数なのでできると思うのですが

パコネコ

Re:polpol

#10

投稿記事 by パコネコ » 14年前

失礼します。
Mojiは整数型なのでしょうか?

上にある宣言との関係もいまいちわからなくて…

上のサイト行ってみましたが全部読むのは骨が折れそうで・・・
どこに宣言あるかだけでもいいですが・・・
(もしくは役割)

それと私の想像道理の場合↓
void main(void){
printf("%d",'1');
}
これの結果が「1」だと思ってないでしょうか?
勘違いの場合すいませんが…

ちなみに
void main(void){
printf("%d",'1'-'0');
}
これが結果「1」です。
========
勘違いの場合は本当に申し訳ないです。
すいません。 画像

polpol

Re:polpol

#11

投稿記事 by polpol » 14年前

>ハバネコさん

Mojiはchar型になります

char型は文字コードとして認識されて
case文を多く作るのは難しいという事でしょうか

>これの結果が「1」だと思ってないでしょうか?
そうですね。実際文字コードとかよく分からない部分があるので
実際に例を書いてもらうとありがたいです。

char String[/url][ 256 ] =
{
"○○○○○○○○100" ,
"××××××××101" ,
} ;
switch( Moji )
{
case 100;
case 101;
}

パコネコ

Re:polpol

#12

投稿記事 by パコネコ » 14年前

#include<stdio.h>
int main(void){
int a;

printf("\n");
for(a=33;a<57+33;a++){
printf("%d::%c\t",a+57*0,a+57*0);
printf("%d::%c\t",a+57*1,a+57*1);
printf("%d::%c\t",a+57*2,a+57*2);
printf("%d::%c\n",a+57*3,a+57*3);
}

}
これなんてどうでしょうか?
文字コードが出るようにしたつもりですが…

それとMojiが一文字ならcase 'a'などでいいのではないでしょうか?
2文字なら判定の前に数字に直すようにするべきです。

もう一度聞きますが、
数字と数値の違いはわかりますか?

========
一応intに変更しておきました。 画像

Dixq (管理人)

Re:polpol

#13

投稿記事 by Dixq (管理人) » 14年前

> polpolさん

文字コードについて私が上で書いたコメントとリンクはご覧になりました?

> パコネコさん

パコネコさんが期待する出力結果は127までじゃないでしょうか?
後void mainの書き出しは正しくないと指摘される場合があるので、int mainの方が良いようです。

polpol

Re:polpol

#14

投稿記事 by polpol » 14年前

> パコネコさん
返答ありがとうございます
printf("\n");
for(a=33;a<57+33;a++){
printf("%d::%c\t",a+57*0,a+57*0);
printf("%d::%c\t",a+57*1,a+57*1);
printf("%d::%c\t",a+57*2,a+57*2);
printf("%d::%c\n",a+57*3,a+57*3);
}
というコードを通すと文字コードが自動変換されるのですね
ちょっと試してみます
> 数字と数値の違いはわかりますか?
初心者なのでよく分かりません^^;

>Dixqさん

失礼しました。
上で書いたリンクを参考に
例えば9の文字コードは57で
以下のように書いたらうまく読み込んだのですが

char String[/url][ 256 ] =
{
"○○○○○○○○9" ,

} ;
switch( Moji )
{
case 57;
}
ただその後のa2をcaseに書く場合char str[3] = "a2"; を
どのように上のコードに組み込むのかがよく分かりませんでした

Dixq (管理人)

Re:polpol

#15

投稿記事 by Dixq (管理人) » 14年前

出来ますが、果たしてそのようなデータ管理が適切なんでしょうか・・。
最初は学習が面倒かもしれませんが、softyaさんが示してくださったリンク先を読むなどして、
サウンドノベルの設計についてきちんと学んだ上で設計した方が後々楽だと思いますよ。

それでも我流が良いという事でしたら・・。

文字列のデータを数値に変換する時はatoi等を使います。
例えば
文字列で表現した「12」はintの「12」とは違います。
文字コードが 49 50 と並んでいるデータ配列になっています。
これを12にするにはどうしたらいいかというと

int a;
char str[3]="12";
a = atoi(str);

このようにすると文字列である12がint型の12になります。
パコネコさんも仰っているように、1は0より文字コードが1つ大きい事を利用して変換出来ます。

'1'-'0'は数値として1です。同様に'2'-'0'は2ですね。
'1'-'0'を10倍して'2'-'0'を足すとatoi関数は無くても計算出来ます。

まず文字は文字コードで管理されているという事をしっかり理解する為に、
「文字列を受け取ったらint型の数値で返す関数」を自作すると良く解ると思います。

パコネコ

Re:polpol

#16

投稿記事 by パコネコ » 14年前

きれいな形ではないですが、
全部タイプ分けするなら…
switch(Moji[0]){
case 'a':
switch(Moji[1]){
case '9'://処理
}
break;
}
こういうことでもやりたいことはできると思います。
もっといい方法もあるとは思いますが…すぐには思いつかなかったので、
とりあえず一つの方法ではあります。
ただしaaaというように桁数が増えるなら数値※に変換したほうがいいですね。

'9'が9ではなく57?であることはわかっていらっしゃるようなので、
数字と数値の違いはもうわかっているようですね。
文字データとしての数は「数字」書いて字のごとく数の字ですね。
計算などに使うような「数値」はこれもそのまま数の値です。
間違ったことはいってないと思いますが、
いつか「ちゃんとした人」に勉強させてもらっていたほうがいいです。
(必ず’9’は57ともいえませんが…)
if(9=='9'-'0')
は成り立ちます。

※編集しました

polpol

Re:polpol

#17

投稿記事 by polpol » 14年前

>Dixqさん
なるほど。本格的に作るならsoftyaさんが示してくださったリンク先
を学んだほうがいいのですね。
ちょっと分からない所があって折れたんですがもう一度やってみます。

>果たしてそのようなデータ管理が適切なんでしょうか・・
確かにcase文に入れる文字をいちいち変換して読み込ませるのは
回りくどいというか効率が悪そうですね・・・
でも一度教えてくださったatoi関数というので色々といじってみます


> パコネコさん
> ただしaaaというように桁数が増えるなら数値※に変換したほうが
そうですね。Dixqさんの関数化して数値を返すようにすればいいのですね
ヒントを頂いたので作りやすいと思います。

なんとなく分かってきたので一旦解決ということにします
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る