Wednesday, 16 October 2013

Game #002 - Your Interplanetary Age

Game #002 on Github

My second game is another little tech demo which asks your age and returns its equivalent on every planet. Yes, another ground breaking show of technology!

I quite enjoyed make the interplanetary age calculator. This was mainly due to the challenges I encountered whilst coding.

Feature Creep


As someone in the IT (I am a software tester) I am very familiar with feature creep. The phrases "Couldn't we just" and "It would be nice if" are punishable offences around me!  I started #002 with the idea to ask the user their age, and break it down to months, days, minutes. It's a simple one, and a small step up from #001. Then I thought "Wouldn't it be nice if I finished with the user's age on Mars?" Yep, feature creep almost before I had started to code. A bit of searching later, I found a site with Your Age on Other Worlds. And the wish to write a python script which gives you your age on all the planets in the solar system was born. First I put together a table to help me with the different revolution periods of each planet. This formed the basis of my calculations further down the programme.

Planet Rotation Period (Earth days) Revolution Period (Earth years/days)
Mercury
58.6 days
87.97 days
Venus
243 days
224.7
Earth
1 day
365.25 days
Mars
1.03 days
1.88 years
Jupiter
0.41 days
11.86 years
Saturn
0.45 days
29.46 years
Uranus
0.72 days
84.01 years
Neptune
0.67 days
164.79 years
Pluto
6.38 days
248.59 years

The Int to Str, Str to Int Switcheroo 


When I started coding, I asked the person their age and updated a variable, put that variable into an equation, and print the answer. Simple. For a newbie like me, it took a little bit of research to find out why my code kept on failing. It was great fun. It turns out that the input command produced a string, which wouldn't play well with my equation. The solution was to take the user input and turn it into an integer. This meant that the equation worked.
The next problem encountered was that the print statement wouldn't work because the print command doesn't work with integers. Having researched the need to change the user's input to an integer, it was relatively quick to realise what needed to be done. The result was the following flow of code:

 print("What is your age?")age = int(input(">>> "))  
 mars_age_years = age / 1.88  
 print("You are " + str(mercury_age_years) + "Mercury years old")  

This bit of code would essentially calculate and print a user's age on Mars

Round, Float, Decimal - Who knows!?


If the code above is run the result is that you age is likely to be have a lot of numbers after the decimal point (eg. 5.319148936170213 if you input an age of 10). This doesn't scan as easily as having an  age to two decimal points. This is where the majority of my research came in.
I recall in java it is easy to restrict to a number of decimal points by wrapping your equation/result in float. In python there are three options, all with different foibles of their own. I won't go into them here as I don't entirely understand what the difference is at this point in my learning.
After a decent bit of research, I found that rounding the age to two decimal points produced the answer I wanted. So this:
mars_age_years =  age / 1.88
became this:
mars_age_years = round(age / 1.88 ,2)
I now had a working script I could apply to all the revolutionary cycles of all the planets.

Github Learnings


Part of the fun of this project is putting the code out there for all to see. Like many people I use Github. I have the windows client installed, and it is very easy to push everything to the cloud for all to see. I am researching whether there is an online python interpreter so the scripts can be run without the need to have python on the machine.
I had just finished the game and was attempting to put the final version up on Github when I inadvertently rolled back on my machine. Being new to it all, I attempted to revert to the version online, but because there was now a disconnect between local and git, I was getting an error. It took me two and a half hours to sort out what would have taken someone with the knowledge five minutes to do! I really need to be a little more careful with how I roll back in future.

Game #002 Conclusion


If you have taken a look at the script in full, you will note that everything is still very procedural. There are no functions defined, for example. This is ripe for a revisit further down the line to refactor just about every line of code to make it easier to read and maintain.
Another thing that needs to change is that the user input is incredibly brittle, and not very interesting. If you put 0 in, the programme crashes. If you put a decimal in, the programme will crash. A loop needs to be added to handle these two things.
And what about interplanetary days?! The site I found during my initial design and research calculates the user's age in days as well. This is particularly interesting as each planet's rotation period is vastly different. So, this would definitely be a good addition to the whole programme.

Watch this space.

Wednesday, 9 October 2013

Game #001: Greeting

Github

Remember, my posts are like buses. You wait 10 months for one, then two come along straight away!

I have uploaded my first game. As I said in my first post, many of these will probably be a demo of something, rather than a full-on game. And this is no exception.

Greeting.py is a script which will ask you your name and then greet you. It's such a small script, I can post it in its entirety.


print ("Hi! What is your name? ")
name = input(">>> ")

print ("Welome " + name + "! I hope you enjoy your time browsing the 100 Games project.") 

The main feature of this script is to get the user's input. For games to be interactive, they require input of some kind from the user.
Obtaining the user's input is cunningly done via the input command. Whatever the user types in will be assigned to the variable name for use in the next line, the welcome statement.

Ways to enhance this script may be to only accept characters A-Z, filter out swear words using a dictionary, limit the number of characters a user can input. The list is endless! I will probably want to use some of the above ideas in later games when I interact with users in more complicated games.

P.S. I used the standard highlight function of blogger to make the code look code-y. I realise it looks a bit pants right now. Hopefully I can find a way to style the code snippets better in the future.
[Edit] Found it! Code highlighted

Tags for google+: #Python #100Games #Game

The 100 Games Project

Well, it looks like my idea about blogging more didn't really take off. 10 months on from my last post and here I am with the second article of 2013. Let’s see where we go from here.

100 Games Project

The title of this blog is the 100 Games Project. It is something I am trying which will hopefully help me to learn programming in a fun and interesting way.

Last week I noticed a tweet by Z. A. Shaw, who wrote "Learn Python the Hard Way", mentioning Jennifer Dewalt had finished her 180 Websites in 180 Days project. I remembered hearing about this a while back (probably from Shaw himself), and went to take a look. For the past week I have been reading Jennifer's blog, following the journey from her first website onwards. I was impressed by how she took an idea, and then used Stack Overflow, Google, and anything else to work out how to complete the idea. This lead to was Jennifer encountering more advanced technology (than HTML and CSS) such as jQuery and javascript a lot sooner than in most book lead courses on web development.
Reading the blog got me thinking about my own attempts to learn programming and how often I have got to a point in a course and then given up, got bored, or distracted by another language (where I have usually repeated the same process). The 100 Games Project aims to take Jennifer’s process of using ideas to direct learning to help me with my studies in learning to code.

I am currently learning Python through Udacity's Introduction to Computer Science course. So far I have really enjoyed the show a little, test a little way of presenting the language. Plus the idea of building a web crawler is appealing. I know, however, that if I don't do other things with my knowledge, it won't bed in and I will end up getting to a point where I struggle, get bored, and then stop. The 100 Games Project should go some way to keeping me interested, and bed the knowledge in.

Why 100 Games? 

100 games is quite a lot of games, for sure. I expect a lot of them will probably be more of a tech demo than an actual game. Other games will probably be incremental versions of past games. Even so, I will try and do something new (for me at least) with each game. If I revisit the majority of an old game, it will be to significantly change what was originally coded.
In the same way that Jennifer did, I will also blog a little bit about each game, and uploaded everything to github. That way there is a record
of each game, and other people can take them and play (with) them as well. It will also serve as a reminder of where I started and where I got to should I ever complete the project!

I realise I have now rambled on for quite long enough. If you have read this far, well done. Other posts will definitely not be as long. This I promise.

Friday, 4 January 2013

Testing: What Will 2013 Bring?



I don't make New Year's resolutions. I tried to once and got a stressed and disappointed when I didn't achieve any of them. I think failing at New Year's resolutions is a common occurrence, particularly with the "lose x kg in weight", "exercise y times per week", or "cut z out for a month" ones. There's probably been a study on it and everything! 

So, I don't make resolutions. 

What I do make is a list of things I would like to do in the coming year. It could be mistaken for a list of resolutions, but it's not. It's not, I tell you!!!

 What is on my list of resolu things to do this year? Here goes...

Blog More about Testing

I am a software tester, test manager, consultant, networker, social media user, blog reader, and uTester. I get a lot of exposure to testing, both in practical and in theoretical terms. I often find myself coming up with little tips, tricks, and ideas that make me think "I should blog about that!". And then I don't. So, the first item for me this year is to blog more often. I am not going to go silly by blogging every day! That would lead me to not blogging at all (the old failed resolution pressure again)! I am going to aim for once per month and see where that gets me. 

Learn Enough Coding to Develop Something

I have spent the past few months learning Selenium, and have really enjoyed it. I have been using resources by Alan Richardson which are excellent. The flavour of Selenium taught by Alan uses junit. I get along fairly well with Selenium-RC and Webdriver using junit, but that is mainly just running tests.
What I want to do is actually make something in code! I have a few ideas, but do not have the coding skill to get them to point of going public just yet. This year I want to put at least one item which I made from scratch out there for people to look at, use, refactor, whatever. I already have a little text adventure on github which was written in python. One idea would be to take that and write it in java. This isn't difficult. I think I could handle that already. What I would do beyond that is extend the number of rooms, add a little ASCII art, and a few other bits and bobs. It will never be Zork, but it will be a way for me to work through the odd coding problem on my own. 

Present to my Peers

I spent some of 2012 talking to some of my testing contacts about talking at a networking event, or a conference. The ideas for talks that I have were well met and I have been gently encouraged to put a talk together. When I say gently gently encouraged, I mean "Stop dicking about and get a talk together!" is gently encouraged. This is one item on the list I feel I may actually complete. I have already got the skeleton of a talk. I now need to target a meetup to give me that final push. Watch this space!

Learn a New Testing Skill

This one is a bit vague, but is on the list nonetheless. There are a few areas of testing I would like to explore more, but always make excuses for not doing so. The two main ones that come to mind are performance and security testing. One of the specialities of my company, The Test People, is performance management. I was not hired to be a performance tester and so have had little exposure to the tools we use. Since I usually don't have cause to conduct any performance testing or similar, the way to use the software has been largely forgotten.
As or security testing, I just want to have a play around. I have no wish to become a security specialist, but I definitely have an interest in the field. It is just a case of making time to take a look at tutorials that are available, and see where they take me.

Contribute More to the Testing Industry

And finally the most general item for the list,  contribute more to the testing industry. One could argue that all of the above can be summed up by this point. But then you haven't seen me present or code!
What I actually mean by this point is that I will comment on other tester's blogs more often, put more questions and answers on SQA Stack Exchange (an excellent resource by the way), and maybe keep an eye on the Software Testing Club forums a bit more. That kind of thing.
My reason for this is simple, if you put a balanced well thought out comment on someone else's blog, you open a conversation or debate. Through the replies, you will learn more, and perhaps help others to learn as well.
By asking questions on places like SQA Stack Exchange, one has to think of the correct way to phrase the question, lest ye be marked down! The act of doing this usually sets me on the way to solving my issue. Instead of continuing to plug away at my solution, I am going to also ask on SQA Stack Exchange as that will help me to find other solutions, as well as help others when they encounter the same problems as me. 

And that's it. Five items. That should be doable right? Right!? I tried to do much the same last year, including writing a similar blog post to this one. I didn't manage to post my entry but did manage to complete a couple of the items, the most important of which was learning an automation framework. I hope to build on that this year.

Have a fantastic and prosperous 2013, dear reader. Let's see where this adventure takes us.