JavaScriptを学んでいたとき、JavaScriptでSudokuゲームを書きました。私は最近いくつかのJavaコンテンツを読んだので、SudokuゲームのJavaバージョンを作成したかったのです。
今、私はすべてのコードを共有し、あなたから学びます。もちろん、コードにはさまざまな問題と欠点があります。あなたが批判し、私にいくつかのアドバイスを与えることを願っています。
以下は、Sudokuマップを生成するためのコアアルゴリズムです。アルゴリズムはあまり良くありません。また、以前にオンラインでいくつかのアイデアを参照しました。
パッケージhlc.shudu.src;/** sudoku help class。 //各9メートルのグリッドプライベート静的int [] canputsum = new int [9]に配置できる位置の数。 //以前に配置されたstatic int [] used = new int [9]を保存するために使用します。 //マップ生成が完了したかどうか静的ブールisok = true; /** sudokuマップ配列を取得*/public static int [] [] getMap(){//マップが生成されていないかどうかを判断し、完了していない場合は再生します。 //これから、アルゴリズムを最適化する必要があることがわかります。バックトラックが良い場合、バックトラッキングを通じて再生でき、ここでは生成アルゴリズムを再実行することで再生されます。興味のある友達が以下を実装できることを願っています。 {isok = true; initmaps(); } while(!isok);マップを返す。 } / * * Mapsを初期化 * / private static void initmaps(){//(int i = 0; i <9; i ++){for(int j = 0; j <9; j ++){maps [i] [j] = -1; }} // 1〜9のfor(int num = 1; num <= 9; num ++){for(int i = 0; i <9; i ++){used [i] = -1; CanputSum [i] = -1; } //ビッグナイングリッドの各9番目のグリッド(int i = 0; i <9; i ++){if(canputsum [i] == -1){canputSum [i] = getCanputSum(i、num); } if(canputsum [i] == 1){used [i] = -1; } if(canputSum [i] == 0){canputSum [i] = -1;使用[i] = -1; //番号numを現在の9つのグリッドに配置できない場合、前のnin if(i> 0){//前の9つのグリッドに配置されている位置をクリアしますif(使用[i-1]!= -1){// maps [(int) (math.floor(使用[i-1]/3)+math.floor((i-1)/3)*3)] [使用[i-1]%3+((i-1)%3)*3] = -1; clearnum(i -1、num); } //私は1つに戻ります。なぜなら、forループグレーは私にそれを追加するので、ここで2が差し引かれますi - = 2;続く; } else {isok = false;戻る; }} else {//現在の9番目のグリッドブールフラグ= false; while(!flag){int j =(int)(math.random() * 9); //現在の小さな正方形II =(I / 3) * 3 + j / 3の水平座標。 //小さな正方形int jj =(i%3) * 3 + j%3の現在の垂直座標。 //system.out.println(" num:"+num+"/tii: "+ii+"/tjj:"+jj); // numを配置できる場合、if(maps [ii] [jj] == -1 && j!= used [i] && iscanput(jj、num)){maps [ii] [jj] = num;使用[i] = j; CanputSum [i] - = 1; flag = true; }}}}}}}} / * * clear num clear num in the ith 9th grid * / private static void clearnum(int i、int num){for(int j = 0; j <9; j ++){//現在の小さな正方形int II =(i / 3) * 3+j / 3; //現在の小さな正方形int jj =(i%3) * 3 + j%3の垂直座標。 //現在の小さな正方形を配置できるかどうかを判断します(maps [ii] [jj] == num){maps [ii] [jj] = -1; }}} /**現在の9クライアントを数値に配置できる位置の数を取得します* / private static int getCanputSum(int i、int num){int sum = 0; //(int j = 0; j <9; j ++){//現在の小さな正方形の水平座標II =(i / 3) * 3+j / 3; //現在の小さな正方形の垂直座標int jj = i%3 * 3 + j%3; //現在の小さな正方形を配置できるかどうかを判断します。 }} return sum; } / * *水平方向および垂直座標ポイントを配置できるかどうかを指定します * / private static boolean iscanput(int ii、int jj、int num){//指定された座標ポイントの同じ行または列の同じ数が同じ数字であるかどうかを決定します。ある場合、それは(int i = 0; i <9; i ++){if(maps [ii] [i] == num){return false; } if(maps [i] [jj] == num){return false; }} trueを返します。 }}完全なパッケージは、github:https://github.com/houlongchao/sでダウンロードできます
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。