デバッグエラー

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

デバッグエラー

#1

投稿記事 by 秋刀魚 » 9年前

開発環境:VisualC++2008
開発言語:C言語
やりたいこと:ジャンケンゲーム
ソース:
#include<stdio.h>
#include<stdlib.h>
#include "DxLib.h"
#include<time.h>

void kekka( int sum1 , int sum2 );
void comp(int num);
void player();



int Key[256];
int Color = GetColor( 255, 255, 255 ); //基本(黒)
int SRand((unsigned)time(NULL));

int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key==1) GetHitKeyStateAll_InputKey++;
else GetHitKeyStateAll_InputKey=0;
}
return 0;
}



int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない


player();





ScreenFlip();
}

DxLib_End();
return 0;
}

void player(){

int num;

DrawString( 0, 0, "グー=Z チョキ=X パー=C", Color );

if( Key[KEY_INPUT_Z] == 1 ){
num = 1;
}
else if( Key[KEY_INPUT_X] == 1 ){
num = 2;
}
else if( Key[KEY_INPUT_C] == 1 ){
num = 3;
}
comp( num );
}

void comp( int num ){

int comprand = GetRand(3);

kekka(num , comprand );
}

void kekka( int sum1 , int sum2 ){

if( sum1 == sum2 ){
DrawString( 0, 0, "引き分けです!", Color );
}
else if( sum1 ==1 && sum2 == 1 ){
DrawString( 0, 0, "プレイヤーの勝利!", Color );
}
else if( sum1 == 2 && sum2 == 2 ){
DrawString( 0, 0, "プレイヤーの勝利!", Color );
}
else if( sum1 == 3 && sum2 == 0 ){
DrawString( 0, 0, "プレイヤーの勝利!", Color );
}
else
DrawString( 0, 0, "コンピュータの勝利!", Color );
}

こんにちは。じゃんけんゲームを作って、実行してみたら、デバッグエラーが出てしまいました。
何が原因なのでしょうか?
処理の順番(?)は
グーかパーかチョキかを選ばして、乱数でコンピューターの手を選ばして、プレイヤーとコンピューターの手同士を判定して結果を出すって感じです。

アバター
DVDM
記事: 38
登録日時: 9年前
住所: 大阪
連絡を取る:

Re: デバッグエラー

#2

投稿記事 by DVDM » 9年前

>>秋刀魚さん
この記事の上に「コードを貼り付ける場合は [code] と [/code] で囲って下さい。」と書いてありますので
プログラムを掲載する際はご活用下さいませ。

デバッグエラーについてですが、ざっと見た感じ
void player() 関数で、int num; とありますが、初期化されていない状態で
comp( num ); に引数として渡しているのが原因ではないでしょうか。

box
記事: 1746
登録日時: 9年前

Re: デバッグエラー

#3

投稿記事 by box » 9年前

>DVDMさん

>if( Key[KEY_INPUT_Z] == 1 ){
>num = 1;
>}
>else if( Key[KEY_INPUT_X] == 1 ){
>num = 2;
>}
>else if( Key[KEY_INPUT_C] == 1 ){
>num = 3;
>}

これらのif文で、numには1か2か3を格納しようとしてますが、
どの条件にもヒットしない場合があるんじゃないかってことですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

ライス
記事: 11
登録日時: 9年前
住所: 鹿児島県

Re: デバッグエラー

#4

投稿記事 by ライス » 9年前

すでに自己解決してるかもしませんが、一応…

コード:

#include<stdio.h>
#include<stdlib.h>
#include "DxLib.h"
#include<time.h>

void kekka( int sum1, int sum2 );
void comp( int num );
void player( );

int Key[256];
int Color = GetColor( 255, 255, 255 ); //基本(黒)
int SRand( ( unsigned )time( NULL ) );

int GetHitKeyStateAll_2( int GetHitKeyStateAll_InputKey[] )
{
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for ( int i = 0; i<256; i++ )
    {
        if ( GetHitKeyStateAll_Key[i]==1 )
        {
            GetHitKeyStateAll_InputKey[i]++;
        }
        else
        {
            GetHitKeyStateAll_InputKey[i] = 0;
        }
    }
    return 0;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    ChangeWindowMode( TRUE ); //ウィンドウモード
    if ( DxLib_Init( ) == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0 )   //初期化と裏画面化
    {
        return -1;
    }
    while ( ProcessMessage( )==0 && ClearDrawScreen( )==0 && GetHitKeyStateAll_2( Key )==0 && Key[KEY_INPUT_ESCAPE]==0 )
    {
        //↑メッセージ処理    ↑画面をクリア        ↑入力状態を保存              ↑ESCが押されていない

        player( );

        ScreenFlip( );
    }

    DxLib_End( );
    return 0;
}

void player( )
{
    int num;

    DrawString( 0, 0, "グー=Z チョキ=X パー=C", Color );

    if ( Key[KEY_INPUT_Z] == 1 )
    {
        num = 1;
        comp( num );
    }
    else if ( Key[KEY_INPUT_X] == 1 )
    {
        num = 2;
        comp( num );
    }
    else if ( Key[KEY_INPUT_C] == 1 )
    {
        num = 3;
        comp( num );
    }
}

void comp( int num )
{
    int comprand = GetRand( 3 );

    kekka( num, comprand );
}

void kekka( int sum1, int sum2 )
{
    if ( sum1 == sum2 )
    {
        DrawString( 0, 30, "引き分けです!", Color );
    }
    else if ( sum1 ==1 && sum2 == 1 )
    {
        DrawString( 0, 30, "プレイヤーの勝利!", Color );
    }
    else if ( sum1 == 2 && sum2 == 2 )
    {
        DrawString( 0, 30, "プレイヤーの勝利!", Color );
    }
    else if ( sum1 == 3 && sum2 == 0 )
    {
        DrawString( 0, 30, "プレイヤーの勝利!", Color );
    }
    else
    DrawString( 0, 30, "コンピュータの勝利!", Color );
    ScreenFlip ( );
    while ( ProcessMessage( )==0 && GetHitKeyStateAll_2( Key )==0 && Key[KEY_INPUT_RETURN]==0 )
    {
    }
}
これで正しく動作するはずです^^

問題点はDVDMさんや、boxさんの仰ってる通りです。
最初のコードですとz,x,cのどれかが入力される前に comp ( num ) ; にとんでいるので、numは宣言されただけで空っぽのままです。
(もちろん起動直後に目にもとまらぬ速さで入力したら問題ないですがw)
なので 、comp ( num ) ; にとぶのはz,x,cのどれかが入力された時だけにしました。

また"グー=Z チョキ=X パー=C"とジャンケンの結果を表示する座標が変わっていないため、文字が重なってしまいます。
なので、ジャンケンの結果を表示する座標をずらしました。

そしてジャンケンの結果を表示した後処理が止まっていないため、結果が目にもとまらぬ速さで消えてしまいます。
なので、エンターキーが入力されたら次のターンに進むようにしました。

とにかく、最初のコードと比較したらどこが違うかわかると思います。
でも私のやり方はあまり良くない可能性もあるので、上で指摘した問題点を自分のやり方で直した方が良いかもしれません^^;

後やってみると分かると思いますが、ジャンケンの結果に相当の偏りが出ています。
少なくとも私の環境ではコンピュータの勝利ばかりで、引き分けはたまに、プレイヤーの勝利は20回に1回程度です。
もしかしたら乱数の発生や、比較の条件文におかしなところがあるかもしれないので、自分で試してみて調整してください。

秋刀魚

Re: デバッグエラー

#5

投稿記事 by 秋刀魚 » 9年前

返信が遅れてしまい申し訳ございませんでした。
こっちの諸事情により、遅れてしまいました。

皆様ご回答ありがとうございます!
なんとかじゃんけんゲームを作ることが出来ました!

また、今度質問する時は、コードで囲います。
急いで質問したため見過ごしてしまいました・・・。

アバター
DVDM
記事: 38
登録日時: 9年前
住所: 大阪
連絡を取る:

Re: デバッグエラー

#6

投稿記事 by DVDM » 9年前

>>boxさん
> これらのif文で、numには1か2か3を格納しようとしてますが、
> どの条件にもヒットしない場合があるんじゃないかってことですか?

じゃんけんでグー・チョキ・パー以外があるのなら話は変わってくると思いますが、
多分そうではないと思うので、どの条件にもヒットしないという事はないと思います。

仮にあったとしても、初期化されていない変数を引数として渡すのがまずいのでは・・・と思って指摘させて頂きました。
なにか誤解を招くような事を言ってしまったようで申し訳ございませんでした。

秋刀魚

Re: デバッグエラー

#7

投稿記事 by 秋刀魚 » 9年前

>少なくとも私の環境ではコンピュータの勝利ばかりで、引き分けはたまに、プレイヤーの勝利は20回に1回程度です。

理由分かりました!

GetRand関数は、0~ではなく1~なんですね・・・。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: デバッグエラー

#8

投稿記事 by ISLe » 9年前

秋刀魚 さんが書きました:GetRand関数は、0~ではなく1~なんですね・・・。
GetRand(3)は0,1,2,3のいずれかを返します。
コンピュータが3を引いたときはパーで引き分けに持ち込む以外は負けになってます。

閉鎖

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