Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #include <vector>
- #include "Point2d.h"
- #include "Army.h"
- class Army;
- using namespace std;
- class Map
- {
- int XSIZE,YSIZE;
- char **map;
- int **TRACE;
- int **WayArr;
- public:
- void SetPositions(Army *a1, Army *a2);
- Map(int sizex, int sizey);
- Map(char *c);
- void LoadMap(char *c);
- void WriteMap(FILE *f);
- void ReadMap(FILE *f);
- vector <Point2d> CalcWay(int x1,int y1, int x2, int y2);
- vector <Point2d> CalcWay(Point2d p1,Point2d p);
- int getX()
- {
- return XSIZE;
- }
- int getY()
- {
- return YSIZE;
- }
- Map(){};
- char getChar(int x, int y)
- {
- return map[x][y];
- }
- ~Map(void);
- };
- #include "StdAfx.h"
- #include "Map.h"
- #include "Soldier.h"
- #include <iostream>
- #include <stdlib.h>
- using namespace std;
- #define TRUE true
- #define FALSE false
- Map::Map(int x, int y)
- {
- this->XSIZE = x;
- this->YSIZE = y;
- this->map = new char * [XSIZE];
- this->TRACE = new int * [XSIZE];
- this->WayArr = new int *[XSIZE];
- for(int i =0; i< XSIZE; i++)
- {
- this->TRACE[i] = new int[YSIZE];
- this->map[i] = new char[YSIZE];
- this->WayArr[i] = new int[YSIZE];
- }
- }
- void Map::LoadMap(char *c)
- {
- FILE *f = fopen(c,"r");
- if(f)
- {
- fscanf(f,"%d%d",&this->XSIZE,&this->YSIZE);
- this->map = new char * [XSIZE];
- this->TRACE = new int * [XSIZE];
- this->WayArr = new int *[XSIZE];
- for(int i =0; i< XSIZE; i++)
- {
- this->TRACE[i] = new int[YSIZE];
- this->map[i] = new char[YSIZE];
- this->WayArr[i] = new int[YSIZE];
- }
- char x;//хз зачем так сделал, но оно работает.
- x = fgetc(f);
- for(int j = 0; j<YSIZE; j++)
- for(int i =0;i<XSIZE+1;i++)
- {
- x = fgetc(f);
- if(i<XSIZE)
- {
- map[i][j] =x;
- TRACE[i][j]=0;
- }
- }
- fclose(f);
- }
- }
- Map::Map(char *c)
- {
- LoadMap(c);
- }
- void Map::WriteMap(FILE *f)
- {
- fwrite((char*)&XSIZE,4,1,f);
- fwrite((char*)&YSIZE,4,1,f);
- for(int i =0; i< XSIZE; i++)
- for(int j =0; j<YSIZE; j++)
- {
- fwrite((char *)&map[i][j],1,1,f);
- }
- }
- void Map::ReadMap(FILE *f)
- {
- fread((char*)&XSIZE,4,1,f);
- fread((char*)&YSIZE,4,1,f);
- this->map = new char * [XSIZE];
- this->TRACE = new int * [XSIZE];
- this->WayArr = new int * [XSIZE];
- for(int i =0; i< XSIZE; i++)
- {
- this->TRACE[i] = new int[YSIZE];
- this->map[i] = new char[YSIZE];
- this->WayArr[i] = new int [YSIZE];
- }
- for(int i =0; i< XSIZE; i++)
- for(int j =0; j<YSIZE; j++)
- {
- fread((char *)&map[i][j],1,1,f);
- }
- }
- void Map::SetPositions(Army *a1,Army *a2)
- {
- //vector <Soldier *> v = a1->GetSoldiers();
- /* for(int i =0; i<v.size(); i++)
- {
- TRACE[v[i]->getPos().x][v[i]->getPos().y] = 90;
- }
- v = a2->GetSoldiers();
- for(int i =0; i<v.size(); i++)
- {
- TRACE[v[i]->getPos().x][v[i]->getPos().y] = 90;
- }
- */
- /* for(int j=0;j<YSIZE;j++)
- {
- for(int i=0;i<XSIZE;i++)
- {
- TRACE[i][j]=0;
- WayArr[i][j]=0;
- if(map[i][j]=='*' )
- TRACE[i][j]=XSIZE*YSIZE;//sheight - стенка.
- }
- }*/
- }
- vector <Point2d> Map::CalcWay(int x1, int y1, int x2, int y2)
- {
- TRACE[x1][y1]=1;//точка кто идет(тоесть враг) - 1.
- WayArr[x2][y2] = 0; //чтоб враг съел игрока , а не остановился перед ним - клетка игрока тоже 20.
- //(в этом массиве клетка куда надо идти помечаеться 20кой.)
- for(int k=0;k<XSIZE*YSIZE;k++)//три цикла.
- {//1 для волны, да для массивов.
- for(int j=0;j<YSIZE;j++)
- {
- for(int i=0;i<XSIZE;i++)
- {
- if(i+1<XSIZE && TRACE[i][j]==0 && TRACE[i+1][j]==k+1 && map[i][j]!='*')//если не стенка и правая - на 1 больше этой и не стенка(зачем еще раз??), то....
- { TRACE[i][j]=k+2;}//трасса - следующий номер.
- if(i-1>0 && TRACE[i][j]==0 && TRACE[i-1][j]==k+1 && map[i][j]!='*')
- { TRACE[i][j]=k+2;}
- if( j+1<YSIZE && TRACE[i][j]==0 && TRACE[i][j+1]==k+1 && map[i][j]!='*')
- { TRACE[i][j]=k+2;}
- if(j-1>0 && TRACE[i][j]==0 && TRACE[i][j-1]==k+1 && map[i][j]!='*')
- { TRACE[i][j]=k+2;}
- }
- }
- }
- /***************************************************************************/
- vector <Point2d> res;
- int x3=x2;
- int y3=y2;
- for(int i=0;i<TRACE[x2][y2];i++)//И идет до игрока...
- {
- if(i%2)//если и четная то...
- {
- if(TRACE[x3][y3+1]<TRACE[x3][y3])//если следующая меньше этой,
- { y3++; goto bc; }//го туда.
- if(TRACE[x3][y3-1]<TRACE[x3][y3])
- { y3--; goto bc; }
- if(TRACE[x3+1][y3]<TRACE[x3][y3])
- { x3++; goto bc; }
- if(TRACE[x3-1][y3]<TRACE[x3][y3])
- { x3--; goto bc; }
- }
- else//иначе го сюда.
- {
- if(TRACE[x3+1][y3]<TRACE[x3][y3])
- { x3++; goto bc; }
- if(TRACE[x3-1][y3]<TRACE[x3][y3])
- { x3--; goto bc; }
- if(TRACE[x3][y3+1]<TRACE[x3][y3])
- { y3++; goto bc; }
- if(TRACE[x3][y3-1]<TRACE[x3][y3])
- { y3--; goto bc; }
- }
- bc:
- //WayArr[x3][y3]=20;//нужные клетки заполняем.
- res.push_back(Point2d(x3,y3));
- }
- return res;
- }
- vector <Point2d> Map::CalcWay(Point2d p1, Point2d p2)
- {
- //нужна гребаная оптимизация
- int x1,y1,x2,y2;
- x1=p2.x;
- y1=p2.y;
- x2=p1.x;
- y2=p1.y;
- for(int i =0; i< XSIZE; i++)
- for(int j =0; j<YSIZE; j++)
- {
- TRACE[i][j] = 0;
- WayArr[i][j] = 0;
- if(map[i][j]=='*' )
- TRACE[i][j]=XSIZE*YSIZE;//sheight - стенка.
- }
- TRACE[x1][y1]=1;//точка кто идет(тоесть враг) - 1.
- WayArr[x2][y2] = 0; //чтоб враг съел игрока , а не остановился перед ним - клетка игрока тоже 20.
- //(в этом массиве клетка куда надо идти помечаеться 20кой.)
- bool b = false;
- for(int k=0;k<XSIZE*YSIZE;k++)//три цикла.
- {//1 для волны, да для массивов.
- for(int j=0;j<YSIZE;j++)
- {
- for(int i=0;i<XSIZE;i++)
- {
- if(i+1<XSIZE && TRACE[i][j]==0 && TRACE[i+1][j]==k+1 && map[i][j]!='*')//если не стенка и правая - на 1 больше этой и не стенка(зачем еще раз??), то....
- { TRACE[i][j]=k+2;}//трасса - следующий номер.
- if(i-1>=0 && TRACE[i][j]==0 && TRACE[i-1][j]==k+1 && map[i][j]!='*')
- { TRACE[i][j]=k+2;}
- if( j+1<YSIZE && TRACE[i][j]==0 && TRACE[i][j+1]==k+1 && map[i][j]!='*')
- { TRACE[i][j]=k+2;}
- if(j-1>=0 && TRACE[i][j]==0 && TRACE[i][j-1]==k+1 && map[i][j]!='*')
- { TRACE[i][j]=k+2;}
- }
- }
- if(x2-1>=0 && x2+1<XSIZE && y2-1>=0 && y2+1 < YSIZE)
- if(TRACE[x2-1][y2] != 0 && TRACE[x2+1][y2] != 0 && TRACE[x2][y2-1] != 0 && TRACE[x2][y2+1] != 0)
- { b = true;cout<<"Algorithm breaked at "<<k<<" iterations."<<endl; break;}
- }
- if(!b)
- cout<<"Algorithm breaked at MAXIMUM: "<<XSIZE*YSIZE<<" iterations"<<endl;
- /***************************************************************************/
- vector <Point2d> res;
- int x3=x2;
- int y3=y2;
- for(int i=0;i<TRACE[x2][y2];i++)//И идет до игрока...
- {
- if(i%2)//если и четная то...
- {
- if(y3+1<YSIZE && TRACE[x3][y3+1]<TRACE[x3][y3])//если следующая меньше этой,
- { y3++; goto bc; }//го туда.
- if(y3-1>=0 && TRACE[x3][y3-1]<TRACE[x3][y3])
- { y3--; goto bc; }
- if(x3+1<XSIZE && TRACE[x3+1][y3]<TRACE[x3][y3])
- { x3++; goto bc; }
- if(x3-1 >=0 && TRACE[x3-1][y3]<TRACE[x3][y3])
- { x3--; goto bc; }
- }
- else//иначе го сюда.
- {
- if(x3+1<XSIZE && TRACE[x3+1][y3]<TRACE[x3][y3])
- { x3++; goto bc; }
- if(x3-1>=0 && TRACE[x3-1][y3]<TRACE[x3][y3])
- { x3--; goto bc; }
- if(y3+1<YSIZE && TRACE[x3][y3+1]<TRACE[x3][y3])
- { y3++; goto bc; }
- if(y3-1>=0 && TRACE[x3][y3-1]<TRACE[x3][y3])
- { y3--; goto bc; }
- }
- bc:
- //WayArr[x3][y3]=20;//нужные клетки заполняем.
- // if(x2 != x3 || y2 != y3)
- res.push_back(Point2d(x3,y3));
- // x2 = x3;
- //y2 = y3;
- }
- // for(int i =1; i<res.size(); i++)
- // if(res[i].x == res[i-1].x && res[i].y == res[i-1].y)
- // res.erase(res);
- return res;
- }
- Map::~Map(void)
- {
- }
Add Comment
Please, Sign In to add comment