ページ 1 / 1
switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年7月30日(月) 22:45
by 3453
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;
}
}
こういうふうに文字を表示させようと思っています。
すると、あいこの場合はちゃんと「あいこ」だけで表示されるのですが、
勝ちと負けの場合にあいこの表示が重なって表示されてしまうのです。
これはどういう原因でなってしまっているのでしょうか?
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年7月30日(月) 22:51
by h2so5
break;を忘れています
というより、break;の位置がおかしいです。
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年7月31日(火) 09:23
by softya(ソフト屋)
マルチポストですので、フォーラムルールに則って相互リンクをお願いします。
http://dixq.net/board/board.html
「C++のDxlibを使い文字を表示させていたら、文字がかぶってしまうのですが - Yahoo!知恵袋」
http://detail.chiebukuro.yahoo.co.jp/qa ... 1491542914
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年7月31日(火) 10:27
by 3453
マルチポストのことを忘れていました;
yahoo知恵袋↓
http://detail.chiebukuro.yahoo.co.jp/qa ... ert_newans
現在知恵袋に書かれているように、
case24: case25: のすぐ上にbreak;を挿入してしまうと
単独で表示はされるのですが、ループが終わってしまってキー入力ができないんです。
それと、h2so5さんのいうようにbreak;の位置が違うっぽいのでひたすら位置を変えてみたのですが、
なかなかうまくいきませんでした;
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年7月31日(火) 10:55
by softya(ソフト屋)
申し訳ないですが現状は相互リンクになっていないんです。
知恵袋側には、こちらで質問していることが書かれていませんのでルール違反に成るため返信ができません。
この状態で出来ることといえば、知恵袋でベストアンサーを決めて別質問を相互リンク状態で作ることぐらいでしょうか。
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年7月31日(火) 13:08
by 3453
追記の時にURLを入れ忘れてしまいました。
知恵袋の方は質問を取り消しました。
これで大丈夫でしょうか?
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年7月31日(火) 13:22
by softya(ソフト屋)
3453 さんが書きました:追記の時にURLを入れ忘れてしまいました。
知恵袋の方は質問を取り消しました。
これで大丈夫でしょうか?
なんらかの返答が書かれていた場合は、回答者に大変失礼ですのでなるべくそういう事は避けて下さい。
今後を付けて頂ければ幸いです。
基本的なここのルールも回答者に失礼の無くお互いに気持ちよく出来たらなという主旨となっております。
で、基本的な仕組みとしてswitch文のbreakの役割とbreak文が無かった時の動作を説明してみてもらえますか?
そこら辺の理解があやふやだと思われます。
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年7月31日(火) 20:30
by 3453
マルチポストの件大変失礼しました m(_ _)m
switch文でのbreakはswitchを抜けて、
それ以降のプログラムをやらせるんですよね?
case 22~25までのbreakがなかった場合は、
case 22~25がずっとループしている状態になってしまいました。
breakを入れていないからcase 25をずっとループさせてしまっているのでしょうか。
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年7月31日(火) 20:35
by softya(ソフト屋)
3453 さんが書きました:
switch文でのbreakはswitchを抜けて、
それ以降のプログラムをやらせるんですよね?
それではswitch文のbreakの説明としては中途半端ですので、そこが知識として怪しいです。
①break;を実行するとプログラムは次は何処を実行するのでしょうか?
②もしbreak;がなかった場合はcase文の流れはどうなるのでしょうか?
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年7月31日(火) 20:58
by box
下のコードがどういう動きをするか、プログラムを実行させずにまず考えてみてください。
その後、実際に動かしてみて、予想と一致したかどうかを確認してください。
コード:
#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;
}
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年7月31日(火) 21:47
by 3453
1.
次のcaseに飛ばすんですよね?
2.
case 0から順に動作していく?
思ったのですが、
switch文をいくつか作って分けてほうが
こういうことは起きにくいのですかね?
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年7月31日(火) 21:55
by softya(ソフト屋)
>次のcaseに飛ばすんですよね?
いえ、違います。
>case 0から順に動作していく?
それも違います。
まず、ココをよく読んでみて下さい。ホントは入門書で勉強してもらいたいですが。
「番号による場合分け」
http://9cguide.appspot.com/08-03.html
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年7月31日(火) 21:59
by box
3453 さんが書きました:1.
次のcaseに飛ばすんですよね?
2.
case 0から順に動作していく?
くだんのコードを実際に動かすと、数行分出力します。正確な行数は、あえて書きません。
何行目に何を出力するか、まずは予想してみてください。
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年7月31日(火) 22:23
by 3453
URL見ました。
1.処理を止める
2.case同士がつながる
ってことですか。
今回の症状はワンポイントの
「この例のように、break文を除けばcaseをつなげられるのですが、
逆に言えば、break文を忘れると関係ないcaseがつながってしまうのです。
つなげたくない場合にうっかりbreak文を忘れないように。」
が関連してるのですよね?
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年7月31日(火) 22:28
by softya(ソフト屋)
3453 さんが書きました:URL見ました。
1.処理を止める
2.case同士がつながる
ってことですか。
今回の症状はワンポイントの
「この例のように、break文を除けばcaseをつなげられるのですが、
逆に言えば、break文を忘れると関係ないcaseがつながってしまうのです。
つなげたくない場合にうっかりbreak文を忘れないように。」
が関連してるのですよね?
処理を止めるは語弊があるのでswitchブロックを抜けると言うことです。
今回の問題は、そのとおりでワンポイントに書かれている通りの問題ですね。
これらを踏まえてboxさんの問題に挑戦してみて下さい。
実行せずまず予想を書いてみましょう。
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年8月06日(月) 22:13
by 3453
返信が遅れて申し訳ありません;
最近忙しくて返信する機会がありませんでした;
boxさんの問題の予想は、
for内のswitchのcase0,1,2を4回ループさせる。
switch内は、
まず最初に0が表示され、
iが1のときに1と表示され、forのループを抜け、
iが2のときに2と表示され、nが123の時のみforのループを抜ける。
そして、case3で3と表示され、switch処理を抜けて、終了。
という流れでしょうか?
返信はまた遅くなるかもしれませんがよろしくです。
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年8月06日(月) 22:19
by box
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) はどういう動きをするのか、
よ~く考えてみてください。
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年8月07日(火) 03:12
by 3453
「
0
1 (i = 0)
1 (i = 1)
2
3 (i = 2)
3 (i = 3)
」
と表示されると思うのですが。
どうなんでしょうか?
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年8月07日(火) 03:19
by box
break;
の有無によってswitch文がどういう動きをするか、理解できたと思います。
さて、質問者さんのコードでは、思ったとおりにbreakできているでしょうか。
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年8月19日(日) 18:43
by 3453
返信が遅れて申し訳ありません。
大学受験なもので・・・。
コード:
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文を置けばいいのでしょうか?
でもそれでは全部の画面で通用してしまうのでなんかしらフラグを作ったほうがいいのでしょうか?
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年8月19日(日) 18:55
by box
3453 さんが書きました:返信が遅れて申し訳ありません。
大学受験なもので・・・。
プログラミングは来春までお預けにした方がよさそうです。
じゃんけんゲームを作ることと大学受験と、質問者さんの将来にとって
どちらが大事であるかは私ごときがいうまでもないことだと思います。
Re: switch文を使って文字を表示させていたら重なってしまうのですが
Posted: 2012年8月19日(日) 19:21
by 3453
そうですね・・。
わかりました。
しばらくプログラミングはおやすみにしようと思います。
アドバイスしてくださったみなさま本当にありがとうございました!
受験が終わったらまた質問しにくるかもしれないので、その時はまたよろしくお願いします。