変数を一度数が変わったら固定したいです

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
エルフ
記事: 79
登録日時: 11年前
住所: 埼玉

変数を一度数が変わったら固定したいです

#1

投稿記事 by エルフ » 10年前

簡単なテキストアドベンチャーゲームを作っているのですが、一度道を選んでも、道を選び直せてしまいます。
どういう事かというと、AとBの道があり、キー1を押すと変数aが1になり、Aの道に進むのですが、その後キー2を押したら変数aが2になってしまい、Bの道に変わってしまいます。
これを防ぐために、変数が一度変わったら固定できるようにしたいんですが、可能でしょうか。
不可能 または難しいなら、可能でなるべく簡単な方法を教えて下さい。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
	ProcessMessage();
	int a = 0;
	int b = 0;
	int c = 0;
	int d = 0;
	int e = 0;
	int f = 0;

	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 )
	{

		DrawFormatString( 0, 0, GetColor(255,255,255), "気付いたらあなたは白い部屋の中にいた。");
		DrawFormatString( 0, 20, GetColor(255,255,255), "目の前には扉があるが開かない。窓もない。扉には北と書いてある。");
		DrawFormatString( 0, 40, GetColor(255,255,255), "地面にはリンゴが一つ落ちている。食べますか?");
		DrawFormatString( 0, 60, GetColor(255,255,255), "1で食べる 2で食べない");
		if( CheckHitKey(KEY_INPUT_2 ))
		{
			a = 2;
		}
		if( a == 2 )
		{
			//食べない
			DrawFormatString( 0, 80, GetColor(255,255,255),"リンゴを拾ってみると地面には「生まれる太陽に死を」と書かれていた。");
			DrawFormatString( 0, 100, GetColor(255,255,255),"後ろには何もない。");
			DrawFormatString( 0, 120, GetColor(255,255,255),"左右どちらに行って調べる?");
			DrawFormatString( 0, 140, GetColor(255,255,255),"3で左 4で右");
			if( CheckHitKey(KEY_INPUT_3 ))
			{
				b = 1;
			}
			if( b == 1 )
			{
				//左
				DrawFormatString( 0, 160, GetColor(255,255,255),"左に進むと宝箱を見つけた。");
				DrawFormatString( 0, 180, GetColor(255,255,255),"宝箱に「扉は0=360 僕は?」と書かれている。");
				DrawFormatString( 0, 200, GetColor(255,255,255),"宝箱には鍵がかかっている。");
				DrawFormatString( 0, 220, GetColor(255,255,255),"宝箱のパスワードは?");

				if( d == 3 && e == 6 && f == 0 )
				{
					c = 1;
				}
				if( c == 1 )
				{
					//正解
					DrawFormatString( 0, 240, GetColor(255,255,255),"宝箱が開き、中には鍵が入っていた。");
					DrawFormatString( 0, 260, GetColor(255,255,255),"鍵を使って扉を開け、あなたは脱出した。~END~");
					DrawFormatString( 0, 280, GetColor(255,255,255),"0キーで終了します。");
					if( CheckHitKey(KEY_INPUT_0 ))
					{
						break;
					}
				}

				else
				{
					c = 2;
				}
				if( c == 2 )
				{
					//ハズレ
					DrawFormatString( 0, 240, GetColor(255,255,255),"パスワードが間違っていたようだ。");
					DrawFormatString( 0, 260, GetColor(255,255,255),"天井から何かが降って来てあなたは死んだ。~GAME OVER~");
					DrawFormatString( 0, 280, GetColor(255,255,255),"0キーで終了します。");
					if( CheckHitKey(KEY_INPUT_0 ))
					{
						break;
					}
				}
			}
			else if( CheckHitKey(KEY_INPUT_4 ))
			{
				b = 2;
			}
			if ( b == 2 )
			{
				//右
				DrawFormatString( 0, 160, GetColor(255,255,255),"右に進むとあなたは落とし穴に落ちてしまった。~GAME OVER~");
				DrawFormatString( 0, 180, GetColor(255,255,255),"0キーで終了します。");
				if( CheckHitKey(KEY_INPUT_0 ))
				{
					break;
				}
			}
		}
		else if( CheckHitKey(KEY_INPUT_1 ))
		{
			a = 1;
		}
		if( a == 1 )
		{
			//食べる
			DrawFormatString( 0, 80, GetColor(255,255,255), "リンゴには毒が入っていてあなたは死んでしまった。~GAME OVER~");
			DrawFormatString( 0, 100, GetColor(255,255,255), "0キーで終了します。");
			if( CheckHitKey(KEY_INPUT_0 ))
			{
				break;	
			}
		}
	}

	DxLib_End();
	return 0;
}

north

Re: 変数を一度数が変わったら固定したいです

#2

投稿記事 by north » 10年前

とりあえず試していないので恐らくですが、コードを見る限り毎回キー1かキー2が押されたかのチェックが行われているため、
Aの道に進んだ後もまた、キー1かキー2が押されたかのチェックがされ、その為キー2を押すとBの道が表示されてしまうのだと思われます。
解決法方法としてはフラグを立てるのが一番簡単な方法だと思います。
たとえばFirstCheckFlagという変数を最初に作成しておき、キー1が押されたのかキー2が押されたのかチェックしているif文に
このフラグがfalseかどうかの判定も付け加え、それでキー1かキー2が押されましたらこのフラグをtrueにしてしまい、
条件分に当てはまらないようにしてしまうのが一番早くて簡単な方法だと思います。
間違っていたら申し訳ありません。

セネ
記事: 2
登録日時: 10年前

Re: 変数を一度数が変わったら固定したいです

#3

投稿記事 by セネ » 10年前

north様の言うように1シーン目のCheckHitKey(KEY_INPUT_ )で毎回キー押下判定がなされているようです。

フラグの変数で2回以上判定しないようにすることも可能ですが、毎回if文で条件分岐をするとシーン管理が大変になるので、
Stateパターンでシーンの切り替えをしてはいかがでしょうか?

コード:

int scene = 1;

while( scene > 0 ){
   switch( scene ){
   case 1:
      // シーン1処理
      break;
   case 2:
      // シーン2処理
      break;
   }
}
みたいな感じで、scene変数の値でシーンを変更すると管理が楽になります。

アバター
エルフ
記事: 79
登録日時: 11年前
住所: 埼玉

Re: 変数を一度数が変わったら固定したいです

#4

投稿記事 by エルフ » 10年前

ごめんなさい
知識が無さすぎて、おっしゃることの意味はわかったのですが、それをソースに書けませんでした・・・
ですが、無理やりな方法で事故解決しました
すみませんでした・・・

ありがとうございました。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
	ProcessMessage();
	int a = 0;
	int b = 0;
	int c = 0;
	int d = 0;
	int e = 0;
	int f = 0;

	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 )
	{
		DrawFormatString( 0, 0, GetColor(255,255,255), "気付いたらあなたは白い部屋の中にいた。");
		DrawFormatString( 0, 20, GetColor(255,255,255), "目の前には扉があるが開かない。窓もない。扉には北と書いてある。");
		DrawFormatString( 0, 40, GetColor(255,255,255), "地面にはリンゴが一つ落ちている。食べますか?");
		DrawFormatString( 0, 60, GetColor(255,255,255), "1で食べる 2で食べない");
		if( CheckHitKey(KEY_INPUT_2 ))
		{
			if( a == 0 )
			{

			a = 2;
		}
		}
		if( a == 2 )
		{
			//食べない
			DrawFormatString( 0, 80, GetColor(255,255,255),"リンゴを拾ってみると地面には「生まれる太陽に死を」と書かれていた。");
			DrawFormatString( 0, 100, GetColor(255,255,255),"後ろには何もない。");
			DrawFormatString( 0, 120, GetColor(255,255,255),"左右どちらに行って調べる?");
			DrawFormatString( 0, 140, GetColor(255,255,255),"3で左 4で右");
			if( CheckHitKey(KEY_INPUT_3 ))
			{
				if( b == 0 )
				{
				b = 1;
			}
			}
			if( b == 1 )
			{
				//左
				DrawFormatString( 0, 160, GetColor(255,255,255),"左に進むと宝箱を見つけた。");
				DrawFormatString( 0, 180, GetColor(255,255,255),"宝箱に「扉は0=360 僕は?」と書かれている。");
				DrawFormatString( 0, 200, GetColor(255,255,255),"宝箱には鍵がかかっている。");
				DrawFormatString( 0, 220, GetColor(255,255,255),"宝箱のパスワードは?");

				if( d == 3 && e == 6 && f == 0 )
				{
					c = 1;
				}
				if( c == 1 )
				{
					//正解
					DrawFormatString( 0, 240, GetColor(255,255,255),"宝箱が開き、中には鍵が入っていた。");
					DrawFormatString( 0, 260, GetColor(255,255,255),"鍵を使って扉を開け、あなたは脱出した。~END~");
					DrawFormatString( 0, 280, GetColor(255,255,255),"0キーで終了します。");
					if( CheckHitKey(KEY_INPUT_0 ))
					{
						break;
					}
				}

				else
				{
					c = 2;
				}
				if( c == 2 )
				{
					//ハズレ
					DrawFormatString( 0, 240, GetColor(255,255,255),"パスワードが間違っていたようだ。");
					DrawFormatString( 0, 260, GetColor(255,255,255),"天井から何かが降って来てあなたは死んだ。~GAME OVER~");
					DrawFormatString( 0, 280, GetColor(255,255,255),"0キーで終了します。");
					if( CheckHitKey(KEY_INPUT_0 ))
					{
						break;
					}
				}
			}
			else if( CheckHitKey(KEY_INPUT_4 ))
			{
				b = 2;
			}
			if ( b == 2 )
			{
				//右
				DrawFormatString( 0, 160, GetColor(255,255,255),"右に進むとあなたは落とし穴に落ちてしまった。~GAME OVER~");
				DrawFormatString( 0, 180, GetColor(255,255,255),"0キーで終了します。");
				if( CheckHitKey(KEY_INPUT_0 ))
				{
					break;
				}
			}
		}
		else if( CheckHitKey(KEY_INPUT_1 ))
		{
			a = 1;
		}
		if( a == 1 )
		{
			//食べる
			DrawFormatString( 0, 80, GetColor(255,255,255), "リンゴには毒が入っていてあなたは死んでしまった。~GAME OVER~");
			DrawFormatString( 0, 100, GetColor(255,255,255), "0キーで終了します。");
			if( CheckHitKey(KEY_INPUT_0 ))
			{
				break;	
			}
		}
	}

	DxLib_End();
	return 0;
}

閉鎖

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