generated from sigonasr2/CPlusPlusProjectTemplate
parent
8d8db664f5
commit
cc45154afa
Binary file not shown.
@ -0,0 +1,223 @@ |
||||
#define OLC_PGE_APPLICATION |
||||
#include "pixelGameEngine.h" |
||||
#include "olcutils.h" |
||||
|
||||
using namespace olc; |
||||
|
||||
|
||||
vi2d upperLeftCoords={500,0}; |
||||
vi2d lowerRightCoords={500,0}; |
||||
std::vector<std::vector<char>>board; |
||||
int sum=0; |
||||
float timePerTick=0.03; |
||||
float acc=0; |
||||
float acc2=0; |
||||
vi2d sandCoord={500,0}; |
||||
bool simulationDone=false; |
||||
|
||||
struct Connection{ |
||||
std::vector<vi2d>coords; |
||||
}; |
||||
|
||||
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::vector<Connection>connections; |
||||
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;i<line.length();i++){ |
||||
switch (state){ |
||||
case READX:{ |
||||
if (line[i]==','){ |
||||
state=READY; |
||||
break; |
||||
} |
||||
num1+=line[i]; |
||||
}break; |
||||
case READY:{ |
||||
if (line[i]==' '){ |
||||
state=WAIT; |
||||
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 "<<num1<<"//"<<num2<<std::endl; |
||||
num1=""; |
||||
num2=""; |
||||
break; |
||||
} |
||||
num2+=line[i]; |
||||
}break; |
||||
case WAIT:{ |
||||
if (line[i]==' '){ |
||||
state=READX; |
||||
break; |
||||
} |
||||
}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 "<<num1<<"//"<<num2<<std::endl; |
||||
num1=""; |
||||
num2=""; |
||||
connections.push_back(c); |
||||
} |
||||
std::cout<<line<<std::endl; |
||||
} |
||||
std::cout<<"Upper-Left Bounds: "<<upperLeftCoords<<std::endl; |
||||
std::cout<<"Lower-Right Bounds: "<<lowerRightCoords<<std::endl; |
||||
|
||||
|
||||
|
||||
for (int y=upperLeftCoords.y;y<=lowerRightCoords.y;y++){ |
||||
std::vector<char>b; |
||||
for (int x=upperLeftCoords.x;x<=lowerRightCoords.x;x++){ |
||||
b.push_back(' '); |
||||
} |
||||
board.push_back(b); |
||||
} |
||||
|
||||
for(int i=0;i<connections.size();i++){ |
||||
Connection&c=connections[i]; |
||||
vi2d&startPos=c.coords[0]; |
||||
for (int j=1;j<c.coords.size();j++){ |
||||
vi2d&endPos=c.coords[j]; |
||||
modifyBoard(startPos,'#'); |
||||
while (startPos!=endPos){ |
||||
if (startPos.x!=endPos.x){ |
||||
startPos.x+=(endPos.x-startPos.x)/std::abs(startPos.x-endPos.x); |
||||
} |
||||
if (startPos.y!=endPos.y){ |
||||
startPos.y+=(endPos.y-startPos.y)/std::abs(startPos.y-endPos.y); |
||||
} |
||||
modifyBoard(startPos,'#'); |
||||
} |
||||
} |
||||
} |
||||
|
||||
SandSim demo; |
||||
if (demo.Construct(54, 170, 8, 8)) |
||||
demo.Start(); |
||||
|
||||
return 0; |
||||
} |
Loading…
Reference in new issue