自分のスキルでご飯食べられるといいなぁ
というわけで、これ(http://headlines.yahoo.co.jp/hl?a=20100404-00000003-zdn_ep-sci)に挑戦してみました。
実時間は3時間くらいかかったけど、合間に別のことやったりしたから実際は1時間半くらい。
簡単にソースの解説を置いておくと、
- yaku構造体に面子を木構造で入れていって、最後に木を解体しながら出力してる感じ
- 本当は構造体の名前はyakuじゃなくてmentsuにすべきだったけど、コーディング終わってから気づいた
- 333345みたいな牌のときに、(333)(345)と(345)(333)と二通り出ないように、刻子と頭は前の面子の最初の要素と異なっているか確認するようにした
- (33)(33)とか(33)[33]とかありえないから考えなくていいし。
- 七対子って、同じ牌4子は成立しないらしいね。プログラム終わってから気づいたから直してないけど
- "atamable"(頭にすることが出来るか)って変数名が頭悪そうな感じでちょっと気に入ってる
- 九蓮宝燈ってちゃんと役の形になってたんだね……
実行結果とソースを下のほうにぺたり。
//あと、待ちを出力するプログラム、って当たり牌を表示するプログラムのことだろjk……。
エイプリルフール(事後報告)
来年まで公開しないでおいて、来年のエイプリルフールのネタとして使おうかどうか迷ってたらこんなにゆっくりしてしまったよ!
身内向けにエイプリルフールなプログラムを作ったので、一般公開。前日に6時間ほどで作ったものなので、完成度低いです。経緯としては、
前に友人とウィンドウをブロックに見立てたテトリスの話をしたことを、エイプリルフールのネタとして作ることを思いつく ↓ BGMとして、Windowsの効果音を使用したコロブチカに挑戦するも、あきらめる。計画凍結(3/26くらい) ↓ ちょっと暇だったので、突発的に製作開始。BGMなし(3/31 18時くらい) ↓ ちょっと遅刻しつつ完成(4/1 1時くらい)
こういう感じです。本当なら次に落ちてくるブロックや、スコア表示もする予定だったけど……。短時間での突貫作業なので、ソースが大変なことになっててもう見返したくないです。
バイナリはこちら。スクリーンショットはこんなかんじ。
今年は諸事情によりだいぶ暇になるので、今度こそ何かしらゲーム作りたいです。
もはや休みにすら更新しない(略
気がついたら夏休み終わって大学始まったよ!
この夏休みを思い返すと、Vistaの再インストールぐらいしかやったことを思い出せない。あとサークルのちょこっとしたものを修正したくらいか。
これからは大学始まるし、ちゃんと有意義に時間を過ごさなくては。なんて明日1限から授業がある予定なのにこんな時間まで起きてる夏休み感覚が抜けていない自分が言ってみる。
prxモジュールを作ってAPIをフックしたい(4)
前回からかなり時間がたってるから、過去の記事を読み返していろいろ思い出すと、フックする予定の関数が内部でsyscall呼んでるせいでジャンプ先がわからなくて、フック出来ねーよ!ってことだった。syscallで発生した例外でジャンプする先がわからなくて諦めたわけだけど、"PSP Exception Vector"とか入れてググってたら、こんなページが出てきた(yet another PlayStationPortable Documentation)。このドキュメントのCOP0のところを読んでると、COP0のコントロールレジスタにsyscallの例外ベクトルの位置があるらしい。MIPSのドキュメントを読んでもそんなこと書いてなかったので、たぶんPSPのCPU独自の設計なんだろう。というか、このレジスタ書きかえれば例外ベクトルの位置変わるんじゃね、とかいろいろ思ったけど自分で例外処理するのも大変そうなので、別の方法を探すことにする。
syscallされた実際の関数がどう処理されるのか、ってことが知りたくていろいろ漁ってると、PS2DEVにこんなドキュメントが置いてあった(http://ps2dev.org/psp/Tutorials/PSP_Modules,_Exports,_Imports_and_Patches)。PSPのモジュールの作り方や、モジュールがどう配置されてるか、どうやってパッチを当てるか、みたいな事が英語で書いてあるらしい。がんばって読んで、わかったことにしとこう……。
縦横比を固定したままウィンドウ(Form)を拡大縮小したい
タイトル通り、縦横比を保ったまま、.NETのFormのサイズを変更したかった。で、FormのResizeイベントのドキュメントを見てみると、Formを正方形に保つサンプルが載ってた。それを参考に、FormのClientSizeを4:3に保つコードを書いてみた。
const double fixedRate = (double)4 / 3; private void Form1_Resize(object sender, EventArgs e) { ClientSize = new Size((int)(fixedRate * ClientSize.Height + 0.5),ClientSize.Height); }
これだけで4:3に固定されたよ!やったね!と言いたい所だけど、これだけだとまずい。まず、サイズが変わるたびにちらつく。ついでに、角とか辺とかでサイズ変更すると挙動が若干怪しい。まぁ、挙動はちゃんと書けばどうにかなるような気はするが、SuspendLayoutとか入れたりしたけどちらつきはどうにもならなかった。
続きを読む