#include using namespace std; //パラメーター #define WIDTH 8 #define HEIGHT 5 #define GOAL_ONE_X 3-1 #define GOAL_ONE_Y 2-1 #define GOAL_TWO_X 4-1 #define GOAL_TWO_Y 2-1 //グローバル変数 int Stage[HEIGHT][WIDTH] = { {4,4,4,4,4,4,4,4}, {4,0,2,2,0,0,0,4}, {4,0,0,0,0,0,0,4}, {4,0,0,0,0,0,0,4}, {4,4,4,4,4,4,4,4}, }; struct Object { int x;int y; }; Object Player; //プレイヤーの座標 Object Obj[2]; //荷物の座標 char Input; //プレイヤーが何を入れたか void Init();//初期化関数 void Draw();//描画関数 void Update();//更新関数 void GetInput();//入力を受け取る関数 void Init() { Player.x = 6; Player.y = 2-1; Obj[0].x = 3-1; Obj[0].y = 3-1; Obj[1].x = 4-1; Obj[1].y = 3-1; Stage[Player.y][Player.x] = 1; Stage[Obj[0].y][Obj[0].x] = 3; Stage[Obj[1].y][Obj[1].x] = 3; } void Draw() { for(int j=0;j> Input; } void UpDate() { //プレイヤーの座標を保存する。 int PX = Player.x; int PY = Player.y; //まず何を入力されたのか。 switch(Input) { case 'z': PY++; break; case 'a': PX--; break; case 's': PX++; break; case 'w': PY--; break; } //座標が更新されたので、そこをまず判定する。 switch(Stage[PY][PX]) { case 1://1の場合は、変なものを入力されたということより、何もしない。 case 2://2はゴール地点。とりあえず平地と同じ扱いにしよう。 case 0://でもやはりなにもしない。 break; case 4://壁なので、プレイヤーの座標は更新されない。 PX = Player.x; PY = Player.y; break; case 3://問題の部分。荷物がどうやら更新先にあるようだ。 for(int n=0;n<2;n++) { if(PX == Obj[n].x&&PY == Obj[n].y) { int OX = Obj[n].x+(PX-Player.x); int OY = Obj[n].y+(PY-Player.y); if(Stage[OY][OX] != 4&&Stage[OY][OX] != 3)//壁、もしくは別の荷物がなければいい。 { Obj[n].x = OX; Obj[n].y = OY; } else//もし障害物が存在するなら、更新は不可。 { PX = Player.x; PY = Player.y; } } } break; } //現在地をまず消去 Stage[Player.y][Player.x] = 0; Stage[Obj[0].y][Obj[0].x] = 0; Stage[Obj[1].y][Obj[1].x] = 0; //プレイヤーの更新 Player.x = PX; Player.y = PY; //マップの更新 Stage[GOAL_ONE_Y][GOAL_ONE_X] = 2; Stage[GOAL_TWO_Y][GOAL_TWO_X] = 2; Stage[Player.y][Player.x] = 1; Stage[Obj[0].y][Obj[0].x] = 3; Stage[Obj[1].y][Obj[1].x] = 3; } int main() { Init(); while(true) { //クリア判定 int GOAL_OBJ = 2; if(Stage[GOAL_ONE_Y][GOAL_ONE_X] == 3)GOAL_OBJ--; if(Stage[GOAL_TWO_Y][GOAL_TWO_X] == 3)GOAL_OBJ--; //もし、ゴールが全て埋まっていれば、ループを抜け出す。 if(GOAL_OBJ == 0)break; Draw(); GetInput(); UpDate(); } Draw();//もう一度だけ更新する。 cout << "Congratulations!!" <