Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Look for FlashVars in Element Inspect in hacker.org/coil
- #include <iostream>
- #include <vector>
- const int sizeX = 16;
- const int sizeY = 16;
- int gameMap[sizeY][sizeX];
- std::string Board = "..........X.........X.....X..XX.X.....XX..XX....X....X....XXXX.........XX........X..X........XX..XXX..X...........XX........X...X......XXX....X....XXXXXXX.X.....X..XXXX............X.....X.XXXX..XXX...X.X..X....XXXX..X....X..........X...............X.......";
- void MakeMap() {
- for(int y=0; y<sizeY; y++) {
- for(int x=0; x<sizeX; x++) {
- gameMap[y][x] = ((Board[sizeX*y + x])=='.'?0:1);
- }
- }
- }
- std::vector<char>* history = new std::vector<char>;
- int currentMove = 2;
- class PlayerObj {
- public:
- int x=0;
- int y=0;
- bool MoveLeft() {
- bool CouldMove = false;
- while((x>0) && (!gameMap[y][x-1])) {
- CouldMove = true;
- gameMap[y][x] = currentMove;
- x--;
- }
- if(CouldMove) currentMove++;
- return CouldMove;
- }
- bool MoveRight() {
- bool CouldMove = false;
- while((x<sizeX-1) && (!gameMap[y][x+1])) {
- CouldMove = true;
- gameMap[y][x] = currentMove;
- x++;
- }
- if(CouldMove) currentMove++;
- return CouldMove;
- }
- bool MoveUp() {
- bool CouldMove = false;
- while((y>0) && (!gameMap[y-1][x])) {
- CouldMove = true;
- gameMap[y][x] = currentMove;
- y--;
- }
- if(CouldMove) currentMove++;
- return CouldMove;
- }
- bool MoveDown() {
- bool CouldMove = false;
- while((y<sizeY-1) && (!gameMap[y+1][x])) {
- CouldMove = true;
- gameMap[y][x] = currentMove;
- y++;
- }
- if(CouldMove) currentMove++;
- return CouldMove;
- }
- bool EraseLeft() {
- bool CouldMove = false;
- while((x>0) && (gameMap[y][x-1]==currentMove-1)) {
- CouldMove = true;
- gameMap[y][x] = 0;
- x--;
- }
- if(CouldMove) currentMove--;
- return CouldMove;
- }
- bool EraseRight() {
- bool CouldMove = false;
- while((x<sizeX-1) && (gameMap[y][x+1]==currentMove-1)) {
- CouldMove = true;
- gameMap[y][x] = 0;
- x++;
- }
- if(CouldMove) currentMove--;
- return CouldMove;
- }
- bool EraseUp() {
- bool CouldMove = false;
- while((y>0) && (gameMap[y-1][x]==currentMove-1)) {
- CouldMove = true;
- gameMap[y][x] = 0;
- y--;
- }
- if(CouldMove) currentMove--;
- return CouldMove;
- }
- bool EraseDown() {
- bool CouldMove = false;
- while((y<sizeY-1) && (gameMap[y+1][x]==currentMove-1)) {
- CouldMove = true;
- gameMap[y][x] = 0;
- y++;
- }
- if(CouldMove) currentMove--;
- return CouldMove;
- }
- bool Undo() {
- }
- };
- PlayerObj* player = new PlayerObj;
- void PrintMap() {
- for(int y=0; y<sizeY; y++) {
- for(int x=0; x<sizeX; x++) {
- if((player->x == x) && (player->y == y)) {
- std::cout << 'x';
- } else {
- std::cout << (gameMap[y][x]?'#':'.');
- }
- }
- std::cout << std::endl;
- }
- std::cout << std::endl;
- }
- bool IsMapComplete() {
- bool result = true;
- for(int y=0; y<sizeY; y++) {
- for(int x=0; x<sizeX; x++) {
- if(!(gameMap[y][x])) {
- if(!(player->x==x && player->y==y)) {
- result = false;
- break;
- }
- }
- }
- if(!result) break;
- }
- return result;
- }
- void Undo() {
- switch(history->back()) {
- case 'L':
- player->EraseRight();
- history->pop_back();
- break;
- case 'R':
- player->EraseLeft();
- history->pop_back();
- break;
- case 'U':
- player->EraseDown();
- history->pop_back();
- break;
- case 'D':
- player->EraseUp();
- history->pop_back();
- break;
- }
- }
- char FirstMove = ' ';
- bool CanContinue = true;
- bool MovePlayer(char skip) {
- if((!((skip=='L') || (skip=='R') || (skip=='U') || (skip=='D'))) && player->MoveLeft()){
- history->push_back('L');
- if(FirstMove=='L' && history->size()==1) CanContinue = false;
- if(FirstMove==' ')FirstMove='L';
- } else if((!((skip=='R') || (skip=='U') || (skip=='D'))) && player->MoveRight()) {
- history->push_back('R');
- if(FirstMove=='R' && history->size()==1) CanContinue = false;
- if(FirstMove==' ')FirstMove='R';
- } else if ((!((skip=='U') || (skip=='D'))) && player->MoveUp()) {
- history->push_back('U');
- if(FirstMove=='U' && history->size()==1) CanContinue = false;
- if(FirstMove==' ')FirstMove='U';
- } else if ((!(skip=='D')) && player->MoveDown()) {
- history->push_back('D');
- if(FirstMove=='D' && history->size()==1) CanContinue = false;
- if(FirstMove==' ')FirstMove='D';
- } else {
- return false;
- }
- return true;
- }
- bool TryPosition(int posX, int posY) {
- player->x = posX;
- player->y = posY;
- char skip = ' ';
- while(CanContinue) {
- if(!MovePlayer(skip)){
- if(!IsMapComplete()) {
- skip = history->back();
- Undo();
- } else {
- return true;
- }
- } else {
- skip = ' ';
- }
- }
- return false;
- }
- int gameMapCopy[sizeY][sizeX];
- void Reset() {
- for(int y=0; y<sizeY; y++) {
- for(int x=0; x<sizeX; x++) {
- gameMap[y][x] = gameMapCopy[y][x];
- }
- }
- FirstMove = ' ';
- CanContinue = true;
- history->clear();
- }
- int main()
- {
- MakeMap();
- PrintMap();
- for(int y=0; y<sizeY; y++) {
- for(int x=0; x<sizeX; x++) {
- gameMapCopy[y][x] = gameMap[y][x];
- }
- }
- bool FoundResult = false;
- int FoundX, FoundY;
- for(int y=0; y<sizeY; y++) {
- for(int x=0; x<sizeX; x++) {
- Reset();
- if(!(gameMap[y][x])) {
- if(TryPosition(x,y)) {
- FoundResult = true;
- FoundX = x;
- FoundY = y;
- break;
- }
- }
- }
- if(FoundResult) break;
- }
- std::cout << "x:" << FoundX << " | y:" << FoundY << std::endl;
- for(int i=0; i<history->size(); i++) {
- std::cout << (*history)[i];
- }
- std::cout << std::endl << std::endl;
- std::cout << "http://www.hacker.org/coil/index.php?x=" << FoundX << "&y=" << FoundY << "&path=";
- for(int i=0; i<history->size(); i++) {
- std::cout << (*history)[i];
- }
- std::cout << std::endl;
- }
Add Comment
Please, Sign In to add comment