ページ 1 / 2
DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 00:39
by エルフ
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;
}}
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 02:09
by N.Mです
DXライブラリが一瞬で消えてしまうのは、while文の括弧の中にDxLib_END関数とreturn 0;を入れてしまってるからでしょう。またそこを修復してもいくらか問題はあると思いますよ?(Random変数を初期化していなかったり等)
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 10:06
by softya(ソフト屋)
インデントが乱れているのが間違いの元じゃないかと思います。
コード:
#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;
}
}
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 12:31
by エルフ
ソフト屋さん ありがとうござました。ですが、そのように編集しても結果は変わりませんでした。あなたのソースをコピペしても一瞬で消えてしまいました・・・
N.Mさん 「while文の括弧の中にDxLib_END関数とreturn 0;を入れてしまってるからでしょう。」とおっしゃいましたが、そんなことはないと思うのですが・・
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 12:55
by Ryo
開発ソフトがVS2008(のVC)とのことですから
デバッグモードで1行ずつ動作を追いかけてみてはどうでしょうか?
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 13:09
by エルフ
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ライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 13:32
by うずら
エルフ さんが書きました:ソフト屋さん ありがとうござました。ですが、そのように編集しても結果は変わりませんでした。あなたのソースをコピペしても一瞬で消えてしまいました・・・
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;
}
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 13:32
by みけCAT
エルフ さんが書きました:N.Mさん 「while文の括弧の中にDxLib_END関数とreturn 0;を入れてしまってるからでしょう。」とおっしゃいましたが、そんなことはないと思うのですが・・
デバッグにおいて、思い込みは大敵です。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 14:26
by エルフ
思い込んでたようです すいません
直したら起動できました。
ですが、プレイヤーの手を選択するとデバッグエラーがおこります・・・
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;
}
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 14:29
by softya(ソフト屋)
私のコードはインデントなおしただけで、コードに一切手を付けていません。
これで通ってないように見えるとしたら、whileループの仕組みを理解されていないかもしれません。
みけCATさんの言われるように思い込みの激しい人はデバッグを難しくします。
これは、プログラマーとして成長する事を難しくする要因です。
自分の作ったものを出来るだけ他人の目で見る=客観視する能力が必要となるんです。
それでもプロでも完全な客観視は難しいのでデバッガがデバッグ手法が有りますので、それを使いましょう。
「太田研究室 > Visual C++ 2010 Express プログラミング入門」
http://cvwww.ee.ous.ac.jp/vc10prog.html#7
ここのブレークポイントを
DxLib_End(); // DXライブラリ終了処理
に設定してF5で実行してみてください。止まると思います。
もし止まったら実行されているということです。
と書いている間に投稿されましたね。その分は後で投稿します。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 14:30
by みけCAT
エルフ さんが書きました:プレイヤーの手を選択するとデバッグエラーがおこります・・・
Run-Time Check Failure #3 - The variable 'Random' is being used without being initialized.
とでてきました。
それとビルドすると警告で、warning C4700: 初期化されていないローカル変数 'Random' が使用されますとでるんですが、なんででしょう・・
SRand(GetNowCount()); // 乱数初期化をおこなっているのに・・
Randomを初期化していないからです。
SRandはライブラリの内部の初期化であり、ローカル変数Randomとは無関係です。
ついでに、確保された領域の外であるRandom[2]にアクセスする可能性があるという問題もあります。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 14:33
by softya(ソフト屋)
>Run-Time Check Failure #3 - The variable 'Random' is being used without being initialized.
>それとビルドすると警告で、warning C4700: 初期化されていないローカル変数 'Random' が使用されますとでるんですが、なんででしょう・・
>SRand(GetNowCount()); // 乱数初期化をおこなっているのに・・
int Random[2];の初期化とSRand(GetNowCount());には一切関係ありませんよ。関係のあるようなことが一切書かれていません。
それも思い込みです。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 15:24
by エルフ
いろいろ考えて直しました
皆さんの助けもあったため、どうにかエラーと警告を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;
}
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 15:27
by softya(ソフト屋)
すでにヒントは出てます。
見逃しているのなら、それも思い込みかもです。
あとインデントはちゃんとしましよう。
インデントが分からないなら質問して下さい。
何かわからないからスルーと云うのは大抵良くないパターンにハマります。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 15:34
by うずら
宣言が
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秒しか結果が表示されないんじゃないでしょうか?
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 15:57
by エルフ
うずらさん
ありがとうございます
あなたのおかげでエラーがなくなりました。
そしてESCで終了するように直しました!
ソフト屋さん
インデントがわからないので教えてください。
それと、押したら次の処理がされるのではなく、押している間、次の処理がされる。という風になってしまいました。
他にも、相手が毎回同じ手しか出さないです・・
解決策を教えて下さい。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 16:11
by softya(ソフト屋)
> インデントがわからないので教えてください。
そうです。そうやって聞かないと後で「今さら聞けない」状態になるので不幸ですよ。
「mixcpp/投稿前チェックリスト」 ここに書いてあります。
http://mikecat.6.ql.bz/mixc_check/
>それと、押したら次の処理がされるのではなく、押している間、次の処理がされる。という風になってしまいました。
状態を変数に残して、表示の分岐は変数を見てしないといけません。状態遷移と呼ばれるものです。
これがグラフィック系のアプリ・ゲームを作る時の必須アルゴリズムです。
コンソールの時には使わなくても済む場合が多いですけどね。
> 他にも、相手が毎回同じ手しか出さないです・・
Random[0] = GetRand( 2 ) == a;
ってどうな値が入るのを期待していますか?
デバッガで確認した場合の値は? なぜ、そんな値になると思いますか?
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 16:18
by みけCAT
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 16:28
by エルフ
ソフト屋さん
インデントはわかりました ありがとうございました
デバッガをする前のブレークポイントが作れなくてデバッガができないです・・
それと状態遷移にするにはどうしたらいいんですか?
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 17:06
by softya(ソフト屋)
エルフ さんが書きました:ソフト屋さん
インデントはわかりました ありがとうございました
デバッガをする前のブレークポイントが作れなくてデバッガができないです・・
そんなはずはないですが、F9を押しても反応無いですか?
エルフ さんが書きました:
それと状態遷移にするにはどうしたらいいんですか?
こっちは、ここで1レベル上を目指しましょうか。
まずネットで検索して自分なりに状態遷移というモノを整理してみてください。
ここで考えるということが重要です。そして、どのようにしたら良いかとい提案をお願いします。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 17:13
by エルフ
ソフト屋さん
F9で出来ました
全て値は0でした
なぜその結果になったのかは思いつかないです・・・
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 17:33
by エルフ
状態遷移の件ですがよくわかりません
キー入力をしたらループを使うとか・・?
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 18:01
by うずら
変数を置いて、値がいくらだったらどの処理をするかっていうのを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ライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 19:21
by 顔芸
自分だったらこんな流れにしますかねー
実行はしてないので間違ってたらゴメンナサイ
コード:
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;
}
うずらさんのおっしゃる通り,状態を意識してやらないと
押したら次の処理がされるのではなく、押している間、次の処理がされる。という風になってしまいました。
というようなことになってしまいます.結果の表示が一瞬で終了してしまうからですね.
あと,これは好みにもよると思いますが,コード長よりも処理の内容を意識して,
意味の切れ目で関数化するよう心がけると,流れの追いやすいプログラムが書けると思いますよ.
(もちろんインデントや行間が整っていることが前提です.)
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月20日(水) 23:51
by エルフ
状態を意識してやるというのがわかりません・・
そのため、グー(キーボードの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;
}
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月21日(木) 00:11
by softya(ソフト屋)
とりあえずじゃんけんは置いておいて状態遷移を勉強してみましょうか。
【状態遷移とは】
変な例え思いつきましたので書いておきます。
温泉旅館に有る1つの露天風呂が男湯と女湯に時間で切る変わる仕組みの様なものと考えます。
男湯という札と女湯という札が状態変数の状態で、切り替えるスイッチが巡業員の札の入れ替えと思ってください。
客は札を見て今男湯か女湯か判断するわけですね。
で、札が勝手に変わっては困るので、巡業員が入れ替えるまでその状態を維持しないといけません。
壁に札を置く場所があり、これが状態変数ですが勝手に置いたら状態が切り替わってしまうので、必要な時まで誰も触ってはいけません。
と言うことで、話をじゃんけんにもどすと状態変数を書き換えるのは何かボタンを押した時です(札の入れ替え)。
それ以外の時は、その最後の入れ替えの状態を維持しないといけません。
へんな例えですが、状態遷移について理解が進みましたでしょうか?
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月21日(木) 00:14
by みけCAT
とりあえずコードのインデントを整えたらどうですか?
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月21日(木) 00:19
by エルフ
ソフト屋さん
ありがとうございました
状態遷移の仕組みについてはわかりました
それを実行するにはどうしたらいいのでしょう
みけCATさん
すいません 直します
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月21日(木) 00:30
by エルフ
とりあえず見やすくしたつもりです
まだインデントが改善できる所があるなら教えて下さい
コード:
#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;
}
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月21日(木) 00:35
by softya(ソフト屋)
まず、状態を保持する変数を用意します。その変数に初期値を入れます。ここまでメインループの前。
あとは、メインループ内でその状態変数に合わせて表示する処理と、キー入力で状態変数を書き換える処理を作るだけです。
よく分からないなら別プロジェクトで、初期値が0で1ボタンを押したら1に切り替わり、2ボタンを押したら2と切り替わりずっと表示し続けるプログラムを組んでみてください。
練習のためには余分な要素を削ってシンプルにしましょう。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月21日(木) 00:39
by みけCAT
本筋とは関係ないですが、毎フレーム乱数初期化する必要は無いと思いますし、むしろするべきではないと思います。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月21日(木) 01:14
by エルフ
ソフト屋さん
どうにか作れた!と思ったら動作が停止しやがりました・・・
なんででしょう・・・
コード:
#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;
}
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月21日(木) 01:35
by エルフ
breakを追加したら改善したんですけど、やっぱり押してる間しか実行されないです・・
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月21日(木) 05:32
by へにっくす
エルフ さんが書きました:とりあえず見やすくしたつもりです
まだインデントが改善できる所があるなら教えて下さい
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;
}
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月21日(木) 08:29
by みけCAT
エルフ さんが書きました:どうにか作れた!と思ったら動作が停止しやがりました・・・
なんででしょう・・・
エルフ さんが書きました:コード:
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への代入が行われているので無限ループかと思いましたが、
よく見ると代入されないパスが存在するので、厳密には無限ループではありません。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月21日(木) 10:23
by softya(ソフト屋)
私の書いたことが全然守られていないというか、違います。
>まず、①状態を保持する変数を用意します。②その変数に初期値を入れます。③ここまでメインループの前。
>あとは、④メインループ内でその状態変数に合わせて表示する処理と、⑤キー入力で状態変数を書き換える処理を作るだけです。
番号を振りましたので、それぞれの番号が該当する部分をコメントに書き加えてみてください。
なんなら、全部温泉旅館仕様にしますか? 変数名もaでは無くfudaOkibaとか。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月21日(木) 22:14
by エルフ
今からがんばります
温泉旅館に旅行してますw(リアルに)
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月21日(木) 23:16
by エルフ
ごめんなさい 作れませんでした
勉強不足ですね・・
キーを押しても反応ないです
コード:
#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;
}
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月22日(金) 00:05
by softya(ソフト屋)
//③ここまでメインループの前。
がメインループの中にあります。
④と⑤は別の処理なのに1つの処理として書いています。
このプログラムを見る限り、条件分岐やループでプログラムがどういう順番で実行されるのか分かっていないのかも知れません。
もっと基本に返った方が良さそうです。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月22日(金) 05:02
by へにっくす
①と②は一緒でもいいが
①~③はなぜそこに?
ループの意味分かってますか。
なので①②③の場所が違うので、直してみてください。
オフトピック
No.38のコード見てて思ったけど
インデントそろえなさい
何度もしつこく言われてますよね?
直そうとしないのはなぜですか?
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月22日(金) 19:18
by much
どうも初めまして,今回指導に協力するmuchというものです。
随分とたくさんのお叱りの言葉が来ていますね(^^;)
スレを最初からみた限りエルフさんはif文覚えたてのかなりの初心者かと思われますので
あまり無理をさせないであげたほうがいいかと思います(トラウマになっちゃっいますし...)
ゆっくり改良していきましょう(`・ω・´)
その前に勘違い(?)をしている点について
状態・・・その状況がどういう状況かを表す
------------------------(例)----------------------------
状態遷移:(初期化)→入力前→判定&結果表示→(終了)
↑─┘
という風に仕事別に考えるとき
「入力前」,「判定&結果表示」とした部分が
入力前の状態を1
判定&結果表示の状態を2
としておいて
「入力前」のときにキーを押したら「判定&結果表示」になるようにする
状態をあらわす変数をstate (int型)としたら
stateが1のときのしかるべき場所に
state=2;
を入れればいいわけです(そこは考えて.わからなかったら要相談)
もちろん戻るときは
state=1;
もしかるべき場所に入れなければなりません
また,メインループ内も
if(state==1) //入力前の状態
if(state==2) //判定&結果表示の状態
という風に分けておかなければなりません
--------------------------------------------------------------------
メインループ・・・ウィンドウが表示されている間のループ
ループがわからなければ「while文」で検索
一般に
初期化
↓
メインループ ←┐
↓ └───┘
終了
という形式であらわします
いきなりプログラムデザインを考えるのは難しいとは思いますが
頑張ってください,応援してますので
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月22日(金) 19:41
by much
もうちょっと追記
メインループ内では,ぱらぱら漫画のように一瞬でデータが戻っちゃいます
なのでキーを離した瞬間押してないことに等しくなります
そこでキーを押したという証拠を残さなければなりません
これが状態です(曲解だけど)
そしてその証拠があるときとないときで分けるために
メインループを
while(/*ホニャララ*/){
if(state==1){
/*証拠がない*/
//証拠を作る→state=2;
}
if(state==2){
/*証拠がある*/
//証拠を消す→state=1;
}
}
とすればメインループを2分できるということを利用すればいいのです(曲解だけど)
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月22日(金) 22:09
by 顔芸
少し前にレスさせていただいた者です.
一つの問題に対するいろいろな意見が聞かれておもしろいですねここは.
エルフさんのソースコードに目を通すと,大変失礼な話ではありますがエルフさん自身に
高いコーディング能力がある・・とは思えないです.これは,皆さんのご指摘にもあるように,
インデントの調整だったり処理流れだったりを見ての私個人の感想です.
しかし,muchさんの仰るとおり,インデントの調整など,プログラムの処理流れと
直接関係のない部分について必要以上に追求すべきではないと思います.
なぜなら,
読みやすいソースコードを提示して,質問の回答者に最低限の敬意を払う
ことは大切ですが,読みやすさとは結局のところ書き手の価値観に依るものであって,
読み手が書き手に強要するものであってはならないはずだからです.
実際,エルフさんも指摘を受けた直後に具体的な指導を仰ぎ,インデントを改善したい
という姿勢を見せています.しかし,最終的には
"多くの人にとって読みにくい"
コードになってしまっているようです.
この原因は,エルフさんにとってインデントの調整がそもそも重要な問題ではないか,
あるいはエルフさん自身が
"多くの人にとって読みやすい" スタイルを知らないかでしょう.
それにもかかわらず,インデントを直しなさい等という高圧的なコメントを見かけ,
質問者でない私でさえびっくりしてしまいました.
直せというのなら具体的にどう直すべきなのかも併せて記述するのが当然ですよね.
まさか読み手の好みを推し量れという注文でもないでしょうし.
例えば私が個人的に支持しているのは,以下の参考サイトに記載されている
「BSD/オールマンのスタイル」という見出し語のスタイルです.
他に,「K&Rのスタイル」に従ってコーディングしていた時期もあります.
http://ja.wikipedia.org/wiki/%E5%AD%97% ... 4%E3%83%AB
微妙な派生はあれど,
世の中のメジャーな字下げスタイルは先に挙げた2種類に
大別されるといっても過言ではないと思うので,まずはこのどちらかに統一して
コーディングするよう気をつけてみればいいと思います.
先に,インデントの調整をプログラムの処理流れと直接関係のない部分と述べましたが,
インデントの乱れによってブロックの範囲を見誤るといったミスも十分想定できます.
このようなミスを避けたいと思うのならば(ミスをすること自体は悪くないです,
勉強になるので),他のみなさんにご指摘をいただけた今回をいい機会だと思って,
ぜひエルフさんの考える
"多くの人にとって読みやすい" であろうコーディングスタイルを
見出してみて下さい.
最後に,質問の本筋から外れるレスをさせていただいたことについてお詫び申し上げます.
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月22日(金) 23:07
by ISLe()
この程度の規模のコードでスタイルが読みやすさに大きな影響を与えるのでしょうかね。
プログラミングにおいて入口と出口の対応が合っているかどうかはあらゆる点から重要なのでそれをおろそかにするというのはできるできない以前の問題ではないでしょうかね。
質問者さんはVC++2008を使っているということですから、VC++のIDE上でソースコードを開いているときに、Ctrlキーを押しながらKを押し、続けて、Ctrlキーを押しながらFを押せば自動でインデントを整えてくれるはずです。
それをコピペするだけで良いのではないでしょうかね。
ちなみにこの掲示板の下の方にある検索窓を使って『インデント』をキーワードに過去ログを検索すると同じことが書いてあるトピックがすぐに見付かると思います。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月22日(金) 23:17
by エルフ
ソフト屋さん
123番がどこが違うのか、どうするべきなのかはわかりました。ですが4と5がわからないです・・
へにっくすさん
ループの意味はわかってますが、メインループがよくわかってませんでした。
インデントの件ですが、直す気はあるのですが、まだどうすれば見やすいかがよくわかってなくて、{と}を同じ列にするぐらいしかしてなかった事を御詫びします。
今後は、ISLe()さんから教えてもらった方法で改善したいと思います
顔芸さん
とりあえず自働でインデントする方法でやりますが、自分でもできるようにがんばります
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月22日(金) 23:18
by ISLe()
補足というか訂正。
VC++のコードの整形は選択範囲に機能するので、先の投稿は、最初にCtrlキーを押しながらAを押しで全選択を加えてください。
操作としては、Ctrlキーを押したまま、A K F と順に押します。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月22日(金) 23:19
by エルフ
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;
}
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月22日(金) 23:20
by エルフ
ISLe()さん
Ctrlキーを押したまま、A K F ですね わかりました
便利なので覚えときます
ありがとうございました。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月22日(金) 23:24
by みけCAT
エルフ さんが書きました:どこがどう違いますか?
毎フレームの最初に強制的にstate=1;にしているのが間違いです。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月22日(金) 23:40
by エルフ
みけ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ライブラリが一瞬で消えます
Posted: 2014年8月22日(金) 23:40
by うずら
直下のコードはメインループだけ抜出し。気になった点にコメント追加してます。
コード:
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;
}
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月22日(金) 23:52
by みけCAT
エルフ さんが書きました:編集したのですが、まだループしてくれません・・
さすがにループはしているはずです。
これでループしなかったらコンパイラのバグを疑います。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 00:04
by エルフ
うずらさん
コードへのコメントありがとうございました
関数のコードですが、実は1キーを押したら変数を1にして1を2キーを押したら変数を2にして2を表示するプログラムを作りたいんです
さっき僕が書いたのはとりあえず1キーだけのパターンを作ったつもりが、正しくできてなかったので、今の所どこが違うのかを教えてほしかったんです
ややこしくてすみません
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 00:14
by うずら
コード:
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;
}
こんなのを延々書いていくことになります。(ループ使ってキーコードをインクリメントしたりすることもできますが・・・やめた方が無難です)
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 00:17
by softya(ソフト屋)
こうしましょう。
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;
}
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 00:24
by much
うずら さんが書きました: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;
}
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 00:34
by エルフ
ソフト屋さん
すごいです
こんな風に動いてるんですね・・・
面白かったです。イメージできました。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 00:37
by softya(ソフト屋)
このイメージがないと思うようにプログラムは作れませんで、常に意識してください。
さて、プログラムの流れが思っても見なかった物だと思いますが、どのような流れに治したいですか?
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 00:39
by エルフ
muchさん
お察しのとおり、関数についてはなんとなくイメージは分かりますが作るとなると難しいです・・・
すごいですね 凄いスピードで数字が上がっていったのが見えました。こんなに早くループしてるんですね・・
1キーを押したら1がずっと表示されていたのも感動しました
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 00:44
by much
エルフ さんが書きました:みけ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の位置をもう一度考えなおしてみて
(とは言ったもののさっき書いてもうた...)
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 00:45
by エルフ
ソフト屋さん
とりあえず話を一個戻して、1キーを押したら変数を1にして1を2キーを押したら変数を2にして2を表示するプログラムを作りたいです。
今まで私が作ったソースだとなぜ押し続けなければ消えてしまうのかが今理解できました。
押してもすぐにループして書き換えられてしまうのですね
そのために押したという証拠を残すのですね
もう一度考えて書いてみます
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 00:49
by みけCAT
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個適切な場所に加えれば、この動きは改善します。(→目押しルーレットになります)
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 00:51
by みけCAT
エルフ さんが書きました:みけCATさん
編集したのですが、まだループしてくれません・・
証拠を付け、証拠を消してるのになんでですか?
思うとおりに動かない(≠ループしない)のは「証拠を付け、証拠を消してる」からです。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 00:54
by much
みけCAT さんが書きました:
前にも指摘されていますが、これは違います。
このコードだと、
1が押されているので
stateが1になる
state==1なので、(今の「ループ」で)stateが0になる
次の「ループ」に入る
1が押されているので
stateが1になる
state==1なので、(今の「ループ」で)stateが0になる
・・・
という流れです。
とりあえず、elseを1個適切な場所に加えれば、この動きは改善します。(→目押しルーレットになります)
せやな(´・ω・`)
else if じゃないんだった...
ご指摘ありがとうございます
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 01:01
by エルフ
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;
}
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 01:07
by エルフ
25行目のifの{}が抜けてたのに気づいて直しましたが変わりませんでした
バグの内容は、1キーは1と一瞬しか写らない。2キーはなんもキーを触ってないのに2と最初から出続ける
です。
どうしてでしょう
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 01:09
by エルフ
あああ間違えに気づきました直してきます すいません
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 01:27
by エルフ
皆さんありがあとうございます!!!
できましたあああ!!!!
コード:
#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;
}
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 01:28
by エルフ
これでじゃんけんゲームも正常に動作するようにできるかな・・
やってきます
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 01:29
by much
[quote="エルフ" id=3,15563,123844
ですが、1または2というソースだと駄目です・・
どうしてでしょう
それとmuchさん証拠を消す理由はなんですか?
[/code][/quote]
もうすでに気づいたと思うけど
stateを0にする = 消す って表現しただけ
未入力と入力状態の遷移だったから
入力の証拠は消えてますが状態の移動に変わりないです
ですので
stateを2にする
にも全く同じ形ができます
( 証拠って表現 気に入ってもらえたんでしょうか... 少し余計なことしたかも... )
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 01:44
by much
それぞれの状態ごとにキーコンフィグが変わることがよくあります
例えば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;
}
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 02:07
by much
↑の18行目: else は消してください
今日はelse運がないな(´・ω・`)
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 02:14
by エルフ
muchさん
書き方で少し変わってしまうんですね・・
難しいですね・・
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 02:20
by エルフ
ジャンケンゲーム、ちゃんとずっと表示できるようにはなりました!
でも、キーもふれてないのに全てのパターンが重なって表示されるというバグがでました・・
改善策を教えて下さい・・
コード:
#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;
}
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 02:26
by much
とりあえずwhileのあとに,この一行入れてみて
DrawFormatString( 100,0, GetColor(255,255,255),"a=%d",a);
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 02:38
by much
状態はキーを押す前と後,前準備の3つだけ
(前準備はキーの押す前に入れてもいいけど毎回前準備する必要ない)
初期状態は「じゃんけんの前準備」
↓
while(/*ホニャララ*/)
↓
「じゃんけん前の前準備」
↓処理が終わったら「キーを押す前」の状態に進む証拠をつける
「キーを押す前」
↓キーが押されたら(1or2or3キー)「キーを押した」証拠をつける
「キーを押した後」 ->escで終了
↓何かキーが押されたら「じゃんけんの前準備」に進む証拠をつける
「じゃんけんの前準備」
↓
・・・
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 02:57
by much
エルフ さんが書きました:ジャンケンゲーム、ちゃんとずっと表示できるようにはなりました!
でも、キーもふれてないのに全てのパターンが重なって表示されるというバグがでました・・
改善策を教えて下さい・・
よく見ると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で何をするかをそれぞれに記入
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 03:08
by much
私が提案した3つの状態だと
コード:
//・・・
while(/*ホニャララ*/){
if(PC==0){
/*前準備*/
PC=1;
}
if(PC==1){
if(/*キーが入力されたら*/){
/*入力されたキーを変数に保存しておく*/
PC=2;
}
}
if(PC==2){
/*入力されたキーとランダムの値で場合分け(9通り)*/
/*結果表示*/
if(/*ESCキーが入力されたら*/){
return 0;
}
if(/*キーが入力されたら*/){
PC=0;
}
}
//・・・
}
こんなんでどうでしょう
というか、眠たいのでまた明日にでも様子見に来ます
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 07:40
by みけCAT
much さんが書きました:コード:
if(/*ESCキーが入力されたら*/){
return 0;
}
DxLib_End()を呼ばずに終了するのはまずそうなので、return 0;よりbreak;の方がいいと思います。
ただし、switchを用いるとその中でのbreak;によりwhileループを脱出することはできなくなるので、
終了フラグを立て、whileループの条件で終了フラグが立っていたら終了、という方式の方がいいかもしれません。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 09:43
by softya(ソフト屋)
私のお教えしたデバッグ技法を常に使われたほうが良いと思います。
少なくともイメージがすぐ把握できるようになるまでは。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 14:45
by エルフ
いろいろ書き直してみました。
そしたら、「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;
}
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 14:52
by softya(ソフト屋)
C言語の入門書には必ず書いてあるともうのでお手持ちの本を確認をお願いします。
今回の問題は「変数のスコープと寿命」が関係しています。
http://www.cc.kyoto-su.ac.jp/~hxm/cstext/prog04.html
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 15:02
by エルフ
ソフト屋さん
ありがとうございます
解決しました
でもまた別の問題が・・
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 16:37
by ふぁい
長い間ここの掲示板を見てるが、なんでsoftya氏はいつも偉そうなんだろう。
俺は正しいことを教えてやっているんだ。俺の言うことに従え。という意識しか感じられん…
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 16:50
by みけCAT
エルフ さんが書きました:でもまた別の問題が・・
if文(などの条件を書く場所)の中で無駄な代入をしないように、余計なセミコロンを付けないように気をつけましょう。
オフトピック
無駄じゃない代入の例
コード:
if(fp=fopen("hoge.txt","r")) {
/* fpを使った処理 */
fclose(fp);
}
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 19:17
by much
ふぁい さんが書きました:長い間ここの掲示板を見てるが、なんでsoftya氏はいつも偉そうなんだろう。
俺は正しいことを教えてやっているんだ。俺の言うことに従え。という意識しか感じられん…
私も昔お世話になったのですが
なんだかC言語を理解していることを前提としているような感じですよね.(悪いとはいいませんが)
確かに初歩的な事はネットなどで調べればすぐに出ますが,
最初のうちは動作を理解するのに苦戦するかと思います.
(プログラミング脳に変わるまでわからないものはわからないですし...)
(そのうえライブラリが混入してきたら,普通のC言語入門サイトとの微妙な書式の違いで混乱するでしょう)
また,「C言語の質問掲示板」というくらいですので
C言語を理解していない状態での質問は勿論許されるべきでしょうし
わからない文法はわからないとコメントしたり
産まれたてのぎこちない,モジャモジャスパゲッティテストコードに関して他者からのコメントをもらうのは普通の行為かと思います
個人的にはデバッグ能力 ( 変数表示, コメント化による分離, 仮値代入など ) をつけるのが
先決かとも思うんですけど,その辺りは個人の性格なんでしょうかね
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 21:20
by エルフ
みけCATさん
私の書いたソースのどの行の;が不要ですか?
elseにはつけないといけないですよね?
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 21:26
by みけCAT
エルフ さんが書きました:みけCATさん
私の書いたソースのどの行の;が不要ですか?
No: 81のソースの中では、42行目、62行目、68行目、81行目、193行目の;が不要(蛇足)だと思います。
エルフ さんが書きました:elseにはつけないといけないですよね?
いいえ。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 21:38
by エルフ
みけCATさん
elseの;を消すと、error C2143: 構文エラー : ';' が '{' の前にありません。とでてしまいます
どうしたらいいですか?
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 21:44
by みけCAT
エルフ さんが書きました:みけCATさん
elseの;を消すと、error C2143: 構文エラー : ';' が '{' の前にありません。とでてしまいます
どうしたらいいですか?
それはelseではなくてelse ifの間違いではないですか?
elseで間違いないとしたら、紛らわしいのでカッコを外したほうが私は好みです。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 22:06
by much
エルフ さんが書きました:みけCATさん
私の書いたソースのどの行の;が不要ですか?
elseにはつけないといけないですよね?
付けてはいけません
行末に ; を付けないときは
① ○○ { というふうに" { " で続く場所
(例): if (a==1) {
② } というふうにカッコを閉じるところ(ただし,構造体のタグ宣言とか例外多し)
(例): }
③ハッシュマーク(#)で続くような場所
(例): #include <stdio.h>
他にもあるかもしれないけど,やってりゃ覚える
というより
else if (/* */) { }
という形か
else { }
という形がいいかと
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 22:11
by みけCAT
自分でじゃんけんのプログラムを書いてみました。
エルフさんには一度自分で動くものが書けてから見てほしいです。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 22:18
by エルフ
みけCATさん
そうですね elseなら()がいりませんよね
直しました
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 22:20
by エルフ
みけCATさん
今のじゃんけんが正常に動くようになったら見さしていただきます
ありがとうございました
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 22:25
by エルフ
バグが直んないです・・
バグの内容は、キーに触れてないのに、パターン1(変数 PC=1)の時の処理をされてしまい、あいてがグーを出してしまいます
どうしてでしょう・・
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 22:27
by みけCAT
エルフ さんが書きました:バグが直んないです・・
バグの内容は、キーに触れてないのに、パターン1(変数 PC=1)の時の処理をされてしまい、あいてがグーを出してしまいます
どうしてでしょう・・
PC=1という式は(PCがint型の場合)常に真だからです。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 22:33
by エルフ
みけCATさん
どうすれば改善しますか?
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 22:35
by みけCAT
エルフ さんが書きました:みけCATさん
int型の変数には初期化しても最初に0ではなく1が入っているということですか?
(掲示板がおかしくなったようなので、うろ覚えで復元)
初期化の方法によります。
と書けば、(まともなコンパイラなら)当然最初に1が入ります。
エルフ さんが書きました:みけCATさん
どうすれば改善しますか?
数値が等しいかを判定したいときに、代入演算子を使わないようにすれば改善すると思います。
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 22:51
by much
エルフ さんが書きました:みけCATさん
どうすれば改善しますか?
ヒント:
if(/* 条件式 */ )
の
条件式部が正(非ゼロ)なら
if文の中を通ります
(例)
if (1){
通る
}
if(20){
通る
}
if(0){
通らない
}
if(-1){
実は通る
}
if(1+2){
通る
}
if(a=0){ } -> if(0) -> 通らない
if(a=1){ } -> if(1) -> 通る
Re: DXライブラリが一瞬で消えます
Posted: 2014年8月23日(土) 22:55
by エルフ
ソフト屋さんのデバッガ方法で調べた結果、乱数の値が-858993460になっていました
これはどういう事でしょう・・
int a = GetRand( 3 );と書けば0または1または2ではないんですか?