From: Devin Mullins Date: 2005-06-16T23:04:25+09:00 Subject: Re: [SUMMARY] Chess Variants (I) (#35) --------------000307020708020909010405 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Err... uhhh... it seems I missed the deadline. Merrhh. Oh well, here's my incomplete chess program. :) I was basically completing the rules from top to bottom on the web page, and so I haven't yet done castling, or validating for check, stalemate, or (seems hardest to me) mate. But it does to a little REP loop and draw a board and all that. Probably the most significant thing about this "solution" is that I decided to ignore your initial statement about introducing plugins & whatnot for the purpose of expansion. Rather, I used this as an opportunity to practice TDD, refactoring, and YAGNI. I was hoping to see this pay off when I had to implement the variants. There are a bunch of cute tricks in the code (at least, for a ruby nuby such as I). I am proud of: - doing all sorts of metaprogramming without resorting to 'eval' - TDDing the whole d*mn thing (almost) - producing so much code, so quickly, on a language so foreign to me, and still understanding what I wrote afterwards I am not proud of: - well, check the code. chances are, if there's a comment, it's a description of some code debt. - I don't like using 'break' to get out of loops. Too much like GOTO. But I did. Twice. TDD, by the way, proved to be incredibly successful, not because it helped with design (in fact, I found it quite difficult -- often, I would write the code I wanted in a comment, and then struggle to write tests to make that code appear), but because it was really easy to make sure I didn't break anything, and it really felt good to see all the tests pass. Hope there's something of value here for somebody out there! It was certainly valuable practice for me, and I'll probably go on to finish the code. Devin --------------000307020708020909010405 Content-Type: application/x-zip-compressed; name="rubyquiz35.zip" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="rubyquiz35.zip" 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 AHIFAABydWJ5cXVpejM1L2ZpeHR1cmVzL21vY2tfaW8ucmJQSwECFAsUAAAACAC4us8yJODU cr0EAACLDAAAEgAAAAAAAAABACAAAAAyBgAAcnVieXF1aXozNS9nYW1lLnJiUEsBAhQLFAAA AAgA767NMoDKiuwmAAAAKAAAABgAAAAAAAAAAQAgAAAAHwsAAHJ1YnlxdWl6MzUvZ2FtZV9l cnJvci5yYlBLAQIUCxQAAAAIAFazzzKvSkOqqwQAAKgMAAAcAAAAAAAAAAEAIAAAAHsLAABy dWJ5cXVpejM1L3Bhd25fdmFsaWRhdG9yLnJiUEsBAhQLFAAAAAgAo7nNMrSfLuswAAAAPAAA ABUAAAAAAAAAAQAgAAAAYBAAAHJ1YnlxdWl6MzUvUkVBRE1FLnR4dFBLAQIUCxQAAAAIAEa+ zDLhx8l8HgAAACIAAAARAAAAAAAAAAEAIAAAAMMQAABydWJ5cXVpejM1L3J1bi5yYlBLAQIU CxQAAAAIANsOzzIOUEGmeQIAACMFAAAUAAAAAAAAAAEAIAAAABARAABydWJ5cXVpejM1L3J1 bm5lci5yYlBLAQIUCxQAAAAIAFCozzJ3UvK7QgAAAHwAAAASAAAAAAAAAAEAIAAAALsTAABy dWJ5cXVpejM1L3Rlc3QucmJQSwECFAsKAAAAAAAjuc8yAAAAAAAAAAAAAAAAEQAAAAAAAAAA ABAAAAAtFAAAcnVieXF1aXozNS90ZXN0cy9QSwECFAsUAAAACAC6q84yS7MEIuYCAAAOCQAA GQAAAAAAAAABACAAAABcFAAAcnVieXF1aXozNS90ZXN0cy9ib2FyZC5yYlBLAQIUCxQAAAAI AGW1zzKUzUPM1QIAAPMOAAAYAAAAAAAAAAEAIAAAAHkXAABydWJ5cXVpejM1L3Rlc3RzL2dh bWUucmJQSwECFAsUAAAACABBvc0yzpgls/sBAAD7CQAAHwAAAAAAAAABACAAAACEGgAAcnVi eXF1aXozNS90ZXN0cy9nYW1lX2Jpc2hvcC5yYlBLAQIUCxQAAAAIACO5zzKWz2bceAIAAC0N AAAdAAAAAAAAAAEAIAAAALwcAABydWJ5cXVpejM1L3Rlc3RzL2dhbWVfa2luZy5yYlBLAQIU CxQAAAAIAGkGzjKgZ+G3CgIAABsMAAAfAAAAAAAAAAEAIAAAAG8fAABydWJ5cXVpejM1L3Rl c3RzL2dhbWVfa25pZ2h0LnJiUEsBAhQLFAAAAAgA7rPPMi/8LNWeBQAAICwAAB0AAAAAAAAA AQAgAAAAtiEAAHJ1YnlxdWl6MzUvdGVzdHMvZ2FtZV9wYXduLnJiUEsBAhQLFAAAAAgA1APO Mux8F/PgAQAAXgkAAB4AAAAAAAAAAQAgAAAAjycAAHJ1YnlxdWl6MzUvdGVzdHMvZ2FtZV9x dWVlbi5yYlBLAQIUCxQAAAAIAEyjzjL+kMdSgwEAANcFAAAdAAAAAAAAAAEAIAAAAKspAABy dWJ5cXVpejM1L3Rlc3RzL2dhbWVfcm9vay5yYlBLAQIUCxQAAAAIAJixzzKtcupKpwIAANQG AAAiAAAAAAAAAAEAIAAAAGkrAABydWJ5cXVpejM1L3Rlc3RzL3Bhd25fdmFsaWRhdG9yLnJi UEsBAhQLFAAAAAgAe6PPMo3F25a3AgAAtAgAABoAAAAAAAAAAQAgAAAAUC4AAHJ1YnlxdWl6 MzUvdGVzdHMvcnVubmVyLnJiUEsFBgAAAAAWABYAFwYAAD8xAAAAAA== --------------000307020708020909010405--