ここでは,sasanqua_neufの文法を除いた仕様について説明します.文法についてはこちらをご覧ください.
sasanqua_neufの動作を一言で説明すると,
となります.以下,より詳しく説明します.
以後,各変数の詳細は後述するものとし,先に定義を述べます.
テープ:T とは,添え字を整数とする,整数の配列T[n] (n=0,±1,±2,…) のこととします.
テープ読み位置:H ,コード読み位置:C ,ルーチン限度:L_1,L_2 は,それぞれ整数変数であるとします.
ルーチン:R_1,R_2 とは,それぞれ123456789の順列 嗜好フラグ と1~9を値にとる変数 思考フラグ の組とします.たとえば,R_1=(123456789,9),R_2=(987654321,1)などとなります.
終了処理:E_1,E_2 とは,それぞれ1~9を値にとる変数とします.
ゲーム盤:B ,または単に 盤:B とは,0,1,2の3つの数を元とする長さ9の配列B[1],...,B[9]を意味するものとします.(←B[0]がないことに注意してください.)
この盤は,3×3の配列とみなせることに注意しておきます.すなわち,B[m]=B'[(m-1)/3][(m-1)%3]なる二次元配列B'[3][3]を考えることができる,ということです.イメージ的には,
上の枠の中に0,1,2の数を書き込んだものが盤に対応します.この盤の左上(の中身)がB'[0][0],上がB'[0][1],…,下がB'[2][1],右下がB'[2][2]と,それぞれ対応しているとしましょう.このとき,Bを用いて書き直すと,左上から順に
B[1] B[2] B[3]
B[4] B[5] B[6]
B[7] B[8] B[9]
ということになります.
B[m]には,このようにB'[x][y]を考えた場合の幾何学的構造が反映されるものとします.
なお,B[m]の値として0が空白に,1が先手コマに,2が後手コマにそれぞれ対応しますが,詳細は次で説明します.
sasanqua_neufに登場する変数は,上に挙げたものが全てとなります.
※T[n]は,実装上は無限でない場合を含みますので注意してください.コンパイラやインタプリタの製作者は,T[n]のスタックが事前に確保していた範囲を超えた際にメッセージを出すなどの対処を行うことが推奨されます.T[n]の値域についても同様の対処が推奨されます.
3目並べを行うことを 対局 と言います.以下,対局について説明します.
盤のある一つの0を,1または2で置換することを,手を指す と言います.対局は,先手 (1)と 後手 (2)が交互に手を指すことで進みます.先手・後手が盤のどこに手を指すかは,それぞれのルーチンによって決められ,対局は自動的に進行します.対局開始の時には,盤は0で初期化されています.
先手が一手指したとき,1が上の図の「タテ」「ヨコ」「ナナメ(45°)」のいずれか少なくとも一つの列で3つ揃った場合,先手勝ち となります.同様に,後手が一手指して2が揃った場合,後手勝ち となります.先手勝ちにも後手勝ちにもならず,9マス全てが1または2のいずれかで埋まった場合,引き分け となります.先手勝ち,後手勝ち,引き分けを合わせて 対局終了 と呼びます.
リーチ とは,簡単に言うと相手の手を無視すれば勝てる状態のことです.以下,詳しく説明します.
「タテ」「ヨコ」「ナナメ」のいずれかの3つのマスからなる列であって,先手のコマで2つ埋まっていて,さらに残り一つが空白のものが存在するとき,この列を リーチ列 と呼びます.先手のリーチ列が存在するとき先手は リーチ であると言い,この空白は先手の リーチマス であるといいます.同様に,後手のコマ2つだけが埋まっている列があるとき,後手はリーチであると言い,その空白を後手のリーチマスといいます.
ルーチン とは,上で述べたとおり 嗜好フラグ と 思考フラグ の組です.先手ルーチンR_1と後手ルーチンR_2があります.
嗜好フラグ(または 優先順位 )とは,後述の思考フラグによって次の一手が定まらないとき,どこに指すかの優先順位を示すもので,1から9までの自然数9個の順列になっています.この順列において,左にある数と対応するマスほど優先順位が高いと解釈します.たとえば,
987654321
という列があった場合,B[9]を最優先し,B[8]を次に優先し,…,他の全てが埋まっているときのみB[1]に指す,ということを意味します.このような解釈が任意の順列に対し適用されるものとします.
思考フラグ とは,1~9の値をとる変数で,以下のf_1,f_2,f_3,f_6に基づく判断を行うかどうかを定めます.
思考フラグの値は,行う判断f_iの添え字iの和+1になります.たとえば,f_1とf_3を用いる場合,思考フラグの値は1+3+1=5となります.f_1とf_2,f_3とf_6は,それぞれ同時に指定することはできません.(f_2はf_1を含み,f_6はf_3を含みます.)
また,f_3,f_6はf_1を含まないということに注意してください.つまり,f_1を指定せずf_3やf_6を指定した場合,他に勝つ手があるのにそれよりもリーチになる手を優先する場合がある,ということです.
思考フラグに1以外を指定した場合,まず上述の条件に合う手があるか調べます.条件に合う手が存在する場合は,その手を次の手として決定します.条件に合う手が複数あった場合は,それらの中から優先順位によって決めます.条件に合う手がなかった場合,盤の空白の中から優先順位によって決めます.なお,思考フラグの判断を 2つ指定した 場合(5,6,8,9),添え字の小さい条件から判定をして,条件に合う手が見つからない場合に次の条件の判定に移ります.
※f_1に限り,候補が複数ある場合,いずれを選んでもよいとします.
実行時の動作のフローチャートは,次のようになります.
実行時,はじめにT[n],B[1],...,B[9],H,C,L_1,L_2,E_1,E_2の全ての変数は,0に初期化されるものとします.
ルーチンセット時には,次のことを行います.
L_1=0かつL_2=0の場合,L_1≠0になるか実行が終了するまで先手のルーチンセットを行います.つまり,この条件で読み込んだ限度数が0であった場合,後手のセットの前に再び先手のセットが行われます.
対局終了時には,終了処理として以下のことを行います.
以上で,文法を除いたsasanqua_neufの仕様が規定されます.ソースの文法に関しては,こちらをご覧ください.
※演算子/および%は,それぞれ整数の割り算の商および剰余を意味します.