前のhabratopikaから、私はhabrazhitelが実際に彼らのボディーシャツのサッパーを好んだので、あえて数独という別のゲームを書くことに気付きました 。 そして再び、彼らのボディシャツに。
マインスイーパと同様に、Sudoku for cmd.exeにはいくつかの利点があります。
- オリジナルロゴ
- 2色のテキストグラフィカルインターフェイス(背景-黒、テキスト-グレー)
- ほぼすべてのコンピューターでプログラムを再生する機能
一般的に、数独ゲームは実装が最も難しいものの1つです。 問題は通常のテーブルの生成です。 したがって、9x9 = 81セルのフィールドがあります。 各セルには、9つの数字のいずれかを入力できます。 総当たりで解決する非常に多くのバリエーション。 代わりに、既製のテーブルが使用されます。 その本質を説明します。
数字の代わりに文字が使用されるいくつかのテーブルを作成できます(ラテン方格:-))。 9文字のみ-abcdefghi。 文字「a」は、9、8、7などに置き換えることができます。 その結果、1つのテーブルから9!= 362880のバリエーションを取得できます。 悪くない? そして、これがコード自体であり、これが数値を妨害します。
REM数独テーブルの9!= 362880バリエーションを提供する神秘的なアルゴリズム。 for / L %% i in(1,1,9)do set replmap %% i = %% i replcounter = 0に設定 :replcycle 設定temp1 =%ランダム:〜-1% if%temp1%== 0 goto replcycle temp2 =%ランダムを設定:〜-1% if%temp2%== 0 goto replcycle セット/リカウンター+ = 1 コールセットtemp = %% replmap%temp1 %%% コールセットreplmap%temp1%= %% replmap%temp2 %%% コールセットreplmap%temp2%=%temp% 「temp =」を設定します if%replcounter%LSS 504 goto replcycle レムエンドサイクル:replcycle
アルゴリズムの概要:変数replmap1-replmap9の1から9までの数字はランダムな順序で入力されます。 これらの変数に含まれる数字で文字を置き換えた後。 たとえば、replma1の番号は5です。その後、文字「a」は番号「5」に置き換えられます。 変数マップには、ランダムに選択されたマップが含まれます。
呼び出し:replacestr map a%replmap1% 呼び出し:replacestr map b%replmap2% 呼び出し:replacestr map c%replmap3% 呼び出し:replacestr map d%replmap4% 呼び出し:replacestr map e%replmap5% 呼び出し:replacestr map f%replmap6% 呼び出し:replacestr map g%replmap7% 呼び出し:replacestr map h%replmap8% 呼び出し:replacestr map i%replmap9% REM ...多くの興味深い、あまりコードではない... :replacestr REM文字列置換関数。 コールセットtemp = %%% 1 %% コールセットtemp = %% temp:%2 =%3 %% set%1 =%temp% goto:eof
テーブルから数十桁を削除する必要がありますが、これは特に問題ではありません。 また、マインスイーパから大々的に盗まれ、わずかに変更されたUIには問題はありません。 時間カウント機能も盗まれました。
Sudokuの実装における2番目の課題は、最終チェックでした。ユーザーは勝ちましたか? あなたは、各行、列、正方形のデュース、トリプル、その他の数を愚かに数えることができますが、これはあまりにも退屈です。 単純に数字の合計と積を数えることにしました。 地獄を変えたシンプルでエレガントな方法は何を知っています。 ちなみに、このメソッドを使用して、行/列/正方形内でのみ、後者が完全に満たされた場合にのみ、エラーの正確な位置を特定することが可能です。
繰り返しますが、ここから数独をダウンロードできます。 Googleドキュメント