ページ 11

if文がうまく動かない

Posted: 2013年1月31日(木) 04:49
by アグルス
初めまして。プログラミング初心者の者です。
C++,DXライブラリに関しては文字通り初心者です。苦しんで覚えるC言語や新・C言語の館をサッと読んだ程度のレベルです。
Windows7,C++2010,DXライブラリでミニゲームを製作しているのですが、if文の挙動がどうしてもうまくいかないので書き込ませてもらいました
作りたいと考えていたものは時限爆弾処理ゲームみたいなもので、ABCのキーに対応したコードを順に切っていくものです。
時間制限制で、いくつの爆弾を時間内に解体できるか?という内容です。

いくつかの問題パターンを想定しており、A→B→Cの順で切るパターンのAのコードを切るときの動きを作りました。
Aボタンを押し、その後Bボタンを押さなければならない状況になったとき、押し続けられた状態になっているとBボタンを押さなくてはならないのにAボタンを押していることになり、問題を間違えたことになってしまうので押し続け判定を作りました。

挙動としては、
何も押されていない→タイムが減る(timec();)
Aボタン(正答)が押されている→報償としてスコアとタイムを増やす(scorep();とtimep();)、キーが押し続けられている判定をONにする
それら以外のキー(誤答)が押されている→ペナルティによりスコアとタイムを減らす(scorem();とtime();)
何等かのキーが押し続けられている→タイムが減る(timec();)

しかし、Aボタンを押すだけのif文でも問題が出てしまいました。
テストのために正答のスコアを+1000、誤答のスコアを-15000にしているのですが、Aボタンを押したときスコアの動きが「+1000」か「-14000」になってしまうのです。
(なぜか-14000のほうが多く、lv関連(次の問題にいく操作)を無くしたところ、押し続けるとスコアが増加、連打するとスコアが減少するのを確認しました)

想定している動きは、Aボタンを押せば「+1000」のスコアだけが出ることです。
何度か見直しましたが、原因がわかりませんでした…。以下if文のコードです。
どのように直したらいいか、そして何が原因かご教授願いたいです。

コード:

	if(lv==0)//Aを切る
	{								//1.レベルは0か?
		if(Key[KEY_INPUT_A]>=1)		//2.正答のキーは押されているか?
		{							//押されているので
			scorep();				//スコアプラス
			timep();				//タイムプラス
			osaretsuduke=1;			//押され続け判定設置
			lv=1;					//Bを切るのに移る
		}							
		else						//押されていないので
		{							
			if(CheckHitKeyAll()==0)	//3.何等かのキーは押されているか?
			{						//押されていないので
				timec();			//タイム減少
				osaretsuduke=0;		//押され続け判定解除
			}						
			else					//押されているので
			{						
				if(osaretsuduke==1)	//4.何等かのキーは押され続けているか?
				{					//押され続けているので
					timec();		//タイム現象
				}					
				else				//押され続けていないので
				{					
					scorem();		//スコアマイナス
					timem();		//タイムマイナス
					osaretsuduke=1;	//押され続け判定設置
				}					
			}						
		}							
	}								
	else							//レベルは0でないので
	{
		if(lv==1)                               //以降、Bを切るのに移る
		{}
		else
		{}
また、スコアとタイムの管理をしている関数はこうなっています

コード:

int ptimes=50;
int ltimes=100;
int times=1000;
int pscore=1000;
int lscore=15000;
//ポイント関連関数//
int scorep()
{
	score=score+pscore;
	return 0;
}

int scorem()
{
	score=score-lscore;
	return 0;
}
//ポイント関連関数//
//時間関連関数//
int timep()
{
	times=times+ptimes;
	return 0;
}
int timem()
{
	times=times-ltimes;
	return 0;
}
int timec()
{
	times=times-1;
	return 0;
}


Re: if文がうまく動かない

Posted: 2013年1月31日(木) 08:18
by Priest
下記URLのページの後半についての実装が行われていると仮定します。
http://dixq.net/g/02_09.html

コード:

if(Key[KEY_INPUT_A]>=1)     //2.正答のキーは押されているか?

コード:

if(Key[KEY_INPUT_A]==1)     //2.正答のキーは押されているか?
こうしてください。

配列Keyには、そのキーの入力されたフレーム数が入ります。
前者だと押され続けている間、if文内の処理が実行されます。
後者だと、押された次のフレームでのみ処理が実行されます。
後者ですと、それ以降の押しっぱなし判定を気にする必要が無くなります。

コード:

    if(lv==0)//Aを切る
    {                               //1.レベルは0か?
        if(Key[KEY_INPUT_A]==1)     //2.正答のキーは押されているか?
        { 
            scorep();               //スコアプラス
            timep();                //タイムプラス
            lv=1;                   //Bを切るのに移る
        }                           
        else  if(Key[KEY_INPUT_B]==1||Key[KEY_INPUT_C]==1) // 誤答のキーが押されているか?
        {                                                 
            scorem();  //スコアマイナス
            timem();  //タイムマイナス
        } 
    timec();  //タイム減少 
    }
こんな感じになると思います!

Re: if文がうまく動かない

Posted: 2013年2月03日(日) 17:31
by アグルス
>Priestさん
返事遅くなってすいません、インフルでダウンしてました;
教えてもらったコードを試してみたところ、その通り動きました!
なるほど…==を使えばうまいこといくんですね。コードもシンプルで勉強になりました。ありがとうございます。m(_ _)m