DXライブラリが一瞬で消えます

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

DXライブラリが一瞬で消えます

#1

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

DXライブラリ初心者です。
DXライブラリでじゃんけんゲームを作ったのですが、実行すると一瞬で消えてしまいます・・
どこをどうすれば改善できのか教えて下さい。
VC++の2008です

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

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

        int Random[2];
        int Col = GetColor( 255,255,255 );

		DrawFormatString( 0, 0, GetColor(255,255,255), "「ジャンケン!」");
        DrawFormatString( 0,20, GetColor(255,255,255), "あなたの手を入力して下さい(グー:1 チョキ:2 パー:3)");

if( CheckHitKey(KEY_INPUT_1) == 1 ){
	DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
	if(Random[0]){
		DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
		DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
		DrawFormatString( 0, 100, GetColor(255, 255, 0),"結果:あいこです。");
		return 0;
	}else if(Random[1]){
		DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
		DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
		DrawFormatString( 0, 100, GetColor(255, 255, 0),"結果:あなたの勝ちです!");
		return 0;
	}else if(Random[2]){
		DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
		DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
		DrawFormatString( 0, 100, GetColor(255, 255, 0),"結果:あなたの負けです・・・");

	}}else if( CheckHitKey(KEY_INPUT_2 ) == 1 ){
		DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
		if(Random[0]){
			DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
			DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
			DrawFormatString( 0, 100, GetColor(255, 255, 0),"結果:あなたの負けです・・・");
			return 0;
		}else if(Random[1]){
			DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
			DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
			DrawFormatString( 0, 100, GetColor(255, 255, 0),"結果:あいこです。");
			return 0;
		}else if(Random[2]){
			DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
			DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
			DrawFormatString( 0, 100, GetColor(255, 255, 0),"結果:あなたの勝ちです!");
		}}else if( CheckHitKey(KEY_INPUT_3 ) == 1 ){
			DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
			if(Random[0]){
				DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
				DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
				DrawFormatString( 0, 100, GetColor(255, 255, 0),"結果:あなたの勝ちです!");
				return 0;
			}else if(Random[1]){
				DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
				DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
				DrawFormatString( 0, 100, GetColor(255, 255, 0),"結果:あなたの負けです・・・");
				return 0;
			}else if(Random[2]){
				DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
				DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
				DrawFormatString( 0, 100, GetColor(255, 255, 0),"結果:あいこです。");

				}}

		DxLib_End(); // DXライブラリ終了処理
		return 0;
}}

N.Mです

Re: DXライブラリが一瞬で消えます

#2

投稿記事 by N.Mです » 6年前

DXライブラリが一瞬で消えてしまうのは、while文の括弧の中にDxLib_END関数とreturn 0;を入れてしまってるからでしょう。またそこを修復してもいくらか問題はあると思いますよ?(Random変数を初期化していなかったり等)

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

Re: DXライブラリが一瞬で消えます

#3

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

インデントが乱れているのが間違いの元じゃないかと思います。

コード:

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) {
	ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

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

		int Random[2];
		int Col = GetColor( 255, 255, 255 );

		DrawFormatString( 0, 0, GetColor( 255, 255, 255 ), "「ジャンケン!」" );
		DrawFormatString( 0, 20, GetColor( 255, 255, 255 ), "あなたの手を入力して下さい(グー:1 チョキ:2 パー:3)" );

		if( CheckHitKey( KEY_INPUT_1 ) == 1 ) {
			DrawFormatString( 0, 40, GetColor( 255, 255, 255 ), "「ポン!」" );
			if( Random[0] ) {
				DrawFormatString( 0, 60, GetColor( 255, 255, 255 ), "あなた:グー" );
				DrawFormatString( 0, 80, GetColor( 255, 255, 255 ), "あいて:グー" );
				DrawFormatString( 0, 100, GetColor( 255, 255, 0 ), "結果:あいこです。" );
				return 0;
			} else if( Random[1] ) {
				DrawFormatString( 0, 60, GetColor( 255, 255, 255 ), "あなた:グー" );
				DrawFormatString( 0, 80, GetColor( 255, 255, 255 ), "あいて:チョキ" );
				DrawFormatString( 0, 100, GetColor( 255, 255, 0 ), "結果:あなたの勝ちです!" );
				return 0;
			} else if( Random[2] ) {
				DrawFormatString( 0, 60, GetColor( 255, 255, 255 ), "あなた:グー" );
				DrawFormatString( 0, 80, GetColor( 255, 255, 255 ), "あいて:パー" );
				DrawFormatString( 0, 100, GetColor( 255, 255, 0 ), "結果:あなたの負けです・・・" );

			}
		} else if( CheckHitKey( KEY_INPUT_2 ) == 1 ) {
			DrawFormatString( 0, 40, GetColor( 255, 255, 255 ), "「ポン!」" );
			if( Random[0] ) {
				DrawFormatString( 0, 60, GetColor( 255, 255, 255 ), "あなた:チョキ" );
				DrawFormatString( 0, 80, GetColor( 255, 255, 255 ), "あいて:グー" );
				DrawFormatString( 0, 100, GetColor( 255, 255, 0 ), "結果:あなたの負けです・・・" );
				return 0;
			} else if( Random[1] ) {
				DrawFormatString( 0, 60, GetColor( 255, 255, 255 ), "あなた:チョキ" );
				DrawFormatString( 0, 80, GetColor( 255, 255, 255 ), "あいて:チョキ" );
				DrawFormatString( 0, 100, GetColor( 255, 255, 0 ), "結果:あいこです。" );
				return 0;
			} else if( Random[2] ) {
				DrawFormatString( 0, 60, GetColor( 255, 255, 255 ), "あなた:チョキ" );
				DrawFormatString( 0, 80, GetColor( 255, 255, 255 ), "あいて:パー" );
				DrawFormatString( 0, 100, GetColor( 255, 255, 0 ), "結果:あなたの勝ちです!" );
			}
		} else if( CheckHitKey( KEY_INPUT_3 ) == 1 ) {
			DrawFormatString( 0, 40, GetColor( 255, 255, 255 ), "「ポン!」" );
			if( Random[0] ) {
				DrawFormatString( 0, 60, GetColor( 255, 255, 255 ), "あなた:パー" );
				DrawFormatString( 0, 80, GetColor( 255, 255, 255 ), "あいて:グー" );
				DrawFormatString( 0, 100, GetColor( 255, 255, 0 ), "結果:あなたの勝ちです!" );
				return 0;
			} else if( Random[1] ) {
				DrawFormatString( 0, 60, GetColor( 255, 255, 255 ), "あなた:パー" );
				DrawFormatString( 0, 80, GetColor( 255, 255, 255 ), "あいて:チョキ" );
				DrawFormatString( 0, 100, GetColor( 255, 255, 0 ), "結果:あなたの負けです・・・" );
				return 0;
			} else if( Random[2] ) {
				DrawFormatString( 0, 60, GetColor( 255, 255, 255 ), "あなた:パー" );
				DrawFormatString( 0, 80, GetColor( 255, 255, 255 ), "あいて:パー" );
				DrawFormatString( 0, 100, GetColor( 255, 255, 0 ), "結果:あいこです。" );

			}
		}

		DxLib_End(); // DXライブラリ終了処理
		return 0;
	}
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エルフ

Re: DXライブラリが一瞬で消えます

#4

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

ソフト屋さん ありがとうござました。ですが、そのように編集しても結果は変わりませんでした。あなたのソースをコピペしても一瞬で消えてしまいました・・・
N.Mさん 「while文の括弧の中にDxLib_END関数とreturn 0;を入れてしまってるからでしょう。」とおっしゃいましたが、そんなことはないと思うのですが・・

Ryo

Re: DXライブラリが一瞬で消えます

#5

投稿記事 by Ryo » 6年前

開発ソフトがVS2008(のVC)とのことですから
デバッグモードで1行ずつ動作を追いかけてみてはどうでしょうか?

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

Re: DXライブラリが一瞬で消えます

#6

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

Ryoさんありがとうございます

デバックしてみたところ、

なにがなんだかわかんないです・・・
すみません 馬鹿で・・・
とりあえずコピペするので教えてください><
以下結果

'GameProg.exe': 'C:\Users\taiga\Desktop\GameProg\Debug\GameProg.exe' を読み込みました。シンボルが読み込まれました。
'GameProg.exe': 'C:\Windows\System32\ntdll.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\kernel32.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\KernelBase.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\user32.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\gdi32.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\lpk.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\usp10.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\msvcrt.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\shell32.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\shlwapi.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\imm32.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\msctf.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\ws2_32.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\rpcrt4.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\nsi.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\winmm.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\ole32.dll' を読み込みました
'GameProg.exe': 'C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.7601.18201_none_ec80f00e8593ece5\comctl32.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\advapi32.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\sechost.dll' を読み込みました
0:システムの情報を出力します
1: DXライブラリ Ver3.05
2: 論理プロセッサの数 : 2
4: OS Windows7 ( Build 7601 Service Pack 1 )
105: CPU動作速度:大体1.88GHz
107: MMX命令を使用します
108: SSE命令が使用可能です
109: SSE2命令が使用可能です
110: CPUベンダ:GenuineIntel
115: CPU名:Celeron(R) Dual-Core CPU T3100 @ 1.90GHz
'GameProg.exe': 'C:\Windows\System32\dwmapi.dll' を読み込みました
128:COMの初期化... 'GameProg.exe': 'C:\Windows\System32\cryptbase.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\uxtheme.dll' を読み込みました
成功しました
170:メモリ総量:2008.60MB 空きメモリ領域:979.88MB
979.88MB
171:タイマーの精度を検査します
173:精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60
173: パフォーマンスカウンターを使用します タイマー精度 : 1851.103000 KHz
175: ソフトの二重起動検査... 二重起動はされていませんでした
181:ウインドウクラスを登録します... 登録に成功しました
182:ウインドウモード起動用のウインドウを作成します
186:ウインドウの作成に成功しました
'GameProg.exe': 'C:\Windows\System32\clbcatq.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\oleaut32.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\IME\IMEJP10\IMJPTIP.DLL' を読み込みました
'GameProg.exe': 'C:\Windows\System32\oleacc.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\IMJP10K.DLL' を読み込みました
'GameProg.exe': 'C:\Windows\System32\IME\shared\IMETIP.DLL' を読み込みました
'GameProg.exe': 'C:\Windows\System32\IME\shared\imecfm.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\IME\IMEJP10\IMJPAPI.DLL' を読み込みました
'GameProg.exe': 'C:\Windows\System32\version.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\IME\shared\IMJKAPI.DLL' を読み込みました
477:IMEを無効にしました
481:ウインドウスタイルをウインドウモード用に変更します... 完了
483:DirectInput関係初期化処理
484: DirectInput7 の取得中... 'GameProg.exe': 'C:\Windows\System32\dinput.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\hid.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\setupapi.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\cfgmgr32.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\devobj.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\wintrust.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\crypt32.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\msasn1.dll' を読み込みました
成功
613: 引き続き初期化処理... 初期化成功
619: ジョイパッドの初期化...
629: 入力装置を見つけました
633: デバイスの登録名:BUFFALO BSGP1203 Series
635: デバイスの製品登録名:BUFFALO BSGP1203 Series
636: 周期的エフェクトの作成に失敗しました。
638: ジョイパッドの追加は正常に終了しました
640: ジョイパッドの初期化は正常に終了しました
641: マウスデバイスの初期化... 初期化成功
644: キーボードデバイスの初期化... 初期化成功
646:DirectInput 関連の初期化は正常に終了しました
'GameProg.exe': 'C:\Windows\System32\msacm32.dll' を読み込みました
688:DirectSound の初期化を行います
691:DirectSound インターフェースの取得を行います.... 'GameProg.exe': 'C:\Windows\System32\dsound.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\powrprof.dll' を読み込みました
成功
723:引き続きインターフェースの初期化処理... 'GameProg.exe': 'C:\Windows\System32\MMDevAPI.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\propsys.dll' を読み込みました
スレッド 'Win32 スレッド' (0x13c) はコード 0 (0x0) で終了しました。
'GameProg.exe': 'C:\Windows\System32\AudioSes.dll' を読み込みました
成功
'GameProg.exe': 'C:\Windows\System32\avrt.dll' を読み込みました
989: DirectSound デバイスを列挙します
991: モジュール名: ドライバ記述:プライマリ サウンド ドライバー
993: モジュール名:{0.0.0.00000000}.{47f08798-1b7d-4d74-90d8-b3ed9b911b44} ドライバ記述:スピーカー (High Definition Audio デバイス)
994: 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz
996: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB

998: 利用可能サンプリング精度
999: プライマリ 16bit = OK 8bit = OK
1001: セカンダリ 16bit = OK 8bit = OK

1002: 利用可能チャンネル
1003: プライマリ MONO = OK STEREO = OK
1004: セカンダリ MONO = OK STEREO = OK

1013:DirectSound の初期化は正常に終了しました
'GameProg.exe': 'C:\Windows\System32\d3d9.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\d3d8thk.dll' を読み込みました
1093:DirectDraw オブジェクトの取得を行います.... 'GameProg.exe': 'C:\Windows\System32\ddraw.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\dciman32.dll' を読み込みました
成功
1126:引き続き初期化処理... 'GameProg.exe': 'C:\Windows\System32\igdumdx32.dll' を読み込みました
'GameProg.exe': 'C:\Windows\System32\igdumd32.dll' を読み込みました
初期化に成功しました
1288:IDirect3D9Ex オブジェクトを取得します.... 成功
1297:IDirect3DDevice9Ex オブジェクトを取得します.... ハードウエア頂点演算を使用します
1686:成功
1688:Driver:igdumdx32.dll Description:Mobile Intel(R) 4 Series Express Chipset Family
1690:画面のフォーマットは D3DFMT_X8R8G8B8 です
1691:Zバッファのフォーマットは D3DFMT_D16 です
1692:16bit カラーフォーマットは D_D3DFMT_R5G6B5 です
1693:32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です
1694:アルファ付き 16bit カラーフォーマットは D_D3DFMT_A4R4G4B4 です
1696:アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です
1697:アルファテスト用 16bit カラーフォーマットは D_D3DFMT_A1R5G5B5 です
1698:アルファテスト用 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です
1699:DXT1テクスチャフォーマットは D_D3DFMT_DXT1 です
1700:DXT2テクスチャフォーマットは D_D3DFMT_DXT2 です
1702:DXT3テクスチャフォーマットは D_D3DFMT_DXT3 です
1703:DXT4テクスチャフォーマットは D_D3DFMT_DXT4 です
1704:DXT5テクスチャフォーマットは D_D3DFMT_DXT5 です
1705:描画用 16bit カラーフォーマットは D_D3DFMT_R5G6B5 です
1706:描画用 32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です
1708:描画用アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です
1709:最大テクスチャサイズ 幅:4096 高さ:4096
1710:テクスチャステージテンポラリレジスタ:使用可
1711:減算合成のハードウェア対応:ネイティブ
1713:頂点シェーダーバージョンコード:300
1714:ピクセルシェーダーバージョンコード:300
1775:バックバッファロック転送の時間:3122nsec 一時的な描画可能バッファを使用した転送の時間:4086nsec
1777:バックバッファロックを使用します
1778:Zバッファを作成します.... 成功
1806:プログラマブルシェーダーを使用します

1948:フォントの初期化を行います
1983:フォントの初期化は正常に終了しました
1984:文字コードバッファの初期化を行います... 完了しました
2113:フォントの初期化を行います
2121:フォントの初期化は正常に終了しました
2124:Direct3DDevice9 の解放 3
スレッド 'Win32 スレッド' (0x68c) はコード 0 (0x0) で終了しました。
'GameProg.exe': 'C:\Windows\System32\igdumd32.dll' をアンロード
'GameProg.exe': 'C:\Windows\System32\igdumdx32.dll' をアンロード
2189:Direct3D9 DLL の解放 4
2195:DirectInput 関連の終了処理... 完了
'GameProg.exe': 'C:\Windows\System32\d3d9.dll' をアンロード
'GameProg.exe': 'C:\Windows\System32\d3d8thk.dll' をアンロード
スレッド 'Win32 スレッド' (0x400) はコード 0 (0x0) で終了しました。
スレッド 'Win32 スレッド' (0x7c8) はコード 0 (0x0) で終了しました。
スレッド 'Win32 スレッド' (0x778) はコード 0 (0x0) で終了しました。
'GameProg.exe': 'C:\Windows\System32\avrt.dll' をアンロード
スレッド 'Win32 スレッド' (0x478) はコード 0 (0x0) で終了しました。
スレッド 'Win32 スレッド' (0x5cc) はコード 0 (0x0) で終了しました。
スレッド 'Win32 スレッド' (0xb10) はコード 0 (0x0) で終了しました。
スレッド 'Win32 スレッド' (0x938) はコード 0 (0x0) で終了しました。
'GameProg.exe': 'C:\Windows\System32\msacm32.dll' をアンロード
2276:DirectSound の終了処理は正常に終了しました
2284:ウインドウを閉じようとしています
'GameProg.exe': 'C:\Windows\System32\IME\shared\imecfm.dll' をアンロード
2299:ウインドウが破棄されようとしています
2300:ソフトを終了する準備が整いました
'GameProg.exe': 'C:\Windows\System32\IMJP10K.DLL' をアンロード
2308:
2309:Alloc memory dump
2322: Total size:0(0.000kb) Alloc num:0
2324:
'GameProg.exe': 'C:\Windows\System32\ws2_32.dll' をアンロード
'GameProg.exe': 'C:\Windows\System32\nsi.dll' をアンロード
スレッド 'Win32 スレッド' (0xc48) はコード 0 (0x0) で終了しました。
スレッド 'Win32 スレッド' (0x96c) はコード 0 (0x0) で終了しました。
スレッド 'Win32 スレッド' (0xf40) はコード 0 (0x0) で終了しました。
スレッド 'Win32 スレッド' (0xbf4) はコード 0 (0x0) で終了しました。
スレッド 'Win32 スレッド' (0x578) はコード 0 (0x0) で終了しました。
プログラム '[2684] GameProg.exe: ネイティブ' はコード 0 (0x0) で終了しました。

うずら

Re: DXライブラリが一瞬で消えます

#7

投稿記事 by うずら » 6年前

エルフ さんが書きました:ソフト屋さん ありがとうござました。ですが、そのように編集しても結果は変わりませんでした。あなたのソースをコピペしても一瞬で消えてしまいました・・・
N.Mさん 「while文の括弧の中にDxLib_END関数とreturn 0;を入れてしまってるからでしょう。」とおっしゃいましたが、そんなことはないと思うのですが・・
いままでコンソールプログラムの勉強をしていたかたですか?
新・ゲームプログラミングの館
DXライブラリサンプルプログラム
この辺が参考になるかと思いますので最初から一度読んでみるといいとおもいます。

とりあえずコード書いてみました。
スコア表示とか、もう一度やるとかの機能を追加してみました。バグとか不備とかわからないとこがあったら言ってください。
配列をわざわざ0番無視して1から使ってますが、まぁ適当に書き直してやってください。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) 
{
  ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定

  SRand(GetNowCount());  // 乱数初期化

  while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) 
  {
    static int Random  = GetRand(2) + 1;          // グーが0でなく1に振られてるので。
    static int Col     = GetColor(255, 255, 255);
    static int isView  = 0;                       // 勝敗結果を表示するか?
    static int Own;                               // 自分が出した手

    static int Score[4] = {0, 0, 0, 0, };         // 1:勝ち、2:負け、3:あいこ   の回数
    static int BattleState;                       // 勝ったか負けたかあいこか。1:勝ち  2:負け  3:あいこ
    char lcViewScore[256];                        // 結果を表示する。かなり大きめにとっておいた。

    DrawFormatString(0, 0, GetColor(255, 255, 255), "「ジャンケン!」");
    DrawFormatString(0, 20, GetColor(255, 255, 255), "あなたの手を入力して下さい(グー:1 チョキ:2 パー:3)");

    sprintf_s(lcViewScore, "勝ち:%03d回  負け:%03d回  あいこ:%03d回", Score[1], Score[2], Score[3]);
    DrawFormatString(0, 180, GetColor(255, 255, 255), lcViewScore);

    if (!isView)
    {
      if (CheckHitKey(KEY_INPUT_1))
      {
        Own = 1;
        isView = 1;

        switch (Random)
        {
          case 1:
          {
            BattleState = 3;
            Score[3] += 1;
            break;
          }
          case 2:
          {
            BattleState = 1;
            Score[1] += 1;
            break;
          }
          case 3:
          {
            BattleState = 2;
            Score[2] += 1;
            break;
          }
        }
      }
      if (CheckHitKey(KEY_INPUT_2))
      {
        Own = 2;
        isView = 1;

        switch (Random)
        {
          case 1:
          {
            BattleState = 2;
            Score[2] += 1;
            break;
          }
          case 2:
          {
            BattleState = 3;
            Score[3] += 1;
            break;
          }
          case 3:
          {
            BattleState = 1;
            Score[1] += 1;
            break;
          }
        }
      }
      if (CheckHitKey(KEY_INPUT_3))
      {
        Own = 3;
        isView = 1;

        switch (Random)
        {
          case 1:
          {
            BattleState = 1;
            Score[1] += 1;
            break;
          }
          case 2:
          {
            BattleState = 2;
            Score[2] += 1;
            break;
          }
          case 3:
          {
            BattleState = 3;
            Score[3] += 1;
            break;
          }
        }
      }
    }
    else   // すでに出し終わっている。
    {
      // 自分と相手の結果表示
      DrawFormatString(0, 40, GetColor(255, 255, 255), "「ポン!」");

      DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
      DrawFormatString(0, 140, GetColor(255, 255, 0), "Enterキーでもう一度。");

      switch (Random)
      {
        case 1:
        {
          DrawFormatString(0, 80, GetColor(255, 255, 255), "あいて:グー");
          break;
        }
        case 2:
        {
          DrawFormatString(0, 80, GetColor(255, 255, 255), "あいて:チョキ");
          break;
        }
        case 3:
        {
          DrawFormatString(0, 80, GetColor(255, 255, 255), "あいて:パー");
          break;
        }
      }

      switch (Own)
      {
        case 1:
        {
          DrawFormatString(0, 60, GetColor(255, 255, 255), "あなた:グー");
          break;
        }
        case 2:
        {
          DrawFormatString(0, 60, GetColor(255, 255, 255), "あなた:チョキ");
          break;
        }
        case 3:
        {
          DrawFormatString(0, 60, GetColor(255, 255, 255), "あなた:パー");
          break;
        }
      }

      // 結果の描画

      switch (BattleState)
      {
        case 1:
        {
          DrawFormatString(0, 100, GetColor(255, 255, 0), "結果:あなたの勝ちです!");
          break;
        }
        case 2:
        {
          DrawFormatString(0, 100, GetColor(255, 255, 0), "結果:あなたの負けです・・・");
          break;
        }
        case 3:
        {
          DrawFormatString(0, 100, GetColor(255, 255, 0), "結果:あいこです。");
          break;
        }
      }

      if (CheckHitKey(KEY_INPUT_ESCAPE))  // 終了
      {
        goto labelEndProgram;
      }
      if (CheckHitKey(KEY_INPUT_RETURN))  // もう一回
      {
        isView = 0;                 // 見せない状態に戻す
        Random = GetRand(2) + 1;    // 敵の手を変える
      }

    }
  }

labelEndProgram:

  DxLib_End(); // DXライブラリ終了処理
  return 0;
}

アバター
みけCAT
記事: 6310
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: DXライブラリが一瞬で消えます

#8

投稿記事 by みけCAT » 6年前

エルフ さんが書きました:N.Mさん 「while文の括弧の中にDxLib_END関数とreturn 0;を入れてしまってるからでしょう。」とおっしゃいましたが、そんなことはないと思うのですが・・
デバッグにおいて、思い込みは大敵です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: DXライブラリが一瞬で消えます

#9

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

思い込んでたようです すいません

直したら起動できました。
ですが、プレイヤーの手を選択するとデバッグエラーがおこります・・・
Run-Time Check Failure #3 - The variable 'Random' is being used without being initialized.
とでてきました。
それとビルドすると警告で、warning C4700: 初期化されていないローカル変数 'Random' が使用されますとでるんですが、なんででしょう・・
SRand(GetNowCount()); // 乱数初期化をおこなっているのに・・

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int ){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
		
		while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){

		int Random[2];
        int Col = GetColor( 255,255,255 );

        SRand(GetNowCount());  // 乱数初期化

		DrawFormatString( 0, 0, GetColor(255,255,255), "「ジャンケン!」");
        DrawFormatString( 0,20, GetColor(255,255,255), "あなたの手を入力して下さい(グー:1 チョキ:2 パー:3)");

if( CheckHitKey(KEY_INPUT_1) == 1 ){
	DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
	if( Random[0] ) {
		DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
		DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
		DrawFormatString( 0, 100, GetColor(255, 255, 0),"結果:あいこです。");
		
	} else if( Random[1] ) {
		DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
		DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
		DrawFormatString( 0, 100, GetColor(255, 255, 0),"結果:あなたの勝ちです!");
		
	} else if( Random[2] ) {
		DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
		DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
		DrawFormatString( 0, 100, GetColor(255, 255, 0),"結果:あなたの負けです・・・");
        
	}
	} else if( CheckHitKey(KEY_INPUT_2 ) == 1 ) {
		DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
		if( Random[0] ) {
			DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
			DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
			DrawFormatString( 0, 100, GetColor(255, 255, 0),"結果:あなたの負けです・・・");
			
		} else if( Random[1] ) {
			DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
			DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
			DrawFormatString( 0, 100, GetColor(255, 255, 0),"結果:あいこです。");
			
		} else if( Random[2] ) {
			DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
			DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
			DrawFormatString( 0, 100, GetColor(255, 255, 0),"結果:あなたの勝ちです!");
			
		}
		} else if( CheckHitKey(KEY_INPUT_3 ) == 1 ) {
			DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
			if( Random[0] ) {
				DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
				DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
				DrawFormatString( 0, 100, GetColor(255, 255, 0),"結果:あなたの勝ちです!");
				
			} else if( Random[1] ) {
				DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
				DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
				DrawFormatString( 0, 100, GetColor(255, 255, 0),"結果:あなたの負けです・・・");
				
			} else if( Random[2] ) {
				DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
				DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
				DrawFormatString( 0, 100, GetColor(255, 255, 0),"結果:あいこです。");
			}

	}
		}
		DxLib_End(); // DXライブラリ終了処理
		return 0;
}

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

Re: DXライブラリが一瞬で消えます

#10

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

私のコードはインデントなおしただけで、コードに一切手を付けていません。
これで通ってないように見えるとしたら、whileループの仕組みを理解されていないかもしれません。

みけCATさんの言われるように思い込みの激しい人はデバッグを難しくします。
これは、プログラマーとして成長する事を難しくする要因です。
自分の作ったものを出来るだけ他人の目で見る=客観視する能力が必要となるんです。
それでもプロでも完全な客観視は難しいのでデバッガがデバッグ手法が有りますので、それを使いましょう。

「太田研究室 > Visual C++ 2010 Express プログラミング入門」
http://cvwww.ee.ous.ac.jp/vc10prog.html#7
ここのブレークポイントを
DxLib_End(); // DXライブラリ終了処理
に設定してF5で実行してみてください。止まると思います。
もし止まったら実行されているということです。

と書いている間に投稿されましたね。その分は後で投稿します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6310
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: DXライブラリが一瞬で消えます

#11

投稿記事 by みけCAT » 6年前

エルフ さんが書きました:プレイヤーの手を選択するとデバッグエラーがおこります・・・
Run-Time Check Failure #3 - The variable 'Random' is being used without being initialized.
とでてきました。
それとビルドすると警告で、warning C4700: 初期化されていないローカル変数 'Random' が使用されますとでるんですが、なんででしょう・・
SRand(GetNowCount()); // 乱数初期化をおこなっているのに・・
Randomを初期化していないからです。
SRandはライブラリの内部の初期化であり、ローカル変数Randomとは無関係です。
ついでに、確保された領域の外であるRandom[2]にアクセスする可能性があるという問題もあります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: DXライブラリが一瞬で消えます

#12

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

>Run-Time Check Failure #3 - The variable 'Random' is being used without being initialized.
>それとビルドすると警告で、warning C4700: 初期化されていないローカル変数 'Random' が使用されますとでるんですが、なんででしょう・・
>SRand(GetNowCount()); // 乱数初期化をおこなっているのに・・

int Random[2];の初期化とSRand(GetNowCount());には一切関係ありませんよ。関係のあるようなことが一切書かれていません。
それも思い込みです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: DXライブラリが一瞬で消えます

#13

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

いろいろ考えて直しました
皆さんの助けもあったため、どうにかエラーと警告を0にできました。
ですが、まだプレイヤーの手を選択すると「Run-Time Check Failure #2 - Stack around the variable 'Random' was corrupted.」と、デバックエラーがでてしまいます・・・
解決策を教えてください。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int ){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
		
		while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){

	    int Random[2];
        int a = GetRand( 2 );
        int Col = GetColor( 255,255,255 );
		
        SRand(GetNowCount());  // 乱数初期化

		Random[0] = GetRand( 2 ) == a;
		Random[1] = GetRand( 2 ) == a;
		Random[2] = GetRand( 2 ) == a;

		DrawFormatString( 0, 0, GetColor(255,255,255), "「ジャンケン!」");
        DrawFormatString( 0,20, GetColor(255,255,255), "あなたの手を入力して下さい(グー:1 チョキ:2 パー:3)");

if( CheckHitKey(KEY_INPUT_1) == 1 ){
	DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
	if( a == 0 ) {
		DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
		DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
		DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あいこです。");
		return 0;
		
	} else if( a == 1 ) {
		DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
		DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
		DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの勝ちです!");
		return 0;
		
	} else if( a == 2 ) {
		DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
		DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
		DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの負けです・・・");
		return 0;
        
	}
	} else if( CheckHitKey(KEY_INPUT_2 ) == 1 ) {
		DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
		if( a == 0 ) {
			DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
			DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
			DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの負けです・・・");
			return 0;
			
		} else if( a == 1 ) {
			DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
			DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
			DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あいこです。");
			return 0;
			
		} else if( a == 2 ) {
			DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
			DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
			DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの勝ちです!");
			return 0;
			
		}
		} else if( CheckHitKey(KEY_INPUT_3 ) == 1 ) {
			DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
			if( a == 0 ) {
				DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
				DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
				DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの勝ちです!");
				return 0;
				
			} else if( a == 1 ) {
				DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
				DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
				DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの負けです・・・");
				return 0;
				
			} else if( a == 2 ) {
				DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
				DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
				DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あいこです。");
				return 0;
			}

	}
		}
		DxLib_End(); // DXライブラリ終了処理
		return 0;
}

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

Re: DXライブラリが一瞬で消えます

#14

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

すでにヒントは出てます。
見逃しているのなら、それも思い込みかもです。

あとインデントはちゃんとしましよう。
インデントが分からないなら質問して下さい。
何かわからないからスルーと云うのは大抵良くないパターンにハマります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

うずら

Re: DXライブラリが一瞬で消えます

#15

投稿記事 by うずら » 6年前

宣言が
int Random[2];

こうなっていますが

アクセスでこうなっているのが間違いじゃないでしょうか。

Random[0] = GetRand( 2 ) == a;
Random[1] = GetRand( 2 ) == a;
Random[2] = GetRand( 2 ) == a;

int Array[16]; //例を挙げると このような宣言では、Array[0]からArray[15]までが確保されます。
確保時に指定するのは確保する数なので。

つまり、2個の要素(0,1)しか確保してないのに2番目の要素にアクセスしているのが問題です。

エラーとは関係ありませんが、このコードだと勝敗を計算した直後に一回だけ表示してWinMainからreturnしているので
1/60秒しか結果が表示されないんじゃないでしょうか?

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

Re: DXライブラリが一瞬で消えます

#16

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

うずらさん
ありがとうございます
あなたのおかげでエラーがなくなりました。
そしてESCで終了するように直しました!

ソフト屋さん
インデントがわからないので教えてください。


それと、押したら次の処理がされるのではなく、押している間、次の処理がされる。という風になってしまいました。
他にも、相手が毎回同じ手しか出さないです・・
解決策を教えて下さい。

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

Re: DXライブラリが一瞬で消えます

#17

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

> インデントがわからないので教えてください。

そうです。そうやって聞かないと後で「今さら聞けない」状態になるので不幸ですよ。
「mixcpp/投稿前チェックリスト」 ここに書いてあります。
http://mikecat.6.ql.bz/mixc_check/

>それと、押したら次の処理がされるのではなく、押している間、次の処理がされる。という風になってしまいました。

状態を変数に残して、表示の分岐は変数を見てしないといけません。状態遷移と呼ばれるものです。
これがグラフィック系のアプリ・ゲームを作る時の必須アルゴリズムです。
コンソールの時には使わなくても済む場合が多いですけどね。

> 他にも、相手が毎回同じ手しか出さないです・・

Random[0] = GetRand( 2 ) == a;
ってどうな値が入るのを期待していますか?
デバッガで確認した場合の値は? なぜ、そんな値になると思いますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6310
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: DXライブラリが一瞬で消えます

#18

投稿記事 by みけCAT » 6年前

オフトピック
softya(ソフト屋) さんが書きました:「mixcpp/投稿前チェックリスト」 ここに書いてあります。
http://mikecat.6.ql.bz/mixc_check/
URLが古いので、情報の更新をお願いします。
http://mikecat.dip.jp/mixc_check/
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: DXライブラリが一瞬で消えます

#19

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

ソフト屋さん

インデントはわかりました ありがとうございました
デバッガをする前のブレークポイントが作れなくてデバッガができないです・・
それと状態遷移にするにはどうしたらいいんですか?

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

Re: DXライブラリが一瞬で消えます

#20

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

エルフ さんが書きました:ソフト屋さん

インデントはわかりました ありがとうございました
デバッガをする前のブレークポイントが作れなくてデバッガができないです・・
そんなはずはないですが、F9を押しても反応無いですか?

エルフ さんが書きました: それと状態遷移にするにはどうしたらいいんですか?
こっちは、ここで1レベル上を目指しましょうか。
まずネットで検索して自分なりに状態遷移というモノを整理してみてください。
ここで考えるということが重要です。そして、どのようにしたら良いかとい提案をお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: DXライブラリが一瞬で消えます

#21

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

ソフト屋さん
F9で出来ました
全て値は0でした

なぜその結果になったのかは思いつかないです・・・

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

Re: DXライブラリが一瞬で消えます

#22

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

状態遷移の件ですがよくわかりません

キー入力をしたらループを使うとか・・?

うずら

Re: DXライブラリが一瞬で消えます

#23

投稿記事 by うずら » 6年前

変数を置いて、値がいくらだったらどの処理をするかっていうのをswitch case で。ifだと状態が増えたときにやりにくいから。
(今回みたいなじゃんけんだったらintを一つ置いてif--elseでやってもいいかもしれません)

コード:

int  LoopState;

void MainLoop()   // メインループ関数。状態ごとに関数にして分けておくと長くなったとき見やすいです。
{
    switch(LoopState)
    {
        case 0:
            StateWaitInput();      // 自分が手を出すのを待っている
            break;

        case 1:       
            StateResult();           // 手を出し終わって結果を表示している
            break;
    }
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int ){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

    LoopState = 0;    // 状態変数初期化
        
    while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 )
    {
        MainLoop();    // これが一秒間に60回呼ばれる。
    }

顔芸

Re: DXライブラリが一瞬で消えます

#24

投稿記事 by 顔芸 » 6年前

自分だったらこんな流れにしますかねー
実行はしてないので間違ってたらゴメンナサイ

コード:

typedef enum GameState
{
	WAIT_INPUT, // プレイヤーの入力待ち状態
	SHOW_RESULT // 結果表示状態
} GameState;

typedef enum Hand
{
    STONE,    // 0: グー
    SCISSORS, // 1: チョキ
    PAPER,    // 2: パー
    NONE      // 3: (まだ出していない)
} Hand;

typedef enum Result
{
    DRAW, // 0: あいこ
    LOSE, // 1: 負け
    WIN   // 2: 勝ち
} Result;

Hand getPlayerHand()
{
	Hand playerHand;
	
	キーボードの入力をみてプレイヤーの手を決め,その手を返す
	グー,チョキ,パーに対応するキーが押されていない場合,
	まだ出していない状態(NONE)を返す
	
	return playerHand;
}

Hand getEnemyHand()
{
	Hand enemyHand;
	
	ランダムに相手の手を決めて,その手を返す
	
	return enemyHand;
}

Result judge(Hand playerHand, Hand enemyHand)
{
    じゃんけんの勝敗を判定して,判定結果を返却する
    (switch文を並べてもいいですが,実は1行で書けます)
}

GameState waitInput(Hand* playerHand, Hand* enemyHand, Result* result)
{		
	*playerHand = getPlayerHand();
	
	if (プレイヤーがまだ手を出していない)
	{
		じゃんけん開始メッセージと入力待ちメッセージを表示する
		
		return WAIT_INPUT;
	}
	
    *enemyHand = getEnemyHand();
    *result = judge(playerHand, enemyHand);
    
    return SHOW_RESULT;
}

GameState showResult(Hand playerHand, Hand enemyHand, Result result)
{
	if (表示状態を終了させるキーが押されている)
	{
		return WAIT_INPUT;
	}
	
	自分の手と相手の手,じゃんけんの結果をみて適切なメッセージを表示する
	
	return SHOW_RESULT;
}

int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nCmdShow)
{
	適切な前処理
	
	GameState gameState = WAIT_INPUT;
	
	while (適当な条件式)
	{
		Hand playerHand;
		Hand enemyHand;
		Result result;
		
		switch (gameState)
		{
		case WAIT_INPUT:
			gameState = waitInput(&playerHand, &enemyHand, &result);
			break;
		
		case SHOW_RESULT:
			gameState = showResult(playerHand, enemyHand, result);
			break;
		}
	}
	
    return 0;
}

うずらさんのおっしゃる通り,状態を意識してやらないと
押したら次の処理がされるのではなく、押している間、次の処理がされる。という風になってしまいました。
というようなことになってしまいます.結果の表示が一瞬で終了してしまうからですね.

あと,これは好みにもよると思いますが,コード長よりも処理の内容を意識して,
意味の切れ目で関数化するよう心がけると,流れの追いやすいプログラムが書けると思いますよ.
(もちろんインデントや行間が整っていることが前提です.)

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

Re: DXライブラリが一瞬で消えます

#25

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

状態を意識してやるというのがわかりません・・
そのため、グー(キーボードの1)を押すと次の処理がされるのではなく、押している間、次の処理をするいう風になってしまいます。
他にも相手の手がグーチョキパーグーチョキパー・・と、スロットのように回って止まりません
改善策を教えて下さい。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int )
{
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
		
		while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 )
		{

        int a = GetRand( 2 );
        int Col = GetColor( 255,255,255 );

        SRand(GetNowCount());  // 乱数初期化

		DrawFormatString( 0, 0, GetColor(255,255,255), "「ジャンケン!」");
        DrawFormatString( 0,20, GetColor(255,255,255), "あなたの手を入力して下さい(グー:1 チョキ:2 パー:3)");

if( CheckHitKey(KEY_INPUT_1) == 1 ){
	DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
	if( a == 0 )
	{
    DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
	DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
	DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あいこです。");
	DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
		if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
		{
		return 0;
		}
	
	} else if( a == 1 )
	{
	DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
	DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
	DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの勝ちです!");
	DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
		if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
		{
		return 0;
		}

	} else if( a == 2 )
	{
	DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
	DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
	DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの負けです・・・");
	DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
		if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
		{
		return 0;
		}
	}
} else if( CheckHitKey(KEY_INPUT_2 ) == 1 )
{
		DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
		if( a == 0 )
		{
		DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
		DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
		DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの負けです・・・");
		DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
			if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
			{
				return 0;
			}
			
		} else if( a == 1 )
		{
		DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
		DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
		DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あいこです。");
		DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
			if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
			{
				return 0;
			}
			
		} else if( a == 2 )
		{
		DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
		DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
		DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの勝ちです!");
		DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
			if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
			{
				return 0;
			}
			
		}
		} else if( CheckHitKey(KEY_INPUT_3 ) == 1 )
{
	    DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
			if( a == 0 )
			{
			DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
			DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
			DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの勝ちです!");
			DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
				if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
				{
					return 0;
				}
				
			} else if( a == 1 )
			{
			DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
			DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
			DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの負けです・・・");
			DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
				if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
				{
					return 0;
				}
				
			} else if( a == 2 )
			{
			DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
			DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
			DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あいこです。");
			DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");	
				if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
				{
					return 0;
				}
			}
		}
}
		DxLib_End(); // DXライブラリ終了処理
		return 0;
}

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

Re: DXライブラリが一瞬で消えます

#26

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

とりあえずじゃんけんは置いておいて状態遷移を勉強してみましょうか。

【状態遷移とは】
変な例え思いつきましたので書いておきます。
温泉旅館に有る1つの露天風呂が男湯と女湯に時間で切る変わる仕組みの様なものと考えます。
男湯という札と女湯という札が状態変数の状態で、切り替えるスイッチが巡業員の札の入れ替えと思ってください。
客は札を見て今男湯か女湯か判断するわけですね。
で、札が勝手に変わっては困るので、巡業員が入れ替えるまでその状態を維持しないといけません。
壁に札を置く場所があり、これが状態変数ですが勝手に置いたら状態が切り替わってしまうので、必要な時まで誰も触ってはいけません。

と言うことで、話をじゃんけんにもどすと状態変数を書き換えるのは何かボタンを押した時です(札の入れ替え)。
それ以外の時は、その最後の入れ替えの状態を維持しないといけません。

へんな例えですが、状態遷移について理解が進みましたでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6310
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: DXライブラリが一瞬で消えます

#27

投稿記事 by みけCAT » 6年前

とりあえずコードのインデントを整えたらどうですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: DXライブラリが一瞬で消えます

#28

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

ソフト屋さん
ありがとうございました
状態遷移の仕組みについてはわかりました
それを実行するにはどうしたらいいのでしょう

みけCATさん
すいません 直します

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

Re: DXライブラリが一瞬で消えます

#29

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

とりあえず見やすくしたつもりです
まだインデントが改善できる所があるなら教えて下さい

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int )
{
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
		
		while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 )
		{

			int a = GetRand( 2 );
			int Col = GetColor( 255,255,255 );
			SRand(GetNowCount());  // 乱数初期化
			DrawFormatString( 0, 0, GetColor(255,255,255), "「ジャンケン!」");
			DrawFormatString( 0,20, GetColor(255,255,255), "あなたの手を入力して下さい(グー:1 チョキ:2 パー:3)");
			
			if( CheckHitKey(KEY_INPUT_1) == 1 ){
				DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
				if( a == 0 )
				{
					DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
					DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
					DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あいこです。");
					DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
					if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
					{
						return 0;
					}
				} else if( a == 1 )
				{
					DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
					DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
					DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの勝ちです!");
					DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
					if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
					{
						return 0;
					}
				} else if( a == 2 )
				{
					DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
					DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
					DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの負けです・・・");
					DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
					if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
					{
						return 0;
					}
				}
			} else if( CheckHitKey(KEY_INPUT_2 ) == 1 )
			{
				DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
				if( a == 0 )
				{
					DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
					DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
					DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの負けです・・・");
					DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
					if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
					{
						return 0;
					}
			
				} else if( a == 1 )
				{
					DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
					DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
					DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あいこです。");
					DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
					if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
					{
						return 0;
					}
				
				} else if( a == 2 )
				{
					DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
					DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
					DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの勝ちです!");
					DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
					if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
					{
						return 0;
					}
			
				}
			} else if( CheckHitKey(KEY_INPUT_3 ) == 1 )
			{
				DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
				if( a == 0 )
				{
					DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
					DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
					DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの勝ちです!");
					DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
					if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
					{
						return 0;
					}
				
				} else if( a == 1 )
				{
					DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
					DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
					DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの負けです・・・");
					DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
					if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
					{
						return 0;
					}
				
				} else if( a == 2 )
				{
					DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
					DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
					DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あいこです。");
					DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");	
					if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
					{
						return 0;
					}
				}
			}
}
            DxLib_End(); // DXライブラリ終了処理
            return 0;
}

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

Re: DXライブラリが一瞬で消えます

#30

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

まず、状態を保持する変数を用意します。その変数に初期値を入れます。ここまでメインループの前。
あとは、メインループ内でその状態変数に合わせて表示する処理と、キー入力で状態変数を書き換える処理を作るだけです。
よく分からないなら別プロジェクトで、初期値が0で1ボタンを押したら1に切り替わり、2ボタンを押したら2と切り替わりずっと表示し続けるプログラムを組んでみてください。
練習のためには余分な要素を削ってシンプルにしましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6310
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: DXライブラリが一瞬で消えます

#31

投稿記事 by みけCAT » 6年前

本筋とは関係ないですが、毎フレーム乱数初期化する必要は無いと思いますし、むしろするべきではないと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: DXライブラリが一瞬で消えます

#32

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

ソフト屋さん

どうにか作れた!と思ったら動作が停止しやがりました・・・
なんででしょう・・・

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

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

			int a = 0; //aの初期化

			for(a=1;a>=0;a++)
			{;

				if( CheckHitKey(KEY_INPUT_1 ) == 1 )
				{
					DrawFormatString( 0, 0, GetColor(255,255,255), "%d",a = 1);
				
				} else if( CheckHitKey(KEY_INPUT_2 ) == 1 )
					DrawFormatString( 0, 20, GetColor(255,255,255), "%d",a = 2);

			}
		}

        
        DxLib_End(); // DXライブラリ終了処理
        return 0;
}  

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

Re: DXライブラリが一瞬で消えます

#33

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

breakを追加したら改善したんですけど、やっぱり押してる間しか実行されないです・・

アバター
へにっくす
記事: 630
登録日時: 8年前
住所: 東京都

Re: DXライブラリが一瞬で消えます

#34

投稿記事 by へにっくす » 6年前

エルフ さんが書きました:とりあえず見やすくしたつもりです
まだインデントが改善できる所があるなら教えて下さい
No.29のコードをインデントしてみました。
No.32のコードでまたインデントが崩れてますね。break;はったところのコードを再度掲示してください。

コード:

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定

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

		int a = GetRand(2);
		int Col = GetColor(255, 255, 255);
		SRand(GetNowCount());  // 乱数初期化
		DrawFormatString(0, 0, GetColor(255, 255, 255), "「ジャンケン!」");
		DrawFormatString(0, 20, GetColor(255, 255, 255), "あなたの手を入力して下さい(グー:1 チョキ:2 パー:3)");

		if (CheckHitKey(KEY_INPUT_1) == 1){
			DrawFormatString(0, 40, GetColor(255, 255, 255), "「ポン!」");
			if (a == 0)
			{
				DrawFormatString(0, 60, GetColor(255, 255, 255), "あなた:グー");
				DrawFormatString(0, 80, GetColor(255, 255, 255), "あいて:グー");
				DrawFormatString(0, 100, GetColor(255, 255, 255), "結果:あいこです。");
				DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
				if (CheckHitKey(KEY_INPUT_ESCAPE) == 1)
				{
					return 0;
				}
			}
			else if (a == 1)
			{
				DrawFormatString(0, 60, GetColor(255, 255, 255), "あなた:グー");
				DrawFormatString(0, 80, GetColor(255, 255, 255), "あいて:チョキ");
				DrawFormatString(0, 100, GetColor(255, 255, 255), "結果:あなたの勝ちです!");
				DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
				if (CheckHitKey(KEY_INPUT_ESCAPE) == 1)
				{
					return 0;
				}
			}
			else if (a == 2)
			{
				DrawFormatString(0, 60, GetColor(255, 255, 255), "あなた:グー");
				DrawFormatString(0, 80, GetColor(255, 255, 255), "あいて:パー");
				DrawFormatString(0, 100, GetColor(255, 255, 255), "結果:あなたの負けです・・・");
				DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
				if (CheckHitKey(KEY_INPUT_ESCAPE) == 1)
				{
					return 0;
				}
			}
		}
		else if (CheckHitKey(KEY_INPUT_2) == 1)
		{
			DrawFormatString(0, 40, GetColor(255, 255, 255), "「ポン!」");
			if (a == 0)
			{
				DrawFormatString(0, 60, GetColor(255, 255, 255), "あなた:チョキ");
				DrawFormatString(0, 80, GetColor(255, 255, 255), "あいて:グー");
				DrawFormatString(0, 100, GetColor(255, 255, 255), "結果:あなたの負けです・・・");
				DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
				if (CheckHitKey(KEY_INPUT_ESCAPE) == 1)
				{
					return 0;
				}

			}
			else if (a == 1)
			{
				DrawFormatString(0, 60, GetColor(255, 255, 255), "あなた:チョキ");
				DrawFormatString(0, 80, GetColor(255, 255, 255), "あいて:チョキ");
				DrawFormatString(0, 100, GetColor(255, 255, 255), "結果:あいこです。");
				DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
				if (CheckHitKey(KEY_INPUT_ESCAPE) == 1)
				{
					return 0;
				}

			}
			else if (a == 2)
			{
				DrawFormatString(0, 60, GetColor(255, 255, 255), "あなた:チョキ");
				DrawFormatString(0, 80, GetColor(255, 255, 255), "あいて:パー");
				DrawFormatString(0, 100, GetColor(255, 255, 255), "結果:あなたの勝ちです!");
				DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
				if (CheckHitKey(KEY_INPUT_ESCAPE) == 1)
				{
					return 0;
				}

			}
		}
		else if (CheckHitKey(KEY_INPUT_3) == 1)
		{
			DrawFormatString(0, 40, GetColor(255, 255, 255), "「ポン!」");
			if (a == 0)
			{
				DrawFormatString(0, 60, GetColor(255, 255, 255), "あなた:パー");
				DrawFormatString(0, 80, GetColor(255, 255, 255), "あいて:グー");
				DrawFormatString(0, 100, GetColor(255, 255, 255), "結果:あなたの勝ちです!");
				DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
				if (CheckHitKey(KEY_INPUT_ESCAPE) == 1)
				{
					return 0;
				}

			}
			else if (a == 1)
			{
				DrawFormatString(0, 60, GetColor(255, 255, 255), "あなた:パー");
				DrawFormatString(0, 80, GetColor(255, 255, 255), "あいて:チョキ");
				DrawFormatString(0, 100, GetColor(255, 255, 255), "結果:あなたの負けです・・・");
				DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
				if (CheckHitKey(KEY_INPUT_ESCAPE) == 1)
				{
					return 0;
				}

			}
			else if (a == 2)
			{
				DrawFormatString(0, 60, GetColor(255, 255, 255), "あなた:パー");
				DrawFormatString(0, 80, GetColor(255, 255, 255), "あいて:パー");
				DrawFormatString(0, 100, GetColor(255, 255, 255), "結果:あいこです。");
				DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
				if (CheckHitKey(KEY_INPUT_ESCAPE) == 1)
				{
					return 0;
				}
			}
		}
	}
	DxLib_End(); // DXライブラリ終了処理
	return 0;
}
written by へにっくす

アバター
みけCAT
記事: 6310
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: DXライブラリが一瞬で消えます

#35

投稿記事 by みけCAT » 6年前

エルフ さんが書きました:どうにか作れた!と思ったら動作が停止しやがりました・・・
なんででしょう・・・
エルフ さんが書きました:

コード:

			for(a=1;a>=0;a++)
			{;

				if( CheckHitKey(KEY_INPUT_1 ) == 1 )
				{
					DrawFormatString( 0, 0, GetColor(255,255,255), "%d",a = 1);
				
				} else if( CheckHitKey(KEY_INPUT_2 ) == 1 )
					DrawFormatString( 0, 20, GetColor(255,255,255), "%d",a = 2);

			}
この部分で無限ループになっています。
【修正】
DrawFormatStringでaへの代入が行われているので無限ループかと思いましたが、
よく見ると代入されないパスが存在するので、厳密には無限ループではありません。
最後に編集したユーザー みけCAT on 2014年8月21日(木) 10:30 [ 編集 1 回目 ]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: DXライブラリが一瞬で消えます

#36

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

私の書いたことが全然守られていないというか、違います。

>まず、①状態を保持する変数を用意します。②その変数に初期値を入れます。③ここまでメインループの前。
>あとは、④メインループ内でその状態変数に合わせて表示する処理と、⑤キー入力で状態変数を書き換える処理を作るだけです。

番号を振りましたので、それぞれの番号が該当する部分をコメントに書き加えてみてください。
なんなら、全部温泉旅館仕様にしますか? 変数名もaでは無くfudaOkibaとか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: DXライブラリが一瞬で消えます

#37

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

今からがんばります
温泉旅館に旅行してますw(リアルに)

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

Re: DXライブラリが一瞬で消えます

#38

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

ごめんなさい 作れませんでした
勉強不足ですね・・

キーを押しても反応ないです

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

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

			int fudaOkiba = 0; //①状態を保持する変数を用意します。②その変数に初期値を入れます。

//③ここまでメインループの前。
			
			switch(fudaOkiba)
  
			{
			 DrawFormatString( 0, 0, GetColor(255,255,255), "fudaOkiba");	//④メインループ内でその状態変数に合わせて表示する処理?	
			 if( CheckHitKey(KEY_INPUT_1 ) == 1 ) //⑤キー入力
               {
               fudaOkiba = 1; //⑤で状態変数を書き換える処理を作る
			   if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
				   break;
					
			   }else if( CheckHitKey(KEY_INPUT_2 ) == 1 ) //⑤キー入力
				   {
				    fudaOkiba = 2; //で状態変数を書き換える処理を作る
                    if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
					 break;
			       }

  
			}

        
		}
		DxLib_End(); // DXライブラリ終了処理
		return 0;
}

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

Re: DXライブラリが一瞬で消えます

#39

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

//③ここまでメインループの前。
がメインループの中にあります。

④と⑤は別の処理なのに1つの処理として書いています。

このプログラムを見る限り、条件分岐やループでプログラムがどういう順番で実行されるのか分かっていないのかも知れません。
もっと基本に返った方が良さそうです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
へにっくす
記事: 630
登録日時: 8年前
住所: 東京都

Re: DXライブラリが一瞬で消えます

#40

投稿記事 by へにっくす » 6年前

①と②は一緒でもいいが
①~③はなぜそこに?
ループの意味分かってますか。

なので①②③の場所が違うので、直してみてください。
オフトピック
No.38のコード見てて思ったけど
インデントそろえなさい

何度もしつこく言われてますよね?
直そうとしないのはなぜですか?
written by へにっくす

much

Re: DXライブラリが一瞬で消えます

#41

投稿記事 by much » 6年前

どうも初めまして,今回指導に協力するmuchというものです。

随分とたくさんのお叱りの言葉が来ていますね(^^;)

スレを最初からみた限りエルフさんはif文覚えたてのかなりの初心者かと思われますので
あまり無理をさせないであげたほうがいいかと思います(トラウマになっちゃっいますし...)
ゆっくり改良していきましょう(`・ω・´)

その前に勘違い(?)をしている点について

状態・・・その状況がどういう状況かを表す
------------------------(例)----------------------------
状態遷移:(初期化)→入力前→判定&結果表示→(終了)
                 ↑─┘

という風に仕事別に考えるとき

「入力前」,「判定&結果表示」とした部分が

入力前の状態を1
判定&結果表示の状態を2
としておいて

「入力前」のときにキーを押したら「判定&結果表示」になるようにする

状態をあらわす変数をstate (int型)としたら

stateが1のときのしかるべき場所に
state=2;
を入れればいいわけです(そこは考えて.わからなかったら要相談)

もちろん戻るときは
state=1;
もしかるべき場所に入れなければなりません

また,メインループ内も
if(state==1) //入力前の状態
if(state==2) //判定&結果表示の状態
という風に分けておかなければなりません
--------------------------------------------------------------------

メインループ・・・ウィンドウが表示されている間のループ
ループがわからなければ「while文」で検索

一般に

初期化

メインループ ←┐
↓      └───┘
終了

という形式であらわします

いきなりプログラムデザインを考えるのは難しいとは思いますが
頑張ってください,応援してますので

much

Re: DXライブラリが一瞬で消えます

#42

投稿記事 by much » 6年前

もうちょっと追記

メインループ内では,ぱらぱら漫画のように一瞬でデータが戻っちゃいます
なのでキーを離した瞬間押してないことに等しくなります
そこでキーを押したという証拠を残さなければなりません
これが状態です(曲解だけど)

そしてその証拠があるときとないときで分けるために
メインループを

while(/*ホニャララ*/){
 if(state==1){
  /*証拠がない*/

  //証拠を作る→state=2;
 }
 if(state==2){
  /*証拠がある*/

  //証拠を消す→state=1;
 }
}

とすればメインループを2分できるということを利用すればいいのです(曲解だけど)

顔芸

Re: DXライブラリが一瞬で消えます

#43

投稿記事 by 顔芸 » 6年前

少し前にレスさせていただいた者です.
一つの問題に対するいろいろな意見が聞かれておもしろいですねここは.

エルフさんのソースコードに目を通すと,大変失礼な話ではありますがエルフさん自身に
高いコーディング能力がある・・とは思えないです.これは,皆さんのご指摘にもあるように,
インデントの調整だったり処理流れだったりを見ての私個人の感想です.

しかし,muchさんの仰るとおり,インデントの調整など,プログラムの処理流れと
直接関係のない部分について必要以上に追求すべきではないと思います.
なぜなら,読みやすいソースコードを提示して,質問の回答者に最低限の敬意を払う
ことは大切ですが,読みやすさとは結局のところ書き手の価値観に依るものであって,
読み手が書き手に強要するものであってはならないはずだからです.

実際,エルフさんも指摘を受けた直後に具体的な指導を仰ぎ,インデントを改善したい
という姿勢を見せています.しかし,最終的には "多くの人にとって読みにくい"
コードになってしまっているようです.
この原因は,エルフさんにとってインデントの調整がそもそも重要な問題ではないか,
あるいはエルフさん自身が "多くの人にとって読みやすい" スタイルを知らないかでしょう.

それにもかかわらず,インデントを直しなさい等という高圧的なコメントを見かけ,
質問者でない私でさえびっくりしてしまいました.
直せというのなら具体的にどう直すべきなのかも併せて記述するのが当然ですよね.
まさか読み手の好みを推し量れという注文でもないでしょうし.

例えば私が個人的に支持しているのは,以下の参考サイトに記載されている
「BSD/オールマンのスタイル」という見出し語のスタイルです.
他に,「K&Rのスタイル」に従ってコーディングしていた時期もあります.

http://ja.wikipedia.org/wiki/%E5%AD%97% ... 4%E3%83%AB

微妙な派生はあれど,世の中のメジャーな字下げスタイルは先に挙げた2種類に
大別される
といっても過言ではないと思うので,まずはこのどちらかに統一して
コーディングするよう気をつけてみればいいと思います.

先に,インデントの調整をプログラムの処理流れと直接関係のない部分と述べましたが,
インデントの乱れによってブロックの範囲を見誤るといったミスも十分想定できます.
このようなミスを避けたいと思うのならば(ミスをすること自体は悪くないです,
勉強になるので),他のみなさんにご指摘をいただけた今回をいい機会だと思って,
ぜひエルフさんの考える "多くの人にとって読みやすい" であろうコーディングスタイルを
見出してみて下さい.

最後に,質問の本筋から外れるレスをさせていただいたことについてお詫び申し上げます.

ISLe()

Re: DXライブラリが一瞬で消えます

#44

投稿記事 by ISLe() » 6年前

この程度の規模のコードでスタイルが読みやすさに大きな影響を与えるのでしょうかね。

プログラミングにおいて入口と出口の対応が合っているかどうかはあらゆる点から重要なのでそれをおろそかにするというのはできるできない以前の問題ではないでしょうかね。

質問者さんはVC++2008を使っているということですから、VC++のIDE上でソースコードを開いているときに、Ctrlキーを押しながらKを押し、続けて、Ctrlキーを押しながらFを押せば自動でインデントを整えてくれるはずです。
それをコピペするだけで良いのではないでしょうかね。

ちなみにこの掲示板の下の方にある検索窓を使って『インデント』をキーワードに過去ログを検索すると同じことが書いてあるトピックがすぐに見付かると思います。

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

Re: DXライブラリが一瞬で消えます

#45

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

ソフト屋さん
123番がどこが違うのか、どうするべきなのかはわかりました。ですが4と5がわからないです・・

へにっくすさん
ループの意味はわかってますが、メインループがよくわかってませんでした。
インデントの件ですが、直す気はあるのですが、まだどうすれば見やすいかがよくわかってなくて、{と}を同じ列にするぐらいしかしてなかった事を御詫びします。
今後は、ISLe()さんから教えてもらった方法で改善したいと思います

顔芸さん
とりあえず自働でインデントする方法でやりますが、自分でもできるようにがんばります

ISLe()

Re: DXライブラリが一瞬で消えます

#46

投稿記事 by ISLe() » 6年前

補足というか訂正。

VC++のコードの整形は選択範囲に機能するので、先の投稿は、最初にCtrlキーを押しながらAを押しで全選択を加えてください。

操作としては、Ctrlキーを押したまま、A K F と順に押します。

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

Re: DXライブラリが一瞬で消えます

#47

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

muchさん
わかりやすい説明、ありがとうございました

申し上げにくいのですが、まだ正しくソースが書けないです・・・
どこがどう違いますか?

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

	int state = 0; //①状態を保持する変数を用意します。②その変数に初期値を入れます。

	//③ここまでメインループの前。

	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 )
	{
		state=1;
		if( CheckHitKey(KEY_INPUT_1 ) == 1 )
		{
			if(state==1) //証拠がない場合
			{
				DrawFormatString( 0, 0, GetColor(255,255,255), "state"); 
				state=2; //証拠を作る

			}

			if(state==2) //証拠がある場合
			{

				DrawFormatString( 0, 0, GetColor(255,255,255), "state");
				state=1; //証拠を消す
			}

		}
	}

	DxLib_End(); // DXライブラリ終了処理

	return 0;
}

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

Re: DXライブラリが一瞬で消えます

#48

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

ISLe()さん
Ctrlキーを押したまま、A K F  ですね わかりました
便利なので覚えときます
ありがとうございました。

アバター
みけCAT
記事: 6310
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: DXライブラリが一瞬で消えます

#49

投稿記事 by みけCAT » 6年前

エルフ さんが書きました:どこがどう違いますか?
毎フレームの最初に強制的にstate=1;にしているのが間違いです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: DXライブラリが一瞬で消えます

#50

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

みけCATさん
編集したのですが、まだループしてくれません・・
証拠を付け、証拠を消してるのになんでですか?

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

	int state = 0; //①状態を保持する変数を用意します。②その変数に初期値を入れます。

	//③ここまでメインループの前。

	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 )
	{
		if( CheckHitKey(KEY_INPUT_1 ) == 1 )
		{
			if(state==0) //証拠がない場合
			{
				DrawFormatString( 0, 0, GetColor(255,255,255), "state"); 
				state=1; //証拠を作る

			}
			if(state==1)  //証拠がある場合
			{
				DrawFormatString( 0, 0, GetColor(255,255,255), "state");
				state=0;  //証拠を消す
			}
		}
	}
	DxLib_End(); // DXライブラリ終了処理

	return 0;
}

うずら

Re: DXライブラリが一瞬で消えます

#51

投稿記事 by うずら » 6年前

直下のコードはメインループだけ抜出し。気になった点にコメント追加してます。

コード:

while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 )
    {
        state=1;                       // メインループのたびに毎回値が設定されているのが分かりますか?
        if( CheckHitKey(KEY_INPUT_1 ) == 1 )
        {
            if(state==1) //証拠がない場合        // このように書かれてますが、上で1が代入されてしまっているので必ず入ります。
            {
                DrawFormatString( 0, 0, GetColor(255,255,255), "state"); 
                state=2; //証拠を作る                 // ここで次のステートに移行させていますが、
 
            }
 
            if(state==2) //証拠がある場合        // 処理の流れは上から下なので上で値の2を変数に入れた後個々の動作もされてしまっていますね。
// elseをつけて、上の処理が実行されたら次の処理は実行されないようにする必要があります。
// ついでにこのコードだと"証拠がある場合"と"証拠がない場合"の処理に違いがないと思うんですが・・・
            {
 
                DrawFormatString( 0, 0, GetColor(255,255,255), "state");
                state=1; //証拠を消す
            }
 
        }
    }
プログラムの流れがよくわからないのであれば、関数分けから始めてみてはどうでしょうか?
WinMain関数で初期化、内部でループを回す。
MainLoop関数でマイフレームの動作を行う、など分けてみると少し見やすくなってくるかもしれないです。2つだけでも。
以下は関数分けしてみたコードです。参考程度に。(直接書いちゃったのでコンパイル通るか確認してません。)

コード:

#include "DxLib.h"
 
    int state;    // ①状態を保持する変数を用意します

void MainLoop()
{
    // キーが押されたときに上体を切り替える処理
    if( CheckHitKey(KEY_INPUT_1 ) == 1 )
    {
        if (state == 1)
        {    
            state = 2;        // 状態切り替え
        }
        else                    // 上の条件式が実行されなかったら
        {
            state = 1;
        }
    }

    // 変数の状態に合わせて表示する処理
    if(state==1) //証拠がない場合
    {
        DrawFormatString( 0, 0, GetColor(255,255,255), "state変数の値は1です"); 
    }
    else
    {
        DrawFormatString( 0, 0, GetColor(255,255,255), "state変数の値は2です"); 
    }
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
    ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

    // ②初期化します
    state = 1;
 
    //③ここまでメインループの前。
 
    while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 )
    {
        MainLoop();              // メインループを実行してます。
    }
 
    DxLib_End(); // DXライブラリ終了処理
 
    return 0;
}

アバター
みけCAT
記事: 6310
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: DXライブラリが一瞬で消えます

#52

投稿記事 by みけCAT » 6年前

エルフ さんが書きました:編集したのですが、まだループしてくれません・・
さすがにループはしているはずです。
これでループしなかったらコンパイラのバグを疑います。
オフトピック
こういうループもしていますね。

コード:

while(!正常動作する)デバッグ;
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: DXライブラリが一瞬で消えます

#53

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

うずらさん
コードへのコメントありがとうございました
関数のコードですが、実は1キーを押したら変数を1にして1を2キーを押したら変数を2にして2を表示するプログラムを作りたいんです
さっき僕が書いたのはとりあえず1キーだけのパターンを作ったつもりが、正しくできてなかったので、今の所どこが違うのかを教えてほしかったんです
ややこしくてすみません

うずら

Re: DXライブラリが一瞬で消えます

#54

投稿記事 by うずら » 6年前

コード:

DrawFormatString( 0, 0, GetColor(255,255,255), "state変数の値は%dです", state); 
このように書けば値を表示できます。この関数は引数が可変長で、表示させたい内容によって帰るようになっています。面倒なことが多いので慣れないうちは書き換えるときにエラー出しちゃうかもしれませんが。
ライブラリのリファレンスをしっかり読んだり
書式はprintf()などの標準関数と同じなので(違ってたら訂正お願いします)
Google先生にprintf関数について尋ねてみれば書式は理解できるでしょう。

押したキーによって変数に代入する値を変えたいなら

コード:

if( CheckHitKey(KEY_INPUT_1 ) == 1 )
{
    state = 1;
}

if( CheckHitKey(KEY_INPUT_2 ) == 1 )
{
    state = 2;
}
こんなのを延々書いていくことになります。(ループ使ってキーコードをインクリメントしたりすることもできますが・・・やめた方が無難です)

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

Re: DXライブラリが一瞬で消えます

#55

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

こうしましょう。
printfDxを使って動きを可視化します。
分岐点やループに埋め込んでみました。これでどのように動いているかイメージ出来ますか?

コード:

#include "DxLib.h"
 
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
 
	int state = 0; //①状態を保持する変数を用意します。②その変数に初期値を入れます。
 
	//③ここまでメインループの前。
	printfDx( "main-loop start\n" );
	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 )
	{
		printfDx( "(0-0) " );
		if( CheckHitKey(KEY_INPUT_1 ) == 1 )
		{
			printfDx( "(1-0) " );
			if(state==0) //証拠がない場合
			{
				printfDx( "(2-0) " );
				DrawFormatString( 0, 0, GetColor(255,255,255), "state"); 
				state=1; //証拠を作る
 
			}
			printfDx( "(1-1) " );
			if(state==1)  //証拠がある場合
			{
				printfDx( "(2-1) " );
				DrawFormatString( 0, 0, GetColor(255,255,255), "state");
				state=0;  //証拠を消す
			}
			printfDx( "(1-2) " );
		}
		printfDx( "(0-1)\n" );
	}
	DxLib_End(); // DXライブラリ終了処理
 
	return 0;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

much

Re: DXライブラリが一瞬で消えます

#56

投稿記事 by much » 6年前

うずら さんが書きました:MainLoop関数でマイフレームの動作を行う、など分けてみると少し見やすくなってくるかもしれないです
たしかに見やすいですが
エルフさんが自作関数の作り方を理解しているとは思えないけど...どうなんでしょう
(バカにしているわけじゃないよ、ただ昔自分が躓いた点ですし...)
(プロトタイプ宣言?なんかカッケー!!でもそれ何?とか思ってた昔の俺がいるし...)

最初はwhile文とif文とライブラリ関数のみの構成で行ったほうがエルフさんにとってわかりやすいかと


まぁ、とりあえず今はループしていることを実感してもらうことで
理解が深まるかと思いますので以下のコードを添付します.
(動作確認してないけど多分大丈夫...うん)

コード:

#include "DxLib.h"
 
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
    //------------------------------------------------------------
    //   初期化
    //------------------------------------------------------------

    ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
 
    int state = 0; //①状態を保持する変数を用意します。②その変数に初期値を入れます。
 

    //この下にある3つの変数はループを実感してもらうための変数です
    //一回描画されなおされるごとに1増えます

    int nowcount = 0;     //メインループのループ回数
    int state0count = 0;  //state0のループ回数(stateが変わると0に戻る)
    int state1count = 0;  //state1のループ回数(stateが変わると0に戻る)


    //③ここまでメインループの前。
 
    //------------------------------------------------------------
    //   メインループ
    //------------------------------------------------------------

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

        //stateの値とnowcountの値を表示
        DrawFormatString( 200, 0, GetColor(0,255,0), "nowcount=%d",nowcount);
        DrawFormatString( 0, 0, GetColor(255,0,0), "state=%d",state);

        //state0(キーが入力される前の状態)
        //1キー: state1へ

        if(state==0){

            //state0countの値を表示
            DrawFormatString( 100, 0, GetColor(255,255,0), "state0count=%d",state0count);

            state0count++; //1加算する (state0count = state0count + 1 と同じ)

            if( CheckHitKey(KEY_INPUT_1 ) == 1 ){
                state=1; //証拠を作る
                state0count=0; //state0countを0に戻す
            }

        }

        //state1(キーが入力された後の状態)
        //0キー:state0へ

        if(state==1){

            //state1countを表示
            DrawFormatString( 100, 0, GetColor(255,255,0), "state1count=%d",state1count);

            state1count++; //1加算する (state1count = state1count + 1 と同じ)

            if( CheckHitKey(KEY_INPUT_0 ) == 1 ){
                state=0; //証拠を消す
                state1count=0; //state1countを0に戻す
            }
        }

        nowcount++;  //1加算する (nowcount = nowcount + 1 と同じ)

    }//ループ終わり(while~のところまで戻る)

    //------------------------------------------------------------
    //   終了処理
    //------------------------------------------------------------

    DxLib_End(); // DXライブラリ終了処理
 
    return 0;
}

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

Re: DXライブラリが一瞬で消えます

#57

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

ソフト屋さん
すごいです
こんな風に動いてるんですね・・・

面白かったです。イメージできました。

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

Re: DXライブラリが一瞬で消えます

#58

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

このイメージがないと思うようにプログラムは作れませんで、常に意識してください。
さて、プログラムの流れが思っても見なかった物だと思いますが、どのような流れに治したいですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: DXライブラリが一瞬で消えます

#59

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

muchさん
お察しのとおり、関数についてはなんとなくイメージは分かりますが作るとなると難しいです・・・

すごいですね 凄いスピードで数字が上がっていったのが見えました。こんなに早くループしてるんですね・・
1キーを押したら1がずっと表示されていたのも感動しました

much

Re: DXライブラリが一瞬で消えます

#60

投稿記事 by much » 6年前

エルフ さんが書きました:みけCATさん
編集したのですが、まだループしてくれません・・
証拠を付け、証拠を消してるのになんでですか?

コード:


//(省)

	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 )
	{
		if( CheckHitKey(KEY_INPUT_1 ) == 1 )
		{
			if(state==0) //証拠がない場合
			{
				DrawFormatString( 0, 0, GetColor(255,255,255), "state"); 
				state=1; //証拠を作る

			}
			if(state==1)  //証拠がある場合
			{
				DrawFormatString( 0, 0, GetColor(255,255,255), "state");
				state=0;  //証拠を消す
			}
		}
	}

//(省)
ループはしてるんですよ
ただ,1を押してる間stateが0と1をパタパタ行き来している
そのうえ1が押されている間しか見えないだけで

【1を押した時の反応】

1が押されているので
stateが1になる

次のループに入る
1が押されているので
stateが0になる

次のループに入る
1が押されているので
stateが1になる
・・・

ループの一単位は上の私のサンプルで示したとおり
ほんの一瞬で大きく増えますので
チョン押しじゃない限り一回のループで一回にはなりませぬぞ
それぞれ異なるキーでやると上手くいく

CheckHitKeyの位置をもう一度考えなおしてみて
(とは言ったもののさっき書いてもうた...)

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

Re: DXライブラリが一瞬で消えます

#61

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

ソフト屋さん
とりあえず話を一個戻して、1キーを押したら変数を1にして1を2キーを押したら変数を2にして2を表示するプログラムを作りたいです。

今まで私が作ったソースだとなぜ押し続けなければ消えてしまうのかが今理解できました。
押してもすぐにループして書き換えられてしまうのですね

そのために押したという証拠を残すのですね
もう一度考えて書いてみます

アバター
みけCAT
記事: 6310
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: DXライブラリが一瞬で消えます

#62

投稿記事 by みけCAT » 6年前

much さんが書きました:【1を押した時の反応】

1が押されているので
stateが1になる

次のループに入る
1が押されているので
stateが0になる

次のループに入る
1が押されているので
stateが1になる
・・・
前にも指摘されていますが、これは違います。
このコードだと、

1が押されているので
stateが1になる
state==1なので、(今の「ループ」で)stateが0になる

次の「ループ」に入る
1が押されているので
stateが1になる
state==1なので、(今の「ループ」で)stateが0になる
・・・

という流れです。
とりあえず、elseを1個適切な場所に加えれば、この動きは改善します。(→目押しルーレットになります)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6310
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: DXライブラリが一瞬で消えます

#63

投稿記事 by みけCAT » 6年前

エルフ さんが書きました:みけCATさん
編集したのですが、まだループしてくれません・・
証拠を付け、証拠を消してるのになんでですか?
思うとおりに動かない(≠ループしない)のは「証拠を付け、証拠を消してる」からです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

much

Re: DXライブラリが一瞬で消えます

#64

投稿記事 by much » 6年前

みけCAT さんが書きました: 前にも指摘されていますが、これは違います。
このコードだと、

1が押されているので
stateが1になる
state==1なので、(今の「ループ」で)stateが0になる

次の「ループ」に入る
1が押されているので
stateが1になる
state==1なので、(今の「ループ」で)stateが0になる
・・・

という流れです。
とりあえず、elseを1個適切な場所に加えれば、この動きは改善します。(→目押しルーレットになります)
せやな(´・ω・`)

else if じゃないんだった...

ご指摘ありがとうございます

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

Re: DXライブラリが一瞬で消えます

#65

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

1キーだけならちゃんと動きました!
ありがとうございます!

ですが、1または2というソースだと駄目です・・
どうしてでしょう
それとmuchさん証拠を消す理由はなんですか?

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

	int state = 0; //①状態を保持する変数を用意します。②その変数に初期値を入れます。

	//③ここまでメインループの前。

	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 )
	{
		if( CheckHitKey(KEY_INPUT_1 ) == 1 )
		{
			state=1; //1キーを押したという証拠
			if( state==1 ) //証拠がある場合
			{

				DrawFormatString( 0, 0, GetColor(255,255,255), "state変数の値は%dです",state);
			}
		}
		else( CheckHitKey(KEY_INPUT_2 ) == 1 );
		{
			state=2; //2キーを押したという証拠
			if( state==2 ) //2キーを証拠がある場合
				DrawFormatString( 0, 20, GetColor(255,255,255), "state変数の値は%dです",state);
		}
	}

	DxLib_End(); // DXライブラリ終了処理

	return 0;
}


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

Re: DXライブラリが一瞬で消えます

#66

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

25行目のifの{}が抜けてたのに気づいて直しましたが変わりませんでした
バグの内容は、1キーは1と一瞬しか写らない。2キーはなんもキーを触ってないのに2と最初から出続ける
です。
どうしてでしょう

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

Re: DXライブラリが一瞬で消えます

#67

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

あああ間違えに気づきました直してきます すいません

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

Re: DXライブラリが一瞬で消えます

#68

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

皆さんありがあとうございます!!!
できましたあああ!!!!

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

	int state = 0; //①状態を保持する変数を用意します。②その変数に初期値を入れます。

	//③ここまでメインループの前。

	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 )
	{
		if( CheckHitKey(KEY_INPUT_1 ) == 1 )
		{
			state=1; //1キーを押したという証拠
		}
		else if( CheckHitKey(KEY_INPUT_2 ) == 1 )
		{
			state=2; //2キーを押したという証拠
		}
		if( state==1 ) //1キーの証拠がある場合
		{

			DrawFormatString( 0, 0, GetColor(255,255,255), "state変数の値は%dです",state);
		}
		else if( state==2 ) //2キーの証拠がある場合
		{
			DrawFormatString( 0, 20, GetColor(255,255,255), "state変数の値は%dです",state);
		}
	}

	DxLib_End(); // DXライブラリ終了処理

	return 0;
}

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

Re: DXライブラリが一瞬で消えます

#69

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

これでじゃんけんゲームも正常に動作するようにできるかな・・

やってきます

much

Re: DXライブラリが一瞬で消えます

#70

投稿記事 by much » 6年前

[quote="エルフ" id=3,15563,123844

ですが、1または2というソースだと駄目です・・
どうしてでしょう
それとmuchさん証拠を消す理由はなんですか?

[/code][/quote]

もうすでに気づいたと思うけど

stateを0にする = 消す って表現しただけ
未入力と入力状態の遷移だったから
入力の証拠は消えてますが状態の移動に変わりないです

ですので
stateを2にする
にも全く同じ形ができます
( 証拠って表現 気に入ってもらえたんでしょうか... 少し余計なことしたかも... )

much

Re: DXライブラリが一瞬で消えます

#71

投稿記事 by much » 6年前

それぞれの状態ごとにキーコンフィグが変わることがよくあります
例えばRPGとかだと
マップ画面だと方向キーでキャラクターが動きますが
メニュー画面ではカーソルが動くだけでキャラクターは動きません

先ほどのエルフさんのコードだと全てに対してキーが同じ反応をします
(今回はそれでも問題ないから別にいいんだけど)

なので個人的には以下のような書き方が好みです
(stateの中にキーコンフィグよる分岐でも、キーコンフィグの中にstateによる分岐でも、どっちでもいい)
(その状態でキーコンフィグがどうか と そのキーはそれぞれの状態でどんな機能を果たすかの違い)
(今回は私好みの前者を取っています)

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

	int state = 0; //①状態を保持する変数を用意します。②その変数に初期値を入れます。

	//③ここまでメインループの前。

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

		if( state==1 ) //1キーの証拠がある場合
		{
			DrawFormatString( 0, 0, GetColor(255,255,255), "state変数の値は%dです",state);

        		else if( CheckHitKey(KEY_INPUT_2 ) == 1 )
        		{
        			state=2; //2キーを押したという証拠
        		}
		}

		else if( state==2 ) //2キーの証拠がある場合
		{
			DrawFormatString( 0, 20, GetColor(255,255,255), "state変数の値は%dです",state);

		        if( CheckHitKey(KEY_INPUT_1 ) == 1 )
        		{
			state=1; //1キーを押したという証拠
	        	}

		}
	}

	DxLib_End(); // DXライブラリ終了処理

	return 0;
}

much

Re: DXライブラリが一瞬で消えます

#72

投稿記事 by much » 6年前

↑の18行目: else は消してください

今日はelse運がないな(´・ω・`)

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

Re: DXライブラリが一瞬で消えます

#73

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

muchさん
書き方で少し変わってしまうんですね・・
難しいですね・・

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

Re: DXライブラリが一瞬で消えます

#74

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

ジャンケンゲーム、ちゃんとずっと表示できるようにはなりました!

でも、キーもふれてないのに全てのパターンが重なって表示されるというバグがでました・・

改善策を教えて下さい・・

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int )
{
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

	int PC=0;

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

		int a = GetRand( 2 );
		int Col = GetColor( 255,255,255 );

		SRand(GetNowCount());  // 乱数初期化

		DrawFormatString( 0, 0, GetColor(255,255,255), "「ジャンケン!」");
		DrawFormatString( 0,20, GetColor(255,255,255), "あなたの手を入力して下さい(グー:1 チョキ:2 パー:3)");

		if( CheckHitKey(KEY_INPUT_1) == 1 )
		{
			if( a == 0 )
			{
				PC==1;
			}
		}
		if(PC=1)
		{
			DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
			DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
			DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
			DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あいこです。");
			DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
			if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
			{
				return 0;
			}

		} 
		else if( a == 1 )
		{
			PC==2;
		}
		if(PC=2)
		{
			DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
			DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
			DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
			DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの勝ちです!");
			DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
			if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
			{
				return 0;
			}

		} else if( a == 2 )
		{
			PC==3;
		}
		if(PC=3)
		{
			DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
			DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
			DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
			DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの負けです・・・");
			DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
			if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
			{
				return 0;
			}
		}
		else if( CheckHitKey(KEY_INPUT_2 ) == 1 )
		{
			if( a == 0 )
			{
				PC==4;
			}
		}
		if(PC=4)
		{
			DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
			DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
			DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
			DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの負けです・・・");
			DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
			if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
			{
				return 0;
			}
		}
		else if( a == 1 )
		{
			PC==5;
		}
		if(PC=5)
		{
			DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
			DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
			DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
			DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あいこです。");
			DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
			if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
			{
				return 0;
			}
		}
		else if( a == 2 )
		{
			PC==6;
		}
		if(PC=6)
		{
			DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
			DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
			DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
			DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの勝ちです!");
			DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
			if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
			{
				return 0;
			}
		}
		else if( CheckHitKey(KEY_INPUT_3 ) == 1 )
		{
			if( a == 0 )
			{
				PC==7;
			}
		}
		if(PC=7)
		{
			DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
			DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
			DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
			DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの勝ちです!");
			DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
			if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
			{
				return 0;
			}
			else if( a == 1 )
			{
				PC==8;
			}
			if(PC=8)
			{
			    DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
				DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
				DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
				DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの負けです・・・");
				DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
				if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
				{
					return 0;
				}
				else if( a == 2 )
				{
					PC==9;
				}
				if(PC=9)
				{
			        DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
					DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
					DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
					DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あいこです。");
					DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");	
					if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
					{
						return 0;
					}
				}
			}
		}
	}

	DxLib_End(); // DXライブラリ終了処理
	return 0;
}

much

Re: DXライブラリが一瞬で消えます

#75

投稿記事 by much » 6年前

とりあえずwhileのあとに,この一行入れてみて

DrawFormatString( 100,0, GetColor(255,255,255),"a=%d",a);

much

Re: DXライブラリが一瞬で消えます

#76

投稿記事 by much » 6年前

状態はキーを押す前と後,前準備の3つだけ
(前準備はキーの押す前に入れてもいいけど毎回前準備する必要ない)

初期状態は「じゃんけんの前準備」

while(/*ホニャララ*/)

「じゃんけん前の前準備」
↓処理が終わったら「キーを押す前」の状態に進む証拠をつける
「キーを押す前」
↓キーが押されたら(1or2or3キー)「キーを押した」証拠をつける
「キーを押した後」 ->escで終了
↓何かキーが押されたら「じゃんけんの前準備」に進む証拠をつける
「じゃんけんの前準備」

・・・

much

Re: DXライブラリが一瞬で消えます

#77

投稿記事 by much » 6年前

エルフ さんが書きました:ジャンケンゲーム、ちゃんとずっと表示できるようにはなりました!

でも、キーもふれてないのに全てのパターンが重なって表示されるというバグがでました・・

改善策を教えて下さい・・
よく見るとifの中が代入になっていたりしますよ

それはともかく
先ほどのコードを私的な書き方で行けば
①状態を列挙
②中にその時にすることを書く

①をやってみる

コード:

//(省)

	int PC=0; 

		SRand(GetNowCount());  // 乱数初期化(ループの中に突っ込まないでください)

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

		int a = GetRand( 2 );
		int Col = GetColor( 255,255,255 );

		DrawFormatString( 0, 0, GetColor(255,255,255), "「ジャンケン!」");
		DrawFormatString( 0,20, GetColor(255,255,255), "あなたの手を入力して下さい(グー:1 チョキ:2 パー:3)");

                if(PC==0){ }
                if(PC==1){ }
                if(PC==2){ }
                if(PC==3){ }
                if(PC==4){ }
                ・・・
                if(PC==9){ }

		}
	}

	DxLib_End(); // DXライブラリ終了処理
	return 0;
}
あとはそれぞれのPCで何をするかをそれぞれに記入

much

Re: DXライブラリが一瞬で消えます

#78

投稿記事 by much » 6年前

私が提案した3つの状態だと

コード:


//・・・

while(/*ホニャララ*/){
    if(PC==0){
        /*前準備*/
        PC=1;
    }
    if(PC==1){
        if(/*キーが入力されたら*/){
            /*入力されたキーを変数に保存しておく*/
            PC=2;
        }
    }
    if(PC==2){
        /*入力されたキーとランダムの値で場合分け(9通り)*/
        /*結果表示*/
        if(/*ESCキーが入力されたら*/){
            return 0;
        }
        if(/*キーが入力されたら*/){
            PC=0;
        }
    }

//・・・

}
こんなんでどうでしょう

というか、眠たいのでまた明日にでも様子見に来ます

アバター
みけCAT
記事: 6310
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: DXライブラリが一瞬で消えます

#79

投稿記事 by みけCAT » 6年前

much さんが書きました:

コード:

        if(/*ESCキーが入力されたら*/){
            return 0;
        }
DxLib_End()を呼ばずに終了するのはまずそうなので、return 0;よりbreak;の方がいいと思います。
ただし、switchを用いるとその中でのbreak;によりwhileループを脱出することはできなくなるので、
終了フラグを立て、whileループの条件で終了フラグが立っていたら終了、という方式の方がいいかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: DXライブラリが一瞬で消えます

#80

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

私のお教えしたデバッグ技法を常に使われたほうが良いと思います。
少なくともイメージがすぐ把握できるようになるまでは。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: DXライブラリが一瞬で消えます

#81

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

いろいろ書き直してみました。
そしたら、「error C2065: 'a' : 定義されていない識別子です。」というエラーが9個でて、直せないです
どうしたら直せますか?

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int )
{
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

	int PC=0; //PCの初期化
	int b = 0; //bの初期化

	SRand(GetNowCount());  // 乱数初期化

	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 )
	{ //ここからメインループ
		if( b = 0 ) //証拠が何もないなら
		{

			int a = GetRand( 3 ); //乱数0,1,2
			int Col = GetColor( 255,255,255 );

			DrawFormatString( 0, 0, GetColor(255,255,255), "「ジャンケン!」");
			DrawFormatString( 0,20, GetColor(255,255,255), "あなたの手を入力して下さい(グー:1 チョキ:2 パー:3)");

			b = 1; //前準備をした証拠
		} //証拠が何もないならここまで

		if( b = 1 ) //前準備をした証拠があるなら
		{

			if( CheckHitKey(KEY_INPUT_1) == 1 )//1キーを押したなら
			{
				b = 2; //1キーを押した証拠
				if(b = 2) //1キーを押した証拠があるなら
				{
					if( a = 0 )
					{
						PC=1;
					}
					else if( a = 1)
					{
						PC=2;
					}
					else( a = 2);
					{
						PC=3;
					}
				}
			}

			else if( CheckHitKey(KEY_INPUT_2) == 1 )//2キーを押したなら
			{
				b = 3; //2キーを押した証拠
				if(b = 3) //2キーを押した証拠があるなら
				{
					if( a = 0 )
					{
						PC=4;
					}
					else if( a = 1 )
					{
						PC=5;
					}
					else( a = 2 );
					{
						PC=6;
					}
				}
			}
			else( CheckHitKey(KEY_INPUT_3) == 1 ); //3キーを押したなら
			{
				b = 4; //3キーを押した証拠
				if( b = 4) //3キーを押した証拠があるなら
				{
					if( a = 0)
					{
						PC=7;
					}
					else if( a = 1)
					{
						PC=8;
					}
					else( a = 2);
					{
						PC=9;
					}
				}
			}

			if(PC=1)
			{
				DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
				DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
				DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
				DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あいこです。");
				DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
				if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
				{
					break;
				}
			}

			else if(PC=2)
			{
				DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
				DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
				DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
				DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの勝ちです!");
				DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
				if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
				{
					break;
				}
			}

			else if(PC=3)
			{
				DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
				DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:グー");
				DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
				DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの負けです・・・");
				DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
				if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
				{
					return 0;
				}
			}

			else if(PC=4)
			{
				DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
				DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
				DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
				DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの負けです・・・");
				DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
				if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
				{
					break;

				}
			}

			else  if(PC=5)
			{
				DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
				DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
				DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
				DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あいこです。");
				DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
				if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
				{
					break;
				}
			}

			else if(PC=6)
			{
				DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
				DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:チョキ");
				DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
				DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの勝ちです!");
				DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
				if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
				{
					break;
				}
			}

			else if(PC=7)
			{
				DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
				DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
				DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:グー");
				DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの勝ちです!");
				DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
				if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
				{
					break;
				}
			}

			else if(PC=8)
			{
				DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
				DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
				DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:チョキ");
				DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あなたの負けです・・・");
				DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");
				if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
				{
					break;
				}
			}

			else(PC=9);
			{
				DrawFormatString( 0, 40, GetColor(255,255,255), "「ポン!」");
				DrawFormatString( 0, 60, GetColor(255,255,255),"あなた:パー");
				DrawFormatString( 0, 80, GetColor(255,255,255),"あいて:パー");
				DrawFormatString( 0, 100, GetColor(255, 255,255),"結果:あいこです。");
				DrawFormatString(0, 120, GetColor(255, 255, 0), "ESCキーで終了します。");	
				if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 )
				{
					break;
				}
			}
		} //前準備をした証拠があるならここまで
	} //ここまでメインループ

	DxLib_End(); // DXライブラリ終了処理
	return 0;
}

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

Re: DXライブラリが一瞬で消えます

#82

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

C言語の入門書には必ず書いてあるともうのでお手持ちの本を確認をお願いします。
今回の問題は「変数のスコープと寿命」が関係しています。
http://www.cc.kyoto-su.ac.jp/~hxm/cstext/prog04.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: DXライブラリが一瞬で消えます

#83

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

ソフト屋さん
ありがとうございます
解決しました

でもまた別の問題が・・

ふぁい

Re: DXライブラリが一瞬で消えます

#84

投稿記事 by ふぁい » 6年前

長い間ここの掲示板を見てるが、なんでsoftya氏はいつも偉そうなんだろう。
俺は正しいことを教えてやっているんだ。俺の言うことに従え。という意識しか感じられん…

アバター
みけCAT
記事: 6310
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: DXライブラリが一瞬で消えます

#85

投稿記事 by みけCAT » 6年前

エルフ さんが書きました:でもまた別の問題が・・
if文(などの条件を書く場所)の中で無駄な代入をしないように、余計なセミコロンを付けないように気をつけましょう。
オフトピック
無駄じゃない代入の例

コード:

if(fp=fopen("hoge.txt","r")) {
  /* fpを使った処理 */
  fclose(fp);
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

much

Re: DXライブラリが一瞬で消えます

#86

投稿記事 by much » 6年前

ふぁい さんが書きました:長い間ここの掲示板を見てるが、なんでsoftya氏はいつも偉そうなんだろう。
俺は正しいことを教えてやっているんだ。俺の言うことに従え。という意識しか感じられん…
私も昔お世話になったのですが
なんだかC言語を理解していることを前提としているような感じですよね.(悪いとはいいませんが)

確かに初歩的な事はネットなどで調べればすぐに出ますが,
最初のうちは動作を理解するのに苦戦するかと思います.
(プログラミング脳に変わるまでわからないものはわからないですし...)
(そのうえライブラリが混入してきたら,普通のC言語入門サイトとの微妙な書式の違いで混乱するでしょう)

また,「C言語の質問掲示板」というくらいですので
C言語を理解していない状態での質問は勿論許されるべきでしょうし
わからない文法はわからないとコメントしたり
産まれたてのぎこちない,モジャモジャスパゲッティテストコードに関して他者からのコメントをもらうのは普通の行為かと思います

個人的にはデバッグ能力 ( 変数表示, コメント化による分離, 仮値代入など ) をつけるのが
先決かとも思うんですけど,その辺りは個人の性格なんでしょうかね

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

Re: DXライブラリが一瞬で消えます

#87

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

みけCATさん
私の書いたソースのどの行の;が不要ですか?

elseにはつけないといけないですよね?

アバター
みけCAT
記事: 6310
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: DXライブラリが一瞬で消えます

#88

投稿記事 by みけCAT » 6年前

エルフ さんが書きました:みけCATさん
私の書いたソースのどの行の;が不要ですか?
No: 81のソースの中では、42行目、62行目、68行目、81行目、193行目の;が不要(蛇足)だと思います。
エルフ さんが書きました:elseにはつけないといけないですよね?
いいえ。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: DXライブラリが一瞬で消えます

#89

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

みけCATさん
elseの;を消すと、error C2143: 構文エラー : ';' が '{' の前にありません。とでてしまいます
どうしたらいいですか?

アバター
みけCAT
記事: 6310
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: DXライブラリが一瞬で消えます

#90

投稿記事 by みけCAT » 6年前

エルフ さんが書きました:みけCATさん
elseの;を消すと、error C2143: 構文エラー : ';' が '{' の前にありません。とでてしまいます
どうしたらいいですか?
それはelseではなくてelse ifの間違いではないですか?
elseで間違いないとしたら、紛らわしいのでカッコを外したほうが私は好みです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

much

Re: DXライブラリが一瞬で消えます

#91

投稿記事 by much » 6年前

エルフ さんが書きました:みけCATさん
私の書いたソースのどの行の;が不要ですか?

elseにはつけないといけないですよね?
付けてはいけません
行末に ; を付けないときは

① ○○ { というふうに" { " で続く場所
(例): if (a==1) {
② } というふうにカッコを閉じるところ(ただし,構造体のタグ宣言とか例外多し)
(例): }
③ハッシュマーク(#)で続くような場所
(例): #include <stdio.h>

他にもあるかもしれないけど,やってりゃ覚える


というより
else if (/* */) { }
という形か
else { }
という形がいいかと

アバター
みけCAT
記事: 6310
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: DXライブラリが一瞬で消えます

#92

投稿記事 by みけCAT » 6年前

自分でじゃんけんのプログラムを書いてみました。
エルフさんには一度自分で動くものが書けてから見てほしいです。
添付ファイル
dx_janken.zip
じゃんけんのプログラム
(2.06 MiB) ダウンロード数: 41 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: DXライブラリが一瞬で消えます

#93

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

みけCATさん
そうですね elseなら()がいりませんよね
直しました

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

Re: DXライブラリが一瞬で消えます

#94

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

みけCATさん
今のじゃんけんが正常に動くようになったら見さしていただきます
ありがとうございました

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

Re: DXライブラリが一瞬で消えます

#95

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

バグが直んないです・・

バグの内容は、キーに触れてないのに、パターン1(変数 PC=1)の時の処理をされてしまい、あいてがグーを出してしまいます

どうしてでしょう・・

アバター
みけCAT
記事: 6310
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: DXライブラリが一瞬で消えます

#96

投稿記事 by みけCAT » 6年前

エルフ さんが書きました:バグが直んないです・・

バグの内容は、キーに触れてないのに、パターン1(変数 PC=1)の時の処理をされてしまい、あいてがグーを出してしまいます

どうしてでしょう・・
PC=1という式は(PCがint型の場合)常に真だからです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: DXライブラリが一瞬で消えます

#97

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

みけCATさん

どうすれば改善しますか?

アバター
みけCAT
記事: 6310
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: DXライブラリが一瞬で消えます

#98

投稿記事 by みけCAT » 6年前

エルフ さんが書きました:みけCATさん

int型の変数には初期化しても最初に0ではなく1が入っているということですか?
(掲示板がおかしくなったようなので、うろ覚えで復元)

初期化の方法によります。

コード:

int hoge = 1;
と書けば、(まともなコンパイラなら)当然最初に1が入ります。
エルフ さんが書きました:みけCATさん

どうすれば改善しますか?
数値が等しいかを判定したいときに、代入演算子を使わないようにすれば改善すると思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

much

Re: DXライブラリが一瞬で消えます

#99

投稿記事 by much » 6年前

エルフ さんが書きました:みけCATさん

どうすれば改善しますか?
ヒント:
if(/* 条件式 */ )

条件式部が正(非ゼロ)なら
if文の中を通ります

(例)
if (1){
通る
}

if(20){
通る
}

if(0){
通らない
}

if(-1){
実は通る
}

if(1+2){
通る
}

if(a=0){ } -> if(0) -> 通らない
if(a=1){ } -> if(1) -> 通る

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

Re: DXライブラリが一瞬で消えます

#100

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

ソフト屋さんのデバッガ方法で調べた結果、乱数の値が-858993460になっていました

これはどういう事でしょう・・
int a = GetRand( 3 );と書けば0または1または2ではないんですか?

閉鎖

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