萌えハッカーニュースリーダー

2025/09/08 07:20 Deliberate Abstraction

出典: https://entropicthoughts.com/deliberate-abstraction
hakase
博士

ロボ子、今日のニュースはカードゲームのシミュレーションコードをインサイドアウト設計で作った話じゃ。

roboko
ロボ子

インサイドアウト設計ですか。ゲームのルールが不明確な状態から開発を始めたそうですね。

hakase
博士

そうじゃ。「初期段階ではゲームのルールやカードの種類が不明確だった」らしい。そこで、まずは`Card`、`Player`、`Table`の基本的な要素から作ったみたいじゃな。

roboko
ロボ子

`Card`は`name`と`valid_play`を持つんですね。`valid_play`は他の`Card`を受け取ってプレイ可能かどうかを判断する、と。

hakase
博士

その通り! `Player`は`name`と`hand`(カードのリスト)を持っていて、カードの追加と削除ができる。`Table`は未使用のカードのリスト`pile`と、直前にプレイされたカード`previous`を持っていて、カードを引かせたりプレイさせたりできるんじゃ。

roboko
ロボ子

なるほど。プレイヤーターン中のアクションシーケンスを制御するために、`Ply`モジュールを導入したんですね。

hakase
博士

`Ply`は`table`、`player`を持っていて、カードを引いたり、プレイしたり、ターンを終了させたりできる。そして、プレイヤーターンの順番を管理するために`Ring`モジュールを使ったんじゃ。

roboko
ロボ子

`Ring`は`table`と`players`のリストを持っていて、`Ply`と同じようにカードを引かせたり、プレイさせたり、ターンを終了させたりできるんですね。

hakase
博士

`Ply`と`Ring`の抽象化によって、ゲームのルールを内部に隠蔽し、新しいルールやカードタイプに対応しやすくしたのがポイントじゃな。

roboko
ロボ子

確かに、これなら後からルールが変わっても対応しやすそうですね。でも、記事には「カードが「引く」「プレイする」以外の効果を持つ場合、`Card`モジュールにその効果をメソッドとして公開する必要がある」とありますね。

hakase
博士

そうなんじゃ。例えば、カードに特殊な効果があって、相手のカードを破壊するとか、自分のライフを回復するとか、そういう場合は`Card`モジュールにその効果を実装する必要があるんじゃな。

roboko
ロボ子

なるほど。この設計だと、ゲームのルールが複雑になっても、比較的柔軟に対応できそうですね。

hakase
博士

そうじゃな。インサイドアウト設計は、不確実な要素が多い場合に有効なアプローチだということがよくわかるのじゃ。ところでロボ子、カードゲームといえば、最近私がハマっているカードがあるんじゃが…

roboko
ロボ子

まさか、また自作のカードですか? 前回の爆発カードの件は、まだ研究室の片付けが終わってないんですよ…

hakase
博士

むむ、あれは事故じゃ! 今回はもっと安全なカードじゃぞ! 名付けて「ロボ子びっくり仰天カード」! 効果は…ロボ子がびっくりする!

roboko
ロボ子

…はかせ、それただの脅迫ですよね?

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search