diff --git a/C++ProjectTemplate b/C++ProjectTemplate index 46bcc8c..911bdbd 100755 Binary files a/C++ProjectTemplate and b/C++ProjectTemplate differ diff --git a/main.cpp b/main.cpp index 6b3eedd..714fae4 100644 --- a/main.cpp +++ b/main.cpp @@ -14,6 +14,8 @@ float acc=0; float acc2=0; vi2d sandCoord={500,0}; bool simulationDone=false; +bool showVisual=true; +float viewX=0; struct Connection{ std::vectorcoords; @@ -31,9 +33,41 @@ vi2d getArrayCoords(vi2d pos){ char getBoard(vi2d pos){ vi2d actualCoords=getArrayCoords(pos); - if (actualCoords.x<0||actualCoords.y<0||actualCoords.x>=board[0].size()||actualCoords.y>=board.size()) { - simulationDone=true; - return 'X'; + if (actualCoords.x<0){ + for (int i=0;inewRow; + for (int i=0;i=board[0].size()){ + for (int i=0;i=board.size()){ + std::vectornewRow; + for (int i=0;iconnections; - std::ifstream file("input"); + std::ifstream file("testinput"); ReadState state=READX; while (file.good()){ std::string line; @@ -184,9 +233,11 @@ int main() } std::cout<>board; +int sum=0; +float timePerTick=0.03; +float acc=0; +float acc2=0; +vi2d sandCoord={500,0}; +bool simulationDone=false; + +struct Connection{ + std::vectorcoords; +}; + +enum ReadState{ + READX, + READY, + WAIT +}; + +vi2d getArrayCoords(vi2d pos){ + return pos-upperLeftCoords; +} + +char getBoard(vi2d pos){ + vi2d actualCoords=getArrayCoords(pos); + if (actualCoords.x<0||actualCoords.y<0||actualCoords.x>=board[0].size()||actualCoords.y>=board.size()) { + simulationDone=true; + return 'X'; + } + return board[actualCoords.y][actualCoords.x]; +} + +void modifyBoard(vi2d pos,char val){ + vi2d actualCoords=getArrayCoords(pos); + board[actualCoords.y][actualCoords.x]=val; +} + +class SandSim : public olc::PixelGameEngine +{ +public: + SandSim() + { + sAppName = "AoC Day 14 Part I"; + } + +public: + bool OnUserCreate() override + { + // Called once at the start, so create things here + return true; + } + + void updateGame(){ + if (!simulationDone){ + vi2d boardCoords=getArrayCoords(sandCoord); + if (getBoard({sandCoord.x,sandCoord.y+1})==' '){ + //Fall straight down. + sandCoord.y++; + } else + if (getBoard({sandCoord.x-1,sandCoord.y+1})==' '){ + sandCoord.x--; + sandCoord.y++; + } else + if (getBoard({sandCoord.x+1,sandCoord.y+1})==' '){ + sandCoord.x++; + sandCoord.y++; + } else { + if (!simulationDone){ + sum++; + modifyBoard(sandCoord,'.'); + sandCoord={500,0}; + } + } + } + } + + bool OnUserUpdate(float fElapsedTime) override + { + acc+=fElapsedTime; + acc2+=fElapsedTime; + if (acc>=timePerTick){ + acc-=timePerTick; + updateGame(); + } + if (acc2>=0.01){ + if (GetKey(RIGHT).bHeld){ + timePerTick=std::clamp(timePerTick+0.001f,0.f,1.f); + acc2=0; + } + if (GetKey(LEFT).bHeld){ + timePerTick=std::clamp(timePerTick-0.001f,0.f,1.f); + acc2=0; + } + } + + + //DrawStringDecal({0,0},std::to_string((int)(timePerTick*1000))+"ms"); + DrawStringDecal({1,(float)(ScreenHeight()-GetTextSize("S").y*0.4)-1},"Sand Pieces: "+std::to_string(sum),BLACK,{0.4,0.4}); + DrawStringDecal({0,(float)(ScreenHeight()-GetTextSize("S").y*0.4)},"Sand Pieces: "+std::to_string(sum),WHITE,{0.4,0.4}); + // called once per frame + for (int x = upperLeftCoords.x; x <= lowerRightCoords.x; x++){ + for (int y = upperLeftCoords.y; y <= lowerRightCoords.y; y++){ + vi2d coords=getArrayCoords({x,y}); + if (x==sandCoord.x&&y==sandCoord.y){ + Draw(coords.x, coords.y,YELLOW); + } else { + Draw(coords.x, coords.y, + (board[coords.y][coords.x]==' ')?Pixel(40,40,40): + (board[coords.y][coords.x]=='.')?DARK_YELLOW: + Pixel(255,255,255)); + } + } + } + return true; + } +}; + +int main() +{ + std::vectorconnections; + std::ifstream file("input"); + ReadState state=READX; + while (file.good()){ + std::string line; + std::getline(file,line); + std::string num1; + std::string num2; + if (line.length()>0){ + state=READX; + Connection c; + for (int i=0;ib; + for (int x=upperLeftCoords.x;x<=lowerRightCoords.x;x++){ + b.push_back(' '); + } + board.push_back(b); + } + + for(int i=0;i