正常に作動する問題点

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

正常に作動する問題点

#1

投稿記事 by apricot » 14年前

 はじめまして。杏です。
 どうやって質問したらいいのか分からないので、テンプレートで質問します。
[1] 質問文
 [1.1] 自分が今行いたい事は何か
      「ライフゲーム」というものを作りたいと思っています。
      うまく説明できる自信がないので、ご存じない方は、wikiなどで調べていただけるとありがたいです。
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
      一応完成はしました。
      下のように作りました。

コード:

#include "DxLib.h"

int Key[256];

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

int hantei[96][128] , hantei2[96][128];

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	ChangeWindowMode(TRUE);//ウィンドウモード
	if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
	SetMouseDispFlag(TRUE);

	int x , y , mox , moy , white=GetColor(255,255,255);

		for(x=0 ; x<128 ; x++)
			for(y=0 ; y<96 ; y++)
				hantei[y][x]=0;

	while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){

		GetMousePoint(&mox,&moy);
		if(mox>0 && mox<640)
			if(moy>0 && moy<480){
				if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 )
					hantei[(moy-(moy%5))/5][(mox-(mox%5))/5]=1; //点を打つ。
				if( ( GetMouseInput() & MOUSE_INPUT_RIGHT) != 0 )
					hantei[(moy-(moy%5))/5][(mox-(mox%5))/5]=0;//点を消す。
			}

		for(x=0 ; x<128 ; x++)
			for(y=0 ; y<96 ; y++)
				if(hantei[y][x]==1)
					DrawBox(x*5+1 , y*5+1 , (x+1)*5-1 , (y+1)*5-1 , white , TRUE);
                                                                //点を描画する。

		if(Key[KEY_INPUT_F5]==1 || Key[KEY_INPUT_SPACE]>0){

			for(x=0 ; x<128 ; x++)
				for(y=0 ; y<96 ; y++)
					hantei2[y][x]=0;
			
			for(x=0 ; x<128 ; x++)
				for(y=0 ; y<96 ; y++)
					if(hantei[y][x]==1){
                                   if(y>0 && y<95 && x>0 && x<127){  //ここから↓
							hantei2[y-1][x-1]++;
 							hantei2[y-1][x  ]++;
							hantei2[y-1][x+1]++;
							hantei2[y  ][x-1]++;
							hantei2[y  ][x+1]++;
							hantei2[y+1][x-1]++;
							hantei2[y+1][x  ]++;
							hantei2[y+1][x+1]++;
						}
						else if(y==0 && x!=0 && x!=127){
							hantei2[y  ][x-1]++;
							hantei2[y  ][x+1]++;
							hantei2[y+1][x-1]++;
							hantei2[y+1][x  ]++;
							hantei2[y+1][x+1]++;
						}
						else if(y==95 && x!=0 && x!=127){
							hantei2[y-1][x-1]++;
 							hantei2[y-1][x  ]++;
							hantei2[y-1][x+1]++;
							hantei2[y  ][x-1]++;
							hantei2[y  ][x+1]++;
						}
						else if(x==0 && y!=0 && y!=95){
 							hantei2[y-1][x  ]++;
							hantei2[y-1][x+1]++;
							hantei2[y  ][x+1]++;
							hantei2[y+1][x  ]++;
							hantei2[y+1][x+1]++;
						}
						else if(x==127 && y!=0 && y!=95){
							hantei2[y-1][x-1]++;
 							hantei2[y-1][x  ]++;
							hantei2[y  ][x-1]++;
							hantei2[y+1][x-1]++;
							hantei2[y+1][x  ]++;
						}
						else if(y==0 && x==0){
							hantei2[y  ][x+1]++;
							hantei2[y+1][x  ]++;
							hantei2[y+1][x+1]++;
						}
						else if(y==0 && x==127){
							hantei2[y  ][x-1]++;
							hantei2[y+1][x-1]++;
							hantei2[y+1][x  ]++;
						}
						else if(y==95 && x==0){
 							hantei2[y-1][x  ]++;
							hantei2[y-1][x+1]++;
							hantei2[y  ][x+1]++;
						}
						else if(y==95 && x==127){
							hantei2[y-1][x-1]++;
 							hantei2[y-1][x  ]++;
							hantei2[y  ][x-1]++;
						}                                                       //ここまで↑
					}

			for(x=0 ; x<128 ; x++)
				for(y=0 ; y<96 ; y++)
					if(hantei[y][x]==1){
						if(hantei2[y][x]<=1 || hantei2[y][x]>=4)
							hantei[y][x]=0;
					}
					else if(hantei2[y][x]==3)
						hantei[y][x]=1;

			WaitTimer(50);
		}

		ScreenFlip();
	}

	DxLib_End();
	return 0;
}
      ですが、これはとても非効率的というか、あんまり良い出来ではないのです。
特に、コードの中で、「ここから」「ここまで」と書いてあるところは、以前は下のように書いていました。

コード:

			if(y!=0)	        hantei2[y-1][x]++;
			if(x!=0)	        hantei2[y][x-1]++;
			if(y!=95)	        hantei2[y+1][x]++;
			if(x!=127)	  hantei2[y][x+1]++;
			if(y!=0 || x!=0)	  hantei2[y-1][x-1]++;
			if(y!=0 || x!=127) hantei2[y-1][x+1]++;
			if(y!=95 || x!=0)  hantei2[y+1][x-1]++;
			if(y!=95 || x!=127) hantei2[y+1][x+1]++;
      このように書くと、微妙な場所で問題が発生します。
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
      「ここから」「ここまで」を、問題が発生する方のコードに書き換えて、実行します。
      ちゃんと起動します。
      左上の隅に、点を一つ打ちます。
      そして、右上の隅に、同じように点を一つ打ち、それに接するように、もう一つだけ点を打ちます。
      そして、F5を押します。
      「ライフゲーム」ルールだと、すべて消えるはずなのですが、どうしても右上の点が残ってしまいます。
 [1.4] 今何がわからないのか、知りたいのか
      どうして点が残ってしまうのかを教えてください。
      

[2] 環境  
 [2.1] OS : Windows, Linux等々
      Windows vista です。
 [2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
      VC++2008EEです。
[3] その他
 ・どの程度C言語を理解しているか
      まだ始めたばかりなので、丁寧に説明してくださるとありがたいです。
 ・ライブラリを使っている場合は何を使っているか
      DXライブラリ以外に何があるのか知りません。

  長文失礼いたしました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 正常に作動する問題点

#2

投稿記事 by softya(ソフト屋) » 14年前

初めまして。副管理人のsoftya(ソフト屋)です。
codeタグにミスがあったので修正しました。
[]を忘れないでくださいね。あと投稿前にプレビューで確認をお願いします。

これからソースコードは見させてもらいます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 正常に作動する問題点

#3

投稿記事 by softya(ソフト屋) » 14年前

たぶん、&&と||で逆だと思います。
例えば、y!=0で且つx!=0の時にhantei2[y-1][x-1]++;としたいのでは?
y=0の時はxが幾つの値であろうとhantei2[y-1][x-1]++;はまずいですよね。

コード:

							if(y!=95)				hantei2[y+1][x]++;
							if(x!=127)				hantei2[y][x+1]++;
							if(y!=0  &&  x!=0)		hantei2[y-1][x-1]++;
							if(y!=0  &&  x!=127)	hantei2[y-1][x+1]++;
							if(y!=95 &&  x!=0)		hantei2[y+1][x-1]++;
							if(y!=95 && x!=127)		hantei2[y+1][x+1]++;
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

apricot
記事: 8
登録日時: 14年前

Re: 正常に作動する問題点

#4

投稿記事 by apricot » 14年前

 返信遅れました。
 すいません。
 そして、修正ありがとうございます。

 納得、できたような気がします。
 多分、自分の中で、!=と||の意味が捉え切れてなかったのだと思います。
 ありがとうございました。

閉鎖

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