switch文を使って文字を表示させていたら重なってしまうのですが

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

switch文を使って文字を表示させていたら重なってしまうのですが

#1

投稿記事 by 3453 » 13年前

dxlibでswitch文を主体にジャンケンを作っています。

コード:

		case 21:{
				//キーボード取得	
				Keyboard_Update();

				player = 0;
				enemy = 0;
				put = 0;
				
				DrawString( 250 , 180 , "どうする? 左チョキ 上グー 右パー" , white );
				
				if( Keyboard_Get ( KEY_INPUT_UP ) == 1 ){
					player = 1;
					put = 1;
					}
				if( Keyboard_Get ( KEY_INPUT_RIGHT ) == 1 ){ 
					player = 2;
					put = 1;
					}
				if( Keyboard_Get ( KEY_INPUT_LEFT ) == 1 ){ 
					player = 3;
					put = 1;
					}
		
				enemy = rand() % 3 + 1 ;

				}

		case 22:{

			if(put == 1){
				if(player == enemy){
					swc = 25;
				
				}else if(player == 1 && enemy == 2){
					swc = 23;
				
				}else if(player == 2 && enemy == 3){
					swc = 23;

				}else if(player == 3 && enemy == 1){
					swc = 23;

				}else {
					swc = 24;
				}
			}

			break;
				

				}
という感じで分岐させています。

そして勝ち負けの判定を文字で表そうとしているのですが、
その文字がかさなって表示されてしまうのです。

コード:


		case 23:{
				DrawString( 250 , 180 , "勝ち   PUSH Z" , white );
				
				//タイトル画面移行
				if(Keyboard_Get ( KEY_INPUT_Z ) > 0){
					swc = 0 ;
				break;
				}
				
				}

		case 24:{
				DrawString( 250 , 180 , "負け   PUSH Z" , white );
				
				//タイトル画面移行
				if(Keyboard_Get ( KEY_INPUT_Z ) > 0){
					swc = 0 ;
				break;
				}
				
				}

		case 25:{
				DrawString( 250 , 180 , "あいこ   PUSH Z" , white );
				
				//タイトル画面移行
				if(Keyboard_Get ( KEY_INPUT_Z ) > 0){
					swc = 21 ;
				break;
				}
				}
こういうふうに文字を表示させようと思っています。

すると、あいこの場合はちゃんと「あいこ」だけで表示されるのですが、
勝ちと負けの場合にあいこの表示が重なって表示されてしまうのです。

これはどういう原因でなってしまっているのでしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#2

投稿記事 by h2so5 » 13年前

break;を忘れています
というより、break;の位置がおかしいです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#3

投稿記事 by softya(ソフト屋) » 13年前

マルチポストですので、フォーラムルールに則って相互リンクをお願いします。
http://dixq.net/board/board.html

「C++のDxlibを使い文字を表示させていたら、文字がかぶってしまうのですが - Yahoo!知恵袋」
http://detail.chiebukuro.yahoo.co.jp/qa ... 1491542914
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

3453

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#4

投稿記事 by 3453 » 13年前

マルチポストのことを忘れていました;

yahoo知恵袋↓
http://detail.chiebukuro.yahoo.co.jp/qa ... ert_newans

現在知恵袋に書かれているように、
case24: case25: のすぐ上にbreak;を挿入してしまうと
単独で表示はされるのですが、ループが終わってしまってキー入力ができないんです。

それと、h2so5さんのいうようにbreak;の位置が違うっぽいのでひたすら位置を変えてみたのですが、
なかなかうまくいきませんでした;

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#5

投稿記事 by softya(ソフト屋) » 13年前

申し訳ないですが現状は相互リンクになっていないんです。
知恵袋側には、こちらで質問していることが書かれていませんのでルール違反に成るため返信ができません。
この状態で出来ることといえば、知恵袋でベストアンサーを決めて別質問を相互リンク状態で作ることぐらいでしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

3453

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#6

投稿記事 by 3453 » 13年前

追記の時にURLを入れ忘れてしまいました。
知恵袋の方は質問を取り消しました。
これで大丈夫でしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#7

投稿記事 by softya(ソフト屋) » 13年前

3453 さんが書きました:追記の時にURLを入れ忘れてしまいました。
知恵袋の方は質問を取り消しました。
これで大丈夫でしょうか?
なんらかの返答が書かれていた場合は、回答者に大変失礼ですのでなるべくそういう事は避けて下さい。
今後を付けて頂ければ幸いです。
基本的なここのルールも回答者に失礼の無くお互いに気持ちよく出来たらなという主旨となっております。

で、基本的な仕組みとしてswitch文のbreakの役割とbreak文が無かった時の動作を説明してみてもらえますか?
そこら辺の理解があやふやだと思われます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

3453

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#8

投稿記事 by 3453 » 13年前

マルチポストの件大変失礼しました m(_ _)m

switch文でのbreakはswitchを抜けて、
それ以降のプログラムをやらせるんですよね?

case 22~25までのbreakがなかった場合は、
case 22~25がずっとループしている状態になってしまいました。
breakを入れていないからcase 25をずっとループさせてしまっているのでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#9

投稿記事 by softya(ソフト屋) » 13年前

3453 さんが書きました: switch文でのbreakはswitchを抜けて、
それ以降のプログラムをやらせるんですよね?
それではswitch文のbreakの説明としては中途半端ですので、そこが知識として怪しいです。
①break;を実行するとプログラムは次は何処を実行するのでしょうか?
②もしbreak;がなかった場合はcase文の流れはどうなるのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

box
記事: 2002
登録日時: 15年前

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#10

投稿記事 by box » 13年前

下のコードがどういう動きをするか、プログラムを実行させずにまず考えてみてください。
その後、実際に動かしてみて、予想と一致したかどうかを確認してください。

コード:

#include <stdio.h>

int main(void)
{
    int n = 100, i;

    for (i = 0; i < 4; i++) {
        switch (i) {
        case 0:
            printf("0\n");
        case 1:
            printf("1\n");
            break;
        case 2:
            printf("2\n");
            if (n == 123) {
                break;
            }
        case 3:
            printf("3\n");
            break;
        default:
            break;
        }
    }
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

3453

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#11

投稿記事 by 3453 » 13年前

1.
次のcaseに飛ばすんですよね?
2.
case 0から順に動作していく?

思ったのですが、
switch文をいくつか作って分けてほうが
こういうことは起きにくいのですかね?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#12

投稿記事 by softya(ソフト屋) » 13年前

>次のcaseに飛ばすんですよね?
いえ、違います。
>case 0から順に動作していく?
それも違います。

まず、ココをよく読んでみて下さい。ホントは入門書で勉強してもらいたいですが。
「番号による場合分け」
http://9cguide.appspot.com/08-03.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

box
記事: 2002
登録日時: 15年前

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#13

投稿記事 by box » 13年前

3453 さんが書きました:1.
次のcaseに飛ばすんですよね?
2.
case 0から順に動作していく?
くだんのコードを実際に動かすと、数行分出力します。正確な行数は、あえて書きません。
何行目に何を出力するか、まずは予想してみてください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

3453

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#14

投稿記事 by 3453 » 13年前

URL見ました。

1.処理を止める
2.case同士がつながる
ってことですか。


今回の症状はワンポイントの

「この例のように、break文を除けばcaseをつなげられるのですが、
逆に言えば、break文を忘れると関係ないcaseがつながってしまうのです。
つなげたくない場合にうっかりbreak文を忘れないように。」

が関連してるのですよね?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#15

投稿記事 by softya(ソフト屋) » 13年前

3453 さんが書きました:URL見ました。

1.処理を止める
2.case同士がつながる
ってことですか。


今回の症状はワンポイントの

「この例のように、break文を除けばcaseをつなげられるのですが、
逆に言えば、break文を忘れると関係ないcaseがつながってしまうのです。
つなげたくない場合にうっかりbreak文を忘れないように。」

が関連してるのですよね?
処理を止めるは語弊があるのでswitchブロックを抜けると言うことです。
今回の問題は、そのとおりでワンポイントに書かれている通りの問題ですね。

これらを踏まえてboxさんの問題に挑戦してみて下さい。
実行せずまず予想を書いてみましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

3453

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#16

投稿記事 by 3453 » 13年前

返信が遅れて申し訳ありません;
最近忙しくて返信する機会がありませんでした;

boxさんの問題の予想は、

for内のswitchのcase0,1,2を4回ループさせる。
switch内は、
まず最初に0が表示され、
iが1のときに1と表示され、forのループを抜け、
iが2のときに2と表示され、nが123の時のみforのループを抜ける。
そして、case3で3と表示され、switch処理を抜けて、終了。

という流れでしょうか?

返信はまた遅くなるかもしれませんがよろしくです。

box
記事: 2002
登録日時: 15年前

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#17

投稿記事 by box » 13年前

3453 さんが書きました: for内のswitchのcase0,1,2を4回ループさせる。
ループを回る回数は、変数 i で制御しているとおり、4回です。
その4回のループの中で、0、1、2、3をどのように出力しますか?という問いです。
i が0のとき、switch (i) はどういう動きをするのか、
i が1のとき、switch (i) はどういう動きをするのか、
i が2のとき、switch (i) はどういう動きをするのか、
i が3のとき、switch (i) はどういう動きをするのか、
よ~く考えてみてください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

3453

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#18

投稿記事 by 3453 » 13年前


0
1 (i = 0)
1 (i = 1)
2
3 (i = 2)
3 (i = 3)


と表示されると思うのですが。
どうなんでしょうか?

box
記事: 2002
登録日時: 15年前

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#19

投稿記事 by box » 13年前

break;
の有無によってswitch文がどういう動きをするか、理解できたと思います。
さて、質問者さんのコードでは、思ったとおりにbreakできているでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

3453

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#20

投稿記事 by 3453 » 13年前

返信が遅れて申し訳ありません。
大学受験なもので・・・。

コード:

		case 23:{
				DrawString( 250 , 180 , "勝ち   PUSH Z" , white );
				//タイトル画面移行
				if(Keyboard_Get ( KEY_INPUT_Z ) > 0){
					swc = 0 ;
				}
				}
				break;

		case 24:{
				DrawString( 250 , 180 , "負け   PUSH Z" , white );
				//タイトル画面移行
				if(Keyboard_Get ( KEY_INPUT_Z ) > 0){
					swc = 0 ;
				}
				}
				break;

		case 25:{
				DrawString( 250 , 180 , "あいこ   PUSH Z" , white );

				if(Keyboard_Get ( KEY_INPUT_Z ) > 0){
					swc = 21 ;
				}
				}
				break;
というふうに書いてみました。

こうすることで文字は重ならずに表示されたのですが、
ifを通り越してしまいます。
こういうときはswitchの外にif文を置けばいいのでしょうか?
でもそれでは全部の画面で通用してしまうのでなんかしらフラグを作ったほうがいいのでしょうか?

box
記事: 2002
登録日時: 15年前

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#21

投稿記事 by box » 13年前

3453 さんが書きました:返信が遅れて申し訳ありません。
大学受験なもので・・・。
プログラミングは来春までお預けにした方がよさそうです。
じゃんけんゲームを作ることと大学受験と、質問者さんの将来にとって
どちらが大事であるかは私ごときがいうまでもないことだと思います。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

3453

Re: switch文を使って文字を表示させていたら重なってしまうのですが

#22

投稿記事 by 3453 » 13年前

そうですね・・。

わかりました。
しばらくプログラミングはおやすみにしようと思います。

アドバイスしてくださったみなさま本当にありがとうございました!

受験が終わったらまた質問しにくるかもしれないので、その時はまたよろしくお願いします。

閉鎖

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