研究帖20


作者へのメッセージ
研究課題 そよ風さんのハノイの塔

研究課題 そよ風さんのハノイの塔

 

 

そよ風さん「博士!、博士!」

ナイス博士「やあ、そよ風さん、あれからどうなった?」

そよ風さん「それが、ちょっと聞いて下さいよ!」

ナイス博士「だから、聞いてるじゃないか。どうしたんだ?」

そよ風さん「オーナーに見せたら、とても喜んで、さっそくブラック博士に 見せるんだ、て言ってたんですけど」

ナイス博士「それで?」

そよ風さん「次の日、博士がやって来たんで見せたら、なんと、大笑いしたって言うんです!」

ナイス博士「何だって!いったい何が可笑しいんだ!」

そよ風さん「こんなのは、ハノイの塔じゃなくて、単なる数字の羅列だ、ワッハッハって笑っ たって言うんです!!」

ナイス博士なっ何だって!!

 

 

 

ナイス博士「それはいったい、どういう事だ!!」

そよ風さん「ハノイの塔のプログラムは、アニメーションで作らないとだめだ! って言ったそうです。そうじゃないと、何のプログラムかわからないからだそうです。」

ナイス博士うっ!

そよ風さん「そっ、それに!!」

ナイス博士「それに!何だって!」

そよ風さん「そっ、それにっ、くっっ、くっっ、くやしい!!ウワーーーーン!!!

ナイス博士「どっ、どうしたんだ!泣かないで、大人なんだから。ちゃんと話しなさい!」

そよ風さん「つっ、綴りが間違っていると言うんです。」

ナイス博士「何だ?何の綴りだ??」

そよ風さん「class Pegに出て来る円盤の配列名 diskは、discだって、フロッピーディスクやハード ディスクの綴りさえかけない馬鹿どもめ!ウワッハッハッハって笑われたそうですっ、ウウッ!!」

ナイス博士しっ、しまった!!なんて事だ、こんな初歩的なミスを犯すなんて!」

そよ風さん「博士、博士が変なプログラム作るもんだから、私まで散々馬鹿にされちゃった じゃないですか!!ウワーーーーン!!」

ナイス博士「もうっ、泣くのはよしなさい!こんな細かい事で、そういう人の揚げ足を取る ようなことを言うなんて、何て奴だ!よしっ!そよ風さん!!」

そよ風さん「なっ、何ですか?」

ナイス博士「アニメでハノイの塔を作ろう!!」

そよ風さん「えっ、出来るんですか??」

ナイス博士「やって見なきゃ分らんが、我々の総力を結集して、ブラック博士がギャフン と言うような、ナイスなプログラムを作るんだっ!!」

そよ風さん「本当?大丈夫かしら。でも、綴りだけは間違えないで下さいよ..。」

 

 

 

そよ風さん「で、気を取り直してと、どういう風に作るんですか?」

ナイス博士「とにかく、円盤が動くところを、アニメーションで見せるんだ!!」

そよ風さん「どんなアニメですか?」

ナイス博士「当研究所の名に恥じない、ナイスで美しくてしかも独創的なデザインで なくてはいけないんだ。」

そよ風さん「で、どんなデザインですか?」

ナイス博士「うーーん、どういうのが良いかな。」

そよ風さん「え、まだ考えてないんですか?」

ナイス博士「うん、これから考えるんだ。」

そよ風さん「うーーん、あいかわらず頼りないな。」

ナイス博士「そうか。君だったらどうする?」

そよ風さん「そうですねえ、上から見た所で、2色の同心円が移動するのが 良いんじゃないですか?」

ナイス博士「それだ!それで行こう!」

そよ風さん「それに、Swingを使って配列の表示とグラフィックを一緒にやったら いいと思います。」

ナイス博士よし!それで行くぞ!!

そよ風さん「テンションだけは高いのね。..」

 

 

 

*******************************************************************************************

【プログラムの計画】

1.2色の同心円が茶色の盤の上を移動するのを真上から描く。

2.グラフィックとともに配列もテキストで書く。

3.Swingで、ボタンを押すと次の手に変わる。

*******************************************************************************************

ナイス博士「こんな感じだ。」

そよ風さん「どんなコードにするんですか?」

ナイス博士「それが問題だな。まず、円盤は半径や色があるからただの配列じゃだめだ。」

そよ風さん「そうですね。クラスを作りましょう。こんな感じですか。」

****************************************************************

import java.awt.*;
import javax.swing.*;

public class Disc{
	int r;
	int no;
	static Color scolor=Color.red;
	Color color;
	
	public Disc(int no,int r){
		this.r=r;
		this.no=no;
		this.color=Disc.scolor;
		if(scolor.equals(Color.red))scolor=Color.black;
		else scolor=Color.red;
	}
}

*****************************************************************

ナイス博士「static Color scolorって何の変数だい??」

そよ風さん「2色に色分けするんで円盤を作るごとに色を切り替えるんです。」

ナイス博士「なるほどね。で、それからどうする?」

そよ風さん「後は、今までのプログラムを少し変えて、状態が変わるたびに、テキスト表示と 同時に全部のインスタンスをArrayListに記録します。」

ナイス博士「で?」

そよ風さん「最後に、ボタンを押すたびにArrayListの次の要素を呼び出してグラフィックで 描きます。」

ナイス博士よし!それで行こう!!!

そよ風さん「博士はそればっかりじゃないですか。......ほら、出来ました!」

ナイス博士「うん、じゃ、早速テストを.........あれえ?」

そよ風さん「あれえ??.........最初から最後の状態になってますね?」

ナイス博士「うん、何かバグがあるに違いない!」

そよ風さん「分ってますけど......これはね、」

ナイス博士「なんだい?」

そよ風さん「オブジェクトの参照変数をそのままArrayListに入れたんで全部同じオブジェクト を表示しちゃうわけですね。」

ナイス博士「ああ、そうか。で?どうする?」

そよ風さん「うーーん...ええいっ!面倒だ!!配列記録用のクラスを作って円盤の配置だけ 記録しましょう!!」

****************************************************************

class DiscRecord{
    int[][] record;
    
    DiscRecord(Peg[] pegs){
        record=new int[pegs.length][pegs[0].discs.length];
        for(int i=0;i<pegs.length;i++){
               for(int j=0;j<pegs[i].discs.length;j++){
                   record[i][j]=pegs[i].discs[j].no;
                }
            }
        }
    }
}

*****************************************************************

ナイス博士「何か、安易な解決だなあ。」

そよ風さんいいんです!........ほら、出来ました!」

  アプレット

Peg.javaのコード Game.javaのコード AppletStart.javaのコード Disc.javaのコード Boad.javaのコード DiscRecord.javaのコード

 簡単なクラス図

 

ナイス博士「うん、.........あれえ?」

そよ風さん「えっ?まだなんか有りますか?」

ナイス博士「最後に出て来る君のアイコンは何だい?」

そよ風さん「フフフッッ、最後に私の勝ちほこった顔をブラック博士に見せ付けて やるんです!」

ナイス博士「そうか!それは愉快だ!はっはっはっはっ」

そよ風さん「そうでしょ!フッフッフッ、ハッハッハッ,,, ウワッハッハッハッハッ!!!

 

続く。

 

」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」

【簡単な解説】

 

JLabelを使って盤のクラスBoadを作って、そこに円盤を描いています。 円盤のクラスDiscは、最初AllayListに盤と棒と円盤をそのまま保存するつもりで作ったのですが、 状態が変わるたびにオブジェクトを作らなければならないことが分って、無駄だと思って止めました。

そよ風

作者へのメッセージ

 

研究課題に戻る。

 見学者への注意事項に戻る。