Whist Card Game in C# and WPF

Greetings all, I am hopefully going to have some time over the next few weeks as my current project at work ramps down and I await the next one. I have begun a new side project to use some of this time toward and plan to make a few posts about it. I am writing a card game, which might seem cliché, but it is something I have always wanted to do and it is going to be a game that you don’t see very often.

I like cards and I play both bridge and whist whenever I get a chance, which is not very often. It is hard to find people to play and consequently I want a computer game to play. I am going to start with a base solitaire game for Silverlight [thanks to Eric Guo] that has a decent card and deck class that make it easy to quickly show the cards on the screen. I have put together a quick starter application that has a nice felt background and that will deal the cards out and I just added sorting, as one would for bridge, but with uptown and downtown (hi/lo) options for sorting both ways for Bid Whist hands.

The key feature will be the Artificial Intelligence component that will play the other three hands. This is not a simple task and is certainly where the challenge lies. My first attempt will likely use more heuristics than anything, a rule based player. It will certainly be a work in progress for a long time to come. I will publish to my as soon as I set it up. For now here is a screenshot of what I have:

Deal and sort for Whist hand…

One thing I want to note is how I solved the problem of converting the Silverlight xaml I got from the sample project into WPF xaml that would run. The problem that occurred in multiple places and in almost all animations, such as just moving a card was the same. The Silverlight application had code for nice move animations and a nice flip animation that I am planning to reuse. But, in WPF you must have a valid, preset Top and Left value on the item you wish to manipulate. This is not so in Silverlight and causes a common NaN error. The answer I found at and showed me how to get a rendered top and left value. Instead of using:
var dx = Canvas.GetLeft(deck);
var dy = CanvasGetTop(deck);

which will result in a NaN error if you try to use the value returned. You have to use:
var offset = VisualTreeHelper.GetOffset(deck);
var dx = offset.X;
var dy = offset.Y;

This GetOffset method will give you the rendered positional values for your element.


Still Walkin’

Yes I am posting again. I refuse to give up on my blog. I have been away from my hometown and my work for the last year and a half or so and I am now back and getting back into my routine. Much to my joy as I have missed all these things tremendously. I am back to work at GloryKidd Technologies and happy to have the opportunity.

Reminded daily why I have always loved Louisville. I am back in my old neighborhood Starbucks, clacking away. Hope to be able to post some new articles soon as I see where my new project takes me in the world of coding.

Yes I am Still Here

I am working from home, thru my Elusive Development company, on a side project to develop a windows forms app with several components.

It is a very interesting project so far, but I am only a couple of weeks in to it. In the end it will be a couple of windows forms apps. One for the client and one for the end user, as well as a windows service that will handle timing and the win32 api calls. The service will use the api to create a new desktop and then create a process w/in that desktop and switch to it, effectively taking over the users computer with the new desktop. The user is ultimately forced to deal with the, now in the foreground, application in order to get back to what they were originally doing. Pretty sweet. I am building it using C# for the 2.0 framework. I opted for 2.0 versus 3.5 in order to prevent requiring the user to have 3.5 installed. As folks get the 2.0 framework w/sp3 for xp, I am pretty much guaranteed my target platform for that os on up to windows 7.

For those interested I am using a plugin archictecture that utilizes the Abstract Factory and Template Method design patterns so far. Dll assemblies with new types and usercontrols for those types are loaded at runtime and instantiated using factories. Neato…


Well I finally joined Github, which is the coolest of course.  I started with just a little project for an httphandler to apply filters to images.  Something I need for work.  I have the project’s homepage here at my blog for lack of a better location.  And I also added a page in the wiki at github for good measure.  I am extra jazzed about the whole git thing.  I have been using it for local VC at work and at home.  I am still a little skittish about using git-svn, as it hosed on me the first time i tried to dcommit something, but all in all I am very pleased with Git itself.

You should checkout Github, it is perfect, and you can pay a few bucks a month if you need private repos…

jQuery Plugins

I thought that due to the fact that I have been working on pretty much nothing but jQuery at work for the last month or so, that I could come up with a post about some of what I have been doing.  First I should mention that I have really enjoyed it, challenging and at times frustrating though it was, it was equally if not more gratifying.  I had yet to have worked with any one particular library much, if any one prior to now it would have to have been just a little bit of jQuery here and there, playing really.  And certainly not trying to write my own plugin, of course as I said, until now.

The Task at Hand

My task began as a matching of functionality at minimum and ideally a surpassing of functionality in the area of product thumbnail/image viewing, as compared to one of our direct competitors on the web (our primary product is a print catalog).  One of our competitor’s sites had a zooming feature and the ability to drag around the zoomed image to further examine it.  So off I went.  In the end I have matched the functionality but, I feel at least, surpassed them more in terms of usability and appearance.  Basically ours offers the same features as theirs, for now, but looks a lot slicker I think.  Rather I hope.  Anyways, I decided early on, if not immediately to implement the entire thing in jQuery as a plugin.  I wanted to challenge myself and I did.  And while it took me a bit longer I am much more satisfied and my skills with jQuery are much more improved.  

I should mention that just prior to this project I had been working on an ASP.NET site and model/api for describing reports with an xml schema and matching .NET model and delivering them via a web page.  I used an http handler to turn the xml file that described the report and its query and columns into rendered html with data embedded.  During that process I wrote a pagination plugin in jQuery that was actually my first official production quality plugin in jQuery.  Of course all it did was take in the details of the report and generate the links for next/prev and each page in a desired visible range.  So the image gallery was my  sophomore effort at writing a plugin.

The Process (sort of)

Well, let us just say that I have over twenty-five pages of notes that I wrote while I worked on this plugin.  I worked on it at home probably at least a fourth of the time if not a third, and I learned a whole lot about jQuery and about writing a larger scale plugin.  I basically went out on the web and looked for the different pieces of functionality that I needed, like zooming an image in and out by resizing it, and then dragging, and then the carousel for the thumbnails came at the very end.  There was quite a bit of math to figure out, but I was able to piece it together from scripts I found and really by just writing it out in my notes when I got stuck. 

Some things I was able to pull from existing plugins, like the zooming works with a couple of images (one for in and one for out) but it also works with the mousewheel movements (but only when the mouse is over the image view pane.  I was able to utilize the jquery.mousewheel.js plugin in order to get a delta value to use to determine whether to zoom in or out.  I already mentioned that I used a very minimalistic version of jcarousel lite to make the thumbnail slider (that requirement came later of course).  

One of the coolest things, I think, is that instead of placing a toolbar or a list of links below or above or even adjacent to the image being worked on, I went an extra mile (or two) to make a slide out/down toolbar that appears at the top of the view pane when you mouseover the image.  It wasn’t easy, well of course jquery made the slide in/out very easy, but I had a really tough time getting 100% opacity button images and link text over top of a 70% opacity background for the see through toolbar effect.  But I eventually got it to work and I think the end result is a really nice effect.

A Brief Note…

This will be a brief post.  For one, I did want to post something because I haven’t in a while and I need to write another decent article.  In fact I have the notes and outline for a post about the work I have been doing in jQuery lately.  I have been writing plugins, a couple at least, for work, for our public facing site.  One rather large one in fact, to build an image gallery from an un-ordered list of image/thumbnail links, that allows zooming in and out and dragging of the zoomed image around in the view pane.  I will post about it soon.

I have also been studying an average of two hours per night in Ruby and Ruby on Rails.  My position at Glorykidd Technologies as a senior software engineer has afforded me a rare opportunity to work on a large scale project in rails and I am studying for that purpose.  I am quite excited to actually get to work on a real project in rails.  More to come about this as well. But for now I am just claiming my blog on my Technorati Profile so that it will show up there.  I have been using delicious a whole lot lately, as opposed to Google Bookmarks and I like it very much.  And, along those lines I am trying out Technorati as well… J

Project Euler Journey Begins

What, Project Euler?

Project Euler Website

Project Euler Website

This post is an introduction to what I intend to be a series of posts that detail my journey through the problems of Project Euler.  I am hoping to post as I solve, or attempt to solve each of these problems.  My goal is, of course, to solve all of them, but I expect them to become very challenging very quickly so I may find myself stumped early on.  However, this is an exercise in learning so I will have to prepare to be challenged, that is really the whole point.

The intent is for me to use the problems on Project Euler(see previous link) to accomplish several goals I have, or rather have had for a while and am just now attempting.  I can list them as three distinct learning goals.  I say learning because they all have to do with me wanting to either learn something knew or to increase my knowledge/skills in an area. 

My Goals for the Journey

The first goal is to learn how to use a unix shell.  I want to learn how to program for the bash shell as well as how to get around and get things done using the shell command prompt.  I would eventually like to be able to incorporate shell usage into my daily work as much as possible as I really think it is an efficient way of getting tasks done. I have always felt that anything that keeps my hand off of the mouse is a step toward increasing productivity.  Being able to key tasks at a command prompt is always faster than moving your hand to the mouse to search through dropdown menus and lists of icons, atleast it is in most cases.  I do not think that the mouse is unnecessary by any means, I just prefer to use the keyboard as much as possible, or as much as is practical, while I am working.

The second thing I have always wanted to learn more about is higher math.  I never took calculus in my brief stint at university, nor when I was in high school.  I always loved algebra and I am hoping that calculus as well as other higher mathematics areas will be just as interesting.  I also hope they are not beyond me though.  I expect I will have to learn quite a bit in order to solve the problems on Euler, even after the first couple I am already looking up stuff on Wikipedia and learning new things, exactly my purpose.

Lastly, but certainly not least, I want to learn a new language, maybe more than one.  I am going to start with Perl because I have always felt that not knowing perl was a drawback as a professional developer.  I will be attempting to solve all of the problems using Perl as the coding language and consequently have to learn it as I go.  I have already used perl to solve the first two problems.  I also really want to learn Ruby so I may do some problems in Ruby as I go along.  There are plenty of problems so I may be able to learn both languages as I go.

More about Project Euler

Euler is considered to be the preeminent mathematician of the 18th century and one of the greatest of all time. He is also one of the most prolific; his collected works fill 60–80 quarto volumes.

Euler is considered to be the preeminent mathematician of the 18th century.

I stumbled on to project euler somehow, though I cannot remember how for the life of me.  At the time I bookmarked it in my GMarks and went on my way keeping it in the back of my mind as something to look at later.  Well later came and I went to the site and read about it.  

Project Euler is a series of challenging mathematical/computer programming problems.  They involve both the math aspect as well as the coding aspect which is used to perform the calculations needed to get the solution in a timely fashion.  In fact all solutions are supposed to adhere to the one minute rule meaning that they should take no more than a minute to execute and produce the result.  The site’s about page states that its intent is

“to provide a platform for the inquiring mind to delve into unfamiliar areas and learn new concepts in a fun and recreational context”

which is what it does, quite well in my opinion.  There are several cool features about the site that make it fun as well as challenging.  It is also well kept and updated often, which makes it feel like you are participating in something more so than if it was a dead site.  In fact, every time I logon to the site there are dozens of people logged in already, as I write this there are 88 members logged in, so it is definitely an active site.

Some of the Features

There are a few features on the site that appealed to me and that made me want to participate as well as making me think that this was an excellent way for me to accomplish the goals I mentioned above.  Of course the activity level of the site and the fact that it is kept current and that they are still adding new problems, etc. all made it attractive to me.  But, there are a couple of specific features that make it even cooler.

One of those features is the simple fact that you can register and login.  This makes possible the scoring and tracking stats features per user (and per problem).  Once you register and login you start on the problems, I am doing them in the suggested order that they are presented in, but I suppose you don’t have to do it that way.  When you solve a problem or rather, when you think you have solved a problem you can submit your answer.  There is a place to do that for each problem, then you are told whether you are right or not.  I have been right the first time on the first two problems so I am not sure what happens when you are wrong.  When you are right you will see a different view in the problem list from then on.  You now see links to an overview pdf, which explains the solutions and has notes about the math/theory behind the problem.  This lets you see if you went about solving the problem in the most efficient way possible.  You also see a link to the forum thread for that problem where others have discussed the problem in greater detail.  

Screenshot of the list of problems.

Screenshot of the list of problems.

All this extra info is quite informative and contributes greatly to the learning experience.   If not for this extra info and participation by the community I wouldn’t know that although I correctly solved the first two problems, there were better ways to solve them than the ways that I used.  While not wrong, because I got the right answer, I discovered that there were simpler ways, that included more math theory that I did not have, that would find the solution more efficiently.  These extra notes and posts helped me learn much more than I would have by just submitting my answer and finding out it was correct.  I plan to post separately about each problem where I will go into this point in more detail.

Some tidbits about Project Euler

  • Here are some cool facts/details about project euler that I thought might add to this post and were interesting:
  • There are 228 problems so far, all of which have been solved by someone.
  • The first problem has been solved by 48,882 people (including me) and the 228th problem has been solved by 76 people.
  • You can sort the problems in descending ID, ascending Difficult, or ascending Difficulty.  I am solving them in order by ID.
  • From the Stats page, there are 52,922 users whom have submitted a total of 892,601 solutions, an average of 16.9 problems per user.
  • I count 165 countries listed on the stats page w/atleast one solution submitted next to their flag.

The top five(5) languages in number of users are: 

    1.  C/C++ [5798]
    2. Python [5121]
    3. Java [3231]
    4. C# [1758]
    5. Haskell [1255]
    6. Ruby [1185] — i added a sixth because the last two were so close 

      The top five(5) languages in User’s Rating are:

        1. 40% – Magma — (?? never heard of this one, have to look it up)
        2. 39% – Pari/GP — (?? never heard of this one either)
        3. 23% – APL/J/K — (?? okay I must be an idiot)
        4. 22% – Mathematica — (finally one i have heard of)
        5. 20% – GAP — (?? sigh)

          Okay, so there you go, a bunch of stuff about Project Euler and why I am gonna be working on it.  I hope I don’t get discourage right away.  I have little doubt that this is going to get real tough pretty soon, but I am equally sure that I will learn a great deal if I can do it… j