Best Game

最高のゲーム

受賞者:Raphael Meyer

引用元:https://www.ioccc.org/2006/meyer/meyer.c

審査員・作者による説明:https://www.ioccc.org/2006/meyer/hint.text

動作

数独を対戦ゲームにしたもの。

$ gcc -o meyer meyer.c

$ ./meyer

. . .  . . .  . . .   a
. . .  . . .  . . .   b
. . .  . . .  . . .   c

. . .  . . .  . . .   d
. . .  . . .  . . .   e
. . .  . . .  . . .   f

. . .  . . .  . . .   g
. . .  . . .  . . .   h
. . .  . . .  . . .   i

0 1 2  3 4 5  6 7 8

you:

数字を置く場所を聞かれる。 a 0 1と書くと、「a-0の位置に数字1を置く」という意味になる。

you: a 0 1

1 . .  . . .  . . .   a
. . .  . . .  . . .   b
. . .  . . .  . . .   c

. . .  . . .  . . .   d
. . .  . . .  . . .   e
. . .  . . .  . . .   f

. . .  . . .  . . .   g
. . .  . . .  . . .   h
. . .  . . .  . . .   i

0 1 2  3 4 5  6 7 8

cpu: e 8 3

1 . .  . . .  . . .   a
. . .  . . .  . . .   b
. . .  . . .  . . .   c

. . .  . . .  . . .   d
. . .  . . .  . . 3   e
. . .  . . .  . . .   f

. . .  . . .  . . .   g
. . .  . . .  . . .   h
. . .  . . .  . . .   i

0 1 2  3 4 5  6 7 8

you: a 1 2

CPUはe-8に3を置いた。

数独のルールに違反するような置き方はできない。この制約の下で、お互いにマスに数字を1つずつ置いていき、どこにも置けなくなった方の負け。

解説

コードの特徴としては、オブジェクト指向を意識しながら書いたらしい。 FGHIが4つのクラスを意識しているようで、NF()NH()などがnew相当。 関数ポインタの配列Mが全クラスのメソッドテーブルになっており、Fは0番目から5つ、Gは5番目から4つ、などが所属メソッドになっていると思う(このオフセットはLで定義されている)。 0番目のメソッドに対応する関数ポインタはnew相当の関数から呼び出されるので、コンストラクタ相当。 Gのコンストラクタは0なので、これは直接newすることがない抽象クラス相当と思われる。 NH()NI()の返り値が(G*)にキャストされているので、これらの親クラスということか。