-858993460になる理由は(修正されたソースが提示されていないようなので)わかりませんが、エルフ さんが書きました:ソフト屋さんのデバッガ方法で調べた結果、乱数の値が-858993460になっていました
これはどういう事でしょう・・
int a = GetRand( 3 );と書けば0または1または2ではないんですか?
GetRand( 3 )はDXライブラリの仕様では0または1または2または3のはずです。
-858993460になる理由は(修正されたソースが提示されていないようなので)わかりませんが、エルフ さんが書きました:ソフト屋さんのデバッガ方法で調べた結果、乱数の値が-858993460になっていました
これはどういう事でしょう・・
int a = GetRand( 3 );と書けば0または1または2ではないんですか?
#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 )
{ //ここからメインループ
int a = GetRand( 2 ); //乱数0,1,2
int Col = GetColor( 255,255,255 );
if( b = 0 ) //証拠が何もないなら
{
b = 1; //前準備をした証拠
} //証拠が何もないならここまで
if( b = 1 ) //前準備をした証拠があるなら
{
DrawFormatString( 0, 0, GetColor(255,255,255), "「ジャンケン!」");
DrawFormatString( 0,20, GetColor(255,255,255), "あなたの手を入力して下さい(グー:1 チョキ:2 パー:3)");
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 if( 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 if( a = 2 )
{
PC=6;
}
}
}
else if( 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 if( 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 )
{
break;
}
}
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 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 )
{
break;
}
}
} //前準備をした証拠があるならここまで
} //ここまでメインループ
DxLib_End(); // DXライブラリ終了処理
return 0;
}
理解できなくて当然です。エルフ さんが書きました:1キーも押してないのに,29行目のifを通り、34行目のa=0のifが通ってPC=1の処理が必ず行われる理由がまだ理解できません・・
とりあえず メインループから出してください
かけません。if文の条件式が間違っています。much さんが書きました:毎ループ,aの値をランダムにするのも不適切だから
さらにこうかけますね
あと変数宣言の位置ですが,変数の生存期間を絞ることで,目で追わなければならないソースコードの長さを短くするというよくやる間違い
a = 10;
b = 34;
if (a = b){
printf("a == b \n");
}
この例は文法的には間違っていないが、良くやる間違いの一つである。 どこが間違っているかというと、
if の条件文が、比較演算の == では なく、代入演算の = になっている点にある。本来ならば、 a=10, b=34 なの で、a と b とは異なっており、
if 文の中は実行されない筈であるが、 実はこの例では実行されてしまう。比較演算の == を代入演算の = に間違えた だけなのだが、
実は、代入演算は演算なので演算結果が存在する。代入演算の 結果は代入した値になるという決まりなので、
a=b の結果は、b が 34 より 34 になる。これは、0ではないので、この代入演算の結果は真と判断される 訳である。
まぁ,「指導」者を自称するのもどうかと思いますけどネ・・・;much さんが書きました: 私も昔お世話になったのですが
なんだかC言語を理解していることを前提としているような感じですよね.(悪いとはいいませんが)
much さんが書きました: どうも初めまして,今回指導に協力するmuchというものです。
そんなコンパイラがあるんですね(まあ普通 if文に代入演算子なんて使いませんが)みけCAT さんが書きました:理解できなくて当然です。エルフ さんが書きました:1キーも押してないのに,29行目のifを通り、34行目のa=0のifが通ってPC=1の処理が必ず行われる理由がまだ理解できません・・
なぜなら34行目のa=0のifの中身のPC=1;が実行されるのは(まともなコンパイラでは)ありえないはずだからです。
デバッガなどで本当にそこを通っているか確認し、通っているのであればあなたのコンパイラは狂っているので、
まともなコンパイラに乗り換えましょう。
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
int a;
DxLib_Init(); // DXライブラリ初期化処理
ChangeWindowMode( TRUE );
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
if(a=0){
DrawFormatString( 0, 0, GetColor(255, 0, 0),"あなたのコンパイラはa=0を通します。");
}
else{
DrawFormatString( 0, 0, GetColor( 0, 255, 0),"あなたのコンパイラはa=0を通しません。");
}
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}
大 い に あ り ま す 。エルフ さんが書きました:私のソースが間違っていて、私が勘違いしてるとかないですかね
やめたげてー その煽り文字...みけCAT さんが書きました: 大 い に あ り ま す 。
//見えづらかったら GetColor(63,63,63) を GetColor(255,255,255) に書き換えてください
DrawFormatString( 0, 400, GetColor(63,63,63), "PC = %d , a = %d , b = %d " , PC , a , b);
最新のコードかどうかわかりませんが、No:102のコードなら17行目、 の次に入れてみてください。エルフ さんが書きました:muchさん
error C2065: 'a' : 定義されていない識別子です。とでます
どんなコードにしたのですか…?エルフ さんが書きました:みけCATさん
error C2374: 'Col' : 再定義されています。2 回以上初期化されています。
error C2374: 'a' : 再定義されています。2 回以上初期化されています。
とでました
をさらに追加してはダメですよ…?
コードに対して妥当な動作ですね。エルフ さんが書きました:PCが常に1
aは乱数の動き(スロットのように回っている)をしていると思われましたが、キーを押すと全て1になってました・・
どやみけCAT さんが書きました:コードに対して妥当な動作ですね。エルフ さんが書きました:PCが常に1
aは乱数の動き(スロットのように回っている)をしていると思われましたが、キーを押すと全て1になってました・・
なぜだと思いますか?
ちょっと説明不足だったかもmuch さんが書きました: それでやってみて
PCが1になれば
35行目が犯人
そうでなければ
犯人は他の場所にいるってことですよ
(見せかけの犯行ですね)
コメント化出来る領域が違うエルフ さんが書きました:muchさん
//と/* */ってどうちがうんですか?
ほぼ同じだとおもってました・・
コレもやりがちmuch さんが書きました:エルフ さんが書きました:muchさん
//と/* */ってどうちがうんですか?
ほぼ同じだとおもってました・・
なんでCheckHitKeyのときはきちんと比較できているのに、変数になると1個残らず代入してしまっているのでしょうか?Hiragi(GKUTH) さんが書きました:とりあえずif文の中には条件式を書いてあげましょう。
これを真面目に読んで理解してくれたら一発だと思うんですけどねー・・上に抜粋している5行だけでも.顔芸 さんが書きました: 条件式について何度か指摘はあったようですが,エルフさん自身,まだ気付けていない様子ですね.
以下の参考サイトの内容をよく読んでみることをおすすめします.
http://www.wakhok.ac.jp/~kanayama/C/99/node18.html
http://www.g-ishihara.com/c_co_01.htm
よくやる間違い
a = 10;
b = 34;
if (a = b){
printf("a == b \n");
}
この例は文法的には間違っていないが、良くやる間違いの一つである。 どこが間違っているかというと、
if の条件文が、比較演算の == では なく、代入演算の = になっている点にある。本来ならば、 a=10, b=34 なの で、a と b とは異なっており、
if 文の中は実行されない筈であるが、 実はこの例では実行されてしまう。比較演算の == を代入演算の = に間違えた だけなのだが、
実は、代入演算は演算なので演算結果が存在する。代入演算の 結果は代入した値になるという決まりなので、
a=b の結果は、b が 34 より 34 になる。これは、0ではないので、この代入演算の結果は真と判断される 訳である。
初心者あるあるだからみけCAT さんが書きました:なんでCheckHitKeyのときはきちんと比較できているのに、変数になると1個残らず代入してしまっているのでしょうか?Hiragi(GKUTH) さんが書きました:とりあえずif文の中には条件式を書いてあげましょう。
コンパイルエラーにならないから?
何も考えず手当たり次第にコードを追加するのではなく、少しは自分の頭を使って追加するコードの意味を考えていますか?