途中で止まります

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
x0214
記事: 6
登録日時: 10年前

途中で止まります

#1

投稿記事 by x0214 » 10年前

どれが2^xの数なのかを当てるゲームを作っているのですが、
ホーム画面(main(void))でゲームの画面(game(void))に行こうとすると
突然止まります
問題点と解決策がわからないので教えてください

コード:

#include "DxLib.h"
#include <math.h>
#include <time.h>
#include <stdlib.h>
#include "exofb.h"



int Key[256];
int font = CreateFontToHandle( "メイリオ",70,3,DX_FONTTYPE_ANTIALIASING_EDGE);


int game(void);
int chu(void);
int extra(void);
int help(void);
int option(void);

int GpUpDateKey(){
	char tmpKey[256]; 
	GetHitKeyStateAll(tmpKey); 
	for (int i=0; i<256; i++ ){
		if(tmpKey[i] != 0){ 
			Key[i]++;
		} else {
			Key[i] = 0;

		}
	}
	return 0;
}



int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	

	ChangeWindowMode(TRUE);
	DxLib_Init();
		
        MenuElement_t MenuElement[5]={
                {  80, 100, "ゲームスタート" },
                { 100, 150, "おまけ" },
                { 100, 200, "ヘルプ" },
                { 100, 250, "コンフィグ" },
                { 100, 300, "ゲーム終了" },
        };
        int SelectNum = 0;

        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && GpUpDateKey()==0 ){
			if( Key[ KEY_INPUT_DOWN ] == 1 ){
                        SelectNum = ( SelectNum + 1 ) % 5;
                }
			if( Key[ KEY_INPUT_UP ] == 1 ){
				SelectNum = ( SelectNum + 4 ) % 5;
			}
			if( Key[ KEY_INPUT_DOWN ] == 1 || Key[ KEY_INPUT_UP ] == 1 ){
				for( int i=0; i<5; i++ ){
					if( i == SelectNum ){
						MenuElement[i].x = 80;
					} else {
						MenuElement[i].x = 100;
					}
				}
			}
			for( int i=0; i<5; i++ ){
				DrawFormatString( MenuElement[i].x, MenuElement[i].y, GetColor(255,255,255), MenuElement[i].name );
			}
			if( Key[KEY_INPUT_RETURN] != 0 ){
				switch(SelectNum%5){
					default:
						exit(0);
						break;
					case 0:
						game();
						break;
					case 1:
						extra();
						break;
					case 2:
						help();
						break;
					case 3:
						option();
						break;
					}
                }
			}
			
	
	
	DxLib_End();
	return 0;
}

int game(void){
	
	DrawBox( 0, 0, 320, 240, GetColor( 255,0,0 ), TRUE ) ;
	DrawFormatStringToHandle(20,120,GetColor(255,255,255),font,"READY?") ;
	DrawBox( 320, 0, 640, 240, GetColor( 0,0,255 ), TRUE ) ;
	DrawBox( 0, 240, 320, 480, GetColor( 0,200,0 ), TRUE ) ;
	DrawBox( 320, 240, 640, 480, GetColor( 255,0,255 ), TRUE ) ;
	while(Key[ KEY_INPUT_Q ] == 0){
		if( Key[ KEY_INPUT_Q ] == 1 ){chu();}
	}
	return 0;
}
	
int chu(void){
	int jadge = 0;
	while(jadge == 0){
			
		double size = 1.0;
		int omo[4] = {0};
		int shitei = 0;
		int x = 1;
		omo[0],omo[1],omo[2],omo[3],shitei = lod(x);

		DrawBox( 0, 0, 320, 240, GetColor( 255,0,0 ), TRUE ) ;
		DrawBox( 320, 0, 640, 240, GetColor( 0,0,255 ), TRUE ) ;
		DrawBox( 0, 240, 320, 480, GetColor( 0,200,0 ), TRUE ) ;
		DrawBox( 320, 240, 640, 480, GetColor( 255,0,255 ), TRUE ) ;

		DrawFormatStringToHandle(20,120,GetColor(255,255,255),font,"%d",omo[0]) ;
		DrawFormatStringToHandle(340,120,GetColor(255,255,255),font,"%d",omo[1]) ;
		DrawFormatStringToHandle(20,360,GetColor(255,255,255),font,"%d",omo[2]) ;
		DrawFormatStringToHandle(340,360,GetColor(255,255,255),font,"%d",omo[3]) ;
		
		if( Key[ KEY_INPUT_Q ] == 1 ){
			if(shitei = 0){
				x++;
			}else{
				DrawBox( 0, 0, 639, 479, GetColor( 0,0,0 ), TRUE ) ; 
				DrawStringToHandle( 200, 160, "GAME OVER", GetColor(255,255,255), font );
				jadge++;
			}
		}
		if( Key[ KEY_INPUT_P ] == 1 ){
			if(shitei = 1){
				x++;
			}else{
				DrawBox( 0, 0, 639, 479, GetColor( 0,0,0 ), TRUE ) ; 
				DrawStringToHandle( 200, 160, "GAME OVER", GetColor(255,255,255), font );
				jadge++;
			}
		}
		if( Key[ KEY_INPUT_C ] == 1 ){
			if(shitei = 2){
				x++;
			}else{
				DrawBox( 0, 0, 639, 479, GetColor( 0,0,0 ), TRUE ) ; 
				DrawStringToHandle( 200, 160, "GAME OVER", GetColor(255,255,255), font );
				jadge++;
			}
		}
		if( Key[ KEY_INPUT_M ] == 1 ){
			if(shitei = 3){
				x++;
			}else{
				DrawBox( 0, 0, 639, 479, GetColor( 0,0,0 ), TRUE ) ; 
				DrawStringToHandle( 200, 160, "GAME OVER", GetColor(255,255,255), font );
				jadge++;
			}
		}
	
	}
	
	return 0;
	
}

int extra(void){
	return 0;
}


int help(void){
	return 0;
}

int option(void){
	return 0;
}
まだextra以降はできていません

そして自作のexofb.hは

コード:

typedef enum {
    eScene_Menu,
    eScene_Game,
    eScene_Config,
} eScene ;

typedef struct{
        int x, y;       // 座標格納用変数
        char name[128]; // 項目名格納用変数
} MenuElement_t ;



int lod(double custom){ //customで2^xのxを得る
	int kae[4] = {0}; //
	int kaem[10] = {0};//同じ数を付けないようにするためのロック変数
	int ransu; //
	int count = 0;
	int checkok = 0;
	int redm = 0;
	int lucky;
	custom = pow(2,custom); //ここで2^xの形にする
	SRand((unsigned int)time(NULL));
	while(checkok!=0){
		while(count <= 3){
			ransu = GetRand(9);
			switch(ransu){
				default:
					break;
				case 0:
					if(kaem[0]=0){
						kae[count] = custom;
						lucky = count;
						count++;
						kaem[0]++;
					}
					break;
				case 1:
					if(kaem[1]=0,custom!=1){
						kae[count] = custom+2;
						count++;
						kaem[1]++;
					}
					break;
				case 2:
					if(kaem[2]=0,custom>=2){
						kae[count] = custom-2;
						count++;
						kaem[2]++;
					}
					break;
				case 3:
					if(kaem[3]=0){
						kae[count] = custom-6;
						count++;
						kaem[3]++;
					}
					break;
				case 4:
					if(kaem[4]=0){
						kae[count] = custom+72;
						count++;
						kaem[4]++;
					}
					break;
				case 5:
					if(kaem[5]=0){
						kae[count] = custom*6;
						count++;
						kaem[5]++;
					}
					break;
				case 6:
					if(kaem[6]=0,custom>=6){
						kae[count] = custom-28;
						count++;
						kaem[6]++;
					}
					break;
				case 7:
					if(kaem[7]=0){
						kae[count] = custom+10;
						count++;
						kaem[7]++;
					}
					break;
				case 8:
					if(kaem[8]=0){
						kae[count] = custom-1;
						count++;
						kaem[8]++;
					}
					break;
				case 9:
					if(kaem[9]=0){
						kae[count] = custom+1;
						count++;
						kaem[9]++;
					}
					break;
			}
	}
	if(kaem[0]=0){
		count = 0;
		while(redm <= 9){
			kaem[redm] = 0;
			redm++;
		}
	}else{
		checkok++;
	}
}

return kae[0],kae[1],kae[2],kae[3],lucky;
}
です。

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

Re: 途中で止まります

#2

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

Qキーを押さない状態でgame()を呼び出すと、

コード:

	while(Key[ KEY_INPUT_Q ] == 0){
		if( Key[ KEY_INPUT_Q ] == 1 ){chu();}
	}
の部分で無限ループになります。
どんな処理をしたいかよくわからないので、とりあえずこの部分を削除(コメントアウト)すれば止まるという不都合は改善すると思います。

また、直接は関係ないかもしれませんが、
・hファイルの中にテンプレートが使用されていない関数の実体が書かれている(複数の翻訳単位からインクルードされると被ってリンクエラーになりそう)
・lod関数のswitch文の中で、ransuが1でも2でも無いときはif文のブロックの中は絶対に実行されないはず
・lod関数の最後で、「kae[0],kae[1],kae[2],kae[3]」は全く意味が無い
・chu関数の中にもif文の条件が不自然な場所がある
のが気になりますね。if文の条件式で使用されている代入演算子および順次演算子は、本当に意図したものでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

x0214
記事: 6
登録日時: 10年前

Re: 途中で止まります

#3

投稿記事 by x0214 » 10年前

説明不十分でした。すみません。
・どんな処理をしたいか
game()は準備画面でQが押されたらchu()の処理、つまりゲームが開始する
・hファイルのなかに・・・
別のプログラムを作っていて、それの名残です
・if文の中は・・・
よくわからなかったので解説をお願いします。
・kae[0~3]は意味がない
ここも対策がわかりませんでした
・不自然な条件/代入順次演算子について
敢えてこれにした、なんてものはありません。
・複雑な問題
やめてくださいしんでしまいます

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

Re: 途中で止まります

#4

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

x0214 さんが書きました:・どんな処理をしたいか
game()は準備画面でQが押されたらchu()の処理、つまりゲームが開始する
chu()は呼び出された時にKey[ KEY_INPUT_Q ] == 1が真ならすぐに終了、偽なら無限ループになります。
プロセスのメモリを書き換えるツールを使って遊ぶゲームでしょうか? 設計し直す必要があるかもしれません。
x0214 さんが書きました:・if文の中は・・・
よくわからなかったので解説をお願いします。
(オーバーロードされていない場合)代入演算子=は右辺の値を返すので、例えばkaem[0]=0の値は常に0で、偽になります。
常に偽ということは、このif文の直後のブロックは常に実行されない(はずな)ので、存在する意味が(ほとんど)なく、不自然です。
順次演算子,は、まず左辺を評価し、その後右辺を評価し、左辺の値は無視して右辺の値を返します。
例えばkaem[1]=0,custom!=1は、まずkaem[1]に0を代入し、custom!=1の値を返します。
x0214 さんが書きました:・kae[0~3]は意味がない
ここも対策がわかりませんでした
lod関数の引数としてkae[0]、kae[1]、kae[2]、kae[3]を格納する配列(の先頭要素へのポインタ)を渡し、そこに格納するといいと思います。luckyはそのまま戻り値として返せます。
オフトピック
x0214 さんが書きました:・複雑な問題
やめてくださいしんでしまいます
[youtube][/youtube]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

x0214
記事: 6
登録日時: 10年前

Re: 途中で止まります

#5

投稿記事 by x0214 » 10年前

if文の条件式は完全に修行不足でしたね・・・
これで解決かと思ったら
errorLINK1168を吐きました。ヤロウムッコロシテヤラアァァァァァァ!!
P.S.そこのお姉さんの部活での愛称は「気違い数え姉さん」です

x0214
記事: 6
登録日時: 10年前

Re: 途中で止まります

#6

投稿記事 by x0214 » 10年前

大体おkです。ありがとうございます。
また何か分からない事があれば質問します。

閉鎖

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