//////////////////////////////////////////////////////////////////////////
//  ハノイの塔　Flashフラッシュソース一式
//                                         (c) 2006　SOFNEC.,LTD.
//////////////////////////////////////////////////////////////////////////

----------------------------------------
 目 次
----------------------------------------
 1. 概要
 2. 動作条件
 3. 同梱ファイル一覧
 4. Flash／Prologインタフェース
 5. 著作権・他
 6. 免責事項

----------------------------------------
 1. 概要
----------------------------------------
　本プログラムはWebアプリケーションとして動作する「AZ-Prolog Ver.5」を使用することにより
Flashを使用して論理解析結果表示のビジュアル化を目的としたものです。

----------------------------------------
 2. 動作条件
----------------------------------------
　本ソフトウェアを動作させるためには、FlashMX2004が必要です。
  提供プログラムはLocalHostのcgiとの通信を行うように設定されています
　任意のサーバーとの通信をおこなうためには、hanoi_index.html に埋め込まれて
　いるHOST設定とサーバー種類の設定を書き換えてください。
----------------------------------------
 3. 同梱ファイル一覧
----------------------------------------

hanoi.swf　Flashムービー
hanoi.fla　Flashソース本体(FlashMX2004)

-------- 以下外部ソース ---------
hanoiInit.as　　　　初期処理
hanoiIntro.as　　　 画面初期表示
hanoiEnban.as　　　 円盤関連
hanoiRoot.as　　　　Root関係、サーバとの通信※
　　※　→　144行以降　Web実行環境により要変更
hanoiSlide.as　　　 スライドバーの処理


-------------------------------------------
 4. Flash／Prologインタフェース
-------------------------------------------

% 問題：
N枚の円盤が大きいものから順に柱aに積み上がっている。
これを全て同じ積み重なりで柱cへ移せ。

% ルール：
柱ｂを作業用に利用してよいが小さい円盤の上に大きい円盤を置いてはならない。
また柱以外の場所へ円盤をおいてはならず、同時に一枚しか動かすことができない。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 1)円盤の数は１〜９を限度とする。（一文字一位置とするため）
%% 2) Flash=>Prolog のパラメータ： seed,place
%%        http://www.xxxx.jp/prolog/hanoi.cgi?seed=3abc&place=3a1a2a3
%% 4) Prolog=>Flash のパラメータ： seed,answer
%%        seed=0bac2ab1cab3ac2bac&answer=3a1a1a2a2a3c1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%
%% 盤面の表現 %%
%%%%%%%%%%%%%%%%

円盤の名前を小さい順に円盤１〜円盤Nと名付ける。
円盤の置かれている高さを下から順に高さ位置１〜高さ位置Nと名付ける。


円盤１      =|=          |           |  ＜＝高さ位置３
円盤２    ===|===        |           |  ＜＝高さ位置２
円盤３   ====|====       |           |  ＜＝高さ位置１
       〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
            柱a         柱b         柱c

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%　Place：Flashから受け取る円盤配置情報　%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

ある盤面のときの静的状態を円盤数を前置きし、左から順番に全ての円盤を
次のように並べることであらわす。

　＜　円盤数,円盤Nの柱と高さ,円盤N-1の柱と高さ,円盤N-2の柱と高さ...　＞

Flash側から現在の盤面としてこの情報を受け取る。上の図では次のようになる。

3a1a2a3
 ==--==
  3 2 1 <--  順序が円盤番号に対応

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%　Answer：Prologから返す円盤の操作情報　%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

上の盤面で円盤１を柱ｃへ移動する操作( move disk1 from a3 to c1 )
のとき、他の円盤は動いていないのだから全体像は次である。

 move disk3 a1 -> a1 , move disk2 a2 -> a2 , move disk1 a3 -> c1

これを円盤数を前置きし、左から順番に全ての円盤の移動情報を
次のように並べることであらわす。

　＜　円盤数,円盤Nの現位置＋移動先,円盤N-1の現位置＋移動先,円盤N-2の現位置＋移動先...　＞

Prolog側から移動操作としてこの情報を渡す。上記操作は次のようになる。

3a1a1a2a2a3c1
 ====----====
   3   2   1    <--  順序が円盤番号に対応


%%%%%%%%%%%%%%%%
% 動作例 
| ?-hanoi("3abc","3a1a2a3").
[Move Disk ,1, from ,a, to ,c]
0bac2ab1cab3ac2bac
3a1a1a2a2a3c1

| ?-hanoi("0bac2ab1cab3ac2bac","3a1a2c1").
[Move Disk ,2, from ,a, to ,b]
1cab3ac2bac
3a1a1a2b1c1c1

| ?-hanoi("1cab3ac2bac","3a1b1c1").
[Move Disk ,1, from ,c, to ,b]
0acb3ac2bac
3a1a1b1b1c1b2

| ?-hanoi("0acb3ac2bac","3a1b1b2").
[Move Disk ,3, from ,a, to ,c]
2bac
3a1c1b1b1b2b2

| ?-hanoi("2bac","3c1b1b2").
[Move Disk ,1, from ,b, to ,a]
0cba2bc1abc
3c1c1b1b1b2a1

| ?-hanoi("0cba2bc1abc","3c1b1a1").
[Move Disk ,2, from ,b, to ,c]
1abc
3c1c1b1c2a1a1

| ?-hanoi("1abc","3c1c2a1").
[Move Disk ,1, from ,a, to ,c]
0bac
3c1c1c2a1c3

| ?-hanoi("0bac","3c1c2c3").
end
end

----------------------------------------
 5. 著作権・他
----------------------------------------

　本プログラムの著作権は「ソフネック株式会社」が所有しています。

----------------------------------------
 6．免責事項
----------------------------------------
　本プログラムはサンプルプログラムです。ご自由に改変していただいてかまいませんが、
なんらかの不具合が生じた場合、また、本プログラムの使用によって万が一事故等が生じた場合、
直接の原因が本プログラムにあった場合でも、弊社は一切の責任を問われないものとさせていただきます。

