「スパゲッティコード」ルール
「スパゲッティコード」ルール (人数 2人~5人 / プレイ時間 10分)
(ゲーム性は大きく違うので2人用に絞った方が良いかも。プレイ時間は長考の量による。チェスタイマーを使うのが良い)
入っているもの
コマンドカード10枚(+拡張コマンドカード5枚+ブランクカード3枚)
フラグチップ10個×5色: フラグチップの色はプレイヤーと1対1対応しています。
カーソル 1個
インクリメントチップ 5個
デクリメントチップ 5個
ライフカウンタ 5個×5色
ゲームの目的
自分以外のプレイヤーを全部倒すこと
倒し方
相手のライフを0以下にする
相手の色のフラグを0個にする
ルール説明
「スパゲッティコード」のルールは一度に全体を理解するのが難しいので、まずはレベル1の2人プレイからはじめて、ゲームに慣れてからレベル2、レベル3のルールに挑戦することがおすすめです。
■概要
「スパゲッティコード」のゲームは「コマンド準備フェーズ」「フラグ配置フェーズ」「プログラム実行フェーズ」の3つで構成されます。
「コマンド準備フェーズ」では、コマンドカードを場に並べ、先手後手を決めてゲームの初期状態を決定します。
「フラグ配置フェーズ」では、各プレイヤーがフラグチップをコマンドカードに配置していきます。これがプログラムを表現しています。
「プログラム実行フェーズ」では、カーソルを動かしながらフラグの状態によってコマンドを実行していきます。このフェーズはゲームが終了するまで続きます。
レベル1
https://gyazo.com/37a0e980e0eb8e750d11b3a6bc309534
■使うもの
レベル1ではフラグやプレイヤーのライフに影響を与えるコマンドだけが使えます。
コマンドカードの中からレベル1と書かれている5枚 AddFlag, MoveFlag, RemoveFlag, Bug, ForkBomb を選びます。
また、カーソルチップ1個、フラグチップ各色10個、ライフカウンタ各色5個を使います。
レベル1コマンドカード: 5枚
■ AddFlag: このコマンドカード以外の任意のコマンドカードの末尾にフラグを追加する
■ MoveFlag: 任意の{1}個のフラグを別のコマンドカードの末尾へ移動する
■ RemoveFlag: 任意の{1}個のフラグをゲームから取り除く
■ Bug: 任意の{1}人のプレイヤーのライフを{1}減らす
■ ForkBomb: 任意の1人のプレイヤーのライフを{2}減らし、このコマンドを起動したフラグをゲームから取り除く
■コマンド準備フェーズ
5枚のコマンドカードをシャッフルし、机の上に表向きに並べ、最初に置かれたカードにカーソルチップを置きます。
各プレイヤーにライフカウンタ5個とフラグチップ4個を配ります。
配られなかった各色残り6個のフラグチップは「未使用フラグチップ置き場」に置きます。
先手後手を決めます。
レベル1では先手が有利なので、不慣れな人を先手にします。
対等ならジャンケンで決めるか、直前に負けた人を先手にします。
より厳密な決め方については付録の「公平な先手決めアルゴリズム」を参照。
■フラグ配置フェーズ
先手が一つのコマンドカードを選び、そこに自分のフラグチップを配置します。次に後手が一つのコマンドカードを選んでそこにフラグチップを配置します。これを繰り返して4個のフラグを全部コマンドカードに配置します。フラグチップを置くことを「フラグを立てる」と呼びます。
フラグ配置フェーズでは同じコマンドカードに自分のフラグを2個以上立ててはいけません。
もしこれが可能な場合、1枚目のカードがBug, ForkBomb, RemoveFlagだと先手がそのカードに置き続けることで勝てるからです。
フラグはコマンドカードに配置された順に列を作ります。
これは「先に立てられたフラグの優先順位が高い」という事を意味しています。
どのコマンドにフラグを立てたかが勝敗に大きく影響しますが、はじめてプレイするときはどこにフラグを立てると有利なのかがわからないかもしれません。その場合は適当に配置してプログラム実行フェーズへ進み、一度通して体験してみると良いでしょう。
■プログラム実行フェーズ
カーソルが指しているコマンドカードにフラグが立っていない場合、カーソルは次のコマンドカードに移動します。
フラグが立っている場合、先頭フラグのプレイヤーが、コマンドの実行をする権利があります。実行しないという選択も可能です。
コマンドの発動が終った後、列に他のフラグがある場合は、次のフラグのプレイヤーに実行の権利が与えられます。
列の最後までこれを繰り返し、全てのフラグの処理が完了したら、カーソルは次のコマンドカードへ移動します。
カーソルが最後のコマンドカードでの処理を終えたら、また最初のコマンドカードに戻ります。ゲームが終わるまでこれを繰り返します。
「自分のフラグはひとつのコマンドカードに一個まで」という制約は、最初にフラグを配置するときだけです。
AddFlag(フラグ追加)やMoveFlag(フラグ移動)のコマンド実行によってひとつのコマンドカードに複数のフラグが立つことは問題ありません。
RemoveFlag(フラグ削除)で取り除かれたフラグはゲームから取り除かれます。「未使用のフラグチップ」には戻りません。未使用のフラグチップ6枚を使い切ってしまった場合、AddFlag(フラグ追加)でフラグを追加することはできません。
■ゲームの終了
自分以外のプレイヤーのフラグチップをすべて取り除くか、自分以外のプレイヤーのライフを0以下にすると勝利です。
レベル2
■使うもの
レベル1の用具にレベル2のコマンドカード MoveCommand, RemoveCommand, Reverse を追加して使います。レベル2の島ではカーソルの動く向きやコマンド自体に対して効果を発揮するコマンドが使えます。
レベル2コマンドカード: 3枚
■ MoveCommand: {1}つのコマンドカードxをプログラム中の任意の位置に移動する。
xに立っているフラグは、xと一緒に移動する
■ RemoveCommand: 任意のコマンドカードxを立っているフラグごとゲームから取り除く。
カーソルがxを指している場合は、カーソルは次のコマンドへ移動する。
■ Reverse: カーソルがコマンドカードをなめる向きを反転する
■フラグ配置フェーズ
レベル1より1個多い、5個のフラグを配置します。残りの5個は「未使用フラグチップ置き場」におきます。
■プログラム実行フェーズ
レベル2で追加された RemoveCommand はフラグごとコマンドカードを取り除くとても強力なカードです。また、一見貧弱な Reverse や MoveCommand も他のカードとの組み合わせで強力なコンボを生み出します。
例
(AddFlag A)(MoveCommand A)(ForkBomb A)
この状態だと「AddFlagでFormBombにフラグを追加、MoveCommandでMoveCommandをAddFlagの手前にカーソルごと移動し、AddFlagを再度実行してFormBombにフラグを追加、FormBombを3回実行して相手に6ダメージ」という勝利確定コンボが発生します。つまりプレイヤーBは負けないためにはフラグ配置フェーズでMoveCommandにフラグを立てる(もしくはAddFlagに立て、発動時にMoveCommandに立てる)必要があるわけです。
フラグ配置フェーズでは交互にフラグを立てながら「自分が勝つためのプログラムを構想し、実装すること」と「相手の書いているプログラムの意図を理解し、妨害すること」をやるわけです。これがこのゲームのコアコンセプトです。
■ゲームの終了
レベル2では、レベル1での勝ち方に加え、RemoveCommandによって敵の最後のフラグを取り除く勝ち方が起こり得ます。RemoveCommandによって敵味方すべてのフラグが取り除かれる場合、先頭フラグのプレイヤーが勝利します。
レベル3
■使うもの
レベル2の用具にレベル3のコマンドカード Increment, Decrement と Increment/Decrementチップを追加します。レベル3のコマンドでは他のコマンドの強さ(パラメータ)に対して影響を与えることができます。
レベル3コマンドカード: 2枚
■ Increment: 任意のパラメータ(波括弧で囲まれた数値)を{1}増やす
■ Decrement: 任意のパラメータ(波括弧で囲まれた数値)を{1}減らす。
ただし数値をマイナスにすることはできない。
■フラグの配置フェーズ
レベル2より1個多い、6個のフラグを配置します。
■プログラム実行フェーズ
IncrementとDecrementは、任意のコマンドを選んで、パラメータ(波括弧で囲まれた数値)を変更します。たとえば RemoveFlag の 「任意の{1}個のフラグをゲームから取り除く」を Increment すると、数字が1増やされ「任意の{2}個のフラグをゲームから取り除く」にかわります。一方、 Decrement すると「任意の{0}個のフラグをゲームから取り除く」となり、何の効果も起きないコマンド(NOP)に変わってしまいます。
Decrementの効果で数値をマイナスにすることはできません。コマンドが複数のパラメータを持つ場合、どちらか片方を選んで変化させます。
パラメータにIncrement/Decrementが掛かっていることは、Increment/Decrementチップをコマンドカードに置くことで表現します。
IncrementされたパラメータがDecrementされた場合は両方のチップを置くのではなく、先に置かれたIncrementチップを取り除きます。逆も同様です。
めったにないことですが、各5個のIncrement/Decrementチップを使いきってしまった場合はそれ以上Increment/Decrementできません。
膠着状態の解決アルゴリズム
まれに将棋の千日手のように、お互いが自分のやりたい行動を選ぶと状況が全く変わらなくなってしまう事態が発生します。一度発生した盤面状況が再度発生し、プレイヤーのどちらかが「これは膠着状態だ」と宣言するかと即座にゲームが終了します。この時、
• ライフが多い方が勝ち
• ライフが同点の場合、コマンドカードに乗っているフラグチップの多い方が勝ち
• 同数の場合「列の先頭にいるフラグ」が多い方が勝ち
• それも同数の場合、現在のカーソルのあるカードの先頭フラグのプレイヤーが勝ち
となります。宣言するかどうかは自由です。盤面状況は、未使用チップの枚数を含みます。
レベル1コマンドカード: 5枚
■ AddFlag: このコマンドカード以外の任意のコマンドカードの末尾にフラグを追加する
■ MoveFlag: 任意の{1}個のフラグを別のコマンドカードの末尾へ移動する
■ RemoveFlag: 任意の{1}個のフラグをゲームから取り除く
■ Bug: 任意の{1}人のプレイヤーのライフを{1}減らす
■ ForkBomb: 任意の1人のプレイヤーのライフを{2}減らし、このコマンドを起動したフラグをゲームから取り除く
レベル2コマンドカード: 3枚
■ MoveCommand: {1}つのコマンドカードxをプログラム中の任意の位置に移動する。
xに立っているフラグは、xと一緒に移動する
■ RemoveCommand: 任意のコマンドカードxを立っているフラグごとゲームから取り除く。
カーソルがxを指している場合は、カーソルは次のコマンドへ移動する。
■ Reverse: カーソルがコマンドカードをなめる向きを反転する
レベル3コマンドカード: 2枚
■ Increment: 任意のパラメータ(波括弧で囲まれた数値)を{1}増やす
■ Decrement: 任意のパラメータ(波括弧で囲まれた数値)を{1}減らす。
ただし数値をマイナスにすることはできない。
Extra: エクストラカード: 2枚(+Blank3枚)
■ ReversePriority: このコマンドカード以外のすべてのコマンドカードに立っているフラグの優先順位を反転する
■ Memory: カーソルがこのコマンドカードの直前とその前に指していたコマンドを実行する。
両方を発動するか両方を発動しないかのどちらかしか選べない。
■ Blank: ここにあなたが新しいコマンドを書き込んで、このゲームを変えていくことができる
Instant: 即時コマンドカード: 3枚
■ MoveCommand: {1}つのコマンドカードxをプログラム中の任意の位置に移動する。
xに立っているフラグは、xと一緒に移動する
■ MoveFlag: 任意の{1}個のフラグを別のコマンドカードの末尾へ移動する
■ Bug: 任意の{1}人のプレイヤーのライフを{1}減らす
攻略ヒント
■先にフラグを立てた方が有利なコマンドとそうでないコマンドがあります。例えば MoveCommand や Reverse は後から逆の操作をすることで先の人の操作を打ち消せるので後の人が有利です。一方、 RemoveFlag や MoveFlag は先のフラグが後のフラグを削除したり動かしたりすることができるので先の人が有利です。
■フラグ配置フェーズで一つのコマンドに各色一つまでしかフラグを立てられないルールの場合、敵が先にフラグを立てたコマンドカードにはすぐにフラグを配置しないほうが有利です。フラグ配置フェーズでは一手ごとに相手の選択肢を狭めていくのですが、そのコマンドにフラグを立てる選択肢は奪われないからです。
■ Decrement によって無効化されたカード(NOP)は MoveFlag などでフラグを移動させる先としてとても都合がいいです。しかし、そのカードを Increment される可能性があります。
■ Increment されたカードには自分のフラグをたくさん立てたくなると思いますが、 RemoveCommand によってまとめて取り除かれる可能性があります。
■ FormBomb は、まず相手のライフを減らし、それからフラグが取り除かれます。最後の一つのフラグが自分の身を犠牲にして相手のライフを削りきり、ギリギリ勝つこともありえます。
■ レベル1では RemoveFlag は相手の4個のフラグの1個を削り、さらに相手の行動手数を減らすので、ダメージの割合としては25%を超えています。相手のライフ5のうちの1を減らす Bug は20%のダメージなので弱く、自分のフラグが1個減り相手のライフを2減らす ForkBomb は 40% - 25% で、さらに弱いです。しかし AddFlag のカードによってフラグが追加されたり、レベルが上がってフラグの個数が増えたりすると、この強弱関係は影響を受けます。
■ RemoveFlag(フラグ削除)の対象フラグがゲームから取り除かれるルールによって、あるプレイヤーが AddFlag でフラグを増やし、別のプレイヤーが RemoveFlagでフラグを減らすループは無限ループになりません。いずれ、AddFlag で追加できる未使用のフラグがなくなるからです。「膠着状況の解決アルゴリズム」に「盤面状況は、未使用チップの枚数を含みます」条項があることによって、このループは膠着状態と判定されません。
■ Reverse(カーソルの巡回方向を反転)は、カーソルがコマンドをなめる順序が変わるだけで、コマンドの中で先頭のフラグが先に実行されることは変わりません。その順序の反転はエクストラカード ReversePriority で導入されます。しかし、Reverse でフラグの実行順序も反転するルールにしても、大きな問題は見つかっていないので、事前にプレイヤー同士で合意すれば亜種ルールとしてプレイ可能です。
■ RemoveCommand で敵味方すべてのフラグが取り除かれる場合、その先頭フラグのプレイヤーが勝利します。このルールは、事前に明確に決まっていることが重要で、先頭が勝つのか末尾が勝つのかの決め事はどちらでも良いと考えています。なので変えてプレイ可能です。
人にルールを教える時のコツ
レベル1から徐々にやりましょう
先手が有利なので相手に先手を渡しましょう
フラグ配置フェイズで相手が何をしたらよいかわからなくて悩むようなら、先頭の島から交互に置きましょう。
あなたは不利な状態から始めることになるので、長考して形勢を逆転したいと感じるかもしれません。しかし、それをやると相手は、長時間待たされた上に負けて、まったく楽しくありません。今勝つことより勝負の相手を育てることを優先しましょう。
拡張ルール
レベル3のルールに慣れて、物足りなくなった人のために拡張ルールがあります。
拡張ルール::ReversePriorityの導入
エクストラカードの ReversePriority を使います。このコマンドは他のコマンドのフラグの順序を反転します。
ReversePriority のないルールでは、同じコマンドに複数のフラグがある場合、全てに順番に実行権限が与えられました。 ReversePriority カードを入れる際にはこのルールが変更されます。カーソルが訪れるたびに、先頭のフラグだけに実行権限が与えられます。先頭のフラグはコマンドの実行を行った場合、列の末尾に移動します。コマンドの実行を行わなかった場合には、先頭のまま残ります。
このルールは「コマンドを実行しない」という選択肢の価値を高めます。列の後ろのフラグから発動のチャンスを奪う効果を持つからです。
またカーソルの移動が速くなることでコンボが作りやすくなります。
拡張ルール::Memory の導入
エクストラカードの Memory を使います。カーソルは直前およびその前に訪れたコマンドカードのコマンドを記憶し、Memoryコマンドではそれを思い出して発動することができます。
この時、Memory のカードに、直前およびその前に訪れたコマンドカードのデフォルトの記述がそのまま書かれているかのようにふるまいます。プレイ中に Increment/Decrement されていても、その島の上に相手のビットが乗っていても、関係ありません。また、2つのコマンドの両方を発動するか、両方を発動しないか、のどちらかしか選べません。先に2つ前のコマンドが実行され、次に直前のコマンドが実行されます。
拡張ルール::即時コマンドカードの導入
「スパゲッティコード」のルールは隠された情報や運の要素が全くない、将棋や囲碁のようなものです。それが気に入らない人向けに、即時コマンドカード拡張は隠された情報と運の要素を導入します。この拡張は、相手の行動の予測不能性を高めます。
レベル3の用具に即時コマンドカードを追加して使います。
コマンドカードを並べた後、フラグを配置する前に、即時コマンドカードを伏せた状態で先手がシャッフルし、後手が1枚選び、先手が1枚選びます。選ばれなかった1枚はゲームが終わるまで伏せたままにします。ゲームに観測できない情報を追加し、プログラムの意図推測の難易度を高めるわけです。
プログラム実行フェーズの、自分のフラグがコマンドを実行するタイミングで、そのフラグが置かれたコマンドカードのコマンドではなく、即時コマンドカードのコマンドを実行することができます。即時コマンドカードは実行されるとゲームから取り除かれます。
即時コマンドカードは使用するまで伏せておくことができます。通常は相手に情報を与えないために伏せておくことが好ましいでしょう。ただし「即時コマンドカード」は「任意のコマンドカード」に含まれます。
拡張ルール::多人数プレイ時のインタラプト
理論上は色の違うフラグコマを用意すれば何人でもプレイできます。ただ、このゲームはプレイヤー間のインタラクションが強いので、一人の人が集中攻撃を受けて早期に脱落する可能性があります。
脱落者はゲーム終了まですることがなく退屈です。そこで「インタラプト(割り込み)」という拡張ルールを考えました。
脱落者はカーソルが最初のコマンドカードに戻るたびに1ビットを手に入れます。任意のタイミングで「インタラプト」と叫ぶことで、割り込みを発生させ、任意の島の末尾にフラグを追加できます。(この追加ルールはあまりテストプレイをしていません。ゲームが収束しにくくなりプレイが長時間になってしまう可能性があります。)
拡張ルール::順次オープン
フラグ配置フェーズの方法を変える亜種ルールです。フラグ配置フェーズで全てのカードがオープンされている場合、プレイヤーが長考しがちです。そこで意思決定時に与えられる情報を制限することでフラグ配置フェーズを軽くし、プログラム実行フェーズでなんとかしようと頑張るところにウェイトが置かれるようにします。
まずコマンドカードを伏せて並べます。
まず1枚目を開き、先手がフラグを置くかパスかを決めます。次に後手がフラグを置くかパスかを決めます。両方がパスをすれば、次の島を開きます。1つの島には自分のフラグを複数配置できないので
「先手置く、後手置く、先手パス、後手パス」●○ 次の島は●が先手
「先手置く、後手パス、先手パス」● 次の島は○が先手
「先手パス、後手置く、先手パス、後手パス」○ 次の島は●が先手
「先手パス、後手置く、先手置く、後手パス、先手パス」○● 次の島は○が先手
「先手パス、後手パス」次の島は●が先手
後は普通にプレイします。
付録: 2人プレイでの公平な先手決めアルゴリズム
運の要素を極限まで取り除きたい人向けに、公平に先手を決める方法を解説します。
まず、片方のプレイヤーAがカードを配ります。好きな順番に並べても構いませんし、シャッフルして並べても構いません。
シャッフルした場合、プレイヤーAは配られたカードを見てから「この並びでは先手か後手が有利だ」と思った場合には配り直すことができます。
そして、カードを配らなかった側のプレイヤーBは、自分が先手でプレイするのか後手でプレイするのかを選ぶことができます。プレイヤーBは自分が有利だと思う側を選べばいいのでこの選択に不満がなく、プレイヤーAもどちらを選ばれても不利にならないように並べればいいのでやはり選択に不満はないはずです。
履歴と謝辞
このゲームの「コマンドの上にフラグが立つ」という着想はTom JollyによるProgrammer's Nightmare(2000)から得ています。このゲームが入手困難だったため、西尾がクローンを作り、中山ところてん氏とのテストプレイと議論によって実行フェーズでのランダム性をそぎ落とす変更を入れました(2009)。これはSimplified version of Programmer's Nightmareと呼ばれています。その後、ファンタジー風に寄せた「スパゲッティモンスターの戦い」を作り、長らく放置した後2017年にルールブックをインターネット上に公開しました。この「スパゲッティコード」は2019年に、プログラミング風のフレーバーに再移植されたものです。
カード画像
ルールブック(簡略化版)