예제 #1
0
main(){
	int potential[FIELDY][FIELDX];//ポテンシャル値は最悪の場合(うずまき迷路が最悪),FIELDY*FIELDXの値を保持する必要がある.2byteの変数をつかったほうがよい.
	int nowmaze[FIELDY][FIELDX];//マウスが覚えている迷路情報
	int i,t;//for文などで使う汎用変数
	int command;//0:1マス進む 1:左90度ターンしてから1マス進む,2:右90度ターンしてから1マス進む,3:180度ターンしてから1マス進む
	int todirec;//0:北のマスへ進む,1:東のマスへ進む,2:南のマスに進む,3:西のマスに進む
	int mousex,mousey;//マウスの現在位置,左上のマスをmousex=0,mousey=0とする
	int moused;//マウスの現在の方向,北向きを0,東向きを1,南向きを2,西向きを3とする.

	ReadMaze("maze.dat");//迷路の真の情報を保持する
	//初期化:ロボットは最初北向きで左下にいる
	mousex=0;
	mousey=FIELDX-1;
	moused=0;
	//初期化:最初ロボットは迷路情報を何も知らない
	for(i = 0;i < FIELDY;i++)
		for(t = 0;t < FIELDX;t++)
			nowmaze[i][t]=0x00;//16進法表示で0を意味する
	while(!(mousex==7 && mousey==FIELDY-8)){//足立法ループ:マウスがゴールに到着するまで無限ループを行う
		printmaze(mousex,mousey,moused,nowmaze);//現在状態をターミナル(コマンドプロンプト)に表示
		getchar();//キーボードから入力があるまで待つ
		readsensor(mousex,mousey,moused,nowmaze);//センサー値を読んで迷路情報を更新する関数(実機に実装する場合はこの関数を書き換えてください
		makepotential(mousex, mousey, 7, FIELDY-8,potential,nowmaze);//更新された迷路情報を用いてポテンシャル値を計算
		todirec=decidetodirec(mousex,mousey,potential,nowmaze);//四方のマスの中で一番値が小さいものを探す(0:北,1:東,2:南,3:西)
		command=decidecommand(todirec,moused);//指定したマスに動くためのコマンドを決定(指定されたマスに進むには,どの向きに回転すればいいか?)
		switch(command){//指定したコマンドの通り動く
			case 0:break;//ターンしない
			case 1:moused+=3;moused%=4;/*マウスをその場左90度ターンする関数*/break;
			case 2:moused+=1;moused%=4;/*マウスをその場右90度ターンする関数*/break;
			case 3:moused+=2;moused%=4;/*マウスをその場180度ターンする関数*/break;
		}
		switch(moused){//1マス進む
			case 0:mousey--;/*マウスをその場から1マス進ませる関数*/break;//マウスが現在北向きの場合
			case 1:mousex++;/*マウスをその場から1マス進ませる関数*/break;//マウスが現在東向きの場合
			case 2:mousey++;/*マウスをその場から1マス進ませる関数*/break;//マウスが現在南向きの場合
			case 3:mousex--;/*マウスをその場から1マス進ませる関数*/break;//マウスが現在西向きの場合
		}
	}
	puts("マウスがゴールにつきました.");
	return 0;
}
예제 #2
0
// Reset game
void Reset() {
	moves = 0;
	state.state = IDLE;
	ReadMaze();
	LoadMaze(actual_level, 0);
}