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; }
// Reset game void Reset() { moves = 0; state.state = IDLE; ReadMaze(); LoadMaze(actual_level, 0); }