diff --git a/C++ProjectTemplate b/C++ProjectTemplate index 66bd240..46bcc8c 100755 Binary files a/C++ProjectTemplate and b/C++ProjectTemplate differ diff --git a/main.cpp b/main.cpp index c573d4d..6b3eedd 100644 --- a/main.cpp +++ b/main.cpp @@ -8,6 +8,12 @@ using namespace olc; vi2d upperLeftCoords={500,0}; vi2d lowerRightCoords={500,0}; std::vector>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; @@ -23,11 +29,100 @@ 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; @@ -75,6 +170,16 @@ int main() }break; } } + int numb1=std::atoi(num1.c_str()); + int numb2=std::atoi(num2.c_str()); + c.coords.push_back({numb1,numb2}); + upperLeftCoords.x=std::min(numb1,upperLeftCoords.x); + upperLeftCoords.y=std::min(numb2,upperLeftCoords.y); + lowerRightCoords.x=std::max(numb1,lowerRightCoords.x); + lowerRightCoords.y=std::max(numb2,lowerRightCoords.y); + std::cout<<"read "< 498,6 -> 496,6 +503,4 -> 502,4 -> 502,9 -> 494,9 \ No newline at end of file