(短いものにしてはちょっと長いかも…)
迷路ですね。
#include "DxLib.h"
#define MAP_X 29
#define MAP_Y 29
#define MAP_Z 16
#define KEY_UP 0
#define KEY_RIGHT 1
#define KEY_DOWN 2
#define KEY_LEFT 3
int Key[4];
int time1=0,
time2=0,
time3=0;
//キーの状態を得る
int Getkey(void){
int a=0;
if(CheckHitKey( KEY_INPUT_UP)!=0){
Key[KEY_UP]++;
a++;
}
else Key[KEY_UP]=0;
if(CheckHitKey( KEY_INPUT_RIGHT)!=0){
Key[KEY_RIGHT]++;
a++;
}
else Key[KEY_RIGHT]=0;
if(CheckHitKey( KEY_INPUT_DOWN)!=0){
Key[KEY_DOWN]++;
a++;
}
else Key[KEY_DOWN]=0;
if(CheckHitKey( KEY_INPUT_LEFT)!=0){
Key[KEY_LEFT]++;
a++;
}
else Key[KEY_LEFT]=0;
if(CheckHitKey( KEY_INPUT_Z)!=0){
return -1;
}
return a;
}
//mapの描写
void Aitu_gazou(int *map){
int a,b,dx,dy;
for(a=0;a<MAP_X;a++){
for(b=0;b<MAP_Y;b++){
dx=a*MAP_Z;
dy=b*MAP_Z;
DrawBox(dx,dy,dx+MAP_Z,dy+MAP_Z,GetColor(250-*map*200,250-*map*200,250-*map*200),1);
map++;
}
}
}
//メインのプログラムですね
int Aitu_state(void){
int map[MAP_X][MAP_Y];
int a,b;
int dx,dy;
int x=1*MAP_Z,
y=1*MAP_Z,
ex=(MAP_X-2)*MAP_Z,
ey=1*MAP_Z;
int furagu=4;
//mapの初期化
for(a=0;a<MAP_X;a++){
for(b=0;b<MAP_Y;b++){
map[a][b]=0;
}
}
/* mapの外壁 */
//横の壁
for(a=0;a<MAP_X;a++){
map[a][0]=1;
map[a][MAP_Y-1]=1;
}
//縦の壁
for(b=0;b<MAP_Y;b++){
map[0][b]=1;
map[MAP_X-1][b]=1;
}
//中の壁
for(a=2;a<MAP_X;a+=2){
for(b=2;b<MAP_Y;b+=2){
map[a][b]=1;
}
}
//中の壁
for(a=2;a<MAP_X-1;a+=2){
for(b=2;b<MAP_Y-1;b+=2){
do{
if(a==2)dx=GetRand(4);
else dx=GetRand(3);
switch(dx){
case 0:
dx=0;
dy=-1;
break;
case 1:
dx=1;
dy=0;
break;
case 2:
dx=0;
dy=1;
break;
case 3:
dx=-1;
dy=0;
break;
}
}while(map[a+dx][b+dy]==1);
map[a+dx][b+dy]=1;
}
}
while(ProcessMessage()==0 && ClearDrawScreen()==0 && Getkey()!=-1){
time1++;
if(60<=time1){
time2++;
time1-=60;
}
if(60<=time2){
time3++;
time2-=60;
}
if(x%MAP_Z==0 && y%MAP_Z==0){
dx=x/MAP_Z;
dy=y/MAP_Z;
a=ex/MAP_Z;
b=ey/MAP_Z;
if(map[dx][dy-1]==0 && Key[KEY_UP]%20==1)furagu=KEY_UP;
else if(map[dx+1][dy]==0 && Key[KEY_RIGHT]%20==1)furagu=KEY_RIGHT;
else if(map[dx][dy+1]==0 && Key[KEY_DOWN]%20==1)furagu=KEY_DOWN;
else if(map[dx-1][dy]==0 && Key[KEY_LEFT]%20==1)furagu=KEY_LEFT;
else furagu=4;
}
if(furagu<4){
if(furagu==KEY_UP){
y-=MAP_Z/4;
if(map[a][b+1]==0)ey+=MAP_Z/4;
}
if(furagu==KEY_RIGHT){
x+=MAP_Z/4;
if(map[a-1][b]==0)ex-=MAP_Z/4;
}
if(furagu==KEY_DOWN){
y+=MAP_Z/4;
if(map[a][b-1]==0)ey-=MAP_Z/4;
}
if(furagu==KEY_LEFT){
x-=MAP_Z/4;
if(map[a+1][b]==0)ex+=MAP_Z/4;
}
}
Aitu_gazou(&map[0][0]);
DrawCircle(x+MAP_Z/2,y+MAP_Z/2,MAP_Z/2,GetColor(200,50,50),1);
DrawCircle(ex+MAP_Z/2,ey+MAP_Z/2,MAP_Z/2,GetColor(50,50,200),1);
DrawCircle((MAP_X-2)*MAP_Z+MAP_Z/2,(MAP_Y-2)*MAP_Z+MAP_Z/2,MAP_Z/2,GetColor(50,200,50),1);
DrawFormatString(550,50,GetColor(200,200,200),"%d,%d,%d",time3,time2,(int)(time1*1.6));
ScreenFlip();
if(ex==(MAP_X-2)*MAP_Z && ey==(MAP_Y-2)*MAP_Z)return 0;
}
return -1;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
int a,b=1;
Getkey();
a=GetTickCount()%10000;
while(ProcessMessage()==0 && ClearDrawScreen()==0 && Getkey()!=-1){
if(Key[KEY_UP]==1)a+=1*b;
if(Key[KEY_DOWN]==1)a-=1*b;
if(Key[KEY_LEFT]==1 && b<=100)b*=10;
if(Key[KEY_RIGHT]==1 && 10<=b)b/=10;
if(a<0)a=0;
if(9999<a)a=9999;
DrawString(100,100,"Zで決定",GetColor(255,255,255));
DrawFormatString(150,200,GetColor(255,255,255),"%dずつ増えます",b);
DrawFormatString(150,250,GetColor(255,255,255),"マップ:%04d",a);
ScreenFlip();
}
while(Getkey()==-1)ScreenFlip();
SRand(a);
if(Aitu_state()==0){
DrawString(100,100,"Zキーで終了です",GetColor(100,200,100));
DrawString(100,200,"ゲームクリア",GetColor(100,200,100));
DrawFormatString(150,250,GetColor(100,100,255),"マップ:%04d=%d,%d,%d",a,time3,time2,(int)(time1*1.6));
while(Getkey()!=-1)ScreenFlip();
}
DxLib_End();
return 0;
}
(勝手にコピーして改良してくれてもいいです。
面白くなったら起動できる形(.exe)で張ってくれると嬉しいですけど…).
(コピぺしました)