Programmer's Nightmare 改良案

昨日のオフライン対人戦で、やはりこれはルールが複雑すぎると思ったのでシンプルバージョンを作ることにした。
まずは例外的な処理をするカードを取り除いて行く。

  • 「ビットがなくても発動する唯一の命令」OVERSIGHT
  • 選択権なくビットの乗っている人がダメージを受けるPROGRAM_ERROR

この二つを取り除くとルールは「まず命令を並べてプログラムを配り、交互に所有権を表すビットを置いて行き、そのあと実行する。プログラムカウンタが自分の所有する命令に到達したらその命令を発動するかどうか決定できる」となる。

「ビットを置いている人が不利になるカード(PROGRAM_ERROR)」がなくなったので2人対戦に限定すると「他人の色のビットを作成」する BIT_MAKERは不要。(3人対戦では2位がビリを支援して試合を長引かせるなどもできるのであった方が面白いかも)

全員に1ポイントのダメージを与えるBUGがあるのだから、同様に全員に1ポイントの回復をするDEBUGがあってもいい。


GOTOのとび先の選択肢が少なくて使いにくいという案があった。改良案は1: とび先を+6だけではなく+5〜+7くらいに広げる 2: とび先を+6 or -6にする 3: とび先を6以上はなれた任意の位置(つまり二人対戦なら+6〜+8) くらいか。2, 3案だとREVERSEがとび先の選択肢に影響を与えなくなるのでよくないかも。

COPYとFUTUREは必須。FLOATERは挙動を明確にする必要がある。MULTIPLIERの必要性は低いがBIT_MOVERがあるから残した方がいいのか。DELETEはREMOVE_BIT、ERASEはREMOVE_CARDに名称変更。BIT_SWAPPERはINCREMENTできるように文面を加工してみた。

コピーについて: コピー対象のカードの内容ががコピーするカードに書かれているように実行する。複数のカードをコピーした場合、一部の内容だけを実行することはできない。

SEQUENCE MODをMOVE CARDに名称変更。INSTRUCTIONやCARDなどはCARDに統一する。

SWAP_INSTRUCTIONもSWAP_CARDに名称変更。いらない子説が濃厚なので、強化する。「直前二つ、直後二つ、直前と直後」のいずれかを交換。
UPGRADEのa cardを1 cardに変更。

  • ACQUIRE; 2ポイント回復する(3 cards)
  • BIT MOVER; 任意の1つのビットをそのビットが乗っているカードに隣接するカードに移動する(2 cards)
  • BIT SWAPPER; 任意の1ペア(二個のビット)を交換する。ただしペアのビットは異なる色で、異なるカード上に乗っていなければ行けない。(1 card)
  • BUG; 全員に1ポイントのダメージ。(2 cards)
  • COPY; 直前の2命令をコピーする。(2 cards)
  • DECREMENT; 任意のカードに書かれたアラビア数字を1減らす。複数の数が書かれている場合はどちらを減らすかを選択できる。--トークンを置くことで表現する。(2 cards)
  • DEFEND; 1ポイントのダメージを受ける代わりに、このカードの後に実行された2枚のカードによるダメージを無効化する。実行されなかったカードはカウントされない。(1 card)
  • REMOVE_BIT; 1個のビットを任意の1枚のカードから取り除く。(1 card)
  • REMOVE_CARD; このカードの直前のカードを取り除く。(2 cards)
  • FLOATER; このカードを1つ前または後ろのスペースに移動し、実行順で次のカード内容をコピーする。(2 cards)
  • FUTURE; 直後の2枚のカードをコピーする。(2 cards)
  • GOTO; プログラムカウンタを6進める。一度実行されると、ジャンプ先はその対象カードにロックされる。対象カードが削除されるとGOTOは効果を失う。(3 cards)
  • INCREMENT; 任意のカードに書かれたアラビア数字を1増やす。複数の数が書かれている場合はどちらを増やすかを選択できる。++トークンを置くことで表現する。(2 cards)
  • MULTIPLIER; このカードにビットがおかれているすべてのプレイヤーが新しいビットを1つ得る。新しいビットはこのカードにおかれる。(1 card)
  • OVERWRITE; 1枚のカードに乗っているひとつのビットをあなたの色のビットに変更する。このカードは一度使うと消滅し、代わりにデッキから新しいカードを置く。置かれているビットはそのまま残る。(2 cards)
  • POINTER; 直前に実行された2枚のカードによって自分が受けたダメージを誰かにリダイレクトする。(1 card)
  • POWER_SURGE; このカードにビットが置いていないプレイヤーは3ダメージを、ビットを置いているユーザは1ダメージを受ける。(2 cards)
  • REPLACE; デッキからカードを引き、任意の一枚を置き換える。置かれたビットは変化しない。++トークンと--トークンは消滅する。(1 card)
  • REVERSE_PROGRAM; プログラムの実行順序を反転する。(2 cards)
    • 備考: 複数のビットが置かれている場合、後のプレイヤーが先のプレイヤーの決定をさらに反転することができる。
  • SELF_DESTRUCT; 1人のプレイヤーに4ポイントのダメージを与える。このカードは消滅する。(1 card)
    • 備考: 複数のビットが乗っている場合、 最初の1個の爆発ですべて失われる。
  • MOVE_CARD; 1個のカードをプログラム中の任意の場所に移動する。このカード自身を動かした場合、プログラムカウンタも一緒に移動する。(1 card)
  • SWAP_CARD; 直前の2つ、直後の2つ、または直前と直後のカードを交換する。
    • 備考: 「3つのカード」にインクリメントされた場合、3枚のカードの順番は任意(1 card)
  • TIME DELAY; "SKIP"トークンを得る。このトークンは任意のタイミングで発動して現在プログラムカウンタのある命令をスキップすることができる。(1 card)
  • UPGRADE; プログラム上のある位置を選び、そこに1枚のカードをドローして挿入する。(1 card)
  • WORM; 他の任意のカードにあなたの色のビットをひとつ追加する。(1 card)
  • ZAP; 他の一人のプレイヤーに1ポイントのダメージを与える。(3 cards)



この後このルールで2戦したんだけど、やはりまずはカードにそのカードの機能を書くことが重要だ。まあそれは想定してカードに書かれる短い文章と、余裕があれば捕足として各文章はわけてみたんだが。あとSKIPトークンが強い。SKIPトークンは1個以上持てないようにするべきかもしれない。まぁ、とりあえずのところ次にするべきことは処理系の実装だと思う。