どうやって質問したらいいのか分からないので、テンプレートで質問します。
[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ライブラリ以外に何があるのか知りません。
長文失礼いたしました。