#define OLC_PGE_APPLICATION #include "pixelGameEngine.h" #include "olcutils.h" 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; }; 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