Link Bar

Home | Games | Programming | Tutorials | Donate | Legal (These are mostly empty right now. Placeholders!)

warning code

This website contains adult content.

Tuesday, April 17, 2012

Oops!

Came down with a bad case of Someone Is Wrong on the Internet last night.  I'll figure something out in the next day or two. Pardon our dust, and all that.

EDIT FOR DAY 48:  Nope, I got sucked into another project.  Unrelated, I won't be writing about it here.  But it took up all my time.  I'm venturing forth unto the Frigid Northlands tomorrow morning to see my kid brother play the Tin Man, though, so I should have some time to get something together by Friday.  I've just been busy with other things (I'm not accustomed to devoting so much time to a single hobby with such a narrow focus... jeez...).  If nothing else, I'll crank out another text-based whatever, just to keep myself in practice.  Peace!

Saturday, April 14, 2012

Day 45: Ennui conquered... need for sleep still a worthy opponent...

Fell asleep at my desk working on... well, I was doodling, but I was doodling a way to algorithmically build cities.  It works (at least on paper), and is nice & flexible, so it's all good.  Now I just need... a world to put it in, and to code it all out.

Reconnected with an old hobby of mine, that did wonders to re-center myself and I'm feeling much better now.  But aside from these doodles, I don't have much to show for it.  Still, doing something, even if I'm not doing much... due for a breakthrough any day now, I swears it...

Monday, April 9, 2012

Day 41: Ennui strikes. :|

Fuck, you guys.  (That comma is so important.  I'm complaining, not lashing out at you, Dear Readers.)

Yesterday, all the way home from work, I was like, "I'll get those programs Zach told me about, figure out how to open up those files, read through 'em until I see how they work, then apply some of that to my own thing.  Ooh, then maybe I'll play some vidjagames, if I've still got time, 'cuz I'm off tomorrow."  The whole way home, I was fucking excited to get home and start doing things.

Got home, opened up my 'puter, and... shit.  Shitty, shitty shit-shit.  Nothing was wrong with my computer, or anything else in the world, I just suddenly came down with Maximum Strength Not-Fucking-Around ennui.  For those who aren't savvy, ennui is a French word that means "boredom" - but it's a particularly French flavor of boredom.

So I thought, "Fuggit, I'll play some games first, then see if that helps."  Nope!  Phoned it in for a little bit, then didn't care any more.  Poked around on the internet, didn't care about anything.  Found some life-affirming quotes and phrases on the "We Fucking Love Atheism" page on Facebook, brought a smile to my face, but the ennui didn't go away.  Made dinner, it tasted like cardboard.  Went to bed the Hell-ass early.

Woke up after twelve hours of sleep, it was my day off, thought I'd be full of energy.  Nope!  Still full of ennui. Got Notepad++, and figured out how to open those files Zach sent me - so I'm at least in a better position than I was on Friday.  Tried reading it, but the voice in my head kept shouting - like, seriously shouting - "This is stupid!  This is so stupid!  Who cares about this stupid, stupid shit?  Nobody!  Fuck this!" over and over at me.  Took a bath, and somehow the water went from luke-warm to burning without warming me.  Made breakfast and had tea - breakfast also tasted like cardboard, despite carefully planned spices, and tea made me want a nap.  Laid down for a nap - but no!  Stared at the ceiling for four hours.

This is worse than Existential Crisis and Dragons.
Seriously, The Internet.  I think I lost my dice in the move, so I can't even roll my way out of this.  I mean, I don't even feel like drinking.  Don't wanna watch A Game of Thrones.  Don't wanna eat ice cream, for fear that red velvet cake will also taste like cardboard.

I am angry at the world for a whole host of reasons, though - reasons that predate my birth (Hell, reasons that predate the fucking Industrial Revolution) - so I do feel like breaking things.  But I know in my heart of hearts that breaking things won't fix those problems, and will really just inconvenience someone else, which will make me feel worse.  Shit, I even tried looking up cures for ennui on the internet - I found religion, spending money, and murder; all things I can't do.

Fuggit.  I haven't spent a day staring at the air for a while.  I guess I just gotta ride this out.  And anyway, I got Zach's files open in Notepad++, so that's technically progress (stupid, tiny, insignificant progress is still progress).  I'm gonna go sit on the porch now and think about feelings.  Y'all have a better one.

Friday, April 6, 2012

Day 40: Frustration!

Zach gave me some old files of his from which to learn some coding, but I'm having trouble opening them due to version conflicts an' shit.  The message "the file could not be opened" is really starting to grate, now that I've seen it like forty times.  After more than two hours of arguing with my computer over whether or not a file can be opened with a program, I'm just fucking sick of this.  I quit.

For tonight.

I'll take another crack at it over the weekend (I only work half a day on Sunday), and should have some coding done for Monday's post.  But right now, this feels less like a hobby and more like Purgatory, so I'm just going to set it aside for the moment.  Y'all have a great weekend!

Monday, April 2, 2012

Day 36: A Matter of Scale

Missed Friday.  That's two in 33, but still in general A territory overall.

I haven't been working on Hula or Solitaire, so I guess I may as well talk about what I have been working on:  drawing maps an' stuff.

Here's the general schematic of how the world breaks down:
The "flow" is basically from right to left.
Everything's gonna be represented in terms of cards (and tiles and chips, which are just types of cards).  The world will be built, Carcassone-style, out of modular tiles, not unlike RPGtoolkit's boards, but of varying sizes for the various levels of detail at which they will be dealt with.  Here are some of the chips and other tiles that can be placed on land tile cards:
Those houses are roughly 1/4 of a mile on a side.
I guess we're officially dealing in serious real estate, eh?

This is a closeup of the tile diagram in the center of that big wide image at top:
One of these tiles is 3 miles on a side, with a central feature occupying 2.25 square miles.
Hopefully this will give me enough useful levels of detail without requiring ridiculous loading screens.  But I guess we'll jump off that bridge when we get to it.

I drew this area of the map to scale on a magnetic toy.  Such a world would be about a quarter the cirucmference of the real world.  I figure if Minecraft can go up to eight times the surface area of the actual world, so this should be a manageable world size, I think.

This is going to be Noob Island:
Noob Island pictured on left Side, inset of the Northern Wastes.
I'm going to figure out some way, when this is all going, to make it multiplayer.  I know that Hanachi makes long-distance LAN-like playing possible, so this is still in the realm of things I can do.  But that's a bit farther down the line.

I also drew a general body plan for sprite maps:
Generic body plan with optional features!
This is farther down the line still, but it'll be a lot of work to implement, so I figure there's no harm in getting some work done in advance.

I also have stuff about stats & shit, but it's a lot of writing and not fun to look at.  However, I was able to run a fight with just a deck of playing cards, so I think that bodes well for my combat mechanics.

Tuesday, March 27, 2012

Day 31.5: Employment!

I didn't want to say anything about this, not out of some irrational fear of jinxing it, but for the very practical and rational reason that I didn't want to risk saying something foolish and thereby screwing it up... but I am employed now!  In accordance with the prophecy, I shall be reducing my output to Mondays and Fridays.  So the next post will be Day 35, this coming Friday.  Hooray for gainful employment!

Monday, March 26, 2012

Day 31: More learning, more coding

Still working on Solitaire.  Also realized just now that I completely forgot to update on Friday.  Whoops!  My best friend came down from out of town to hang out, and it slipped my mind until just now.  Still, losing out on one day in thirty isn't exactly terrible...

Solitaire still isn't ready, though.  I've beefed up the header some, and have read further in a few of the tutorials, but it's still not working.  So, more on that as it develops.  Later!

Friday, March 23, 2012

Day 29: Solitaire-ish

Nearing 300 lines of code in Solitaire.  Mainly for how the interface is going to work out, since I haven't programmed card images or anything.  But it's a proof of concept!  I can make text-based Solitaire, dammit!

Just see if I don't...

You start the game in a room with a dealer, and the dealer can shuffle the cards, and that's about it right now.  But soon... soon... I shall be able to have the dealer deal the cards so that I can play the game.

And by extension, so shall you be.

Wednesday, March 21, 2012

Day 28: But I am le tired...

I did Google-maps'ed it, and between walking South to my job offer and North to the testing facility, I walked 16 miles today.  I got home and was beat and laid down for a nap, then just woke up.

Well, obviously I needed the sleep, and I'm going to be up for at least a couple hours, but it's already past midnight and I'm just poking around in Solitaire anyway.  So this is here for "something up around midnight," there should be something more substantial tomorrow evening.

Day 27.5: Two steps back...

Internet went down last night.  I tried to access the blog around 8, and that's when I first noticed it was down.  At 10, it was still down, so I went to sleep... because I had a job interview this morning!  (Cue excitement and applause!)  Just got back and the 'net is back up, now I have to go do the drug test.

You guys didn't miss much, honestly.  More reading, on how classes are made up of other classes, and can inherit things from parent classes, and so forth.  I'm learning (slowly) how things can be arranged into gangs of four, and how two-dimensional arrays can be "faked' from one-dimensional arrays, and it's all very fascinating and giving me lots of ideas.  But I'm having trouble scaling it down to the point where I can actually write the code; so once I've got that hacked, I'll be able to explode it up from there.

So... about that code-writing... the thing I wanted to be doing on day 26 (Monday)...

So, let's see... I told myself I'd have to start over at least six times.  If I work on a Solitaire game now to figure out objects, that will be my fourth time starting over (the RPG Toolkit world, Noob Game, Hula, and now this Solitaire game).  This is within acceptable bounds.  And then I can put objects in Hula.  And then I will know how I should have put them into Noob Game.  Maybe I'll have to re-do that, as well... Noob Game 2.0.  Then once I've got Noob Game's objects up and running, I think that might be at least the skeletal structure of an engine... so if Noob Game:  Objects is now the skeleton of an engine (and my fifth time starting over), then the game I was making with RPG Toolkit will be the sixth time starting over when I give it its own skeletal engine from scratch.  Except now I will know WTF I am doing.

OK, this is all within tolerance so far.  I'm leaving now to take the drug test, but it's across town and I'm walking, so that will eat up my time well into the evening.  When I get back, it will be time to work on Solitaire by coding objects for it.  If I don't get anything ready before I go to bed, I'll at least post to say so (giving at least the appearance of maintaining a schedule, and hey, I'll at least have learned a thing or two at any rate).  That gives me Thursday to also work on Solitaire, and Friday too, and then we'll see what's up by the weekend (hopefully I'll be scheduled for the orientation next Tuesday!).

Tuesday, March 20, 2012

Day 26: Object-Oriented Programming

So I pulled up a bunch of stuff to read on OOP over the weekend.  I started with Wikipedia's page on object-oriented programming, and when I got to methods, I thought, "Gee, this looks important.  Wonder what it is?"  New tab.  That article fairly swiftly mentions classes, so that meant another new tab.  And somewhere in there was a mention of UML, which term I did not recognize, so I checked it out for good measure.

Hmm... with the other pages I've got pulled up (introductory lessons for C++ from gillius.org, tenouk.com, and desy.de which looked interesting, then this from cplusplus.com and that from intap.net), this was starting to look suspiciously like a wiki walk.  I started with classes and read it all the way through, then back up to methods and finally into OOP generally.  Whuff, that's already quite a bit of reading.

What's more, it's informationally dense, too.  Check this out:

In a language that supports inheritance, an abstract class, or abstract base class (ABC), is a class that cannot be instantiated for it is either labelled as abstract or it simply specifies abstract methods (or virtual methods). Abstract classes specify virtual methods via signatures, that are to be implemented by direct or indirect descendents of the abstract class. Before a class derived, directly or indirectly, from an abstract class can be instantiated, all abstract methods of its parent classes must be implemented by some class in the derivation chain.
 - Wikipedia on abstract classes


Now, I had to read that a second time to really get it.  But now that I do, good Lord, is that last sentence important to remember!  And the whole thing is like this, pretty much, for a beginner like me.


I got to Chapter 3 in the tutorial at gillius.org and was referred to a page with information on dynamic memory allocation (covered way back in reg'lar C++, and now taken for granted in object-oriented C++) for not knowing about the "new" and "delete" commands.


And after more reading like this, it's becoming clear to me that OOP is much more complicated than I thought it would be (...surprise?).  I guess I'm back into a reading phase, then, since I'm not really sure quite how to start coding my objects.  And by "start," I mean how I want things to be organized in the grand scheme of things so that I know what classes I'll have and what individual objects will belong to what classes and so on, all of which it looks like I'll need to plan out in some manner of detail beforehand - oh, gosh, this means I need a Big Boy design document.  OK, so I guess that's the next step before I get objects into Hula, and then I can worry about instantiating the items in the game once I've got some classes & such described from which to draw when representing the game world.  Well, let's just start with one, like in Noob Game, and then blow it up to two, and then many, and we'll see where that takes me.


Oi, I love reading and learning and filling my brain with exciting new things... but this is tough sometimes!  Zach, things are certainly "spiralling out of control naturally," just like you said they would.

Friday, March 16, 2012

Day 25: TECS Project 2, and Arguing on the Internet

Arguing on the internet is like competing in the Special Olympics:  it doesn't matter who wins, you're still retarded.
 - Internet Wisdom


I was playing an online game last night, when I got into quite the disagreement with another guy in my group.  I casually mentioned that I was teaching myself how to program, and he offered his help as a professional programmer, which was very nice of him to do.  He suggested I dive right into OOP, and asked what I was doing now, and I said I was learning some C++ with the help of a friend (Zach) and going through TECS to learn how computers work from the bottom up.  Then came that fateful moment where someone says something which maybe they don't really mean, but then they stick to their guns and everything blows up in everyone's face.

He said, "No, you should start with a top-down approach.  Top-down is always better than bottom-up."

I added emphasis to "always," because that was the one word that stuck in my craw.  I am a philosopher, and I know from my philosophical training that the word "always" should almost always be preceded by the word "almost."  So I said, "Not necessarily."  To which he responded, "Yes, necessarily.  I do this for a living, I know what I'm talking about."

Oh, boy.

So I offered to cook him up an example of a situation where you'd want a bottom-up approach instead of a top-down one, and he was receptive.  I went on to say that if you wanted to simulate an ecosystem but don't know how it works, you should start at the bottom and tweak the parts until the high-level interactions look acceptably like what you see in reality.  I thought this would be a knock-down argument, since ecosystems do in fact emerge from the bottom up and not from the top down, and designing an ecosystem from the top down requires precisely the sort of understanding which the example stipulates to be lacking.  He replied that no, a better way would be to simply simulate all the high-level interactions without worrying about the bottom-up organization, because the internal structure doesn't matter so long as the output is correct (and fair play to him, that latter clause is true).  Having sprung my trap, I pointed out that this presupposes exactly the understanding which is missing from the example - in other words, if you could design the simulation accurately from the top down, then you've already got what the simulation is for.

It gets better.

Then he says, "Well, that's just one specific example.  In general, the top-down approach is better for achieving professional results."

I replied, "Wait, you just changed the subject!  You said that top-down is always better than bottom-up, which means that 'just one specific example' of bottom-up being better is all that's needed to show that top-down is not always better."

"Fine, but in a professional environment, you've still got to do things from the top down."

"But I'm not doing this in a professional environment!  I'm doing this as a hobby."

"Top-down gets results faster, though.  Working bottom-up usually engages you in a bunch of aimless wandering that doesn't get anything done."

We then discussed the virtues of curiosity-driven exploration and the importance of enjoying one's work, and it was all very edifying.  There was a happy ending, too.  I asked him if he had any hobbies (he does:  writing), and then asked him how many hours a week he spends working with his agent and trying to get published (answer:  zero).  Then I told him that he'll never get a good publishing deal without an agent to help him tweak his book for maximum marketability and so he's never going to make it as a professional writer with his current approach - and said that that's how he sounded to me during the last ten minutes.  Then he understood where I was coming from, and now we're friends again.

Jeez, some people (and in case it wasn't clear from my opening quotation, yes, I know that I am some people, too).

In Other News:  I built the half adder, full adder, 16-bit adder, and incrementer.  Oddly, the incrementer gave me the most trouble of the four, but then I had a flash of inspiration and facepalmed at the obviousness of the solution.  I still can't hack the ALU, though, and apparently that's the centerpiece of the virtual machine I'll eventually be building.  Moreover, it's not like I tried a bunch of different things and just kept failing; I don't even know where to start.  My instinct is that I'm intimidated by it at some level, probably because of all the different pins and the fact that it's just a black box on the inside and I need to specify everything that goes into the box.  But in the greater scheme of things, knowing how to build an ALU is tangential to my long-term goals at best, so I'm skipping it and moving on for now.  I gave it an honest effort (I re-read the chapter, and I'm a little clearer on what it's supposed to do, but no clearer at all on how I need to get it to do that), and maybe I'll come back to it after the next chapter or two and see if I have any epiphanies.  And anyway, I'm repeatedly finding myself thinking, "This would be so much easier if I could just write the function of the chip in C++ instead of the HDL," which A) means that I'm learning to think like a programmer, if nothing else, and B) shows that I still have a ways to go, because I wanted to use software to tell the hardware how to do what it does on its own.  But hey, at least I realized that.

OK, so that's week five down.  Over the weekend, I'll be reading up on OOP and classes and such, and Monday should bring another substantial update to Hula.  Y'all have a good one!

Thursday, March 15, 2012

Day 24: "Hula" Beta Update

New and Improved Hula beta here.  Source code below the jump.

Notes:
  • Fixed levels, thanks to Zach's excellent suggestion.  Now working as intended.
  • Added NPC "The Janitor."  Still no NPCs in the world, though.
  • Finished the introduction blurb, smoothed the transition into the game proper.
  • Refined the "consult device" mechanic; still not quite sure how I want this to work, but it's backburner material for now.
  • Put fish in the world for the player to mine, one per location (except inside the CoW or the Inner Hoop).
  • Added a "hunger" stat:  each action adds 1 hunger, player receives suggestions to eat at 90+ hunger, loses health at 101+ hunger (eating a fish restores all health and removes all hunger).
  • Sneaking through the CoW's armory now provides ten bullets to the player.  I'll make it a one-time thing later, but I'll need infinity bullets for future playtesting.
  • There is now an empty pistol at the starting screen.
  • Note to self:  not quite sure if cover is working like I want it to (even in the rudimentary build I've got at the moment).  Probably not.  Display auxiliary counters to check.
Zach's been encouraging me to look into object-oriented programming, and I've been putting it off because I have so many good ideas for my simple conditionals and so I wanted to just run with them while the creative juices were flowing.  But I am now thoroughly convinced that OOP will make NPCs way the Hell easier to handle, as I've been thinking about just exactly how to handle them without it, and it seems like a terrible exploding brute force problem.  So I'm going to read up on that over the weekend, and we'll see what I've got by Monday.

OK, that's all for now.  Tomorrow:  back to project 2 in TECS.  Ciao!

Wednesday, March 14, 2012

Day 23: TECS, Project 2

Holy carp, you guys.  Getting a computer to do math is hard.

Project 2 looks pretty simple at the outset:  build a half-adder (which I get), a full adder (which I also get), an adder (which I kinda get), an incrementer (which I so get that I almost forgot about it), and an arithmetic logic unit (which I don't get at all).  Something about that ALU is just irreducibly magical to me right now, and I'm not quite certain why.

I gave up and went to sleep, resolving to get up in the morning and take another crack at it.  I had hoped that the magic would go away, perhaps by more magic, but no dice.  I'm beating my head against the wall right now on this, which means it's time to do something else and then come back to this later.  If this were one class among many, I'd be tempted to "look for outside inspiration" (i.e. cheat); but I am under no such constraints, and that would simply defeat the purpose of the intellectual exercise (i.e. to learn).  So I'm calling it quits for now.

After today's errands, I'm going to take another pass at Hula and update the beta (assuming I don't just break it over and over again).  So that's something for day 24, and on day 25 I'll take another crack at project 2 after I've had some time off to let my failures sink in and learn some lessons from them.  OK, plan is planned, now execution just needs to be executed.

Tuesday, March 13, 2012

Day 22: "Hula" Open-Source Beta!

I got the "help" button working.  Turns out, back when I had thrown a "}" in at the end (because one was missing), I should have put it before the Help subroutine, because that's where it was missing from.  But I put it in after the Help subroutine, which subordinated it to the Inventory subroutine.  Dammit.

I don't want to admit how long it took me to figure that out.

I also think I've figured out what's causing playerLevel to start out at minus two billion, even though I know by math that it's supposed to start out at zero.  See, the exact player level on a new game is -2,147,483,648.  Recognize that number?  Yup, it's -231, the lowest number that can be displayed in 32-bit number-crunching.  I wanted "XP to next level" to always be twice what it was the last level - which is given by the function:
[LEVEL] = log2(([XP] + 1) / 2) +1
At zero XP, then, you're level zero, because log2 of 1/2 is -1 (and then add one to make it zero).  Take one action, and BAM, you're level one.  Two more actions and you're level two, and so on and so forth.  For some reason, though - probably because of how the logarithm function works under the hood - it's making it (for all intents and purposes) negative infinity.  This could be caused by the fact that I'm calculating the binary logarithm as "log2n = log10n / log102," which is mathematically correct but might be causing the 'puter to throw a fit.  Hmm.

Anyway, that's a headache for another day.  Here's the Hula beta, source code below the jump.  Also, I learned how to make the binary logarithm function here on Stack Overflow, since Microsoft decided to excise it from cmath.  Because who would ever want to take a binary logarithm of something?  Huge dorks and lesser dweebs1, that's who.

Notes:
1.  I swear by the stars that I got this from Strong Bad, but I can't find it right now.

Monday, March 12, 2012

Day 21: "Hula" in development!

...and already in tiny Development Hell!

Alert Readers and long-time fans will recall that, like, three weeks ago, I came up with a cockamamie scheme to make a simple game with the little bit of knowledge that I had at the time.  Of course, like all my ideas, it worked perfectly in my head and then immediately went to Hell as soon as I started trying to make it happen.  Well, now that Noob Game is launched and complete, I figured I could just make a Big Boy Hula (to Noob Game's Playskool) and thereby force myself to make legit versions of all the things I conveniently worked around in Noob Game.  For example, rather than having exactly one NPC per area and governing all aspects of NPC interaction based on player location, I will need to figure out a way to make "real" NPCs which can be present in arbitrary quantities.

I'm some 300-odd lines of code in, after drawing up a little design document over the weekend and coding like one of those typewriter monkeys you hear about in misunderstandings of probability and the infinite.  I've got a game world, experience mostly works (but you start at level minus two billion, which should be zero, and then proceed to level one as intended), and all the buttons work except the "help" button which tells you what the buttons are.  But whatever.  I'm continuing to learn, and that's what counts, right?

Tomorrow, I'll be reading the full chapter 2 from TECS at the temp agency, and either I'll start on the project or I'll tinker around some more in Hula and put up a public beta.  Fun times!

Friday, March 9, 2012

Day 20: "Noob Game" launched!

Early update today, since I stayed up writing my tutorial.  Feels good to be ahead of schedule for a change!  Now if only I can find some work today...

Noob Game can be downloaded on the free right here!  Below the jump is a tutorial on how to write this game (or something like it) all by yourself in C++.  But be warned:  the source code contains spoilers.  Because I know you're super-concerned about those.

GAMES?!

Indeed, games!

This is my central game download page, where you can find all the games I've made.

Noob Game:  This is the first game I ever made all by myself.  It's short & shitty, but it's got all the right elements for a game:  NPCs, dialogue, levels, and quests.  Can you slay the vicious troll of Pro Mountain?  Will you anger the gods and live to tell the tale, venturing forth into the Wild Blue Yonder?  Or will you be whupped soundly by the Noob Trainer and perhaps killed by a guard for attacking a civilian?  YOU DECIDE!  (Note:  the link is to a naked .exe file on Dropbox; your 'puter may turn up its nose at it, but I assure you that there are no viruses).

More coming soon!

Thursday, March 8, 2012

Day 19: A quest! And a world!

So I recoded everything from scratch in a new project called "Noob Game," rather than keep everything in "Hello World."

You start in Noob Camp and can talk to the Noob Trainer, who gives you a quest to take some Noob Shit to Noob Town.  If you keep trying to talk to the Noob Trainer, he tells you to get going.  You can then turn the Noob Shit in to the Noob Civilian, who gives you a gold piece.  Now you're on a first-name basis with the Noob Trainer!  That's some status right there!

The source code is beneath the jump, for anyone who is curious and/or wants to compile and play this pile of a game before I "officially" release it.  There are still a few bugs, like levels don't work right (also, attacking is a lie and does not work), but I have ideas of how to fix them and just wanted to put something up on the blog before midnight.

EDIT:  Uhh... finished the game?  Compiled and released before midnight.  Lots more quest, figured a couple neat new things out, posting a tutorial tomorrow.  Who knows of a nice free place to make .exe files available for download?

DOUBLE-EDIT:  Aaaaand... BAM!


Wednesday, March 7, 2012

Day 18: A game, at last!

It's not much, but I have the rudiments of a game here, now.  Thanks to Zachary's superior tutelage, I now have a game with a functioning victory condition, failure condition, and means of quitting.  You can't save, or talk to anyone, or do anything besides win/lose/quit... but still!  I have something functional here, and now it's just a matter of scaling it up until I get something worth distributing.

For those of you playing along at home, this is how Noob Game works (so far):
#include "stdafx.h"
#include "HelloWorld.h" //this header is empty at the moment, but I have a feeling I'll be using it eventually
using namespace std;
int _tmain(int argc, _TCHAR* argv[]) //this is the main function!
/* If I'm reading it right, the main function is simply an integer (albeit a really, really big one in binary).  What this means is that any possible game state could also be represented as an integer, Library of Babel-style, such that there is a set of integers which in aggregate represent all possible game states.  Whoah. */
{
cout<<"One Man Show"<<std::endl;
cout<<"Welcome to Noob Game.  Enter 1 to win, 2 to lose, or 3 to quit."<<std::endl;
char choiceOne[100];
std::cin.getline(choiceOne,100);
if(choiceOne [0]=='1'){
std::cout<<"You win!  Thank you for playing!"<<std::endl;
}
else {
if(choiceOne [0]=='2'){
std::cout<<"You lose!  Please play another time."<<std::endl;
}
else {
if(choiceOne [0]=='3')[
std::cout<<"You quit!  Fuckin' quitter."<<std::endl;
}}}
std::cout<<"The game is over.  Enter anything to close."<<std::endl;
std::cin.getline(choiceOne,100);
;
return 0;
}
And that's it!  I have extra comments in there & stuff, but I don't really care about that on such a small program.  I compiled it and ran the .exe on my computer many times!  It works!  Well, entering "4" or anything else besides 1, 2, or 3 will simply advance to ending the game, but as far as I'm concerned right now, entering unacceptable input is a failure condition.

I'm working on a replay module right now; I'll probably have to learn something else to make it work the way I want to, since I can't use "goto" any more.  Or at least shouldn't...

Anyway, even that was the result of an embarrassingly long session of poking, prodding, and just trying different things.  I'm going to go back to doing that now; just wanted to share that I've actually got something!  The simple fact that I'm using a program I created myself, no matter how rudimentary, is giving me a bit of a rush.

Tuesday, March 6, 2012

Day 17: Program runs!

Well, after much hemming and hawing, I finally sat through the MS Visual Studio tutorial and followed along instead of just watching it.  Within minutes, I got this:
Fig. 1  A window that asks for a 1 and everything!

It works!  Working code!  But then when I entered "Hot cha!" as you can see above in Figure 1, I got a run-time check failure - apparently, some stack around the memory of "myLine" was corrupted.  I can Break or Continue, and I don't know what those mean.  Glad I can JFGI before I decide!

OK, I didn't find anything in two minutes and I'm too excited, so I clicked "break."  Apparently, breaking things is the wrong thing to do.  I don't know how I could have possibly known this in my previous life experience.  Now I can't close the window.  I ctrl+alt+deleted and tried to end the process, and it just won't die.

I was all set to reboot, and then VC++ asked me if I wanted to stop debugging when I closed it.  Then the window closed on its own.  Not spooky at all.  This magic box is haunted.

Back up and running, and the machine tells you you've played even when you press 2.  Hmm... I thought that maybe that "if(myLine[100]=1" bit might mean "if it's true," so I tried putting the 1 in quotes, and got, "1>c:\users\d\documents\visual studio 2010\projects\helloworld\helloworld\helloworld.cpp(23): error C2440: '=' : cannot convert from 'const char [2]' to 'char'; 1> There is no context in which this conversion is possible."  That's at least intelligible, but it doesn't fix my problem.

OK, that's it for today.  I also did a bunch of art stuff, but it's sketches at this point and nothing really presentable.  Toodles!

Day 16(+1): Oops!

It got to midnight last night before I really knew what time it was, and at that point I didn't have time to write a post.  Sorry about that.  I also had lots to do today, but now I'm done.  So this is what's up with yesterday, and there ought to be something up about today's doings later on this evening.

Yesterday:  trying to get SDL to work.  Lazy Foo says that if I get an error, I probably skipped a step.  I double-checked to make sure I didn't skip a step, but I don't know, maybe I'm glossing over the same part each time and then forgetting that I did it.  That could also be happening.

I also read the lecture notes for Chapter 2 in TECS.  Whooole lotta math in there, glad I had some calculus from my physics days or some of them thar numbars would've really screwed me up.  Also, getting a clearer picture of how a computer does so much math so fast.

OK, time to get down to work.  Err, play, that is.  Hobby?  We'll go with hobby.  Time to get down to hobby.

Sunday, March 4, 2012

New look!

I don't know why I keep going for green, since orange is clearly the color of awesome.

Anyway:  Like?  Dislike?  Suggestions?

Site is easier to read now, which also means easier for me to stare at, and has a search module & tag cloud (which involved tagging all my posts retroactively).  Hooray!  I accomplished all my weekend site update goals!

Saturday, March 3, 2012

Day 15: Wiki Walking

A Wiki Walk is a train of thought that left the track and is Riding into the Sunset. When going for a Wiki Walk you know where you begin, but no one knows where you'll end. Are you a Mad Scientist building an orbital death ray? Well, too bad, inspiration struck and now it's the world's biggest dancing dish washer with a fully adjustable cup holder. You want to have a serious talk about the Middle East? Within ten minutes you'll be arguing whether Darth Vader could take Gandalf in a fight. Just want to check the Rule Of Cool page? Before you know it you're adding examples to Bungling Inventor. You, my friend, have just had a Wiki Walk.
 - TVTropes:  Wiki Walk
Bit of a late start (that's my King Understatement for today).  Well, on writing this entry, at any rate.  I've been reading and organizing ideas all evening (more on the ideas later).  I'm starting to see the wisdom in the Chinese proverb, "Better to be deprived of food for three days, than tea for one" (and that's from before researchers scientifically established the health benefits).

I finished project 01 in TECS.  I'm going to keep posting my progress through the course by chapter and project,  because otherwise I'll probably fall off the ball and publicizing my progress increases my commitment to it.  But I'm stopping with the "step-by-step herp-a-derp" because it probably won't be helpful to anyone just getting started any more, and so will just amount to cheating for anyone who's actually taking the class.  If I am struck by some kind of inspirational tangent, I'll blog about that, but the focus will be on where the tangent ends up and not on the project/chapter itself.

I also poked around quite a bit on LazyFoo.net.  This guy's got a load of tutorials ranging from setting up libraries and displaying images to game saves and joysticks, and articles covering topics ranging from the nature of pixels to making a level editor.  Like any good neophyte, I'm gradually coming to terms with the fact that the more I learn, the more I'll be able to appreciate just how much I have left to learn.  But just as my knowledge of computer systems becomes clearer and more concrete the more I do it, so shall my programming knowledge grow.  In this vein, Lazy Foo's page on Nerd Girls:  The Game also has a very illuminating (not to mention humbling!) list of "Ten Things About Game Development They Didn't Teach Me in School."  I have a feeling I'll be learning a lot from this guy.

So yeah:  ideas!  I think a happy medium between "game I can start out building" and "game I will have fun playing" is a card-based game.  Obviously, I'll have to learn how to code a complete game of Solitaire before I can make my own crazy variation on it, but Solitaire (from what I've read) is a good one to cut your teeth on.  We'll worry about the specifics of what would make this more fun to play than any other free version of Solitaire later - y'know, after I've actually made Solitaire and can get a feel for exactly how out-of-control my feature bloat has become.  But I spent lots of time between my readings drinking green tea and thinking very explicitly about how to get from A to B one step/feature at a time, and I'm excited to see how it takes shape!

OK, I seriously have to get to bed now.  I've got a busy weekend ahead of me, what with the layout stuff I want to do and getting a head start on content for next week.  Y'all have a great one!

Thursday, March 1, 2012

Day 14: Eureka!

I took my homework with me this morning when I went to look for work.  This was a good decision, because I only had like ten pages left to read in Phantoms in the Brain, and I needed something else to do besides all the paying work the temp agency didn't give me.  I had ten more chips to build:  DMux, Not16, And16, Or16, Mux16, Or8way, Mux4way16, Mux8way16, DMux4way, and Dmux8way.  I built the first six, and half-decided/half-succumbed to saving the last four for when I was able to make sure that the first six actually worked, despite the roll I was on.

Last night, I built a multiplexor by a rather circuitous and wasteful, albeit functionally intact, method.  But a two-way multiplexor, using one selector input to choose between two other inputs, only has an eight-value truth table when expressed propositionally.  Mux4way, on the other hand, has two selector inputs and four primary inputs (a-d), resulting in a 64-value truth table that still comes out only 1 or 0.  Don't even get me started on Mux8way!  I realized that yesterday's approach simply wasn't practical, but was stumped as for how to proceed.

Necessity is the mother of invention, and I invented an epiphany.  I honestly don't know how I missed this - it must have been decision fatigue - but I realized at some point when trying to draw up the 64 truth values for Mux4way that since it only comes out 1 or 0, I could just express the 1 values as ganged-up And functions, then disjoin them together into a giant Or function!  Now I am slightly embarrassed over yesterday's fiddle-fartin'; but that's what I get for doing my homework in public.  More importantly, I learned a valuable lesson, and I'm proud for having solved the problem in a more elegant fashion anyway, so it's all good.  Behold:  Mux2.0!
Meaner.  Leaner.  Also greener!
And here's the new and improved NAnd-Only HDL:
IN a, b, sel;
OUT out;
PARTS:
Nand (a=sel, b=sel, out=NotS);
Nand (a=a, b=NotS, out=r1);
Nand (a=sel, b=b, out=r2);
Nand (a=r1, b=r2, out=out);
Wham!  Bam!  Flim and flam!  That's over 75% fewer lines of functional code, for those of you playing along at home.  My inner quality consultant is serenely satisfied.  OK, moving on!

DMux, the demultiplexor which takes a single input and uses a switch between two outputs, gave me a little bit of trouble.  But that was only because I was thinking I still had one output, when actually I've got two output pins coming out of my own little black box space.  That realization cleared it up right quick!  The diagram seems almost absurdly simple in hindsight - even the NAnd-Only diagram!
Gallons easier once you paradigm shift out of truth-functional
propositions per se and just start black-boxing everything.
I'm not even going to bother with the code, here.  If you've been following, it's simple enough to work it out for yourself, and I'm starting to feel pangs of "give a man a fish" guilt about doing this all in public.  At this point, though, I think the only "damage" I've done is to help along somebody just getting started, like I am.  That said, my code works beautifully!  (Also, I found via typo that this HDL is case sensitive - good to know!)

Next up, Not16:  the first 16-bit gate.  This is the reason I wanted to try out a proof-of-concept at home before actually diagramming and coding Mux4way16 and the rest.  Turns out, I can't just put in the variable "i" for inputs 0-15, I have to code them line-by-line.  Or I could type it once in Word, and use Replace!  Not a big deal for Not16, but definitely going to appreciate it for Mux8way16!  I have never been so grateful for Ctrl+H in my life (true story!).  I can imagine a program that takes code with [i] as a variable, expands it n times, and replaces [i] in each iteration of the code with [n-1] (because you start with zero, duh)... but this would save me a fairly minor amount of time (even though it feels like a lot of tedium), and anyway if I knew how to do that, I wouldn't be doing this in the first place.  Heh.  Whatever, Ctrl+V x 16 and highlighting a few lines then pressing Ctrl+H, Tab, n-1, Alt-A, N, Esc over and over isn't exactly hard.  So that's And16, Or16, and Mux16 out of the way.

Or8way throws a bit of a curve, since it's not mapping multiple inputs to multiple outputs like the last three chips.  Instead, we're taking in eight inputs to the same giant Or function which maps to a single output.  What we're coding here is not to do one thing with many inputs and outputs, but rather to check for any of eight things (rather than Or's mere two).  Here I think it pays to point out that how we code this may have an appreciable effect on performance:  I could code 4+2+1 (or 8-1, ganging them serially rather than pairing them) Or gates, making the machine instantiate the Or chip (and its 3 component NAnd gates) seven times "inside" this chip; or I could directly code all 7*3 NAnd gates and have it be its own thing rather than making the machine look elsewhere first.  While the difference between configurations is infinitesimal for just this one Or8 gate, it adds up cumulatively in the processor load when turn on the "computer" and run the "chips."  Not of particular importance to the lesson at hand, but of tangential relevance and so I thought I'd point it out.

Also, I found out by experience that pins cannot be named beginning with numbers - who knew?  I named the outputs from some of my NAnd gates as "out=xvy" for clarity (where x and y were integer values corresponding to input pins), rather than the relatively nondescript r1/r2, etc.  I kept getting the error, "A pin name is expected," and jiggered around with it for over half an hour, giving myself a headache in the process.  I have a feeling I should be expecting a lot of these in the weeks and months to come...

Taking stock:  I seriously refined my multiplexor, which is a big deal to me, and wrote up the first six of my final ten gates.  Good progress for one day, I think; and my brain is feeling full now, to boot!  I also watched a great introductory video over at the Khan Academy, during which an idea for a text adventure began crystallizing. I'm not sure quite how to do the "window" stuff yet, but I've got a good handle on how to declare values like player health, experience, and level, and how to nest conditional dependencies inside them to link derived stats to their primaries (now I just need, oh, the rest of a game to house them!).  I've also got some good ideas for a weekend mini-project to overhaul the site with a custom image header and a few layout features, so there's quite a bit going on under the hood today, as well.  Plus Zach gave me another tip for making forward progress on Fetris, so I'll be looking into that right now.  Y'all have a great one!

Final Thought:  I just realized while proofreading that the program I pined after above - the one that would do my homework for me - would actually be pretty easy to code using the principles taught in Python by that video at the Khan Academy.  The only real "invention" would be to code the recursive function that iterates the steps n times.  Great, now I'm going to be thinking about that all night.  Anyway, I'm not writing the code here, since that would be providing a tool that actually does actual homework in an actual class, but the principle will be super-useful when generating content procedurally in future games.

Wednesday, February 29, 2012

Day 13: TECS, Chapter 1, Part 2.

Zach gave me a suggestion that I thought would work.  After half an hour of Googling, it still did not work.  Back to the books!

I picked up exactly where I left off, on the testing scripts.  Here is a test script from the textbook (testing the Xor gate which I discussed yesterday):

load Xor.hdl,output-list a, b, out;   
set a 0, set b 0,   
eval, output;   
set a 0, set b 1,   
eval, output;   
set a 1, set b 0,   
eval, output;   
set a 1, set b 1,   
eval, output;
Oh, man.  This is easy, after understanding the chip itself!  Just load up the chip, specify what goes onto the output list (in this case, our values for a, b, and the evaluated outputs), then set a & b to all combinations they could be, evaluate the chip's function, and output it.  Like unto a pie.  Sure enough, we get:

a | b | out   
0 | 0 | 0   
0 | 1 | 1   
1 | 0 | 1   
1 | 1 | 0 
Hot cha.  What's next?

Next is what the chips are and how to build them.  Easy-peasy, quick an' breezy.  Well, up until we get to the 4-way 16-bit multiplexor, anyway.  The Alert Reader will recall that multiplexors gave me a small headache yesterday, but today I only got slightly narrowed eyes and increased attention.  Demultiplexors were a cinch after that; it's just the same thing, backwards!  Building these exclusively out of NAnd gates?  Ehh, not so much.

I just learned this yesterday.  Now you want me to build it with
two pop tabs and a paperclip?  CHALLENGE ACCEPTED.
(From The Elements of Computing Systems, by Noam Nisan & Shimon Schocker)

But that's the end of the chapter!  Now for the project:  build all the chips/gates mentioned in the chapter out of NAnd only (that would be Not, And, Or, Xor, Mux, DMux, Not16, And16, Or16, Mux16, Or8way, Mux4way16, Mux8way16, DMux4way, DMux8way).  If this were a real course, I'd have a week to do this, so let's see how I feel after doing Not, And, Or, Xor, and Mux.  Then I'll sleep on it and try the rest tomorrow.

Ready?  Go!

First up, Not via NAND.  Easy enough, right?
IN in;
OUT out;
PARTS:
Nand(a=in, b=in, out=out);
Ha ha, NAnd already does the heavy lifting for me!  Load the test script, and:  SUCCESS!  Now for And via NAnd.  Whoah, I almost thought I could just put a Not at the end, but herp-a-derp, that wouldn't work because NAnd isn't the...  Wait.  No, that's exactly what I want!
IN a, b;
OUT out;
PARTS:
Nand(a=a, b=b, out=r1) //the R is for RESULT, get it?
Not(in=r1, out=out); //let's make it more explicit, shall we?
Nand(a=r1, b=r1, out=out);
Load the test script, make sure I didn't do anything stupid, and... SUCCESS!  I'm on a fuckin' roll!  Now for the inclusive Or.  This will require gymnastics...wait, no it won't, because I can just put Nots after a & b before they go into NAND, and poof!  Let's be super explicit again:
IN a, b;
OUT out;
PARTS:
Nand(a=a, b=a, out=nota);
Nand(a=b, b=b, out=notb);
Nand(a=nota, b=notb, out=out);
Too sexy, too sexy!  This is going smoothly.  Now, I can't help cheating for Xor, since I was already given a diagram and the HDL for it; what I can help is whether I cheat further by simply copying, or instead translate the existing HDL into Super-Exciting Mega-Explicit NAnd-Only Language!  (I'm not shouting, the "!" is just part of the phrase.)  The tough part here is now no longer coming up with the HDL, but keeping my terms straight.  I'll make a new diagram and divide it up into three phases like the old one:  the Not phase, the And phase, and the Or phase, finally leading to the output.  Here it is:
I haven't felt this enlightened since I learned why
the square root of two is necessarily irrational.
Hey, r1 & r2 just get Not'ed twice - at the end of the And phase, and at the beginning of the Or phase - which means... carry the one... I can skip steps.  As long as I skip the right ones.  Now I'm actually learning!  Doing that, my new Optimized NAnd-Only Xor HDL is:
IN a, b;
OUT out;
PARTS:
Nand(a=a, b=a, out=nota);
Nand(a=b, b=b, out=notb);
Nand(a=a, b=notb, out=r1);
Nand(a=nota, b=b, out=r2);
Nand(a=r1, b=r2, out=out);
Instead of crossing my fingers, I'ma crack my knuckles.  Crackita-pop!  Plow!  Annnd... SUCCESS!  In the same number of lines of code as their original Xor gate, which needed Not, And, and Or!  HOO-HA!

Uh-oh.  Now for Mux.  OK, there's a reason I decided to make this the last one for the night, and it's not just that it's 10:22.  You're on a roll, just keep it going, man.  Think out loud.  Or on paper.  Erm, in type.  Whatever.  You've got your a in, your b in, and your selector, and the selector decides which input comes through.  I can do this.  Think of it in terms of the shortcuts, first.  Then blow it up into NAnd-Only, then simplify (if you can).  OK.

Dammit, now it's 10:42, and I've been staring at this for 20 minutes and thinking, "No, this won't work.  No, that won't work.  Shit, what am I gonna do?"  Urge... to cheat... rising... WAIT.  Re-draw the truth table so it's less confusing.  OK, now it looks like an Or for a & sel when sel=0, and it looks like an And for b & sel when sel=1.  Good, you can work with this.  Keep going.  All right, it can't trigger the And for b & sel when sel=0, so... run an And from sel & b (result:  selAndb).  Duh.  Keep going.  Run an Or from sel & a (result:  selOra).  Now we've got selAndb which gives b when sel=1 and 0 when sel=0; and we've got selOra which gives 1 when sel=1 and a when sel=0.  Good.  Paragraph break.

Now compare your "mini" truth tables with each other.  Wait.  Duh.  You're barking up the wrong tree here.  Stop trying to make it explicitly perform based on why you know it ought to go, and make it perform based on why it needs to go. Back up and brute force the fucker, then clean it up in post.  You'll be fine.  OK.  Start with sel&a&b=1.  Work up from there.  Run them all to And gates, then make those come out how they ought to do.  Then funnel them into bottlenecks so that you get what you need at the end.

OK, finally.  I got it.  It's 11:50, and I fucking got it.  First, I just did everything in terms of "and," "not," and "output" - not HDL-wise, just logic-wise.  Like, I wrote on a piece of paper:
s&a&b=1
s&a&~b=0
s&~a&b=1
...and so on.  Then I drew up HDL-like parsings of those functions, and tried to make them as similar as possible.  I noticed that I could capture three correct outputs with only (s*a)*b (call it x), four more with (s+a)*b (call it y), and the last one with (s+a)*~b (call it z).  (For the uninitiated, + = or, * = and, ~ = not.)  Then I drew up a truth table for s, a, b across from x, y, z, and also drew up the output.  I noticed that y predicted three of four outputs of 1, and z got the other one when s=0.  The x function was useless, so I discarded it, and made x':  y+(z*~s).  (Fun Fact:  I accomplished this step by folding over the s/a/b section, MAD Magazine fold-in style!  Now that's thinking outside the box!)  Finally, I drew up a schematic for a, b, and s inputs, into y and z functions using And, Or, and Not gates, then put it all through to the x' function, and that gives the output.  So we have:
IN a, b, sel;
OUT out;
PARTS:
Or (a=a, b=sel, out=sva);
And (a=sva, b=b, out=y); //these lines describe the y function
Not (in=b, out=notb);
And (a=sva, b=notb, out=z); //these lines describe the z function, and I can re-use sva from above
Not (in=sel, out=nots);
And (a=z, b=nots, out=zAndNots);
Or (a=y, b=zAndNots, out=out); //these three lines describe the x' function, which is just output
OK, let's see if that runs... SUCCESS!  Holy carp, that was insane.  OK, that's my proof of concept, now to break it down into NAnd-Only.  Picture first?  Picture first!
And to think, this is still the easy part...
Whoops, that "&s" at the bottom coming out of the first NAnd should read "~s"; and I need to label some results r1, r2, and r3; and I should also label that bit that comes out notzAndNots when you come anticlockwise around the lower-right corner.  Not taking another picture, though.  Now for code:
IN a, b, sel;
OUT out;
PARTS:
Nand (a=a, b=a, out=nota);
Nand (a=sel, b=sel, out=nots);
Nand (a=nota, b=nots, out=sva);
Nand (a=sva, b=b, out=r1);
Nand (a=r1, b=r1, out=y); //BAM!  That's y, now for z.
Nand (a=b, b=b, out=notb);
Nand (a=sva, b=notb, out=r2);
Nand (a=r2, b=r2, out=z); //Sweet.  Now to wrap it all up!
Nand (a=z, b=nots, out=r3);
Nand (a=r3, b=r3, out=zAndNots);
Nand (a=y, b=y, out=noty);
Nand (a=zAndNots, b=zAndNots, out=notzAndNots);
Nand (a=noty, b=notzAndNots, out=out); //done!
Plug & chug, and... BAM!  Success on the first try!  And it only took me - TWO AND A HALF HOURS?!  Whatever, I'm done now.  By the stars, I've got a lot to do tomorrow, though... I'm starting to see why hardware designers burn out and how programming conventions become insane.

Tuesday, February 28, 2012

Day 12: Poking around the internets.

Zach left a helpful link in a comment on yesterday's post, and after reading through the whole thing, I have a slightly clearer idea of what's going wrong.  See, line 187 says:
wcx.lpszClassName=WINDOWCLASS;
...and the error returned is:
error C2440: '=' : cannot convert from 'const char [7]' to 'LPCWSTR'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
So, OK, at least that's not gibberish to me any more.  And way, way back up in line 15, when I wrote:
#define WINDOWCLASS "Fetris"
...that must have made "WINDOWCLASS" into a constant.  OK.  And on line 187, I'm not certain what that "wcx" bit is all about, but "lpsz" means that I'm setting a long pointer to a null-terminated string - so it wants ASCII.  Right?  But... if it's trying to use a long pointer to a constant wide string... that means it wants Unicode.  So I'm telling the machine to do something with ASCII, and it's trying to do it in Unicode, and that's the problem?  I think so.

I don't know how to fix that, though.  Either I need to do something different in the WinMain function (which I'm not sure what that would be), or I need to change my definition up at the top (and I'm not sure how I ought to do that).  Well, this is what I get for using someone's code from over eight years ago.  And holy carp, I spent over half an hour just typing out the above.  Well, more like five minutes typing and revising it, and 25 minutes cradling my head trying to sort everything out.  This is in addition to the hour I spent poking and prodding and reading and trying to make it work.  And I'm still probably missing something (like a real programming course).  Fine.

I'm going to play around with that NAND to Tetris thing.

Got the hardware simulator running after installing the 64-bit version of Java (had to consult their forums to find out I needed to do that - apparently the version I had before wasn't good enough).  Got the Hardware Simulator running, and figured out how to load and test gates/chips in it.  Nice.  Project 00 complete, on to Chapter 1!

I started flipping through the slides for the lecture, figuring I'd read the chapter after I got an idea of what I'll be learning.  Right away, multiplexers stumped me (well, on slide 9 of 24, anyway).  I could not for the life of me figure out what was going on in that truth table.  Wikipedia to the rescue!  (By the way, is Wikipedia being wonky for anyone else lately?)  Man, multiplexers are easy once you know that the selector picks which input gets to be translated into output!  (I did not know that more than five minutes ago.)  The rest of the slide show was easy after that - but now I have to basically re-learn all of my logic using NAND only, which is doable, but confusing.  Whatever, that's the point of the exercise.

Reading the chapter itself, I further learned what the "canonical representation" of a Boolean function is (it's the inclusive disjunction of all the possible values which yield "true" on the truth table).  I've also got the hardware description language (HDL) down.  See, twenty minutes ago, this was gibberish to me:
/* Xor (exclusive or) gate:If a<>b out=1 else out=0. */  
CHIP Xor {
IN a, b;
OUT out;
PARTS:
Not(in=a, out=nota);
Not(in=b, out=notb);
And(a=a, b=notb, out=w1);
And(a=nota, b=b, out=w2);
Or(a=w1, b=w2, out=out);
}
But now I get it!  See:
/* Xor (exclusive or) gate:
If a<>b out=1 else out=0. */
CHIP Xor { //we have a chip, called "Xor"
IN a, b; // it has inputs "a" and "b"
OUT out; // it has output "out"
PARTS: // these are its parts
Not(in=a, out=nota); // A "not" gate with input from a, outputting to "nota"
Not(in=b, out=notb); // A "not" gate with input from b, outputting to "notb"
And(a=a, b=notb, out=w1); // An "and" gate with input from a and notb, outputting to "w1"
And(a=nota, b=b, out=w2); // An "and" gate with input from nota and b, outputting to "w2"
Or(a=w1, b=w2, out=out); // An "or" gate with input from w1 and w2, outputting to "out"
}
I feel smarter already!

OK, I've been doing this for hours, I'm halfway through the first chapter, and this is like a week's worth of work anyway.  My brain is full.  G'night, everybody!

Monday, February 27, 2012

Day 11: Fetris bug-huntin'.

Before I dive into the "actual" errors, I decided to fix the "pretend" errors (i.e. the errors caused by my human error, like typos).  In addition to the errors I found last week, I found one case of necessary capitalization, one case of extra comma (which caused three other syntax errors in the same line), one case of super-exciting extra "}", and one case of a comma that should'a been a semicolon.

I take solace in the fact that I was able to solve my own syntax errors (which were the larger portion of the errors generated) simply by looking at them.  I said, "Oh, that's obviously what's causing the problem," attempted to compile it once again, and BAM!  Error gone!  There was one case where I put a 1 (one) instead of an l (lower-case L), but... look, they look the same.  I would say to them, "You want an ice cream cone?"  Both of them say, "Yes."  Everything that got more complicated than that, I checked against the original post, and yeah:  did it exactly like he said (except for the one part where I kinda-sorta skipped a line).

I am unlikely to get support from Evil_Greven himself on this, but that's OK.  It wouldn't be a learning experience without like six bajillion hurdles.  My high school chemistry teacher, Dr. Landorf, once gave us a universal problem-solving method.  I forget most of it, but the two parts that stuck with me were:  "A problem is not when you simply have to get from A to B.  A problem is when you have to get from A to B and have no idea how.  Otherwise you merely have a number crunch," and, "When you  can't find the solution to a problem, start at the answer and derive the question."  I couldn't find the list itself on the internet (this was a handout from before the internet was everywhere, and apparently drew from several sources), but I did find a really great joke while I was looking:
A mechanical engineer, an electrical engineer, and a software engineer are in a car that breaks down.  The mechanical engineer says, "Maybe is's a stuck valve."  The electical engineer says, "Maybe it's a dead battery."  The software engineer says, "I know. Let's all get out and get back in again, and see if that fixes it."
BWAHAHA!  Oh, what a groaner!  Love it!  OK, so I've now got it down to three errors:

1>------ Build started: Project: Fetris, Configuration: Debug Win32 ------
1>  main.cpp
1>c:\users\d\documents\visual studio 2010\projects\fetris\fetris\main.cpp(187): error C2440: '=' : cannot convert from 'const char [7]' to 'LPCWSTR'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>c:\users\d\documents\visual studio 2010\projects\fetris\fetris\main.cpp(196): error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'const char [7]' to 'LPCWSTR'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>c:\users\d\documents\visual studio 2010\projects\fetris\fetris\main.cpp(260): error C2664: 'BitMapObject::Load' : cannot convert parameter 2 from 'const char [11]' to 'LPCTSTR'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>  BitMapObject.cpp
1>  Generating Code...
Much more manageable than the two dozen I had on Friday.  I can handle this.  I think.  I Googled the first error, in accordance with the prophecy (the prophecy is "JFGI") and found this thread, which led me to this other thread., which led me to this excellent article.  The article is called "Making Wrong Code Look Wrong," and the author goes on about the true history of Hungarian notation (which I did not know was a thing until today) and how to be your own best friend with your programming conventions.  Since one of my errors from this very day was an extra "}" nestled amongst some 50 lines of nested "how to make teh bloxxxorz," I really wish that Evil_Greven had followed rule 5:  "Don't put closing braces more than one screen away from the matching opening brace."  It would've been gallons easier to spot that extra brace, had he done so.  But no worries!  I learned a valuable lesson.  And I bookmarked that guy's blog, because it's rad as Hell.


OK, so the guy in thread number two said that I could either switch the compiler settings to multibyte character set, or use unicode strings instead (the recommended option).  I can't find that option after combing through them all, and I don't know how to make it unicode compliant quite yet, so I'm calling it a night.  It's quarter after ten, I have learned some things and done some things, and I'm happy.


For now.