【C#.NET】ハノイの塔を作ってみた

2021.12.02

CATEGORY : C#.NET プログラミング

あんみんどうふです。

ハノイの塔をC#.NETで作ったので紹介します。
パッと見て子供のおもちゃみたいなゲームですが、意外と奥深く高難度なパズルです。

ハノイの塔とは

横に並んだ3本の杭に異なる大きさの円盤があり、これらを同じ順番で一番右まで移動させたらクリアです。
杭の一番上にある円盤を移動させることができますが、小さい円盤の下に大きい円盤を移動させるのはNGです。

結構単純なルールですが、円盤の数が増えれば増えるほど難しくなります(杭の数は3本で固定です)。

 

開発環境

いつも通りです。

  • Visual Studio 2019
  • C#.NET (.NET Core 3.1)

 

こんな感じ

移動したい円盤のある杭をクリックし、移動先の杭をクリックして移動させます。

移動したい円盤よりも小さい円盤が下にあると移動できません。

同じ順番で一番右まで移動でクリアです!移動は9回かかりました。
円盤が3枚の場合は最低7回でクリアできます。

ちなみに最低移動回数の計算式は「(2のn乗)-1」(n=円盤の数)となっています。
これが4枚になると15回、5枚になると31回。一応12枚まで設定できるようにしていますが、この場合は4095回必要です。1枚動かすのに1秒かかるとすると、クリアまでの推定時間は約1時間と言われています。

64枚では約5800億年かかるそうです。こんなことに5800億年も使いたくない・・・。

(出典: ハノイの塔 – Itoyama’s Page

 

中身

300行弱でさくっと収まりました。ゲームの処理よりも描画処理による見た目の調整が難しかったです・・・。

初期化処理

Load時に呼び出す他、円盤の数を決めて再スタートする時に呼び出します。
円盤は一番小さい円盤が1として順に数値で管理しています。上から「小・中・大」と並んでいる円盤は数値化すると「1・2・3」という感じです。

Initralize関数の「// 描画関連」と書かれた部分、円盤の数によって描画の調整を行っているのですがどうもいまいちで、かといって拘る部分でもないので未完成のままです。

 

描画処理

円盤の色は全部割り当てるのも面倒なので、5で割った余りの値で決めることで5種類の色でループするようにしています。

色はいつも「Color.FromArgb」で指定していますが、今回は「ColorTranslator.FromHtml」で指定してみました。
HTMLのカラーコードのまま使えます。いちいち10進数に戻すのも面倒だしなんとなくこっちにしました。

 

選択処理

杭をクリックすると呼び出されます。
円盤がある杭をクリックすると杭の一番上にある円盤がフォーカスされ、その状態で他の杭をクリックすると移動する処理を書いてます。

CheckClear関数、クリアチェックは「一番右の杭が全て埋まり、かつ1から連番で続いている」を条件としてチェックしているだけです。

 

最低移動回数

最低移動回数はこっちでちゃちゃっと計算してます。
先程の通り、2の(円盤の数)乗-1です。


ほぼ全部のコードを貼ったのでコントロールの種類とNameを合わせてコピペすれば誰でも作れちゃいますね。恥ずかしいのであまりしてほしくない

以上です。また何か作ったら紹介します。