Projects

100 Days of Python, Projects 15-22 #100DaysofCode

So, the first set of projects for #100DaysOfCode were all fairly simple.  Basic Text based programs that run in a terminal and run through simple loops.  The Intermediate Section starting on day 15 of the course is were things started to get quite a bit more interesting, though the basic code isn’t really all that complex yet.

There are two main topics covered during the Intermediate portion of the course, creating GUI interfaces with Turtle Graphics, and some introductory data analysis.  These two topics don’t particularly overlap, but both seem to be the primary focus here.  I’m rather enjoying the use of graphics over just terminal applications myself, though int he long run, handling CSV and other data feeds will probably be a lot more useful.

In the interest of brevity, I’m going to split the intermediate section up into a couple of posts.  I expect this to become more common as the projects become more complex and frankly, by the end, each project may even get it’s own post.

Anyway, on with the projects…  As before, all of the code is stored in this GitHub Repository.

Project 15 – The Coffee Machine Project

The actual focus for Day 15 was to set up PyCharm, and get away from using Replit for the code projects.  I’d already been using VS Code half the time anyway, but I switched over to PyCharm on this day.  A few reasons, one, it’s what the course is using, so it’s easier to follow if needed, two, it was easier to import libraries into projects than with VS Code.

The Coffee Machine project is a simple project that takes an order for a coffee, takes some coins, then spits out change and a coffee.  It doesn’t ACTUALLY do any of this physically, but if it did, that would be super impressive, manifesting physical objects with a laptop.

Project 16 – The Coffee Machine Project

Nope, you aren’t reading that wrong, the next day was the same project.  The difference was, Day 16 was also an introduction to Object Oriented Programming.  So for this project the students get some files with pre-made functions in them, and we build the same Coffee machine using these functions in an Object Oriented Programming way.

This was the first time I’ve actually learned something new in this course.  All of my code before has essentially just been “one file”.  The concept of breaking things into files and classes that do specific tasks is pretty neat, and I’ve gotten pretty good at it.  That said, I can also see where it’s still a good idea fo make a judgement of if something should be it’s own class or just be part of the base program.

There was also a brief introduction to using Pretty Tables to display data and Turtle Graphics, though the final program didn’t use any graphics.

Project 17 – Quiz Game Project

Another Object Oriented project, though instead, we make everything this time.  The questions were provided, but they are set up in a way that it’s simple to replace them with new questions from Open Trivia.  This also really helps push how useful it can be to break a program apart like this, across files.  The questions aren’t a class, they are just a dictionary you import, but they can easily be quickly replaced and the same code will run on any set of questions.

Project 18 – Hirst Painting Project

This one was a more in depth and proper look at Turtle Graphics.  Turtle is Python’s built in method for creating graphics and windows.  I’m sure there are probably others out there, but this works pretty well for a simple interface.  

The first practice was making the Turtle do some things, one of which was a pretty neat Spirograph drawer, which I may revisit in the future to make it useful.  Maybe have a pop up for how large or how many spirals to make.

The Hirst Painting project was inspired by the artist Damien Hirst, who apparently once sold some paintings consisting only of regularly placed dots.  The program takes an input image, extracts a color pallet from it, then creates a similar dot based image.  The instructor used a Hirst painting as the input, I opted to use the cover of the CHVRCHES album Every Open Eye.  It’s a pretty neat result.  It’s another that could be made more robust by prompting for an input image, how many colors to extract and how many dots to draw.

Project 19 – Turtle Racing and Etch-A-Sketch

This day was essentially two projects.  One was a simple Etch-A-Sketch style drawing program, that served as an introduction to actually controlling the Turtle with keyboard inputs.  

The second I particularly enjoyed, though it wasn’t a very complex game.  The second was Turtle Racing.  The purpose was to demonstrate how you can reuse classes to manage several variables of the same class type.  It spawns 6 turtles, you guess which will win, then they race across the screen to the finish line.

Now why is this exciting?  Waaaaaay back in the year 2000, I had a semester to kill between Community College and University, so I took a Computer Science 101 course where I learned some C++ programming.  One of the projects for that class, was a Horse Racing game, that is essentially the same concept.   The Horse Racing Game can be found here, and there is even an exe that lets you play it.  https://github.com/RamenJunkie/C_and_CPP_Code_Snippets/tree/main/CPP%20Code/Horse%20Race

Project 20 and 21 – Snake Game

The first multi day project of the course, well, ok, the Coffee Machine was SORT OF Multi Day, but not really.  This project recreates the classic game Snake.  I’m sure it existed before, but it was popularized by being included on Nokia Phones back in the 90s and early 2000s.

You control the snake, eating food to get longer, and avoiding running into the wall or yourself.  I am pretty happy with the result other than the controls feel like they could be a bit more responsive.

One thing I am proud of with the Snake Game though, I noticed in the instructor’s examples, she was constantly missing the food just barely. In her code, the food just randomly spawns. I changed the code a bit so the food always spawns on the same grid the Snake runs on, which makes it way more reliable to pick up. I also added a border, but I’m less satisfied with that because it seems Python renders things a little funny and slightly off center. I suspect that Python Turtle things are drawn from one corner of the coordinates, and not centered on the coordinates.  

Project 22 – Pong

I’m rather proud of this one, so we’ll cap this round of write ups off with it.  the Day 22 project was to recreate Pong, often cited as the “first video game”.  It’s simple, two players each have a paddle on opposite sides of the screen, the ball bounces back and forth, missing the ball grants score to the other player.

This project combines quite a few things leading up to this point from creating custom classes to taking inputs, drawing graphics. Ok, so technically the Snake Game did all of this. My real win here is doing it, entirely on my own, before watching ANY of the class videos for the day. (Ok, I may have watched the intro just to get the scope of the project, sometimes the instructor throws some curve-ball concepts in.)

Now, don’t get me wrong, in most cases, I do the coding on my own, based on what’s presented, but I usually follow along with the class and do each bit as it’s asked.  I also will occasionally “correct” my code to better align with what’s presented, not because I think my methods are wrong, but more because the instructor may later introduce a concept that needs the code to be set up a particular way.

For Pong, I did it all.  I am plenty familiar with how Pong works, I viewed the 2 minute “What we are making” first video to get the scope, then went off on my own.  And it all worked out.  Getting the ball bounce just right was the trickiest part, mostly because I started seriously over thinking the physics of it.

It really helps that I already know how to code, and have a “programmer mindset” on how to step through things.

  • Make a Paddle Class
  • Spawn a Paddle
  • Make the Paddle Move
  • Keep the Paddle within the screen constraints.
  • Spawn a second Paddle
  • Make the second paddle move with different keys
  • Draw the net
  • Make a ball
  • Make the ball move
  • Make the ball bounce withing the screen
  • Make the score board
  • Make the Scoreboard increment when the ball bounces off of left and right
  • Make the ball re-spawn when it hits left or right instead of bounce
  • Make the ball bounce off of a paddle

That’s pretty much it, the steps to making Pong.   Most of them are super easy.  I even added an additional class that would draw a “net” across the center of the screen that wasn’t required (not that anyone is grading this code).

The point was, I did it all, then watched the videos, just to see if there was any better way to do some of the things I had done.  Felt like a pretty cool accomplishment.

Git Gud at Git

Something that I’ve have tried and fail to quite get a hang of is how to use Git, and more specifically, GitHub. I’ve had a GitHub account for a good while, and at one point I “had” a ton of repositories because instead of simply following something, I would fork it to make a copy of it.  I feel like that’s not quite the proper way to go about using things.  At some point I went through and removed all of these forks and was left with only my code projects.  

I still wanted to get a better feel for the proper flow, which I probably still don’t have, and won’t really ever get until I (if ever) have the chance to actually work with a team using Git.  Most of my projects are just single upload drops.  Almost everything I do I just revise and edit locally until it works, then if I want to “show it off” I scrub out any static IPs, usernames, and passwords, and upload it to a repository.  I suppose there really isn’t anything inherently wrong with this method.  I have, more recently been pushing myself to use Visual Studio Code (VSCode) lately and a few other code apps, and thus I’ve been pushing some repositories with those various program’s interfaces.  

I did get to go through the proper, Fork, Branch, Edit, Push process a few times while doing some lessons through Twilioquest, and a follow up afterwards.  

Still, I think my main take away is… it doesn’t really matter how the code gets there.   Especially for single person projects.  I don’t really have any overall “goal” here.  It feels like the common goal is to try to get a programming job, but I am not really sure I would want that, at least not anytime soon.  I mostly just want to show off some mediocre code to the nobody who would look at it.  

Speaking of “showing off”, I also found that the little games I had made last year with Microsoft’s MakeCode Arcade are all browser based, so I set up a little page to specifically show off Code Projects.  Right now, it’s all just MakeCode games, but I plan to add more if it seems like a good idea.

Another motivator for this push to tidy up my GitHub is it’s an excuse to practice using Markdown more.  Like Git, it feels like a skill I should have practiced more much sooner than now.  The main page for each repository is just a specific Markdown file, so having more repositories means I can make many pages of different types.  I’ve also started using Markdown to draft out blog posts as well as for my archive of old writings.

So anyway, if you want to see some random bits of code, some from 20+ years ago, feel free to poke around my growing pile of repositories.   Actual Repositories, where I did some level of work on them.

Lastly, this whole post is annoying full of things I wanted to blog about but have not.  Markdown, MakeCode, Twilioquest, my huge writing archive, to name a few.

Project – Puzzle Board

I wanted to take a brief moment to talk about a fairly simple project I’ve done making a few Puzzle Boards. Though at the moment, wood prices are kind of nutty, so it’s a good project to do later. I’ve made something like 4 or 5 of these now in various sizes, for use by my family both at my house and extended family. They could be a bit fancier as well but the same concept applies.

Basically, we do puzzles as a group sometimes. Often these puzzles take several days to complete, which means they are often in the way. We also have cats, who like to destroy things because they are cats. This is where the Puzzle Board comes in, it’s a simple flat board with an edge and a cover, to protect the puzzle while it’s being worked on.

It’s extremely simple to make, though it’s best if you have a decent saw and some clamps. For these boards, we bought some medium sized sheets of thin wood. The size depends on how large you want the board to be, the one pictures was likely roughly a 4′ x 4′ sheet. Selecting the type of wood is fairly important and it may cost a bit more than a basic sheet. A lot of flooring or plywood (4′ x 8′ sheets) is too thick, it will make the thing super heavy. Some of the cheaper wood though is too flimsy, it needs to be reasonably stiff, tough the sides will add to the stiffness.

You also need some sort of trim piece. I used 3/4″ pre finished Quarter Round, but you could use something fancier. How much depends on the length of the sides of your board, but unless you are making something absolutely massive, 1-2 8 foot pieces should work. for smaller lap sized boards you’d only need one.

The top cover board is roughly 2 inches smaller than the bottom board, to account for the edge size. So, for example, if you had a 4′ x 4′ square of flat board, you would cut it in two just over half way at 25″ wide. Four feet is 48 inches, half would be 24 inches. Cutting at 25 inches gives you a piece 25 inches wide and a piece 23 inches wide. the 23 inch wide piece will need a couple of inches trimmed off one end, but then it should sit just inside the 25 inch wide base.

For the edges, trim them with a 45 degree angle so the outer side is the same length as the base of the puzzle board. Int he example above, these would be 25 inches and 48 inches, with the 45 degree angles all pointing “in”. It’s best to visualize each piece before cutting and how it will lay, because it’s easy to accidentally cut it incorrectly and then the corners won’t line up.

Once the base and sides are cut, you can stain or paint the base and top (and sides if they are not pre finished) to the desired color. It may also be a good idea to lay things out just to make sure the top board fits and doesn’t need trimmed down any as well. If you are really ambitious you could also potentially attach some sort of mat or fabric to the base piece at this point as well.

Next use some wood glue and glue the sides on carefully, keeping them as straight as you can along the sides of the base piece. Use clamps to hold the side pieces in place as they dry to avoid things coming loose. I also would recommend using an old sock or rag between the clamp and wood, to help keep the clamp for marring the finish. All four sides can be done at once, or a few at a time, depending on how many clamps are available. If you are careful you could also simply place everything on a flat surface (like a table or the ground) and balance something heavy like some large books on top if no clamps are available. Just take care that things don’t slide around. If you re doing this, it may be helpful to use some scrap pieces so the books (or whatever) sit “flat” instead of at an angle (where they will be applying some small sideways force).

Once every thing is dry, that’s it. It’s done. Construct your puzzle on the base, when you’re taking a break, cover it with the cover piece. When not in use you can store the cover in the frame and store it wherever you have room. The basic concept can easily be resized as well. I’ve made smaller lap sized versions of these as well, for single person use in a chair.

Basement – The LEGO Table

The LEGO Table space in the basement was, for the longest time, the catch all space for anything extra. It was always sort of the last space to get finished up in the basement, though it’s always going to be an ongoing project. A lot of the clean up in this space involved cleaning up other areas first. The initial set up involved a counter sort of unit that I had made years ago, that previously was in my wife’s craft room at the old house. She didn’t need it in the new house, so I inherited it and it was a place to land my LEGO Modulars.

Under was used for storage for most of my other LEGO sets, since I didn’t really have a place to put them yet. They’ve still been in boxes for a few years,

At some point we ended up with some pretty hefty book cases second hand that we were using upstairs for a while, but they were no longer needed. Originally these book cases were going to be used in the basement but they were maybe 4″ too tall, so they ended up in the upstairs space. Since they were available again, I opted to go ahead and trim them down a bit so they would fit in the basement.

This process amounted to marking a line around the top end of the book case, using a circular saw to chop all the way around on the line, then removing the top board from the chopped off scrap bit, and reattaching it to the top of the book case. I also put a fresh new coat of paint on the book cases and shelves, as well as cut a few additional shelves.

I originally wasn’t sure where these shelves would end up in the basement, but after some measuring, I decided they would work on either side of the LEGO table. This meant turning the LEGO table itself 90 degrees so it sticks out in the room. I also bought some more pre finished shelving boards, like the original table was constructed from, and build what amounted to, a second table, then strapped them together with some braces to double the available surface area.

This gave me a lot more room to work with for the LEGO city, as well as shelving on either side to display and store additional sets. Which really cleaned out some of the boxes I had stored under the table. The next part of my plan was to add some additional shelving under the table for storage, which lead me to another idea. Why just add shelving on the sides, when it would be fairly easy to add shelving to the end, for a bit more display space. It also gets rid of this ugly as hell blank white surface.

For this process, I separated the two end legs, and shuffled them back the depth of a narrower (8″ I believe) shelf. Then reattached them. I then cut and assembles a smaller shelf unit and attached it to the end of the LEGO table. On the one side, I also adjusted the secondary leg back, as well as the curtain that was there, so I could keep the trash can under the table and out of view as it was. On the opposite side, I simply removed the extra leg.

Finally, for now, I cut some more 24″ pre finished shelf boards and attached them using L braces, inside the length of the table, on both sides, so the mess inside could become a much more organized, and useful mess. I also picked up an LED shop light that I hung over the length of the table, because this particular corner of the basement is a little dark. It lights up the entire space much better than I had expected it to.

In case you noticed, the Return of the Jedi poster fell off the wall at one point. I want to buy better frames and some fresh posters anyway (these three are like 25 years old now), so I simply hadn’t replaced it on the wall yet.

The next phase of this project is to actually start sorting down the extra LEGO into bins and drawers that will go under the table. I already started this a bit with some IKEA bins but I am going to need more bins than I have and it’s slow going since right now all of the LEGO is just in a giant plastic bin.

Basement – Sliding Door Project

So, I’ve been doing a fair number of projects, but writing about them isn’t one of those projects. Some of it has been improving the basement a bit. Part of the slowness of the basement work is because it occasionally floods a bit. Not really “standing in water” flooding, but “there is a puddle that keeps coming” flooding.

It’s annoying, but I’ve been working to fix it. The house originally didn’t have any downspouts on the gutters, I added those. I’ve added extensions to the gutters to direct water away. I added a new downspout near the area where the water seems to come from to help direct it away more. I cut out some drywall in the underside storage area and pulled the bottom step off of the stairs to fill in some ugly crack-ish spots in the area where the water comes from. At this point, I am waiting for more heavy rain to see if some of this has made any real difference. So far the cement fill seems to have done the best. It’s tricky to describe but basically, the water still came in, but it came in waaaay less and in a slightly different place. So I’m getting there.

I’m not really here to discuss the flooding though. It has affected some decisions on how to make the basement nicer, like I am not going to add Drywall walls like I wanted to. And no carpet, though that was out anyway, because the cats are assholes (We also replaced all of the upstairs carpet with vinyl plank flooring).

One fairly simple project was adding a door. In this case, I put in a sliding barn door style door. My wife wanted to put in a real door but I wasn’t keen on that since there isn’t really a good place for it to open to. The door itself had a couple of motivations behind it.

One, the basement is divided into two halves. One half is semi finished and “nicer” and it’s where I keep my computer and collection of stuff and there is a TV and couch with game consoles and my son has a corner that is his bedroom area when he is around. The other half is under the “original house”, it’s rough, the ceilings are a little low, and there is more duct work and such hanging from the ceiling. We use it for storing all sorts of stuff. It’s really great for that.

The “underside” half is ugly though. I wanted the door to be able to block it out, mostly for aesthetic reasons.

The other purpose of the door is to be able to lock the cats in the basement when we have guests over. My parents and my wife’s parents are all allergic to the cats. We lock some of them in bedrooms, we also lock some of them in the small sunroom/office area upstairs. Sometimes we would lock them in the basement by blocking the stairs with a giant cork board we have that doesn’t really have a home.

Now, we can use the door. It slides between the two openings, stairs and underside storage to block off either one.

One concern was air flow from the storage area, so the door can also be positioned in the middle, which is where it usually sits, so air can flow in and out both sides. It also lifts off easily if I needed to remove it.

The door itself isn’t anything complicated. I could have built a door but I opted to just buy one, though the door was pretty pricey since it needed to be extra wide. The roller kit is a low profile barn door kit, easy enough to install and it nestles up into the floor joist ceiling. The tricky part was that the floor joist didn’t reach the edge of the opening, so I had to screw a couple of 2×4 stand offs to the floor joist to get the door to sit int he proper place. This also meant adding some 2×4 lifts under the stand off to support the immense weight of the door.

I also ended up with an issue of the door rolling slightly. I am not sure if it’s the house or if the rail is a little off (probably a little of both) but the door slides towards the stairs on it’s own. Not very quickly, but it does move.

I solved this with magnets, at the suggestion of my uncle. I didn’t really want an ugly latch that would also potentially end up in the way of the door sliding or people walking. I bought some block magnets and some double sided Gorilla tape (I originally used Command Strips but they were too weak). I stuck a larger magnet to the wall, then two smaller magnets on one end and the center of the door. This allows the door to hold it’s position when blocking the stairs or when positioned halfway.

This project isn’t quite done. I may also add an L bracket of some kind in the center of the door, to hold the door from being leaned outwards, and I want to add a roller on the backside to the whole action is smoother. the way things are, if the cats get determined, they can push the door enough to get it to release from the magnet and escape from the basement.

I also need to adjust that network cable because it’s kind of just there and ugly.