五目並べを作ろうとしているのですが・・

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

五目並べを作ろうとしているのですが・・

#1

投稿記事 by ね~す » 17年前

Cの勉強のお供に、五目並べを作ろうとしています。

実行すると、初期化したはずのarray配列に変な値が代入されています。
あと、入力にも問題があります。

二つとも、悩みに悩んで解決できませんでした。
どうか、ソースコードにどのような問題があるのかご指導お願いします。

ソースコードは以下です。
#include "DxLib.h"

extern int array[15][15];
extern int i,j,turn,stone;

int clear(void);
int screen_cl(void);
int screen_st(void);
int input(int);


////////////////////////////////////////////////////////
char Key[256];

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
        SetDrawScreen( DX_SCREEN_BACK );        //裏画面に設定

        while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
                //↑メッセージ処理      ↑画面をクリア          ↑キーボード入力状態取得         ↑ESCが押されていない

////////////////////////////////////////////////////////


	int turn;
	clear();
	screen_cl();
	screen_st();
	ScreenFlip();
	
	// メインループ //
	
	for (turn = 0;turn<100;turn++) {
	screen_st();
	
	if (turn == 0) {
	}
		
	input(turn);
	
	ScreenFlip();		
	}
    }

    DxLib_End();
    return 0;
}

int clear(void)
{
	int array[15][15];
	int i,j;
	
	/*初期化*/
	
	for (i=0;i<15;i++) {	
		for (j=0;j<15;j++) {
			array[j] = 0;
		}
	}
	
	return 0;
}

int screen_cl(void)
{

	int k;
	int i,j;         
	int white = GetColor( 255,255,255 );
	int black = GetColor( 0,0,0 );
	
	//碁盤の枠
	
	DrawBox(80,0,559,479,white,TRUE);
	
	for (i=0;i<15;i++) {
		if (i==0 || i==14) {
			DrawBox( 108 , 30*i+28 , 532 , 30*i+32 , black , TRUE );
		} else {
			DrawBox( 109 , 30*i+29 , 531 , 30*i+31 , black , TRUE );
		}
	}
	for (j=0;j<15;j++) {
		if (j==0 || j==14) {
			DrawBox( 30*j+108 , 28 , 30*j+112 , 452 , black , TRUE );
		} else {
			DrawBox( 30*j+109 , 29 , 30*j+111 , 451 , black , TRUE );
		}
	}
	
	int guid[5][2] = { {199,120},
			   {439,120},
			   {319,240},
			   {199,360},
			   {439,360}
			 };
	for (k=0;k<5;k++) {
	DrawCircle( guid[k][0] , guid[k][1] , 5 , black , TRUE );
	}
	
	return 0;
}

int screen_st(void)
{	
	//碁石
	int m,n;
	int i,j;
	int array[15][15];
	int white = GetColor( 255,255,255 );
	int black = GetColor( 0,0,0 );
	
	for (i=0;i<15;i++) {	
		for (j=0;j<15;j++) {
			m = 30*i+29;
			n = 30*j+109;
			if (array[j] == 1) {
				DrawCircle( n , m , 10 , black , TRUE );
			} else if (array[j] == 2) {
				DrawCircle( n , m , 10 , black , TRUE );
				DrawCircle( n , m , 8 , white , TRUE );
			}
		}
	}
	
	return 0;
}

int input(int turn)
{
	int i,j,stone;
	int array[15][15];
	int MouseX,MouseY,MouseInput;
	int x,y,hasi_x,hasi_y;
	
	
	if (turn%2 == 0) {
		stone = 1;
	} else {
		stone = 2;
	}

	
	// マウスを表示状態にする
	SetMouseDispFlag( TRUE ) ;

	// マウスの入力を待つ
	MouseInput = GetMouseInput() ;
	
	do {
	
		while( ( MouseInput & MOUSE_INPUT_LEFT ) == 0 )
		{
			
			// メッセージ処理
			if( ProcessMessage() == -1 )
			{
				break ;	// エラーが起きたらループから抜ける
			}
	        	
			// マウスの入力を得る
			MouseInput = GetMouseInput() ;
		}
		while( ( MouseInput & MOUSE_INPUT_LEFT ) == 1 )
		{
			
			// メッセージ処理
			if( ProcessMessage() == -1 )
			{
				break ;	// エラーが起きたらループから抜ける
			}
			
			// マウスの入力を得る
			MouseInput = GetMouseInput() ;
			
			// マウスの位置を取得
			GetMousePoint( &MouseX , &MouseY ) ;
				
		}
	} while ( ( (MouseX < 85) || (MouseX > 555) ) && ( (MouseY < 5) || (MouseY > 475) ) );
	
	
	
	//判定部分
	hasi_x = 94;
	hasi_y = 14;
	x = MouseX - hasi_x;
	y = MouseY - hasi_y;
	
	for (i=0;i<15;i++) {
		for (j=0;j<15;j++) {
			if ( (y >= i*30) && (y < i*30+30) &&
			     (x >= j*30) && (x < j*30+30) ) {
			     	array[j] = stone;
			}
		}
	}
	
	return 0;
}



相変わらず覚束ない日本語ですみません。><

組木紙織

Re:五目並べを作ろうとしているのですが・・

#2

投稿記事 by 組木紙織 » 17年前

ざっと見ただけですが、初期化したのを使わずに捨てているところが問題です。
使いたいgrobalな変数をlocalな変数で覆い隠しています。
Cの変数のスコープに気を付けてください。
externは今回は必要ないです。

以下問題のコードの一部、ここ以外にも同様な問題があります。
int clear(void)
{
         /*ここでlocalにarrayの配列を確保*/
	int array[15][15];
	int i,j;
	
	/*初期化*/
	/*localのarrayを初期化する*/
	for (i=0;i<15;i++) {	
		for (j=0;j<15;j++) {
			array[j] = 0;
		}
	}
	
	return 0;
}       /*ここでlocalのarrayを捨てる*/

box

Re:五目並べを作ろうとしているのですが・・

#3

投稿記事 by box » 17年前

WinMain()を除く関数の設計の話をします。
当該関数群では0以外の値をreturnしておらず、
しかも、その0という戻り値を呼び出し側で全く使っていません。
そういう状況で、関数の型をintにすることに何か意味があるでしょうか。

ね~す

Re:五目並べを作ろうとしているのですが・・

#4

投稿記事 by ね~す » 17年前

どうやら、グローバルとエクスターンを完全に取り違えていたようです。><

というか、実際に作っているときは複数のソースファイルに分割していたので、
少々混乱してしまっていたのかもしれません。
また、スコープについて勉強しなおそうと思います・・

とりあえず、一つのソースファイルにまとめてみると、初期化は成功しました。
きちんと完成したら分割してみるつもりです。

ところで、実は入力の方はまだ詰んでおりますorz

原因は以下のソース内だと思います。
int input(void)
{
	int MouseX,MouseY,MouseInput;
	int x,y,hasi_x,hasi_y;
	
	
	if (turn%2 == 0) {
		stone = 1;
	} else {
		stone = 2;
	}

	
	// マウスを表示状態にする
	SetMouseDispFlag( TRUE ) ;

	// マウスの入力を待つ
	MouseInput = GetMouseInput() ;
	
	do {
	
		while( ( MouseInput & MOUSE_INPUT_LEFT ) == 0 )
		{
			
			// メッセージ処理
			if( ProcessMessage() == -1 )
			{
				break ;	// エラーが起きたらループから抜ける
			}
	        	
			// マウスの入力を得る
			MouseInput = GetMouseInput() ;
		}
		while( ( MouseInput & MOUSE_INPUT_LEFT ) == 1 )
		{
			
			// メッセージ処理
			if( ProcessMessage() == -1 )
			{
				break ;	// エラーが起きたらループから抜ける
			}
			
			// マウスの入力を得る
			MouseInput = GetMouseInput() ;
			
			// マウスの位置を取得

				
		}
	} while ( ( (MouseX < 85) || (MouseX > 555) ) && ( (MouseY < 5) || (MouseY > 475) ) );
	
	GetMousePoint( &MouseX , &MouseY ) ;
	
	// 判定部分
	hasi_x = 94;
	hasi_y = 14;
	x = MouseX - hasi_x;
	y = MouseY - hasi_y;
	
	for (i=0;i<15;i++) {
		for (j=0;j<15;j++) {
			if ( (y >= i*30) && (y < i*30+30) &&
			     (x >= j*30) && (x < j*30+30) ) {
			     	array[j] = stone;
			}
		}
	}
	
	return 0;
}


今一度、問題解決に協力していただければ嬉しいかぎりです。m(__)m


あと、input関数は 変数をグローバルにすることで、void型に直すことができました。
int型だったのは、変な試行錯誤があったとお察しください><

Mist

Re:五目並べを作ろうとしているのですが・・

#5

投稿記事 by Mist » 17年前

最初のソースでは

// マウスの位置を取得

で、GetMousePointをコールしているのに、後のソースではなくなっているせいではないですか?

ね~す

Re:五目並べを作ろうとしているのですが・・

#6

投稿記事 by ね~す » 17年前

すいません、

// マウスの位置を取得

GetMousePoint( &MouseX , &MouseY ) ;

に訂正します。即ち、最初のソースの内容に戻します。

あと、
// メインループ //
	
	for (turn = 0;turn<100;turn++) {
	screen_st();
	
	input();

	ScreenFlip();
// メインループ //
	
	for (turn = 0;turn<100;turn++) {
	
	input();
	
	screen_st();
	
	ScreenFlip();
と変更することで、入力が変になるのが解決しました。

これから、勝利判定などを作っていこうと思います。

ご指導していただいた皆様、ありがとうございました!

閉鎖

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