本発明の囲碁の死活判定システム1(以下、単に「死活判定システム1」という)は、インターネットなどのネットワークを介した囲碁の対局システムにおいて、あるいはネットワークを介さない囲碁の対局システムにおいて、用いることが出来る。なお、本明細書では対局システムと同時に、死活判定システム1を用いる場合を説明するが、死活判定システム1単独で機能させることも可能である。その場合にも同様に処理が行える。
図1に、本発明の死活判定システム1を備えた、ネットワークを介した囲碁の対局システムの構成の一例を模式的に示す。この場合、各対局者が利用するコンピュータ端末(対局者端末3)と、対局システムを実現するサーバ2とがネットワークを介して情報の送受信が可能である。本明細書では、対局システムと死活判定システム1とは同一のサーバ2内で処理が実行される場合を示すが、異なるサーバ2で処理が実行されていても良い。また上述のように、サーバ2で対局システムが実現されるほか、死活判定システム1を備えた対局システムが対局者端末3に備えられることで、ネットワークを介さずに本発明に係る処理が実行されても良い。また、対局システムに本発明の死活判定システム1がその機能として組み込まれ、一体的に構成されていても良い。
本発明の囲碁の死活判定システム1の処理機能の一例の概念図を模式的に図2に示す。上述のように、本明細書ではネットワークを介して囲碁の対局システムが構成される場合なので、サーバ2に各処理機能が備えられ、対局者が利用する対局者端末3との間で情報の送受信をネットワークを介して行うことで、その処理が実現される。
またサーバ2および対局者端末3であるコンピュータ端末のハードウェア構成の一例を図3に模式的に示す。サーバ2およびコンピュータ端末は、プログラムの演算処理を実行するCPUなどの演算装置10と、情報を記憶するRAMやハードディスクなどの記憶装置11と、ディスプレイ(画面)などの表示装置12と、キーボードやポインティングデバイス(マウスやテンキーなど)などの入力装置13と、演算装置10の処理結果や記憶装置11に記憶する情報をインターネットやLANなどのネットワークを介して送受信する通信装置14とを有している。サーバ2およびコンピュータ端末上で実現する各機能(各手段)は、その処理を実行する手段(プログラムやモジュールなど)が演算装置10に読み込まれることでその処理が実行される。各機能は、記憶装置11に記憶した情報をその処理において使用する場合には、該当する情報を当該記憶装置11から読み出し、読み出した情報を適宜、演算装置10における処理に用いる。また、コンピュータ端末、サーバ2は、複数のコンピュータ端末またはサーバ2に、その機能が分散配置されていても良い。
本発明における各手段は、その機能が論理的に区別されているのみであって、物理上あるいは事実上は同一の領域を為していても良い。
サーバ2は入力受付部20と死活判定処理部21と出力処理部22とを有する。なお本明細書では図示していないが、同一または異なるサーバ2には、囲碁の対局システムを実現する処理機能が備えられており、そこでは盤面の情報(すなわち、どの目にどの石が置かれているか、手番など、囲碁の対局をコンピュータで実現するために必要な情報)を記憶・管理している。そして死活判定処理システムが死活判定処理を行う場合には、その盤面の情報などを適宜、対局システムから取得し、死活判定処理に用いる。
入力受付部20は、死活判定を行うことの要求や着手の情報、手番の情報、判定対象の石、目標石などの情報などの死活判定を行うのに必要な情報を対局者端末3から受け付ける。また出力処理部22は、死活判定処理部21における処理結果や対局者端末3に表示させる情報などを、対局者端末3に送る。
死活判定処理部21は、入力受付部20で死活判定処理を行うことの要求を対局者端末3から受け付けると、対局システムから盤面の情報を取得し、その盤面または対局者によって編集された編集後の盤面の情報に基づいて死活判定処理を行う。またこの際に、盤面すべてについてではなく、どの領域について死活判定処理を行うかの領域を指定する情報を対局者端末3から受け付けることで、当該領域についての盤面の情報を取得し、死活判定処理を行っても良い。また、そのほか手番の情報、判定対象の石、目標石などの死活判定処理に必要な情報を対局者端末3から入力受付部20が受け付け、それを用いて処理を実行する。
死活判定処理は基本的には、従来と同様に、石が置かれていない点に総あたりで石を置き、それをすべてのパターンについて逐次判定することで、石の死活判定処理を行うが、その場合、処理時間が多く必要となる。そこで死活判定処理部21は、上記総あたり処理の前に、後述する各処理の一以上を任意に実行することで総あたり処理の高速化を実現する。なお死活判定処理部21における死活判定処理としては、従来と同様の死活判定処理プログラムを用いることが出来る。なお以下の各実施例では、総あたりによる死活判定処理を行う場合を示すが、それ以外の従来の死活判定処理プログラムによる方法を用いることも可能である。また総あたりでの死活判定処理とは、従来の死活判定処理プログラムにおいて用いられている死活判定処理であっても良く、必ずしも判定領域内のすべての空点に対する総あたり処理を行わなくても良い。例えば判定領域内の空点のうち、一部の空点については処理を省略するなどの方法であっても良い。例えば、価値が全く同じ着手が複数あった場合、一つの着手のみを実行する、といったように処理を省略する方法などがある。すなわち、死活判定実行部214は、任意の方法により、判定領域内にある判定対象の石または目標石に対しての死活判定処理を実行できる方法であれば如何なる方法であっても良い。また本明細書での死活判定処理として総あたり(または一部の空点について処理を行わない効率化処理を施した総あたり)での死活判定処理の場合を示すが、総あたりでの死活判定処理でなくても、死活を判定できる方法であれば、如何なる方法を用いることも出来る。
なお、従来の死活判定処理プログラムの一例として、上述の各非特許文献に記載のコンピュータプログラムなどがあり、それらを適宜用いることが可能であるが、それらに限定されるものではない。
なお、後述の各実施例の説明で用いる用語を以下に説明する。判定対象の石とは、活きまたは死にの結論を出すべき石であり、判定領域内の一方の色の石のすべてが含まれる。少なくとも一つの石が活きる場合、死活判定の結果は活きとなり、すべての石が取られる場合、死活判定の結果は死にとなる。また目標石とは判定対象の石の一部の石またはすべての石であって、活きまたは死にの結論を出すべき石である。ただし目標石が指定された場合、目標石のすべてが活きる場合、死活判定の結果は活きとなり、目標石の少なくとも一つの石が取られる場合、死活判定の結果は死にとなる。なお目標石は対局者によって指定されても指定されなくても良い。
判定領域とは、判定の際、石の着手を可能とする領域である。グループとは隣接(縦横に位置する石)して連結している同色の石の集まりである。外部とは、判定の際、着手を不可能とする領域である。この領域にある石のグループは活き石として扱われ、また一つのグループが判定領域と外部の両方に含まれることはない。
上述の死活判定処理部21aにおける高速処理の第1の実施例を以下に説明する。本実施例における死活判定処理部21aの処理機能の一例の概念図を図4に示す。本実施例の死活判定処理部21aでは、総あたりの死活判定処理を行うにあたり、死活判定の結果が出る可能性が高い点から優先的に総あたりを行うように、各点の処理の優先度を変更した上で、その優先度に従って、総あたりの死活判定処理を実行する場合を示す。
本実施例の死活判定処理部21aでは初期判定処理部210と第1判定処理部211と第2判定処理部212と優先度変更処理部213と死活判定実行部214と優先度記憶部215とを備える。
初期判定処理部210は、本実施例における高速判定が可能であるかを判定する。すなわち、判定領域の内部にある、本来の判定対象の石の一部または全部を外部とし、その外部より内側にある、本来の判定対象の石とは異なる色の石を内部とした判定が可能であるかを判定する。判定可能であると判定した場合、本来の判定対象の石に隣接する、異なる色の石を目標石として設定する。
第1判定処理部211は、初期判定処理部210で高速判定可能であると判定すると、判定領域内の判定対象の石と異なる色の石を内部、本来の判定対象の石を外部とし、本来の判定対象の石に隣接する相手方の石を目標石とした死活判定を実行する。なお、目標石として、本来の判定対象の石に隣接する相手方の石の一部、あるいは判定領域内にある相手方の石の一部または全部を目標石として死活判定を実行しても良い。
第2判定処理部212は、第1判定処理部211で活き(勝ち)となる点がなかった場合、判定領域内の判定対象の石と異なる色の石を内部、本来の判定対象の石を外部とし、死活判定を実行する。
なお第1判定処理部211において、本来の判定対象の石に隣接する相手方の石の全部を目標石とした死活判定を実行した結果、活き(勝ち)となる点がなかった場合に、本来の判定対象の石に隣接する相手方の石の一部、あるいは判定領域内にある相手方の石の一部または全部を目標石として死活判定をさらに実行しても良い。そしてこの死活判定処理でも活き(勝ち)となる点がなかった場合に、第2判定処理部212における死活判定処理を実行するように構成することも出来る。
優先度変更処理部213は、第1判定処理部211、第2判定処理部212で活きとなる点があった場合に、その点について、後述する優先度記憶部215に記憶する各点の優先度を上げる処理を行う。また第1判定処理部211で活きとなる点があった場合のその着点以外の点、第2判定処理部212で活きとなる点があった場合のその着点以外の点、あるいは第2判定処理部212で活きとなる点がなかった場合の判定領域内の点について、後述する優先度記憶部215に記憶する各点の優先度を下げる処理を行う。
死活判定実行部214は、第1判定処理部211、第2判定処理部212でそれぞれ設定した条件に従って、各判定領域内の空点に対する死活判定処理を実行する。この死活判定処理は従来と同様の死活判定処理プログラムを用いることが出来る。なお以下の各実施例では、総あたりによる死活判定処理を行う場合を示すが、それ以外の従来の死活判定処理プログラムによる方法を用いることも可能である。また総あたりでの死活判定処理とは、従来の死活判定処理プログラムにおいて用いられている死活判定処理であっても良く、必ずしも判定領域内のすべての空点に対する総あたり処理を行わなくても良い。例えば判定領域内の空点のうち、一部の空点については処理を省略するなどの方法であっても良い。例えば、価値が全く同じ着手が複数あった場合、一つの着手のみを実行する、といったように処理を省略する方法などがある。すなわち、死活判定実行部214は、任意の方法により、判定領域内にある判定対象の石または目標石に対しての死活判定処理を実行できる方法であれば如何なる方法であっても良い。
優先度記憶部215は、各点についての着手処理の優先度を記憶している。
次に本実施例における死活判定処理の処理プロセスの一例を図5のフローチャートを用いて説明する。
対局者が利用する対局者端末3同士でネットワークを介して囲碁の対局が行われている。この際に囲碁の対局は対局システムを実現するサーバ2上でその処理が行われている。そしてその対局中、あるいは終局後、対局者のいずれかがその表示される画面から所定のボタン等を押下することで、死活判定処理を行うことの要求が対局者端末3から、死活判定処理を行うサーバ2に送信される。対局画面の一例を図6に示す。
対局画面が図6の場合、その画面のうち、「死活ナビ」など、死活判定処理を行うことを要求するボタンを押下することで、死活判定処理を行うことの要求が対局者端末3からサーバ2に送信される。
サーバ2の入力受付部20でその要求を受け付けると、死活判定処理部21aは、対局システムの記憶装置11から当該盤面の情報(たとえば棋譜の情報)を取得する。そして盤面の情報が含まれた死活判定処理の画面を出力処理部22が対局者端末3に送信する。この際の画面の一例が図7である。なお実際に対局している盤面の情報のほか、すでに対局し、所定の記憶装置11に保存している棋譜の情報、あるいは観戦している対局の棋譜の情報を死活判定処理部21aが対局システムの記憶装置11から取得し、その棋譜の情報を図7の画面に含めて対局者端末3に送信しても良い。
死活判定を行う対局者は、図7に示す死活判定処理を行う画面から盤面の編集を行う。例えば表示されている石を指定することで、石を取り除いたり、あるいは石を置く。またマウスなどの入力装置13をドラッグするなどにより、判定領域を指定する。このように死活判定処理を所望する対局者は、適宜、盤面の情報を編集する。この際の編集される石の情報、手番の情報などは、対局者端末3からサーバ2に適宜、送られる。
上述のように対局者が判定領域を指定することにより、その判定領域内にある結論を出すべき石を判定対象の石として設定される。なお、対局者が判定対象の石のうち、さらに特定の石を結論を出すべき石(目標石)として設定したい場合には、それを目標石として設定することが出来る。判定対象の石のうち少なくとも一つの石が活きる時には死活判定の結論は活きとなり、すべての石が取られる場合、結論は死にとなる。なお、目標石を指定した場合には、目標石のすべてが活きる時には死活判定の結論は活きとなり、目標石のうち少なくとも一つが取られる場合、死活判定の結論は死にとなる。なお目標石の指定は必須ではなく、また目標石を指定するかしないかではその処理には差がなく、活き死にの判断基準が変わるだけである。従って、以下の実施例においてはその断りがない限り、対局者が目標石を指定しない場合を説明する。
編集後の死活判定処理を行う画面の一例を図8に示す。なお図8では判定対象の石が黒の13子、手番は白であるとする。囲碁において「手番」とは次の順番の石の色を示すほか、手番から見た勝ち負け(活き死に)を判定することを示す。従って、この場合、次の順番は白石であり、さらに白石から見て黒の11子の死活判定を行うことを意味している。
例えば図8の画面における「判定処理」を押下することで、編集後の盤面の情報(棋譜の情報と判定対象の石の情報など)と手番の情報と、死活判定処理を開始することの要求とが対局者端末3からサーバ2に送信される。サーバ2の入力受付部20で編集後の盤面の情報と手番の情報と死活判定処理を開始することの要求を受け付けると、死活判定処理部21aは、入力を受け付けた編集後の盤面の情報に基づいて、死活判定処理を開始する。
まず死活判定処理部21aは、死活判定処理を開始するにあたり、各点(石の置かれていない交点、すなわち空点)の処理の優先度を任意に、仮に設定する(S100)。ここで仮に設定された各点の優先度は、優先度記憶部215に記憶される。この各点の処理の優先度は、どのような方法で設定しても良い。この優先度は、どの空点から処理を実行するかを特定する優先度であって、順位付けされていても良いし、各空点ごとにポイントが付加され、そのポイントが高い順(あるいは低い順)に処理が行われるように優先度が設定されていても良い。なおこの各点の優先度の設定は、従来と同様である。
次に、死活判定処理部21aの初期判定処理部210は、本実施例における高速処理が実行可能かを、盤面の情報(編集後の盤面の情報)に基づいて判定する(S110)。すなわち、判定領域の内部にある、本来の判定対象の石を外部とし、その外部より内側にある、本来の判定対象の石とは異なる色の石を内部とした判定が可能であるかを判定する。また、この際に初期判定処理部210は、本来の判定対象の石に隣接している石(判定対象の石と隣接している相手方の石)をすべて目標石として特定する。
つまり盤面の情報は図8の状態であり、本来の判定対象の石が黒石の13子であるので、初期判定処理部210は、判定領域内の白石を内部、判定対象の黒石を外部とし、目標石として星によって示される白石を特定する(この盤面の状態を模式的に示すのが図9である)。そして図8の場合、判定対象の石である黒石の内部に白石が含まれていることから、本実施例の高速判定が可能であると判定する(S120)。
なおS110の判定処理において、本来の判定対象の石の領域内に相手方の石がないなどの理由で高速判定できない場合には、本実施例による処理を中止し、従来どおり、総あたりによる死活判定処理を開始する(S130)。
また、S110の判定処理において、上述のように高速判定が可能であることを初期判定処理部210が判定すると、第1判定処理部211は、判定対象の石の内部を判定領域とした死活判定処理を、現在の手番(すなわちここでは白の手番)で行う。この死活判定処理は、S110で設定した判定領域内のみに対しての総あたりを行う(S140)。すなわち、図10に示すように、白8子を判定対象の石および目標石として、手番白での判定を開始する。従って、図10の白い四角で示されたのが判定領域内の空点であるので、この点に対して、死活判定実行部214が、総あたりで死活判定処理を開始する。なお総あたりの死活判定処理そのものは従来と同様である。
そうすると、図10の場合、図11に示すように、白活き(白勝ち)として判定でき、その着点が2カ所のA点であると第1判定処理部211が判定する。
第1判定処理部211で手番の石についての活き(勝ち)を判定する(活きとなる点がある)と(S150)、その着点について、優先度変更処理部213は、優先度記憶部215に記憶する、S100で設定した仮の優先度から、当該点の優先度をあげ、それ以外の点(第1判定処理部211での判定領域におけるA点以外の点)の優先度を下げる(S160)。例えば着点として判定されたA点の優先順位を最上位(例えば1番と2番)に変更し、順次、順位を繰り下げるとともに、第1判定処理部211での判定領域におけるA点以外の点の優先順位を下げる。あるいはA点についての優先順位を所定順位(例えば10番)だけ繰り上げ、第1判定処理部211での判定領域におけるA点以外の点の優先順位を所定順位だけ繰り下げる。さらに優先度がポイントで管理されている場合には、A点について所定量のポイントを加算し、第1判定処理部211での判定領域におけるA点以外の点について所定量のポイントを減算する。なお優先度の変更処理については、上記に限られず、少なくとも着点の優先度が上がるものであれば如何なるものであっても良い。
このように第1判定処理部211で着点として判定された点の優先度を、優先度変更処理部213が優先度が高くなるように変更することで、当該点(着点として判定されたA点)は優先的に処理が行われるようになる。
また、S140での第1判定処理部211での判定の結果、手番の石についての活き(勝ち)が判定できない(活きとなる点がない)場合には、第2判定処理部212において、S140で指定された目標石を指定せず、S140と同様に、死活判定実行部214で総あたりでの死活判定処理を開始する(S170)。
すなわち、S140での第1判定処理部211での判定では、本来の判定対象の石に隣接している石をすべて目標石として指定しているが、第2判定処理部212では目標石を指定せずに、S140と同様に総あたりでの死活判定処理を実行する。従って、図10の場合、S140では白8子を判定対象の石および目標石として手番白での判定を開始したが、S170では、白8子を判定対象の石として手番白での判定を開始する。この場合であっても、総あたりの対象となる空点は、S140とは変わらない。
そして第2判定処理部212で手番の石についての活き(勝ち)を判定する(活きとなる点がある)と(S180)、その着点について、優先度変更処理部213は、優先度記憶部215に記憶する、S100で設定した仮の優先度から、当該点の優先度をあげ、それ以外の点の優先度を下げる(S190)。また第2判定処理部212で手番の石についての活き(勝ち)を判定出来ない(活きとなる点がない)場合には、優先度変更処理部213は、当該判定領域の各点の優先度を下げる(S200)。
以上のようにすることで、判定領域の内部にある本来の判定対象の石と異なる色の石を内部、本来の判定対象の石を外部、とした場合の手番の石の活きの判定を行い、その判定結果に基づいて、活きとなる点があるならば、S100で仮に設定した当該着点の優先度を上げ、それ以外の点については優先度を下げることが可能となる。
そして以上のような処理を行った後、死活判定処理部21aは、優先度記憶部215に記憶する、第1判定処理部211または第2判定処理部212で変更された、各点の優先度に従って総あたりでの死活判定処理を実行することとなる。
第1判定処理部211または第2判定処理部212で活きと判定された際の着点(例えば図11のA点)は、総あたりに死活判定を行う場合にも、ほかの空点よりも優先して処理が行われる。この着点は、本来の判定対象の石の死活判定に影響を与える可能性が高い点(活きるあるいは死ぬと判定できる可能性の高い点)であることから、これらの着点を優先的に処理することで、本来の判定対象の石の死活の結果を早く出す可能性を高めることが出来る。
つまり、単純に総あたりする場合、S100で各点ごとに仮に設定された優先度に従って総あたりを実行するため、いつ死活の結果が出るかが分からない。しかし本実施例の死活判定処理部21aにおける処理を行うことで、死活の結果が出る可能性が高い点から優先的に処理するので、死活の結果が早く出る可能性が高くなる。
また逆に、第1判定処理部211で活きとなる点があった場合の着点以外の点、第2判定処理部212で活きとなる点があった場合の着点以外の点、あるいは第2判定処理部212で活きとなる点がなかった場合の判定領域の各点の優先度を下げる処理を優先度変更処理部213は行っているので、それらの点は、仮に設定された点の処理よりもあとに処理が行われる。これらの点は、本来の判定対象の石の死活判定に影響を与える可能性が低い点(活きる或いは死ぬと判定できる可能性が低い点)であることから、優先度を下げることで、本来の判定対象の石の死活の結果を早く出す可能性を高めることが出来る。
以上のようにして死活判定処理部21aで死活判定の処理結果を判定すると、出力処理部22は、その処理結果を対局者端末3に送信する。この際に対局者端末3で表示される死活判定の結果の画面の一例を図12に示す。このような画面を対局者が見ることで、死活の結果を知ることが出来る。
次に上述の各処理のより詳細な説明を図13乃至図17を用いて説明する。なお以下の各実施例の説明で用いるデータ形式および用語を以下に説明する。
盤面データはBoard[x][y]とする(ただし1≦x≦19,1≦y≦19)。そして盤面の各点は空点であれば0、黒石があれば1、白石があれば2が代入される。
手番はtnで示される。なおtn^3で相手の石の色になるが、「^」はビット演算を示す。
判定対象の石はH[x][y]とする。判定対象となる石には1、目標石でもある石には2が代入される。
着手の優先順位はOrder[i]とする(ただし0≦i<361)また、Order[i].x(点iのx座標)、Order[i].y(点iのy座標)は座標である。またOrder[i].vは変数(点iの着手の優先順位)である。
判定領域はArea[x][y]とする(ただし1≦x≦19,1≦y≦19)。判定領域である点には1が代入され、判定領域外の点には0が代入される。
グループ化とは、ある点から同じ色で、縦または横に隣接している点の集合を配列に代入する処理である。
E点とは、その石から縦路または横路に隣接している(距離が1だけ離れた)点の集合である。図18に示すように、黒1子に対するEと書かれている点がE点となる。また、複数の石の群におけるE点は、その石群を構成するすべての石のE点の和集合から、その石群が存在する点を除いたものとなる。これを示す一例が図19である。
O点とは、その石から斜めに隣接している(距離が1だけ離れた)点の集合である。図20に示すように、黒1子に対するOと書かれている点がO点となる。また、複数の石の群におけるO点は、その石群を構成するすべての石のO点の和集合から、その石群が存在する点とその石群のE点に含まれる点を除いたものとなる。これを示す一例が図21である。
E空点とは、その石群のE点のうち、いずれの石も置かれていない点の集合である。O空点とは、その石群のO点のうち、いずれの石も置かれていない点の集合である。これらの一例を示すのが図22である。
まず死活判定処理部21aは、盤面の情報を読み込み、Board[x][y]に空点であるか、黒石が置かれているか、白石が置かれているかを記憶していく。また判定領域Area[x][y]にそれぞれ判定領域であるか否かを記憶していく。また上記のほか、判定対象の石H[x][y]、判定領域Area[x][y]、手番tnなども適宜、設定される。そして、総あたり処理を開始するにあたり、空点(Board[x][y]=0)の点の処理の優先度を任意に、仮に設定する(S300)。すなわちOrder[i]にそれぞれ優先度を仮に設定していく。ここで設定した各点の優先度は優先度記憶部215に記憶される。なお優先度の処理については上述と同様に如何なる方法でも良い。
次に、死活判定処理部21aの初期判定処理部210は、初期判定処理(処理A)を実行する(S310)。
具体的には、まず配列Area[x][y]=1、Board[x][y]=tn^3となる各点のx,yについて、S3100乃至S3120の処理を反復する。すなわち、Board[x][y]を判定対象として判定領域を生成し(S3100)、S3100で設定した判定領域で、外部となる石がすべて、本来の判定の判定対象の石に含まれるかを判定する(S3110)。もし含まれない場合には、次の点(x,y)の処理に移る。もし含まれる場合には、S3100で設定した領域で判定可能であるかを判定し(S3120)、そうでないならば、次の点(x,y)の処理に移る。また判定可能ならばその時点でループを中断し、第1判定処理部211における処理に移る。また処理Bに移ることがなかった場合でループを終了した場合には、実施例1における高速判定処理を適用することが出来ないので、S300で設定した仮の優先度(Order[i]に設定された優先度)に基づいて、総あたりでの死活判定処理を開始させる。
以上のように初期判定処理部210において初期判定処理(処理A)を実行したあと、第1判定処理部211における第1判定処理(処理B)を実行する(S320)。なお、本来の判定領域が配列Area[x][y]、判定対象の石が配列H[x][y]で示され、さらに、内部についての判定領域が配列Area’[x][y]、判定対象の石が配列H’[x][y]で示される。従って、それぞれの配列Area’[x][y]、H’[x][y]にはそれぞれ値が代入されている。
具体的には、まず判定対象の領域について、H’[x][y]=1となる各点(判定対象となる各点)(x,y)について、S3200乃至S3230の処理を反復させる。まず、上記点(x,y)(H’[x][y]=1となる点)でグループ化(各点(x,y)から、同じ色で縦路または横路につながっている点の集合を配列に代入する)して、それを配列G[x][y]に代入する(S3200)。そして配列G[x][y]のE点を求め、配列E[x][y]に代入する(S3210)。
そして配列E[a][b]=1、Area’[a][b]=0となる点(a,b)があるかを判定する(1≦a,b≦19)(S3220)。すなわちE点であって、判定領域外の点があるかを判定する。もしないならば、その時点で処理Bを中止する。
S3220で上記点があるならば、G[c][d]=1となる点(c,d)で、H’[c][d]=2とする(1≦c,d≦19)(S3230)。すなわちその点の石を目標石として設定する。
以上の処理をH’[x][y]=1となる各点について行った後、総あたりの死活判定処理を死活判定実行部214が、判定領域Area’[x][y]の各点について行い、活き(勝ち)となる着手点を配列R[x][y]に代入する(S3240)。もし活き(勝ち)となる着手点がない場合には配列R[x][y]には代入を行わない。なお着手点には、R[x][y]に1が代入され、そうでない点には0が代入される。
以上のように第1判定処理部211において第1判定処理(処理B)を実行したあと、処理Bで活きとなる着手点があるかを判定する(S330)。もし活きとなる着手点がある場合(配列R[x][y]に着手点の代入がある場合)には、後述する優先度変更処理部213における処理Dを実行する(S350)。
以上のような処理を実行することで、図5におけるS110乃至S150に相当する処理を実行させることが出来る。
またS330において、活きとなる着手点がない場合(配列R[x][y]に着手点の代入がない場合)には、第2判定処理部212における第2判定処理(処理C)を実行する(S340)。
具体的には、まず判定対象の領域について、H’[x][y]=2となる各点(目標石となる点)(x,y)について、H’[x][y]=1として設定する(S3400)。すなわち目標石となる点を判定対象となる石として設定する。
そして、総あたりの死活判定処理を死活判定実行部214が、判定領域Area’[x][y]の各点について行い、活き(勝ち)となる着手点を配列R[x][y]に代入する(S3410)。もし活き(勝ち)となる着手点がない場合には配列R[x][y]には代入を行わない。
以上のように第2判定処理部212における第2判定処理(処理C)を実行することで、図5におけるS170乃至S180に相当する処理を実行することが出来る。また、第2判定処理部212における第2判定処理を実行したあと、あるいはS330において処理Bで活きとなる点があったと判定した場合、優先度変更処理部213における優先度変更処理(処理D)を実行する(S350)。
まず、着手の優先度を示す配列Order[i](0≦i<361)において、Order[i].v(パラメータである)の最大値をmに代入する(S3500)。
そしてi=0からi<361になるまで、S3510乃至S3540の処理を反復させる。
まずH’[Order[i].x][Order[i].y]が1以上となる場合には(S3510)、そのx,yにおいて、着手点であるか、すなわちR[Order[i].x][Order[i].y]=1であるかを判定する(S3520)。もし着手点である場合(R[Order[i].x][Order[i].y]=1である場合)には、Order[i].vをm+1だけ増加させる(S3530)。また、着手点ではない場合(R[Order[i].x][Order[i].y]=1ではない場合)には、Order[i].vをm+1だけ減少させる(S3540)。すなわち、着手点である場合には、所定量(m+1)だけ優先度を増加させ、着手点ではない場合には、所定量(m+1)だけ優先度を減少させる。
以上の処理をすべてのiについて実行したあと、Order[i]を、その要素vが大きい順にソート(並べ替え)する(S3550)。これによって、着手点の優先度が高くなり、そうではない点についての優先度が低くなる。
このようにして優先度変更処理部213での処理が行われると、配列Order[i]が優先度記憶部215に記憶される。以上の処理を実行することで、図5におけるS160、S190乃至S200に相当する処理を実行することが出来る。そしてここで記憶された優先度に基づいて、死活判定実行部214が総あたりの死活判定処理を行うことによって、優先度が高い、すなわち着手点である点を優先的に処理することとなる。着手点である点は死活判定の結果が出やすい点であるので、死活判定の結果の出力を迅速に行うことが出来る。
死活判定実行部214で総あたりの判定処理を実行中に、その死活判定の結果が出た場合には、出力処理部22がその処理結果を対局者端末3に送信する。このような画面を対局者が見ることで、死活の結果を知ることが出来る。
本実施例のように、単純に総あたりの死活判定処理を行う前に、判定領域の内部の相手方の石が活きているかどうかを判定し、その死活の判定結果をもとに、総あたりの際の着手の優先度を定めることで、判定対象となる石の死活判定処理を高速に実現することが出来る。
次に、死活判定処理部21bにおける高速処理の第2の実施例を以下に説明する。本実施例における死活判定処理部21bの処理機能の一例の概念図を図23に示す。本実施例の死活判定処理部21bでは、総あたりの死活判定処理を行うにあたり、処理対象となる点を減らした上で、総あたりの死活判定処理を実行する場合を示す。
本実施例の死活判定処理部21bには、第1外部処理部216と第2外部処理部217と死活判定実行部218とを備える。
第1外部処理部216は、本来の判定領域のうち、判定対象の石を含む閉領域を抽出し、その閉領域の外側の点であって所定条件を充足する点に、判定対象の石と異なる色の石を配置し、新たに配置した石を外部とみなすことで、総あたりの処理対象となる点を減らす。
第2外部処理部217は、外部のE空点であって判定領域となる点を抽出し、その各点のE点に外部の石が2以上含まれ、判定対象の石が一つも含まれていない点に、判定対象の石と異なる色の石を配置し、新たに配置した石を外部とみなすことで、総あたりの処理対象となる点を減らす。
なお本明細書において、外部とは、判定領域以外の一部または全部の領域にある点である。好ましくは、判定領域以外の点であって、かつ、E点またはO点が判定領域に含まれる点である。
死活判定実行部218は、第1外部処理部216、第2外部処理部217で処理がされたあとの盤面の状態において、本来の判定領域の空点に対する死活判定処理を実行する。この死活判定処理は従来と同様の死活判定処理プログラムを用いることが出来る。なお以下の実施例では、総あたりによる死活判定処理を行う場合を示すが、それ以外の従来の死活判定処理プログラムによる方法を用いることも可能である。また総あたりでの死活判定処理とは、従来の死活判定処理プログラムにおいて用いられている死活判定処理であっても良く、必ずしも判定領域内のすべての空点に対する総あたり処理を行わなくても良い。例えば判定領域内の空点のうち、一部の空点については処理を省略するなどの方法であっても良い。例えば、価値が全く同じ着手が複数あった場合、一つの着手のみを実行する、といったように処理を省略する方法などがある。すなわち、死活判定実行部218は、任意の方法により、判定領域内にある判定対象の石または目標石に対しての死活判定処理を実行できる方法であれば如何なる方法であっても良い。
なお第1外部処理部216および第2外部処理部217については双方の処理を実行しても良いし、いずれか一つであっても良い。また第1外部処理部216および第2外部処理部217における処理はその一例であって、それ以外の方法、例えば、判定対象の石と異なる色の石を外部を基準として、新たに配置することで、総あたりの処理対象となる点を減らせれば、如何なる方法であっても良い。
次に本実施例における死活判定処理の処理プロセスの一例を図24のフローチャートを用いて説明する。
対局者が利用する対局者端末3同士でネットワークを介して囲碁の対局が行われている。この際に囲碁の対局は対局システムを実現するサーバ2上でその処理が行われている。そしてその対局中、あるいは終局後、対局者のいずれかがその表示される画面から所定のボタン等を押下することで、死活判定処理を行うことの要求が対局者端末3から、死活判定処理を行うサーバ2に送信される。対局画面の一例を図25に示す。
対局画面が図25の場合、その画面のうち、「死活ナビ」など、死活判定処理を行うことを要求するボタンを押下することで、死活判定処理を行うことの要求が対局者端末3からサーバ2に送信される。
サーバ2の入力受付部20でその要求を受け付けると、死活判定処理部21bは、対局システムの記憶装置11から当該盤面の情報(たとえば棋譜の情報)を取得する。そして盤面の情報が含まれた死活判定処理の画面を出力処理部22が対局者端末3に送信する。この際の画面の一例が図26である。なお実際に対局している盤面の情報のほか、すでに対局し、所定の記憶装置11に保存している棋譜の情報、あるいは観戦している対局の棋譜の情報を死活判定処理部21bが対局システムの記憶装置11から取得し、その棋譜の情報を図26の画面に含めて対局者端末3に送信しても良い。
死活判定を行う対局者は、図26に示す死活判定処理を行う画面から盤面の編集を行う。例えば表示されている石を指定することで、石を取り除いたり、あるいは石を置く。またマウスなどの入力装置13をドラッグするなどにより、判定領域を指定する。このように死活判定処理を所望する対局者は、適宜、盤面の情報を編集する。この際の編集される石の情報、手番の情報などは、対局者端末3からサーバ2に適宜、送られる。
上述のように対局者が判定領域を指定することにより、その判定領域内にある結論を出すべき石を判定対象の石として設定される。なお、対局者が判定対象の石のうち、さらに特定の石を結論を出すべき石(目標石)として設定したい場合には、それを目標石として設定することが出来る。判定対象の石のうち少なくとも一つの石が活きる時には死活判定の結論は活きとなり、すべての石が取られる場合、結論は死にとなる。なお、目標石を指定した場合には、目標石のすべてが活きる時には死活判定の結論は活きとなり、目標石のうち少なくとも一つが取られる場合、死活判定の結論は死にとなる。なお目標石の指定は必須ではなく、また目標石を指定するかしないかではその処理には差がなく、活き死にの判断基準が変わるだけである。従って、以下の実施例においてはその断りがない限り、対局者が目標石を指定しない場合を説明するが、目標石を指定した場合には、「判定対象の石」との記載を「目標石」と適宜読み替えることで、その処理が可能となる。
編集後の死活判定処理を行う画面の一例を図27に示す。なお図27では判定対象の石が黒の8子、手番は黒であるとする。従って、この場合、次の順番は黒石であり、さらに黒石から見て黒の8子の死活判定を行うことを意味している。
例えば図27の画面における「判定処理」を押下することで、編集後の盤面の情報(棋譜の情報と判定対象の石の情報など)と手番の情報と、死活判定処理を開始することの要求とが対局者端末3からサーバ2に送信される。サーバ2の入力受付部20で編集後の盤面の情報と手番の情報と死活判定処理を開始することの要求を受け付けると、死活判定処理部21bは、入力を受け付けた編集後の盤面の情報に基づいて、死活判定処理を開始する。
まず死活判定処理部21bの第1外部処理部216は、総あたり処理を開始するにあたり、盤面の棋譜の情報を抽出し、判定対象の石を含む閉領域を構成する石の群を抽出する(S400)。なお閉領域とは、相手の石を無視して自分の石のみまたは自分の石と外部とで閉じている領域である。
そうすると、図27の場合、図28に示すように、二つの閉領域を構成する石の群が抽出できる。図28(a)は判定対象となる黒石のみによる閉領域であり、図28(b)は判定対象となる黒石と盤端とによる閉領域である。
そしてS400において閉領域がない場合(S410)、第1外部処理部216は、その処理を中止し、第2外部処理部217における処理を実行する。すなわち、S470に移る。一方、閉領域がある場合(S410)、各閉領域について、閉領域の外部の点であって、閉領域を構成する石の群のE空点以外で且つ1線のO空点以外の点を抽出する(S420)。S420の処理を図28に対して実行したのが図29である。図29において黒四角形で示される点がS420で抽出した点である。
S420の処理を、S400で抽出した各閉領域について処理を実行し(S430)、すべての閉領域についてS420における点を抽出すると、それらのすべての閉領域で共通する点を抽出する(S440)。つまり各閉領域についてS420で抽出した点の積となる点を抽出する。これを模式的に示すのが図30である。
そしてS440で抽出した点のうち、判定対象の石とそのE空点を除く、残った点に判定対象の石と異なる色の石(ここでは白石)を配置する(S450)。これを模式的に示すのが図31である。なお図31では新たに配置された相手側の石を星印で示している。なおここでは残った点のすべてに相手側の石を配置したが、すべてではなく一部に配置をしても良い。
S450で新たに配置した相手側の石のうち、外部に繋がっていない石を取り除く。そして取り除いた石以外の新たに配置した相手側の石を外部としてみなす(S460)。これを模式的に示すのが図32および図33である。
以上のようにして第1外部処理部216は処理を実行する。そして第1外部処理部216における処理が終了後、または第1外部処理部216のS400で閉領域がないと判定した場合、第2外部処理部217の処理を実行する。
すなわち、第2外部処理部217は、判定領域内にある外部のE空点となる点を抽出する(S470)。これを模式的に示すのが図34である。図34において黒四角形で示される点がS470で抽出した点である。
そしてS470で抽出した各点のE点に、外部の石が2以上含まれ、判定対象の石が1つも含まれていない点があるかを判定する。そしてある場合には、その点に判定対象となる相手側の石(白石)を配置し、外部としてみなす(S480)。これを模式的に示すのが図35である。
そしてS480において一つ以上の石を配置した場合には、再度、S470乃至S480の処理を実行する(S490)。もし石を配置しなかった場合には、その時点で第2外部処理部217の処理を終了する(S490)。図35の場合、S480の条件を充足しないので、新たに石は配置されない。
以上のようにして第2外部処理部217における処理が終了後、死活判定実行部218がS490の処理終了後の盤面の情報に対して、総あたり処理を実行する。上述の例の場合、図36の各点に対して総あたりの死活判定処理を死活判定実行部218が実行することとなる(S500)。
そしてこの盤面の情報で死活判定処理の結果、活き(勝ち)となる点が1点以上存在している場合には(S510)、死活判定処理として活き(勝ち)として最終結果を判定する(S520)。
一方、S500の死活判定処理の結果、活き(勝ち)となる点が1点も存在しない場合には(S510)、盤面の情報を初期状態(図27の状態)に戻し、死活判定実行部218が通常どおりの死活判定処理を実行し、その結果を最終結果として判定する。
以上のようにして死活判定処理部21bで死活判定の処理結果を判定すると、出力処理部22は、その処理結果を対局者端末3に送信する。
本実施例のような処理を実行したあとで死活判定実行部218が死活判定処理の総あたり処理を実行することで、判定領域内の総あたりの対象となる点を減らすことが出来る。従って、総あたり処理にかかる時間を減らすことが出来るので、処理結果を早く算出することが出来る。
上述では編集後の盤面の情報が図27の状態に対する処理を説明したが、次に編集後の盤面の情報が図37であったとする。この場合の実施例2の処理プロセスを以下に説明する。
例えば図37の画面における「判定処理」を押下することで、編集後の盤面の情報(棋譜の情報と判定対象の石の情報など)と手番の情報と、死活判定処理を開始することの要求とが対局者端末3からサーバ2に送信される。サーバ2の入力受付部20で編集後の盤面の情報と手番の情報と死活判定処理を開始することの要求を受け付けると、死活判定処理部21bは、入力を受け付けた編集後の盤面の情報に基づいて、死活判定処理を開始する。
まず死活判定処理部21bの第1外部処理部216は、総あたり処理を開始するにあたり、盤面の棋譜の情報を抽出し、判定対象の石を含む閉領域を構成する石の群を抽出する(S400)。
そうすると、図37の場合、閉領域を構成する石の群が抽出できない。そのため、第1外部処理部216はその処理を中止し、第2外部処理部217における処理を実行する(S410)。
そして第2外部処理部217は、外部のE空点であって、判定領域となる点を抽出する(S470)。これを模式的に示すのが図38である。図38において黒四角形で示される点がS470で抽出した点である。
そしてS470で抽出した各点のE点に、外部の石が2以上含まれ、判定対象の石が1つも含まれていない点があるかを判定する。そしてある場合には、その点に判定対象となる相手側の石(白石)を配置し、外部としてみなす(S480)。これを模式的に示すのが図39である。そしてS480の処理を実行すると、新たに相手側の石が図40のように配置される。なお図40では新たに配置される相手側の石を星で示している。なおここでは判定したすべての点に相手側の石を配置したが、すべてではなく、一部の点だけであっても良い。
S480で新たに相手側の石を配置したので(S490)、第2外部処理部217は、外部のE空点であって、判定領域となる点を抽出する(S470)(なお本実施例では新たに相手側の石を配置した場合に反復処理を実行するようにしたが、反復処理を実行せずとも良い)。これを模式的に示すのが図41である。図41において黒四角形で示される点がS470で抽出した点である。
そしてS470で抽出した各点のE点に、外部の石が2以上含まれ、判定対象の石が1つも含まれていない点があるかを判定する。そしてある場合には、その点に判定対象となる相手側の石(白石)を配置し、外部としてみなす(S480)。これを模式的に示すのが図42である。そしてS480の処理を実行すると、新たに相手側の石が図43のように配置される。なお図43では新たに配置される相手側の石を星で示している。
S480で新たに相手側の石を配置したので(S490)、第2外部処理部217は、外部のE空点であって、判定領域となる点を抽出する(S470)。これを模式的に示すのが図44である。図44において黒四角形で示される点がS470で抽出した点である。
そしてS470で抽出した各点のE点に、外部の石が2以上含まれ、判定対象の石が1つも含まれていない点があるかを判定する。そしてある場合には、その点に判定対象となる相手側の石(白石)を配置し、外部としてみなす(S480)。これを模式的に示すのが図45である。
図45の状態では新たに石を配置することがない。そのため、第2外部処理部217の処理を終了する(S490)。
以上のようにして第2外部処理部217における処理が終了後、死活判定実行部218がS490の処理終了後の盤面の情報に対して、総あたり処理を実行する。上述の例の場合、図46の各点に対して総あたりの死活判定処理を死活判定実行部218が実行することとなる(S500)。
そしてこの盤面の情報で死活判定処理の結果、活き(勝ち)となる点が1点以上存在している場合には(S510)、死活判定処理として活き(勝ち)として最終結果を判定する(S520)。
一方、S500の死活判定処理の結果、活き(勝ち)となる点が1点も存在しない場合には(S510)、盤面の情報を初期状態(図27の状態)に戻し、死活判定実行部218が通常どおりの死活判定処理を実行し(S530)、その結果を最終結果として判定する。
以上のようにして死活判定処理部21bで死活判定の処理結果を判定すると、出力処理部22は、その処理結果を対局者端末3に送信する。
次に上述の各処理のより詳細な説明を図47乃至図53を用いて説明する。
まず死活判定処理部21bは、盤面の情報を読み込み、Board[x][y]に空点であるか、黒石が置かれているか、白石が置かれているかを記憶していく。また判定領域Area[x][y]にそれぞれ判定領域であるか否かを記憶していく。また上記のほか、判定対象の石H[x][y]、判定領域Area[x][y]、手番tnなども適宜、設定される。そして、死活判定処理部21bにおける第1外部処理部216がそこにおける処理(処理A)を実行する(S600)。
すなわち、まずすべての点(x,y)についてR[x][y]=Area[x][y]、Q[x][y]=Area[x][y]を代入する(S6000)。そして初期値として変数fにf=0を代入する(S6010)。
次に第1外部処理部216は、Area[x][y]=1、Board[x][y]=0となる点(x,y)について、S6020乃至S6080の処理を反復する。
まずQ[x][y]=1であるかを判定し(判定領域であるかを判定し)(S6020)、そうでなければ、次の変数x,yの処理に移る。一方、Q[x][y]=1であるならば(判定領域であるならば)、当該点(x,y)を含む閉領域を抽出し、それを配列C[x][y]に代入する(S6030)。そしてQ[x][y]=0を代入する(S6040)。
C[x][y]=1でないならば(S6050)、次の変数x,yの処理に移る。一方、C[x][y]=1であるならば、C[a][b]>0である点すべてについて(1≦a,b≦19)、Q[a][b]=0を代入する(S6060)。そして後述する処理A2を実行する(S6070)。なおこの処理は、図24におけるS420に相当する処理である。
そして第1外部処理部216は、処理A2を実行する。すなわち、配列C[x][y]のE点を抽出し、それを配列E[x][y]に代入する(S6073)。また配列C[x][y]のO点で1線の点を抽出し、それを配列O[x][y]に代入する(S6075)。その後、配列C[c][d]≧1、配列E[c][d]≧1、または配列O[c][d]≧1のときには、R[c][d]=0を代入する(1≦c,d≦19)(S6077)。
以上のようにして第1外部処理部216が処理A2を実行すると、変数fについて、f=1を代入する(S6080)。以上の処理を第1外部処理部216は、Area[x][y]=1、Board[x][y]=0となるすべての点(x,y)について反復処理を実行する。
以上のような処理を実行することで、図24におけるS400乃至S440に相当する処理を実行することが出来る。
上記反復処理が終了後、変数fについてf=1であるかを判定し(S6090)、f=1であれば、処理A3を実行する。もしf=1でなければ処理Aを中止し、次の処理、すなわち第2外部処理部217での処理Bを実行する(S610)。
上述のS6090において、f=1であるならば、続いて第1外部処理部216は、処理A3を実行する。
すなわち、まず配列H[x][y]≧1のすべての点(x,y)について、R[x][y]=0を代入する(S6100)。次に配列H[x][y]≧1となるE点を配列E2に代入する(S6110)。
E2[x][y]=1となるすべての点(x,y)について、配列R[x][y]=0を代入する(S6120)。そしてすべての点(x,y)で配列W[x][y]=0を代入する(S6130)。その後、Board[x][y]=0、R[x][y]=1となるすべての点(x,y)について、Board[x][y]=tn^3、W[x][y]=1、Area[x][y]=0を代入する(S6140)。
以上のような処理を実行することで、図24におけるS450に相当する処理を実行することが出来る。そしてS6140の処理終了後、第1外部処理部216は、処理A4を実行する。
まず第1外部処理部216は、Board[x][y]=tn^3、Area[x][y]=0、W[x][y]=0となるすべての点(x,y)をグループ化し、配列G2[x][y]に代入する(S6150)。そしてW[x][y]=1となるすべての点(x,y)について、S6160乃至S6170の反復処理を実行する。
まず配列G2[x][y]=0であるかを判定し(S6160)、もし0でないならば、次の点(x,y)の処理に移る。そして0であるならば、Area[x][y]=1、Board[x][y]=0を代入する(S6170)。そして次の点(x,y)の処理に移る。
以上の反復処理をW[x][y]=1となるすべての点(x,y)について実行することで、処理A4が終了する。以上のような処理を実行することで、図24におけるS460に相当する処理を実行することが出来る。
以上の処理が終了した場合、あるいはS6090でf=1でない場合、第2外部処理部217での処理Bが実行される(S610)。
まず第2外部処理部217は、Board[x][y]=tn^3、Area[x][y]=0となる点(x,y)のE空点を配列E1[x][y]に代入する(S6200)。そして次にArea[x][y]=0となる点(x,y)について、配列E1[x][y]=0を代入する(S6210)。以上によって、図24におけるS470に相当する処理を実行することが出来る。
そして次に配列E1[x][y]=1となるすべての点(x,y)について、S6220乃至S6300の反復処理を実行する。
まず点(x,y)のE点を配列E2[x][y]に代入し(S6220)、変数C=0を代入する(S6230)。そして配列E2[x’][y’]=1となる点(x’,y’)について、S6240乃至S6270の反復処理を実行する。
まず配列H[x’][y’]≧1であるかを判定し(S6240)、そうであるならば、変数Cから4を減算してCを更新する(S6250)。すなわちC=C−4を実行する。そして、H[x’][y’]≧1でない場合、あるいはS6250を実行した場合、Area[x’][y’]=0であるかを判定する(S6260)。そうであるならば変数Cに1を加算してCを更新する(C6270)。すなわちC=C+1を実行する。もしそうでない場合、あるいはS6270を実行した場合、配列E2[x’][y’]=1となる次の点(x’,y’)について、同様の処理を実行する。
配列E2[x’][y’]=1となるすべての点(x’,y’)について処理を実行した後、C≧2であるかを判定する(S6280)。もしC≧2であるならば、点(x,y)が1線であるかを判定する(S6290)。一方、C≧2ではないならば、配列E1[x][y]=0を代入する(S6300)。またS6290において、点(x,y)が1線であるならば、配列E1[x][y]=0を代入する(S6300)。
S6290において点(x,y)が1線ではない場合、またはS6300において配列E1[x][y]=0を代入した場合、配列E1[x][y]=1となる次の点(x,y)について、上述と同様の処理を実行する。
以上のように配列E1[x][y]=1となるすべての点(x,y)についてS6220乃至S6300の処理が終了後、配列E1[x][y]=1となる点があるかを判定する(S6310)。もし配列E1[x][y]=1となる点がない場合には、第2外部処理部217における処理を終了し、現在の盤面の状態における死活判定実行部218での総あたりでの死活判定処理を実行させる(S620)。
一方、S6310において配列E1[x][y]=1となる点がある場合には、配列E1[x][y]=1となる点について、Board[x][y]=tn^3、Area[x][y]=0を代入する(S6320)。そして再度、処理Bに戻り、第2外部処理部217が上述の処理を実行する。すなわちS6200以降の処理を実行する。
以上の処理を実行することで、図24におけるS480乃至S490に相当する処理を実行することが出来る。
そして以上のようにして処理A、処理Bを実行すると、当初の状態から盤面の状態が変形され、判定領域となる点が狭められる。そしてこの狭められた点に対して、死活判定実行部218が総あたりでの死活判定処理を従来と同様に実行する(S620)。
そしてこの死活判定処理の結果、活き(勝ち)となる点が1点以上存在している場合には(S630)、死活判定処理として活き(勝ち)として最終結果を判定する(S640)。
一方、S620の死活判定処理の結果、活き(勝ち)となる点が1点も存在しない場合には(S630)、盤面の情報を初期状態に戻し、死活判定実行部218が通常どおりの死活判定処理を実行し(S650)、その結果を最終結果として判定する。
以上のようにして死活判定処理部21bで死活判定の処理結果を判定すると、出力処理部22は、その処理結果を対局者端末3に送信する。
本実施例のように、単純な総あたりによる死活判定処理を実行する前に、外部を基準として、外部の石の色と同色の石を所定の条件で判定領域内に新たに配置することで、死活判定処理の際の総あたりの処理対象を減らすことが出来る。そして、外部を狭めて死活判定をし、それでも活きている場合には、もとの盤面の状態でも活きと判定する処理を実行することで、判定対象となる石の死活判定処理を高速に実現することが出来る。
次に、死活判定処理部21cにおける高速処理の第3の実施例を以下に説明する。本実施例における死活判定処理部21cの処理機能の一例の概念図を図54に示す。本実施例の死活判定処理部21cでは、総あたりの死活判定処理を行うにあたり、判定領域の盤面を所定の方法で分割し、それぞれの眼形に変形した上で、死活判定処理を実行する場合を示す。つまり、判定領域の盤面を所定の方法で分割し、分割した領域のうち一の領域について、もっとも不利な眼形の形状に変形した上で、判定領域全体の死活判定処理を実行する場合である。
本実施例の死活判定処理部21cには、領域分割処理部219と0眼変形処理部220と後手1眼変形処理部222と1眼変形処理部222と死活判定実行部223とを備える。
領域分割処理部219は、判定領域において、外部と隣接している判定対象の石から、同色で隣接している石のつながりを再帰的に判定し、もう一方の端が別の外部と隣接しているかを判定する。このような石のつながりを判定することで、判定領域における盤面を分割する。
0眼変形処理部220は、領域分割処理部219で判定した領域のうちの一つの領域について、0眼となるように変形を行う。具体的には、当該領域に対して最も判定対象側に不利となる0眼となるように変形させる。例えばすべての点を相手の石を配置することで、変形を行う。例えば図56に示すように、分割線に隣接する点すべてに外部と同じ石を配置する。図56では星で示した石が新たに配置される石である。
後手1眼変形処理部221は、領域分割処理部219で判定した領域のうちの一つの領域について、後手1眼となるように変形を行う。具体的には、当該領域に対して最も判定対象側に不利となる後手1眼となるように変形させる。例えば当該領域において、分割線に隣接させた相手の2つの石が取り得る状態となるような後手1眼となるように変形を行う。例えば図57に示すように、黒から打つと1眼、白から打つと0眼となるように配置する。図57では星で示した石が新たに配置される石である。
1眼変形処理部222は、領域分割処理部219で判定した領域のうちの一つの領域について、1眼となるように変形を行う。具体的には当該領域に対して最も判定対象側に不利となる1眼となるように変形させる。例えば当該領域において、分割線に隣接させた相手の2つの石が取り得る状態となる1眼となるように変形を行う。例えば図58に示すように、黒から打っても白から打っても黒1眼となるように配置する。図58では星で示した石が新たに配置される石である。
なお0眼、後手1眼、1眼への変形はどのような変形を行うことも出来、如何なる処理方法を採っても良い。
死活判定実行部223は、分割した領域に対して0眼変形処理部220、後手1眼変形処理部221、1眼変形処理部222のいずれかにおいて変形を行ったあと、その判定領域の全体に対して、死活判定処理を行う。また本来の判定領域に対して、死活判定処理を行う。この死活判定処理は従来と同様の死活判定処理プログラムを用いることが出来る。なお以下の実施例では、総あたりによる死活判定処理を行う場合を示すが、それ以外の従来の死活判定処理プログラムによる方法を用いることも可能である。また総あたりでの死活判定処理とは、従来の死活判定処理プログラムにおいて用いられている死活判定処理であっても良く、必ずしも判定領域内のすべての空点に対する総あたり処理を行わなくても良い。例えば判定領域内の空点のうち、一部の空点については処理を省略するなどの方法であっても良い。例えば、価値が全く同じ着手が複数あった場合、一つの着手のみを実行する、といったように処理を省略する方法などがある。すなわち、死活判定実行部223は、任意の方法により、判定領域内にある判定対象の石または目標石に対しての死活判定処理を実行できる方法であれば如何なる方法であっても良い。
次に本実施例における死活判定処理の処理プロセスの一例を図55のフローチャートを用いて説明する。
対局者が利用する対局者端末3同士でネットワークを介して囲碁の対局が行われている。この際に囲碁の対局は対局システムを実現するサーバ2上でその処理が行われている。そしてその対局中、あるいは終局後、対局者のいずれかがその表示される画面から所定のボタン等を押下することで、死活判定処理を行うことの要求が対局者端末3から、死活判定処理を行うサーバ2に送信される。対局画面の一例を図59に示す。
対局画面が図59の場合、その画面のうち、「死活ナビ」など、死活判定処理を行うことを要求するボタンを押下することで、死活判定処理を行うことの要求が対局者端末3からサーバ2に送信される。
サーバ2の入力受付部20でその要求を受け付けると、死活判定処理部21cは、対局システムの記憶装置11から当該盤面の情報(たとえば棋譜の情報)を取得する。そして盤面の情報が含まれた死活判定処理の画面を出力処理部22が対局者端末3に送信する。この際の画面の一例が図60である。なお実際に対局している盤面の情報のほか、すでに対局し、所定の記憶装置11に保存している棋譜の情報、あるいは観戦している対局の棋譜の情報を死活判定処理部21cが対局システムの記憶装置11から取得し、その棋譜の情報を図60の画面に含めて対局者端末3に送信しても良い。
死活判定を行う対局者は、図60に示す死活判定処理を行う画面から盤面の編集を行う。例えば表示されている石を指定することで、石を取り除いたり、あるいは石を置く。またマウスなどの入力装置13をドラッグするなどにより、判定領域を指定する。このように死活判定処理を所望する対局者は、適宜、盤面の情報を編集する。この際の編集される石の情報、手番の情報などは、対局者端末3からサーバ2に適宜、送られる。
上述のように対局者が判定領域を指定することにより、その判定領域内にある結論を出すべき石を判定対象の石として設定される。
編集後の死活判定処理を行う画面の一例を図61に示す。なお図61では判定対象の石が黒の9子、手番は黒であるとする。従って、この場合、次の順番は黒石であり、さらに黒石から見て黒の9子の死活判定を行うことを意味している。
例えば図61の画面における「判定処理」を押下することで、編集後の盤面の情報(棋譜の情報と判定対象の石の情報など)と手番の情報と、死活判定処理を開始することの要求とが対局者端末3からサーバ2に送信される。サーバ2の入力受付部20で編集後の盤面の情報と手番の情報と死活判定処理を開始することの要求を受け付けると、死活判定処理部21cは、入力を受け付けた編集後の盤面の情報に基づいて、死活判定処理を開始する。
まず死活判定処理部21cの領域分割処理部219は、総あたり処理を開始するにあたり、盤面の棋譜の情報を抽出し、その判定領域を分割することで、分割可能であるかを判定する(S700)。すなわち、外部と隣接している判定対象の石から、同色で隣接している石のつながりを再帰的に判定し、他方の端が別の外部と隣接しているかを判定する。そしてこのような石のつながりを検索し、石のつながりがあった場合には、判定領域が分割可能であると判定する。なお以下の実施例では本来の判定領域を2つの領域に分割する場合を説明するが、3以上の領域に分割できる場合、そのうちの1つと残りの全部の領域の判定を行う。そして残りの領域について判定する際に、上述の分割可能かの判定を再帰的に行うことで、3以上の領域に分割できる場合であっても、以下の実施例と同様に処理が行える。
上述のようにS700で、領域分割処理部219が、本来の判定領域が分割可能ではないと判定した場合には(S710)、そのまま処理を中止し、死活判定実行部223が、本来の盤面の状態で通常どおりの総あたりの死活判定処理を実行する(S840)。
一方、S700で、領域分割処理部219が、本来の判定領域が分割可能であると判定した場合には(S710)、その判定した領域について2つに分割する。この状態を模式的に示すのが図62である。図62では黒星で示される石が分割線となる石である。
そして分割線を境に2つの領域に判定領域を分割する。ここでは分割線より上方を領域R1、下方を領域R2とする。この状態を示すのが図63である。なお上下に分割するほか、左右に分割するなど、如何なる分割であっても良い。
このように領域分割処理部219で2つの領域に分割後、いずれか一方の領域(ここでは領域R1とする)について、まず0眼変形処理部220が0眼となるように変形を行う(S720)。例えば、領域R1に含まれる石を取り除き、そこに0眼となるように、分割線に隣接する点すべてに外部と同じ石(ここでは白石)を配置する。この状態を模式的に示すのが図64である。ここで白星が新たに配置された石である。
そしてS720で変形処理後、変形処理後の盤面の状態に対して、死活判定実行部223が総あたりによる死活判定処理を実行する(S730)。死活判定実行部223による死活判定処理の結果、「勝ち」の場合には(S740)、勝ちと判定できるので(S750)、そのまま処理を終了する。図64の場合、活きないので、S740の処理に移る。
すなわち、S730における死活判定実行部223による死活判定処理の結果、「負け」と判定した場合には(S740)、次に、後手1眼変形処理部221が、領域R1に対して、後手1眼となるように変形を行う(S760)。例えば、領域R1に含まれる石を取り除き、そこに後手1眼となるように、例えば黒から打つと1眼、白から打つと0眼となるように、配置する。この状態を模式的に示すのが図65である。ここで白星、黒星が新たに配置された石である。
そしてS760で変形処理終了後、変形処理後の盤面の状態に対して、死活判定実行部223が総あたりによる死活判定処理を実行する(S770)。死活判定実行部223による死活判定処理の結果、「勝ち」の場合には(S780)、次に、盤面をもとの状態に戻し、分割した領域のうちS760で処理した領域とは別の領域、すなわち領域R2について、1眼変形処理部222が1眼となるように変形を行う(S790)。例えば、領域R2に含まれる石を取り除き、そこに1眼となるように、例えば黒から打っても白から打っても黒1眼となるように、配置する。この状態を模式的に示すのが図66である。ここで白星、黒星が新たに配置された石である。
そしてS790で変形処理終了後、変形処理後の盤面の状態に対して、死活判定実行部223が総あたりによる死活判定処理を実行する(S800)。死活判定実行部223による死活判定処理の結果、「勝ち」の場合には(S870)、勝ちと判定できるので(S880)、そのまま処理を終了する。図67の場合、活きるので、処理を終了する。
一方、S870において死活判定実行部223で「負け」と判定した場合には(S870)、
そのまま処理を中止し、死活判定実行部223が、本来の盤面の状態で通常どおりの総あたりの死活判定処理を実行する(S840)。
また、S780において死活判定実行部223で活きないと判定した場合には(S780)、次に、1眼変形処理部222が、領域R1に対して、1眼となるように変形を行う(S810)。例えば、領域R1に含まれる石を取り除き、そこに1眼となるように、例えば黒から打っても白から打っても黒1眼となるように、配置する。
そしてS810で変形処理終了後、変形処理後の盤面の状態に対して、死活判定実行部223が総あたりによる死活判定処理を実行する(S820)。死活判定実行部223による死活判定処理の結果、「負け」の場合には(S830)、盤面をもとの状態に戻し、分割した領域のうちS810で処理した領域とは別の領域、すなわち領域R2について、0願変形処理部220が0眼となるように変形を行う(S833)。そしてS833で変形処理終了後、変形処理終了後の盤面の状態に対して、死活判定実行部223が総あたりによる死活判定処理を実行する(S835)。死活判定実行部223による死活判定処理の結果、「勝ち」の場合には(S837)、勝ちと判定できるので(S880)、そのまま処理を終了する。一方、S835の死活判定実行部223で「負け」と判定した場合には(S837)、そのまま処理を中止し、死活判定実行部223が、本来の盤面の状態で通常どおりの総あたりの死活判定処理を実行する(S840)。
一方、S820において死活判定実行部223で「勝ち」と判定した場合には(S830)、次に、盤面をもとの状態に戻し、分割した領域のうちS810で処理した領域とは別の領域、すなわち領域R2について、後手1眼変形処理部221が後手1眼となるように変形を行う(S850)。例えば、領域R2に含まれる石を取り除き、そこに後手1眼となるように、例えば黒から打つと1眼、白から打つと0眼となるように、配置する。
そしてS850で変形処理終了後、変形処理後の盤面の状態に対して、死活判定実行部223が総あたりによる死活判定処理を実行する(S860)。死活判定実行部223による死活判定処理の結果、「勝ち」の場合には(S870)、勝ちと判定できるので(S880)、そのまま処理を終了する。
一方、S860において死活判定実行部223で「負け」と判定した場合には(S870)、そのまま処理を中止し、死活判定実行部223が、本来の盤面の状態で通常どおりの総あたりの死活判定処理を実行する(S840)。
以上のように、総あたりの死活判定処理を行うにあたり、判定領域の盤面を所定の方法で分割し、それぞれの眼形に変形した上で、全体の判定領域の死活判定処理を実行することで、本来の判定領域に対して単純に総あたりの死活判定処理を実行するよりも高速に死活判定処理の結果を知ることが出来る。これは、判定対象の石に2眼があれば生きることに着目したものである。すなわち判定領域を2つに分割し、そのうちの1つの領域について0眼とした場合、他方の領域が活きていればそこが2眼となっているので、全体として判定対象の石が活きると判定できる。また1つの領域について後手1眼とした場合、他方の領域が活きていればそこに1眼があることとなるので、全体として判定対象の石が活きると判定できる。さらに1つの領域について1眼とした場合、他方の領域が活きていればそこに後手1眼があることとなるので、全体として判定対象の石が活きると判定できる。
このように、活きる石は2眼を持つことが多いことに着目して、判定領域の盤面を分割し、分割した領域を0眼、後手1眼、1眼のいずれかに変形させ、変形させた盤面の状態に対して、総あたりで死活判定処理で活きるかを判定することで、本来の盤面の死活判定処理を行うよりも高速に死活判定処理の結果を得ることが可能となる。
以上のようにして死活判定処理部21cで死活判定の処理結果を判定すると、出力処理部22は、その処理結果を対局者端末3に送信する。
次に上述の各処理のより詳細な説明を図67乃至図71を用いて説明する。
まず死活判定処理部21cは、盤面の情報を読み込み、Board[x][y]に空点であるか、黒石が置かれているか、白石が置かれているかを記憶していく。また判定領域Area[x][y]にそれぞれ判定領域であるか否かを記憶していく。また上記のほか、判定対象の石H[x][y]、判定領域Area[x][y]、手番tnなども適宜、設定される。そして、死活判定処理部21cにおける領域分割処理部219が判定領域を分割し、分割可能かを判定する。すなわち処理D1、D2を実行させる(S900)。
領域分割処理部219は、外部のE点で、かつBoard[x][y]=tnとなる点について配列R[x][y]=1を代入する(S1030)。そして、R[x][y]=1となる点(x,y)について、S1040乃至S1090を反復処理させる。
まずR[x][y]=1となる点(x,y)に配列T[x][y]=1を代入し、それ以外の点にT[x][y]=0を代入する(S1040)。そして点(x,y)のE点でBoard[x’][y’]=tn、T[x’][y’]=0となる点(x’,y’)について、S1050乃至S1090を反復処理させる。
まずT[x’][y’]=1を代入する(S1050)。そして、点(x’,y’)のE点に外部が含まれるかを判定し(S1060)、外部に含まれる場合には後述する処理D2を実行させる。一方、外部に含まれない場合には点(x’,y’)のE点(a,b)でT[a][b]=1となる点が1点であるかを判定する(S1070)。なおここで(a=x’+1,x’−1,b=0)、または、(b=y’+1,y’−1,a=0)である。そして1点ではない場合にはT[x’][y’]=0とする(S1100)。また1点である場合には点(x’,y’)のE点(c,d)でT[c][d]=0、Board[c][d]=tnとなる点があるかを判定する(S1080)。なおここで(c=x’+1,x’−1,d=0)、または、(d=y’+1,y’−1,c=0)である。そしてS1080の条件を満たす点がない場合には、T[x’][y’]=0とする(S1100)。
一方、点(x’,y’)のE点(c,d)でT[c][d]=0、Board[c][d]=tnとなる点がある場合には(S1080)、点(x,y)に点(x’,y’)を代入する(S1090)。以上の処理を、点(x,y)のE点でBoard[x’][y’]=tn、T[x’][y’]=0となる点(x’,y’)のすべてについて処理を行う。すべての点(x’,y’)について処理実行後、点(x,y)の次の点について処理を実行させる。
以上の処理を、R[x][y]=1となる点(x,y)のすべてについて処理を行う。もし処理が終了した場合には、分割できないと判定できるので(S1110)、領域分割処理部219は以降の処理を中止し、死活判定実行部223における通常どおりの総あたりによる死活判定処理を実行させる(S910、S1020)。
上述の処理のS1060において、点(x’,y’)のE点に外部が含まれる場合には処理D2が実行されるので、それを説明する。まず配列T[x][y]をグループ化し、配列G1[x][y]に代入する(S1120)。そして配列H1[x][y]に配列H[x][y]を代入する(S1130)。
次に配列G1[x][y]=1となる点(x,y)について、H1[x][y]=0を代入する(S1140)。そしてH1[x][y]=1となる点(x,y)を取り、それを配列H1[x][y]でグループ化し、さらにそれを配列H2[x][y]に代入する(S1150)。そしてH2[x][y]=1となる点(x,y)について、H1[x][y]=0を代入する(S1160)。
次に、H1[x][y]=1となる点(x,y)が存在するかを判定し(S1170)、存在しない場合には処理D1に戻り、T[x’][y’]=0とする(S1100)。一方、H1[x][y]=1となる点(x,y)が存在する場合には、判定領域は分割可能であると判定し、各領域をR1,R2として分割線G1を配列D[x][y]に代入する(S1180)。また領域R1の各点、領域R2の各点について、それぞれ配列R1[x][y]に配列H1[x][y]を代入し、配列R2[x][y]に配列H2[x][y]を代入する(S1180)。
以上のような処理を実行することで、図55におけるS700乃至S710に相当する処理を実現できる。
そしてS1180を終了すると、領域分割処理部219は、判定領域を分割可能であると判定できるので(S910)、0眼変形処理部220および死活判定実行部223による処理Aを実行する(S920)。
まず0眼変形処理部220は、R1[x][y]=1となる点(x,y)について、Board[x][y]=tn^3、H[x][y]=0とする(S1190)(なおここでは領域R1について0眼への変形処理を実行している)。そして死活判定実行部223において、通常どおりの総あたりの死活判定処理を実行させる(S1200)。
以上のように処理することで、図55におけるS720乃至S730に相当する処理を実行することが出来る。
以上のように0眼変形処理部220で0眼への変形処理を行ったあと、死活判定実行部223における死活判定処理を実行した実行結果が勝ちであるならば(S930)、そのまま勝ちと判定できるので(S940)、処理を終了する。
一方、死活判定実行部223における死活判定処理を実行した実行結果が負けであるならば(S930)、次に後手1眼変形処理部221および死活判定実行部223による処理Bを実行する(S950)。
まず後手1眼変形処理部221は、領域R1と、領域R1のE点に含まれる外部の点(x,y)について、Board[x][y]=0、H[x][y]=0を代入する(S1210)。そして隣接する2点P1(x1,y1),P2(x2,y2)でそれぞれのE点が分割線Dの配列D[x][y]に含まれる点について、S1220乃至S1260、S1280乃至S1330の処理を反復する。
まず点P1、P2についてそれぞれ、Board[x1][y1]=tn^3、Board[x2][y2]=tn^3を代入する(S1220)。そして点P1、P2のE点となる点(x,y)でBoard[x][y]=tnを代入する(S1230)。そして配列D[x][y]を再びグループ化し(分割線Dを再びグループ化し)、配列D2[x][y]に代入する(S1240)。そしてD2[x][y]=1となる点のE空点(x,y)で、Board[x][y]=tn^3を代入する(S1250)。
次に、S1230で追加した点で、配列D2[x][y]=0かつS1250で追加した点(x,y)の、E点に含まれない点P3(x3,y3)があるかを判定する(S1260)。もしない場合には、次の点の処理に移る。そして2点P1,P2でそれぞれのE点が分割線Dの配列D[x][y]に含まれるすべての点について処理を実行したあと、S1260で条件を充足しない場合には、変形が行えない場合なので、そのまま処理を終了し、死活判定実行部223における死活判定処理を実行する(S1270)。
S1260の判定において、条件を充足する点がある場合には、その求めた点P3についてBoard[x3][y3]=tn^3を代入する(S1280)。そして点P1乃至点P3のグループのE空点、O空点となる点(x,y)について、Board[x][y]=tnを代入する(S1290)。そして点P3について、Board[x3][y3]=0とする(S1300)。
そして以上までで追加した点のE空点(x,y)について、Board[x][y]=tn^3を代入する(S1310)。ここでは後手1眼変形処理部221で処理Bを実行しているので、通常どおりの総あたりの死活判定処理を実行する(S1330)。
以上のように処理することで、図55におけるS760乃至S770に相当する処理を実行することが出来る。
以上のように後手1眼変形処理部221で後手1眼への変形処理を行ったあと、死活判定実行部223における死活判定処理を実行した実行結果が勝ちであるならば(S960)、次に1眼変形処理部222および死活判定実行部223で処理C’を実行する(S970)。一方、死活判定処理を実行した実行結果が負けであるならば(S960)、次に1眼変形処理部222および死活判定実行部223で処理Cを実行する(S1000)。
まず処理C’を実行する場合を説明する。なお図71のフローチャート、すなわち処理B、処理C、処理B’、処理C’で用いるフローチャートは基本的に同じであるが、処理Bと処理B’では処理対象となる領域がR1かR2かで変わる。同様に処理Cと処理C’では処理対象となる領域がR1からR2かで変わる。
まず1眼変形処理部222は、領域R2と、領域R2のE点に含まれる外部の点(x,y)について、Board[x][y]=0、H[x][y]=0を代入する(S1210)。そして隣接する2点P1(x1,y1),P2(x2,y2)でそれぞれのE点が分割線Dの配列D[x][y]に含まれる点について、S1220乃至S1260、S1280乃至S1330の処理を反復する。
まず点P1、P2についてそれぞれ、Board[x1][y1]=tn^3、Board[x2][y2]=tn^3を代入する(S1220)。そして点P1、P2のE点となる点(x,y)についてBoard[x][y]=tnを代入する(S1230)。そして配列D[x][y]を再びグループ化し(分割線Dを再びグループ化し)、配列D2[x][y]に代入する(S1240)。そしてD2[x][y]=1となる点のE空点(x,y)について、Board[x][y]=tn^3を代入する(S1250)。
次に、S1230で追加した点で、配列D2[x][y]=0かつS1250で追加した点(x,y)の、E点に含まれない点P3(x3,y3)があるかを判定する(S1260)。もしない場合には、次の点の処理に移る。そして2点P1,P2でそれぞれのE点が分割線Dの配列D[x][y]に含まれるすべての点について処理を実行したあと、S1260で条件を充足しない場合には、変形が行えない場合なので、そのまま処理を終了し、死活判定実行部223における死活判定処理を実行する(S1270)。
S1260の判定において、条件を充足する点がある場合には、その求めた点P3についてBoard[x3][y3]=tn^3を代入する(S1280)。そして点P1乃至点P3のグループのE空点、O空点となる点(x,y)について、Board[x][y]=tnを代入する(S1290)。そして点P3について、Board[x3][y3]=0とする(S1300)。
そして以上までで追加した点のE空点(x,y)について、Board[x][y]=tn^3を代入する(S1310)。ここでは1眼変形処理部222で処理C’を実行しているので、次に、S1290で追加した点のE点で、配列D2[x][y]のE点に含まれない点(x,y)を一つ求め、Board[x][y]=0を代入する(S1320)。そして死活判定実行部223において、通常どおりの総あたりの死活判定処理を実行する(S1330)。
以上のように処理することで、図55におけるS790乃至S800に相当する処理を実行することが出来る。
以上のように1眼変形処理部222で1眼への変形処理を行ったあと、死活判定実行部223における死活判定処理を実行した実行結果が勝ちであるならば(S980)、全体として勝ちと判定できるので(S990)、そのまま処理を終了する。一方、死活判定処理を実行した実行結果が負けであるならば(S980)、通常どおり、死活判定実行部223における総あたりによる死活判定処理を実行させる(S1020)。
以上のように処理B、処理C、処理B’、処理C’を図71のフローチャートに基づいて適宜実行することで、死活判定処理による処理結果を得ることが出来る。
なお上述のS960における処理Bにおいて、負けと判定したならば、次に1眼変形処理部222および死活判定実行部223で処理Cを上述と同様に実行する(S1000)。すなわち、図71のフローチャートにおいて、処理対象となる領域をR1として上述の処理C’と同様の処理を実行する。
S1000における処理Cの結果、すなわち1眼変形処理部222で1眼への変形処理を行った後、死活判定実行部223における死活判定処理を実行した結果が勝ちであるならば(S1010)、全体として勝ちと判定できるので(S990)、そのまま処理を終了する。一方、死活判定処理を実行した実行結果が負けであるならば(S1010)、さらに0眼変形処理部220および死活判定実行部223で処理A’を上述と同様に実行する(S1013)。
なお処理A’とは、図70に示すフローチャートにおける処理Aと同様の処理であるが、その処理対象となる領域がR1ではなく、領域R2の場合である。
そしてS1013における処理A’の結果、すなわち0眼変形処理部220で0眼への変形処理を行った後、死活判定実行部223における死活判定処理を実行した結果が勝ちであるならば(S1015)、全体として勝ちと判定できるので(S990)、そのまま処理を終了する。一方、死活判定処理を実行した実行結果が負けであるならば(S1015)、通常どおり、死活判定実行部223における総あたりによる死活判定処理を実行させる(S1020)。
以上のようにして死活判定処理部21cで死活判定の処理結果を判定すると、出力処理部22は、その処理結果を対局者端末3に送信する。
本実施例のように、判定領域の盤面を所定の方法で分割し、それぞれの眼形を判定することで、活きる石は2眼を持つことが多いという特性を利用した簡易的な判定を行うことが可能となる。
次に、死活判定処理部21dにおける高速処理の第4の実施例を以下に説明する。本実施例における死活判定処理部21dの処理機能の一例の概念図を図72に示す。本実施例の死活判定処理部21dでは、着手を制限し、通常の活きの条件のほかに判定対象の石に隣接する空点が多ければ活きと判定することで、容易に死ぬ石かどうかを判定する方法である。なお、この判定方法を本明細書では緩みシチョウを用いた判定方法という。
本実施例の死活判定処理部21dには、E空点カウント処理部224と簡易判定処理部225とを備える。
E空点カウント処理部224は、判定対象の石のE空点の数をカウントする。
簡易判定処理部225は、緩みシチョウを用いることにより、E空点カウント処理部224においてカウントしたE空点の数に基づいて、攻撃側または防御側の着手の優先度を決定し、その優先度に従って攻撃側または防御側の着手を実行し、攻撃側において判定対象の石のE空点の数が4以上の場合に攻撃側の負け、攻撃側において判定対象の石のE空点の数が1の場合に攻撃側の勝ち、と判定する。なお攻撃側または防御側のE空点の数に応じた着手の優先度の決定処理は以下の通りである。
まず攻撃側について、E空点カウント処理部224においてカウントした、判定対象の石のE空点の数が4点以上の場合には、緩みシチョウで取ることが出来ないので、攻撃側の負けと判定する。
攻撃側について、E空点カウント処理部224においてカウントした、判定対象の石のE空点の数が3点の場合、E空点のうち、その点を防御側が着手した時のE空点の数を数え、それが多い順に優先度を決定し、着手を行う。
攻撃側について、E空点カウント処理部224においてカウントした、判定対象の石のE空点の数が2点の場合、以下の順序で着手を行う。まず第1に、E点となる攻撃側の石のE空点をE空点カウント処理部224でカウントし、1点の場合にはそのE空点に着手する。第2に、E空点のうち、その点を防御側が着手した時のE空点の数をE空点カウント処理部224でカウントし、それが多い順に着手する。第3に、O空点に着手する。第4に、E空点のE空点に着手する。第5に、E空点のO空点に着手する。第6に、O空点のE空点に着手する。
攻撃側について、E空点カウント処理部224においてカウントした、判定対象の石のE空点の数が1点の場合は、その点に着手する。この時点で攻撃側の勝ちと判定する。
次に防御側について、判定対象の石のE空点の数をE空点カウント処理部224でカウントし、それが2点であれば、以下の順序で着手を行う。まず第1に、E点となる攻撃側の石のE空点の数をE空点カウント処理部224でカウントし、1点のときにはそのE空点に着手する。第2に、E点となる攻撃側の石のE空点の数をE空点カウント処理部224でカウントし、2点のときはそのE空点のいずれかに着手する。第3に、E空点のうち、その点を着手した時のE空点の数をE空点カウント処理部224でカウントし、それが多い順に着手する。第4に、O空点に着手する。第5に、E空点のE空点に着手する。第6に、E空点のO空点に着手する。第7に、O空点のE空点に着手する。
防御側について、判定対象の石のE空点の数をE空点カウント処理部224でカウントし、それが1点であれば、以下の順序で着手を行う。まず第1に、E点となる攻撃側の石のE空点をE空点カウント処理部224でカウントし、それが1点のときにはそのE空点に着手する。第2に、E空点に着手する。
以上のような処理を、簡易判定処理部225は、攻撃側および防御側について交互に行い、攻撃側のE空点の数が4点以上、または1点となるまで繰り返し反復する。
次に本実施例における死活判定処理の処理プロセスの一例を図73のフローチャートを用いて説明する。
対局者が利用する対局者端末3同士でネットワークを介して囲碁の対局が行われている。この際に囲碁の対局は対局システムを実現するサーバ2上でその処理が行われている。そしてその対局中、あるいは終局後、対局者のいずれかがその表示される画面から所定のボタン等を押下することで、死活判定処理を行うことの要求が対局者端末3から、死活判定処理を行うサーバ2に送信される。対局画面の一例を図74に示す。
対局画面が図74の場合、その画面のうち、「死活ナビ」など、死活判定処理を行うことを要求するボタンを押下することで、死活判定処理を行うことの要求が対局者端末3からサーバ2に送信される。
サーバ2の入力受付部20でその要求を受け付けると、死活判定処理部21dは、対局システムの記憶装置11から当該盤面の情報(たとえば棋譜の情報)を取得する。そして盤面の情報が含まれた死活判定処理の画面を出力処理部22が対局者端末3に送信する。この際の画面の一例が図75である。なお実際に対局している盤面の情報のほか、すでに対局し、所定の記憶装置11に保存している棋譜の情報、あるいは観戦している対局の棋譜の情報を死活判定処理部21dが対局システムの記憶装置11から取得し、その棋譜の情報を図75の画面に含めて対局者端末3に送信しても良い。
死活判定を行う対局者は、図75に示す死活判定処理を行う画面から盤面の編集を行う。例えば表示されている石を指定することで、石を取り除いたり、あるいは石を置く。またマウスなどの入力装置13をドラッグするなどにより、判定領域を指定する。このように死活判定処理を所望する対局者は、適宜、盤面の情報を編集する。この際の編集される石の情報、手番の情報は、対局者端末3からサーバ2に適宜、送られる。
上述のように対局者が判定領域を指定することにより、その判定領域内にある結論を出すべき石が判定対象の石として設定される。また、対局者が判定対象の石のうち、さらに特定の石を結論を出すべき石(目標石)として設定する場合には、それを目標石として設定する。判定対象の石のうち少なくとも一つの石が活きる時には死活判定の結論は活きとなり、すべての石が取られる場合、結論は死にとなる。なお、目標石を指定した場合には、目標石のすべてが活きる時には死活判定の結論は活きとなり、目標石のうち少なくとも一つが取られる場合、死活判定の結論は死にとなる。なお目標石の指定は必須ではなく、また目標石を指定するかしないかではその処理には差がなく、活き死にの判断基準が変わるだけである。従って、目標石を指定した場合には、「判定対象の石」との記載を「目標石」と適宜読み替え、各グループ化された目標石についてそれぞれ処理を行うことで、その処理が可能となる。
編集後の死活判定処理を行う画面の一例を図76に示す。なお図76では目標石が黒の2子(黒星)、手番は白であるとする。従って、この場合、次の順番は白石であり、さらに白石から見て黒の2子の死活判定を行うことを意味している。
例えば図76の画面における「判定処理」を押下することで、編集後の盤面の情報(棋譜の情報と判定対象の石の情報など)と手番の情報と、死活判定処理を開始することの要求とが対局者端末3からサーバ2に送信される。サーバ2の入力受付部20で編集後の盤面の情報と手番の情報と死活判定処理を開始することの要求を受け付けると、死活判定処理部21dは、入力を受け付けた編集後の盤面の情報に基づいて、死活判定処理を開始する。
まず死活判定処理部21dのE空点カウント処理部224は、目標石である判定対象の石のE空点の数をカウントする(S1400)。ここでE空点の数が1点であれば(S1410)、簡易判定処理部225は攻撃側の勝ちであることを判定し(S1420)、そのまま処理を終了する。またE空点の数が4以上であれば(S1410)、簡易判定処理部225は攻撃側の負けであることを判定し(S1430)、そのまま処理を終了する。
図76の場合、E空点の数は図77に示すように3点ある。そのため、簡易判定処理部225は、各E空点について、上記の順序に従って、着手の優先順位を決定する(S1440)。ここでは、E空点1が防御側が着手した時のE空点が5カ所、E空点2が防御側が着手した時のE空点が4カ所、E空点3が防御側が着手した時のE空点が3カ所であるので、この優先順位に従って、着手の優先順位を決定する。
従って、簡易判定処理部225は、まず優先順位が最も高いE空点1に着手する(S1450)。これを模式的に示すのが図78である。
次に、簡易判定処理部225は、このE空点1に対して攻撃側が着手したことに対し、防御側のすべての着手で攻撃側が目標石を取れるかを判定する(S1460)。もし目標石が防御側のすべての着手で取れる場合には、その時点で簡易判定処理部225は処理を中止し、攻撃側の勝ちを判定する(S1490)。一方、目標石が防御側のいずれかの着手で取られない場合には(S1460)、S1450で設定した優先順位の次の順位で着手を行う(S1480、S1450)。すなわち、図77のE空点2に着手することとなる。これを模式的に示すのが、図79である。
そして、上記と同様に、簡易判定処理部225は、このE空点2に対して攻撃側が着手したことに対し、防御側のすべての着手で攻撃側が目標石を取れるかを判定する(S1460)。もし目標石が防御側のすべての着手で取れる場合には、その時点で簡易判定処理部225は処理を中止し、攻撃側の勝ちを判定する(S1490)。一方、目標石が防御側のいずれかの着手で取られない場合には(S1460)、S1450で設定した優先順位の次の順位で着手を行う(S1480、S1450)。すなわち、図78のE空点3に着手することとなる。これを模式的に示すのが、図80である。
そして、上記と同様に、簡易判定処理部225は、このE空点3に対して攻撃側が着手したことに対し、防御側のすべての着手で攻撃側が目標石を取れるかを判定する(S1460)。もし目標石が防御側のすべての着手で取れる場合には、その時点で簡易判定処理部225は処理を中止し、攻撃側の勝ちを判定する(S1490)。一方、目標石が防御側のいずれかの着手で取られない場合には(S1460)、S1450で設定した優先順位の次の順位で着手を行うが(S1480)、すべての優先順位で着手を行ってしまったので、簡易判定処理部225は、攻撃側の負けを判定し、処理を終了する(S1490)。
以上のようにして死活判定処理部21dで死活判定の処理結果を判定すると、出力処理部22は、その処理結果を対局者端末3に送信する。
なお上述のS1460で防御側のすべての着手で攻撃側が取れるか取れないかを判定するためには、防御側がE空点カウント処理部224でカウントしたE空点の数に応じて着手した点に対し、さらに攻撃側が、E空点カウント処理部224でカウントしたE空点の数に応じて着手する、といったように順に優先順位に従った処理を行う必要がある。そこで、以下に、図78の状態から、防御側の処理を説明する。
図78の状態に攻撃側が着手した場合、E空点カウント処理部224がカウントするE空点の数は、2カ所である。従って、第1に、E点となる攻撃側の石のE空点が2カ所の点、第2に、E空点、第3に、O空点、第4に、E空点のE空点、第5に、E空点のO空点、第6にO空点のE空点の優先順位を各点に判定することが出来る。これを模式的に示すのが、図81である。
この場合、優先順位が高いE空点1が2点あるので、例えば上方にあるE空点1に着手する。これを模式的に示すのが図82である。
次に図82の状態に防御側が着手した場合、E空点カウント処理部224がカウントするE空点の数は2点なので、上述の優先順位に従って着手する。すなわち、第1に、E点となる攻撃側の石のE空点が1カ所の点、第2に、E空点、第3に、O空点、第4に、E空点のE空点、第5に、E空点のO空点、第6にO空点のE空点の優先順位を、各点について判定することが出来る。これを模式的に示すのが、図83である。
そうすると優先順位が最も高いのがE空点1なので、攻撃側はそこに着手することとなる。これを模式的に示すのが図84である。
次に図84の状態に攻撃側が着手した場合、E空点カウント処理部224がカウントするE空点の数は1点なので、上述の防御側の優先順位に従って着手する。すなわち、E空点が1点で、かつE点となる攻撃側の石にE空点が1点となるものがないので、残りのE空点に着手することとなる。これを模式的に示すのが図85である。
従って防御側はそこに着手することとなる。これを模式的に示すのが図86である。
次に図86の状態に防御側が着手した場合、E空点カウント処理部224がカウントするE空点の数は2点なので、上述の優先順位に従って着手する。なお目標石と繋がっている同じ色についても目標石として処理を行うこととなる。すなわち、第1に、E点となる防御側が着手したときのE空点が3カ所の点、第2に、E点となる防御側が着手したときのE空点が2カ所の点、第3に、O空点、第4に、E空点のE空点、第5に、E空点のO空点、第6にO空点のE空点の優先順位を、各点について判定することが出来る。これを模式的に示すのが、図87である。
そうすると優先順位が最も高いのがE空点1なので、攻撃側はそこに着手することとなる。攻撃側が着手した状態を模式的に示すのが図88である。
次に図88の状態に攻撃側が着手した場合、E空点カウント処理部224がカウントするE空点の数は1点なので、上述の優先順位に従って着手する。すなわち、E空点が1点で、かつE点となる攻撃側の石にE空点が1点となるものがないので、残りのE空点に着手することとなる。これを模式的に示すのが図89である。
従って防御側はそこに着手することとなる。これを模式的に示すのが図90である。
次に図90の状態に防御側が着手した場合、E空点カウント処理部224がカウントするE空点の数は1点なので、上述の優先順位に従って着手する。これを模式的に示すのが図91である。すなわち、E空点1に着手するとともに、攻撃側の勝ちを判定する。これを模式的に示すのが図92である。
以上のように行うことで攻撃側の勝ちを判定できるが、これは図81の状態において、優先順位が「1」である2点のうち、上方にあるE空点1に着手した場合である(これが図82である)。従ってもう一つの優先順位が「1」である点については、攻撃側の勝ちを簡易判定処理部225は判定できていないので、もう一つの点について着手した場合を、簡易判定処理部225は判定する。すなわち、一度、盤面の状態を図81の状態に戻した上で、もう一つの優先順位が「1」である点に着手する。これを模式的に示すのが図93である。
次に図93の状態に防御側が着手した場合、E空点カウント処理部224がカウントするE空点の数は2点なので、上述の優先順位に従って着手する。すなわち、第1に、E点となる攻撃側の石のE空点が1カ所の点、第2に、E点となる防御側が着手したときのE空点が2カ所の点、第2に、E点となる防御側が着手したときのE空点が1カ所の点、第3に、O空点、第4に、E空点のE空点、第5に、E空点のO空点、第6にO空点のE空点の優先順位を、各点について判定することが出来る。これを模式的に示すのが、図94である。
そうすると優先順位が最も高いのがE空点1なので、攻撃側はそこに着手することとなる。攻撃側が着手した状態を模式的に示すのが図95である。
次に図95の状態に攻撃側が着手した場合、E空点カウント処理部224がカウントするE空点の数は2点なので、上述の優先順位に従って着手する。すなわち、第1に、E点のうち防御側が着手したときのE空点が2カ所の点、第2に、O空点、第3に、E空点のE空点、第4に、E空点のO空点、第5に、O空点のE空点の優先順位を、各点について判定することが出来る。これを模式的に示すのが図96である。
図96の状態では優先順位が「1」である点(E空点1)が2点ある。そこでまずE空点1のうち、上方のE空点1に防御側は着手する。これを模式的に示すのが図97である。なお下方のE空点1についても、上方のE空点1に着手した場合の処理が終了したあとで着手し、同様に判定する。
次に図97の状態に防御側が着手した場合、E空点カウント処理部224がカウントするE空点の数は2点なので、上述の優先順位に従って着手する。すなわち、第1に、E点となる防御側が着手したときのE空点が3カ所の点、第2に、E点となる防御側が着手したときのE空点が2カ所の点、第3に、O空点、第4に、E空点のE空点、第5に、E空点のO空点、第6にO空点のE空点の優先順位を、各点について判定することが出来る。これを模式的に示すのが、図98である。
そうすると優先順位が最も高いのがE空点1なので、攻撃側はそこに着手することとなる。攻撃側が着手した状態を模式的に示すのが図99である。
次に図99の状態に攻撃側が着手した場合、E空点カウント処理部224がカウントするE空点の数は1点なので、上述の優先順位に従って着手する。すなわち、E空点カウント処理部224がカウントするE空点の数は1点なので、上述の優先順位に従って着手する。すなわち、E空点が1点で、かつE点となる攻撃側の石にE空点が1点となるものがないので、残りのE空点に着手することとなる。これを模式的に示すのが図100である。
従って防御側はそこに着手することとなる。これを模式的に示すのが図101である。
次に図101の状態に防御側が着手した場合、E空点カウント処理部224がカウントするE空点の数は1点なので、上述の優先順位に従って着手する。これを模式的に示すのが図102である。すなわち、E空点1に着手するとともに、攻撃側の勝ちを判定する。これを模式的に示すのが図103である。
以上のように行うことで攻撃側の勝ちを判定できるが、これは図96の状態において、優先順位が「1」である2点のうち、上方にあるE空点1に着手した場合である(これが図97である)。従ってもう一つの優先順位が「1」である点については、攻撃側の勝ちを簡易判定処理部225は判定できていないので、もう一つの点について着手した場合を、簡易判定処理部225は判定する。すなわち、一度、盤面の状態を図96の状態に戻した上で、もう一つの優先順位が「1」である点に着手する。これを模式的に示すのが図104である。
上述の処理を簡易判定処理部225は、攻撃側、防御側についてそれぞれE空点の数に応じた着手を繰り返す。そして、簡易判定処理部225は、攻撃側、防御側のいずれについても優先順位が高い順にそれぞれ着手を行う。その結果、攻撃側の特定の着手について攻撃側で取れる場合は攻撃側の勝ち、攻撃側のすべての着手で取れないような防御側の着手がある場合には攻撃側の負けと判定する。
このような処理を用いることで、特に終局状態の盤面で特定の石、すなわち目標石が取られるかを高速に判定することが出来る。
次に上述の各処理のより詳細な説明を図105乃至図116を用いて説明する。
まず死活判定処理部21dは、盤面の情報を読み込み、Board[x][y]に空点であるか、黒石が置かれているか、白石が置かれているかを記憶していく。また判定領域Area[x][y]にそれぞれ判定領域であるか否かを記憶していく。また上記のほか、判定対象の石H[x][y]、判定領域Area[x][y]、手番tnなども適宜、設定される。そして、死活判定処理部21dにおけるE空点カウント処理部224が、Board[x][y]、H[x][y]から、H[x][y]のE空点を取得し、配列E1[x][y]に代入する(S1500)。
そして簡易判定処理部225は、配列E1[x][y]=1となる点の数に応じて、S1520乃至S1550に応じた処理を行う(S1510)。
まずE1[x][y]=1となる点の数が4以上の場合、簡易判定処理部225は、攻撃側の負けであることを判定し(S1520)、そのまま処理を終了する。また、E1[x][y]=1となる点の数が1である場合、簡易判定処理部225は、攻撃側の勝ちであることを判定し(S1530)、そのまま処理を終了する。
またE1[x][y]=1となる点の数が3の場合、簡易判定処理部225は、処理Bを実行し(S1540)、処理Bが終了後、さらに処理Dを実行する(S1560)。
一方、E1[x][y]=1となる点の数が2の場合、簡易判定処理部225は、処理Cを実行し(S1550)、処理Cが終了後、さらに処理Dを実行する(S1560)。
以上のような処理を簡易判定処理部225は実行する。
次に、まず処理Bを説明する。簡易判定処理部225は、E1[x][y]=1となる点(x,y)についてS1600乃至S1635を反復処理する。
すなわち、まずE1[x][y]=1となる点(x,y)についてBoard[x][y]=tn^3を代入する(S1600)。そして配列Board[x][y]についてグループ化し、配列H2[x][y]に代入する(S1610)。次に、配列H2[x][y]のE空点を取得し、配列E2[x][y]に代入する(S1620)。そして、その点(x,y)を配列Order[i]に追加し(配列Order[i].xにxを、配列Order[i].yにyを代入)、Order[i].vにE2[x][y]=1となる点の数を代入する(S1630)。また配列Board[x][y]=0を代入する(S1635)。
以上の処理をE1[x][y]=1となるすべての点(x,y)について処理を行い、処理終了後、配列Orderを、その要素vが大きい順に並べ替える(S1640)。
以上のようにして簡易判定処理部225は処理Bを実行し、その後、処理Dを実行する。
まずi=0からi<361になるまで、S1650乃至S1660を反復処理する。
すなわち、まず手番tnで配列Order[i]の点(x,y)に着手可能かを判定し(S1650)、着手不可能ならば次のiの処理に移る。一方、着手可能ならば、着手を行い、配列Board[x][y]、配列H[x][y]を更新する(S1655)。すなわちBoard[x][y]=tnとし、さらに着手したことによって相手の石が取れる場合には、取れる石の位置における配列Boardの値についても適宜更新する。また判定対象の石と隣接している石についても配列H[x][y]=1として適宜更新する。さらにグループ化できる場合には、配列H[x][y]を再グループ化する。その後、後述する処理Eを実行し、処理Eの判定結果が勝ちならば(S1660)、簡易判定処理部225は攻撃側の勝ちと判定し(S1670)、処理を終了する。一方、処理Eの判定結果が負けならば次のiの処理に移る。
以上の処理をi<361となるまで反復し、処理を終了した場合、簡易判定処理部225は攻撃側の負けと判定し(S1680)、処理を終了する。
次に、図105のS1550における処理Cを説明する。
簡易判定処理部225は、H[x][y]の空点ではないE点について、配列E2[x][y]に代入する(S1700)。そして、E2[x][y]=1となるすべての点(x,y)について、S1710乃至S1740を反復処理する。
すなわち、まずBoard[x][y]をグループ化し、配列G[x][y]に代入する(S1710)。そして配列G[x][y]のE空点を配列G2[x][y]に代入する(S1720)。そして配列G2[a][b]=1(1≦a,b≦19)となる点(a,b)の数を判定し(S1730)、それが1点以外の場合には、次の点(x,y)に移る。一方、配列G2[a][b]=1となる点の数が1点の場合には、点(a,b)を配列Order[i]に追加し(配列Order[i].xにaを、配列Order[i].yにbを代入)、Order[i].v=5000とする(S1740)。
以上の処理をE2[x][y]=1となるすべての点(x,y)について行い、その処理終了後、処理C2を実行する。
まずE1[x][y]=1となるすべての点(x,y)について、S1750乃至S1790を反復処理する。
すなわち、E1[x][y]=1となる点(x,y)についてBoard[x][y]=tn^3を代入する(S1750)。そしてBoard[x][y]をグループ化して、配列H2[x][y]に代入する(S1760)。次に配列H2のE空点を配列E2[x][y]に代入する(S1770)。そして点(x,y)を配列Order[i]に追加し(配列Order[i].xにxを、配列Order[i].yにyを代入)、Order[i].vに、4000とE2[x][y]=1となる点の数を加算した値を代入する(S1780)。そしてBoard[x][y]=0を代入する(S1790)。
以上の処理をE1[x][y]=1となるすべての点(x,y)について行い、その処理終了後、処理C3を実行する。
まず、配列H[x][y]のO空点を配列O[x][y]に代入する(S1800)。そして配列H[x][y]のE空点のE空点を配列EE[x][y]に代入する(S1810)。次に配列H[x][y]のE空点のO空点を配列EO[x][y]に代入し(S1820)、配列H[x][y]のO空点のE空点を配列OE[x][y]に代入する(S1830)。
そして点(x,y)について、それぞれ1から19になるまで、S1840乃至S1910を反復処理する。
まず配列O[x][y]=1であるかを判定し(S1840)、そうであるならば点(x,y)をOrder[i]に追加して(配列Order[i].xにxを、配列Order[i].yにyを代入)、Order[i].v=3000を代入する(S1850)。そして次の点(x,y)の処理に移る。また、配列O[x][y]=1ではない場合には、配列EE[x][y]=1であるかを判定する(S1860)。
配列EE[x][y]=1であるならば点(x,y)を配列Order[i]に追加して(配列Order[i].xにxを、配列Order[i].yにyを代入)、Order[i].v=2000を代入する(S1870)。そして次の点(x,y)の処理に移る。そうでないならば、配列EO[x][y]=1であるかを判定する(S1880)。
配列EO[x][y]=1であるならば点(x,y)を配列Order[i]に追加して(配列Order[i].xにxを、配列Order[i].yにyを代入)、Order[i].v=1000を代入する(S1890)。そして次の点(x,y)の処理に移る。そうでないならば、配列OE[x][y]=1であるかを判定する(S1900)。
配列OE[x][y]=1であるならば点(x,y)を配列Order[i]に追加して(配列Order[i].xにxを、配列Order[i].yにyを代入)、Order[i].v=0を代入する(S1910)。そして次の点(x,y)の処理に移る。またそうでない場合にも次の点(x,y)の処理に移る。
以上の処理を点(x,y)がそれぞれ19になるまで処理を実行し、処理終了後、配列Order[i]について、その要素vが大きい順に並べ替える(S1920)。そして、上述の処理Dを簡易判定処理部225が実行する。
次に処理Eについて説明する。
まず処理Eにおいては、配列H[x][y]のE空点を配列E1[x][y]に代入する(S1950)。そしてE1[x][y]=1となる点の数を判定し(S1960)、それが2であるならば、後述する処理Fを簡易判定処理部225は実行する(S1970)。また1であるならば、後述する処理Gを簡易判定処理部225は実行する(S1980)。そして処理F、処理Gが終了後、簡易判定処理部225は後述する処理Hを実行する(S1990)。
まずE1[x][y]=1となる点の数が2であった場合に実行する処理Fについて説明する。
処理Fでは、まず配列H[x][y]の空点ではないE点を配列E2[x][y]に代入する(S2000)。そしてE2[x][y]=1となるすべての点(x,y)について、S2010乃至S2050を反復処理する。
まず配列Board[x][y]をグループ化し、配列G[x][y]に代入する(S2010)。そして配列G[x][y]のE空点を配列G2[x][y]に代入する(S2020)。
そして配列G2[a][b]=1(1≦a,b≦19)となる点(a,b)の数を判定し(S2030)、それが1であるならば、点(a,b)を配列Order[i]に追加し(配列Order[i].xにaを、配列Order[i].yにbを代入)、Order[i].v=6000を代入する(S2040)。一方、配列G2[a][b]=1となる点の数が2の場合、点(a,b)を配列Order[i]に追加し(配列Order[i].xにaを、配列Order[i].yにbを代入)、Order[i].v=5000を代入する(S2050)。また配列G2[a][b]が1でも2でもない場合には、あるいはS2040、S2050において点(a,b)を配列Order[i]に追加した場合には、次の点(x,y)の処理に移る。
以上の処理をE2[x][y]=1となるすべての点(x,y)について実行し、処理終了後、処理F2を実行する。
まず、配列E1[x][y]=1となるすべての点(x,y)について、S2060乃至S2100の反復処理を実行する。
まず、Board[x][y]=tn^3を代入し(S2060)、次にBoard[x][y]をグループ化して、配列H2[x][y]に代入する(S2070)。そして配列H2[x][y]のE空点を配列E2[x][y]に代入し(S2080)、点(x,y)を配列Order[i]に追加する(配列Order[i].xにxを、配列Order[i].yにyを代入)。そしてOrder[i].vについて、4000と、配列E2[x][y]=1となる点の数とを加算した値を代入する(S2090)。そして、Board[x][y]=0を代入する(S2100)。
以上の処理をE1[x][y]=1となるすべての点(x,y)について実行し、処理終了後、処理F3を実行する。
まず、配列H[x][y]のO空点を配列O[x][y]に代入する(S2110)。そして配列H[x][y]のE空点のE空点を配列EE[x][y]に代入する(S2120)。次に配列H[x][y]のE空点のO空点を配列EO[x][y]に代入し(S2130)、配列H[x][y]のO空点のE空点を配列OE[x][y]に代入する(S2140)。
そして点(x,y)について、それぞれ1から19になるまで、S2150乃至S2220を反復処理する。
まず配列O[x][y]=1であるかを判定し(S2150)、そうであるならば点(x,y)をOrder[i]に追加して(配列Order[i].xにxを、配列Order[i].yにyを代入)、Order[i].v=3000を代入する(S2160)。そして次の点(x,y)の処理に移る。また、配列O[x][y]=1ではない場合には、配列EE[x][y]=1であるかを判定する(S2170)。
配列EE[x][y]=1であるならば点(x,y)を配列Order[i]に追加して(配列Order[i].xにxを、配列Order[i].yにyを代入)、Order[i].v=2000を代入する(S2180)。そして次の点(x,y)の処理に移る。そうでないならば、配列EO[x][y]=1であるかを判定する(S2190)。
配列EO[x][y]=1であるならば点(x,y)を配列Order[i]に追加して(配列Order[i].xにxを、配列Order[i].yにyを代入)、Order[i].v=1000を代入する(S2200)。そして次の点(x,y)の処理に移る。そうでないならば、配列OE[x][y]=1であるかを判定する(S2210)。
配列OE[x][y]=1であるならば点(x,y)を配列Order[i]に追加して(配列Order[i].xにxを、配列Order[i].yにyを代入)、Order[i].v=0を代入する(S2220)。そして次の点(x,y)の処理に移る。またそうでない場合にも次の点(x,y)の処理に移る。
以上の処理を点(x,y)がそれぞれ19になるまで処理を実行し、処理終了後、配列Order[i]について、その要素vが大きい順に並べ替える(S2230)。そして、後述する処理Hを簡易判定処理部225が実行する。
また、図111のS1960において配列E1[x][y]=1となる点の数が1である場合には、処理Gが実行されるので、処理Gを説明する。
簡易判定処理部225は、配列H[x][y]の空点ではないE点について、配列E2[x][y]に代入する(S2300)。そして、E2[x][y]=1となるすべての点(x,y)について、S2310乃至S2340を反復処理する。
すなわち、まず点(x,y)をグループ化し(配列Board[x][y]をグループ化し)、配列G[x][y]に代入する(S2310)。そして配列G[x][y]のE空点を配列G2[x][y]に代入する(S2320)。そして配列G2[a][b]=1(1≦a,b≦19)となる点(a,b)の数を判定し(S2330)、それが1点以外の場合には、次の点(x,y)に移る。一方、配列G2[x][y]=1となる点の数が1点の場合には点(a,b)を配列Order[i]に追加し(配列Order[i].xにaを、配列Order[i].yにbを代入)、Order[i].v=5000とする(S2340)。
以上の処理をE2[x][y]=1となるすべての点(x,y)について行い、その処理終了後、処理Hを実行する。
まず簡易判定処理部225は、i=0からi<361になるまで、S2400乃至S2430を反復処理する。
すなわち、まず手番tn^3で配列Order[i]の点(x,y)に着手可能かを判定し(S2400)、着手不可能ならば次のiの処理に移る。一方、着手可能ならば、着手を行い、配列Board[x][y]、配列H[x][y]を更新する(S2405)。すなわちBoard[x][y]=tn^3とし、さらに着手したことによって相手の石が取れる場合には、取れる石の位置における配列Boardの値についても適宜更新する。また判定対象の石と隣接している石についても配列H[x][y]=1として適宜更新する。さらにグループ化できる場合には、配列H[x][y]を再グループ化する。その後、後述する処理A(図105の処理)を実行し、処理Aの判定結果が負けならば(S2410)、簡易判定処理部225は攻撃側の負けと判定し(S2420)、処理を終了する。一方、処理Aの判定結果が負けでないならば次のiの処理に移る。
以上の処理をi<361となるまで反復し、処理を終了した場合、簡易判定処理部225は攻撃側の勝ちと判定し(S2430)、処理を終了する。
以上のように、簡易判定処理部225が処理A乃至処理Hを実行することで、本実施例における、緩みシチョウを用いた死活判定処理を実行することが出来る。
なお上述の実施例1乃至実施例3では判定対象の石を用いた場合を説明したが、目標石を指定しても良い。この場合、死活判定処理部21dは、総あたりによる死活判定処理を行う場合に、目標石のすべてが活きる場合、死活判定の結果は活きとなり、目標石の少なくとも一つの石が取られる場合、死活判定の結果は死にと判定することで、総あたりによる死活判定処理を実行することが出来る。
また、上述の各実施例では配列、変数などを用いた処理を説明したが、それらに限定されず、適宜、必要な方法で処理を行うことが出来る。
本発明に於ける各手段、データベースは、その機能が論理的に区別されているのみであって、物理上あるいは事実上は同一の領域を為していても良い。又データベースの代わりにデータファイルであっても良いことは言うまでもなく、データベースとの記載にはデータファイルをも含んでいる。