Java Swingを使用して、7つの古典的なアプリケーション解釈アルゴリズムの本質を実現します

アルゴリズムの視覚化

  • このコードはliuyubobobo、Mukenetの教師によるコース「Javaアルゴリズムの本質を解釈する7つの古典的なアプリケーション」を参照しており、コースの参照コードに基づいて特定の改善と個人的なカスタマイズを行っています。
  • 主にJava言語で、7つの古典的な楽しいゲームを通じて、アルゴリズムは実際の開発で実際に使用されます。

視覚化に使用される言語とテクノロジー

Java Swing

ビジュアルコンテンツ

1.確率シミュレーションアルゴリズム

モンテカルロアルゴリズムを使用して、PIをシミュレートおよび計算します

2.ソートアルゴリズム

選択ソートの視覚化

挿入ソートの視覚化

マージソートの視覚化

3.迷路は自動的に迷路を解決します

  • 注:自動迷路解決ゲームは、キーボードクリックイベントを追加します。対応するキーボードボタンを押すと、対応する操作がトリガーされます

    • プレス番号1:迷路を生成するための深さ優先走査アルゴリズム
    • プレス番号2:迷路を生成するための深さ優先走査非再帰的アルゴリズム
    • 番号3:幅優先探索アルゴリズムは迷路を生成します
    • プレス番号4:迷路を生成するためのランダムキュートラバーサルアルゴリズム
    • プレス番号5:迷路を生成するための強化されたランダムキューアルゴリズム
    • プレス番号7:迷路を解決するための深さ優先走査再帰アルゴリズム
    • プレス番号8:迷路を解決するための深さ優先走査非再帰的アルゴリズム
    • プレス番号9:迷路を解決するための幅優先探索アルゴリズム
    • 数字の0を押す:画面をクリアすると、ゲームは霧の状態に戻ります
  • ファイルから迷路情報を読み取り、視覚化します。

迷路の視覚化を解決するための深さ優先走査再帰書き込み方式+バックトラッキング方式。

迷路の視覚化を解決するための深さ優先走査非再帰的書き込み方法。

迷路の視覚化を解決するための幅優先探索アルゴリズム。

4.迷路を生成します

  • 簡単にするために、M行N列の迷路では、最初に迷路の入口を(1、0)、出口を(M-2、N-1)と規定します。

迷路が生成される前の準備

以下は61x91の迷路です。奇数行と奇数列の交点は通路(壁なし)です。迷路を生成する前に、このようなマップを生成する必要があります。次に、最初に奇数行と奇数列で交差するすべての道路を横断し、次に2つの道路の前で壁を壊して迷路を作成するだけです。

画像-20210326235007632

深さ優先走査再帰アルゴリズムは迷路を生成します

迷路を生成するための深さ優先走査非再帰的アルゴリズム

迷路を生成するための幅優先走査非再帰的アルゴリズム

ランダムキューを作成して、迷路生成プロセスをよりランダムにします

未生成の部分に霧を追加して、迷路を生成するプロセスをより装飾的で神秘的なものにします

ランダムキューコードを参照してくださいRandomQueue.java

ランダム迷路の生成プロセスを次の図に示します。

ランダム迷路の解決プロセスを次の図に示します。

生成された迷路のランダム性を強化します

迷路の生成と解決プロセスを何度も繰り返した後、迷路の解決パスの一般的な傾向は、左上から右下への曲がりくねった曲線ではなく、ランダム性が十分に強くないため、ランダムキューのランダムアクセス要素のコードが最適化されています。、EnhancedRandomQueue.javaを参照してください。

ランダム性を高めた後の迷路の生成プロセスを次の図に示します。

ランダム性を高めた後の迷路の解決プロセスを次の図に示します。

5.掃海艇

マインスイーパゲームの勝利とゲームオーバー

ゲームオーバー

注:ゲームが終了したら、Enterキーを押してゲームを再開できます。

画像-20210328180303684

勝利

画像-20210328212853457

ゲームボード上のランダムな30の地雷

画像-20210328141001452

ランダムアルゴリズム評価

  • アルゴリズムの目標:ゲームエリア内の同じ数のグリッドに指定された数の地雷をランダムに配置します

  • 多数回使用して、3つのランダムスクランブルアルゴリズムをカウントします。を参照してください。RandomAlgorithmAssessment.java

    • arr:ランダムに計画される配列; mineNumber:地雷の数(配列の長さ未満)

    • ランダムアルゴリズム1:各グリッドの値をランダムグリッドの値と交換します

      for (int i = 0; i < arr.length; i++) {
              
              
          int j = (int) (Math.random() * arr.length);
          swap(arr, i, j);
      }
      
    • ランダムアルゴリズム2:各地雷が配置されているグリッドの値をランダムグリッドの値と交換します

      for (int i = 0; i < mineNumber; i++) {
              
              
          int j = (int) (Math.random() * arr.length);
          swap(arr, i, j);
      }
      
    • クヌースアルゴリズム:区間[i、n)からランダムに要素を取得し、i番目の要素と交換します

      for (int i = 0; i < arr.length; i++) {
              
              
          int j = (int) (Math.random() * (arr.length - i) + i);
          swap(arr, i, j);
      }
      
    • クヌースアルゴリズムを記述する別の方法は、区間[0、i + 1)から要素をランダムに取得し、それらをi番目の要素と交換することです。

      for (int i = arr.length - 1; i >= 0; i--) {
          int j = (int) (Math.random() * (i + 1));
          swap(arr, i, j);
      }
      
    • N = 10000000、n = 10、m = 5(Nは統計の数、nは配列の長さ、mは配列内の雷の数)の場合の各アルゴリズムについて、雷が現れる頻度配列の各位置は次のとおりです。図に示すように:

      画像-20210328160137277

      画像-20210328155957042

6.ムービングボックスゲームは解決策のステップを提供します

ゲーム紹介:

これは、従来の倉庫番とは異なる、マッチ3に似た倉庫番ゲームです。この倉庫番では、ゲームパネル内の3つの同じボックスを連続して接続できるように、指定されたステップ数内でボックスを移動する必要があります。条件に加えて、ゲームには重力システムが装備されています。背の高いボックスが左右に移動したり、その下のボックスが削除されたりすると、ボックスが下に落下します。落下後、新しい消去可能な連続があるかどうかを検出します3つの接続されたボックス、ゲームカバーは次のとおりです

画像-20210329180005073

これはゲームの一定のレベルです。1ステップ移動する条件下ですべてのボックスを削除する必要があります。

画像-20210329180302902

ゲームオブジェクトの象徴化

次に、上のレベルのボックスの分布を2次元の文字配列に変換し、操作の数とともにファイルに保存します。

1
.....
..A..
..B..
..A..
..B..
.BAB.
.BAB.
.ABA.

次に、コードを使用して、操作ステップ数と2次元文字配列を読み取ります。各列の文字を揃えるために、空の位置はドットで示され、さまざまなタイプのボックスはさまざまな文字で示されます。

シンボリックゲームオブジェクトをレンダリングする

コードを読んだ後、下図のようにページにレンダリングされます。オリジナルゲームの箱素材がないので、インターネットでそれを置き換える写真を見つけました。

画像-20210329182751415

ソリューションの手順を表示する

ソリューションをより直感的にするために、各ボックスの中央に座標が書き込まれます。これは、ボックスが現在配置されている行と列を表します。

画像-20210329181210898

コンソールによって出力された結果とマップ上の座標に従って、ゲームに移動して対応する操作を実行し、このレベルを通過します。

交换 (3, 2)(4, 2)
游戏有解!

7.フラクタルグラフを描く

同心円を再帰的に描画します

画像-20210329193958960

ここに画像の説明を挿入

vicsek(長方形)フラクタルグラフを再帰的に描画します

キーボードの0〜6を押すと、再帰時間が異なるフラクタルを実行できます。

デフォルトの再帰数を0に初期化し、領域全体が色であることを示します

キーボード1〜6をそれぞれ押して、次のフラクタルグラフを描画します

SierpinskiCarpet(長方形)フラクタルグラフを再帰的に描画します

SierpinskiTriangle(三角形)フラクタルグラフを再帰的に描画します

KochSnowflake(スノーフレーク)フラクタルグラフを再帰的に描画します

二分木フラクタルグラフを再帰的に描画します

おすすめ

転載: blog.csdn.net/qq_38505969/article/details/115322169