2017-09-15 45 views
-1

我正在製作Sudoku遊戲,並且有問題。比較不正常

my .net fiddle和輸出的圖像:

My outputimage of my code

所以我所做的就是產生的隨機數的夫婦(1和9之間,如(1,2)),並將其保存一個接一個地排成一列。 之後,我檢查了所產生的下一個數字應該不會產生相同的,所以我不喜歡

int[] randomNumbersArray13 = new int[9]; 
int[] randomNumbersArray23 = new int[9]; 
randomNumbersArray13[0] = 122; 
randomNumbersArray23[0] = 12212; 
int va12, vb12; 

for (int k = 0; k < 9; k++) 
{ 
    Same Class = new Same(); 
    va12 = rnd.Next(0, 9); 
    vb12 = rnd.Next(0, 9); 

    for (int i = 0; i < 9; i++) 
    { 
     while (va12 == randomNumbersArray1[i] && vb12 == randomNumbersArray2[i]) 
     { 
      va12 = rnd.Next(0, 9); 
      vb12 = rnd.Next(0, 9); 
     } 
    } 

    for (int i = 0; i < 9; i++) 
    { 
     while (va12 == randomNumbersArray12[i] && vb12 == randomNumbersArray22[i]) 
     { 
      va12 = rnd.Next(0, 9); 
      vb12 = rnd.Next(0, 9); 
     } 
    } 

    for (int i = 0; i < randomNumbersArray13.Length; i++) 
    { 
     while (va12 == randomNumbersArray13[i] && vb12 == randomNumbersArray23[i]) 
     { 
      va12 = rnd.Next(0, 9); 
      vb12 = rnd.Next(0, 9); 
     } 
    } 

    Class.rows = va12; 
    Class.column = vb12; 
    randomNumbersArray12[k] = va12; 
    randomNumbersArray22[k] = vb12; 
    randomNumbersArray[va12, vb12] = 3; 
    myExpenseManager.AddExpense(Class); 
} 
+0

請包括一個https://stackoverflow.com/help/mcve。 – mjwills

+0

請將相關的代碼放在帖子中。讓別人幫你輕鬆,而不是讓他們去別的地方看看代碼的圖片。請閱讀[問]並參加[遊覽] – Plutonix

+1

您只需要包含1個C#標記... –

回答

0

比較,因爲你沒有給我們完整源代碼的鏈接有沒有辦法來理解這個問題。

但我能夠從輸出和現有代碼推斷出什麼是預期的。我編輯了這個問題,並added a dotnet fiddle, here

您正在隨機選擇的數獨中做一個「費用」功能(一種分數類型)。

你有幾個問題。長話短說這裏是你需要的代碼。然後我會解釋你的代碼出了什麼問題。

// I'm using i and j, instead of k and i that you used 
// I'm using 2 dimensional arrays - see my code. 
// I'm using clear names. 
// There's only one variable: 'v'. v holds the current random value. 

for (var i=0; i<9; i++) 
    for (var j=0; j<9; j++) 
     { 
      // if non-unique in the row/column or non-unique in the square, then re-randomize 
      // Also check that it's unique in your resulting array 
      // you'll need a special function to check which square your in... 
      // not in the scope of my answer. If you want, ask and I'll show you how. 
      // meanwhile let's check that in this row and column of the unique array it's unique 
      for (var m=0; m<i; m++) 
       for (var n=0; n<j; n++) 
        while (v == uniqueArray[m,j] || v == uniqueArray[i,n] 
         || v == rowcolArray[i,j] || v == squaresArray[i,j]) 
       v = rnd.Next(1,9); 

      // and now use the unique number in your two dimensional array 
      uniqueArray[i,j] = v; 
      scoreArray[i,j] = 3; 
      // probably scoreArray should be with some kind of algorithm, 
      // outside the scope of this answer. Ask if you still need to understand 
      same = new Same(i,j); 
      myExpenseManager.AddExpense(same); 
      } 
     } 

您的問題:

  1. 對角線:你迭代在對角線上的 - 所以你永遠不會比較整行或整列。您正在檢查第1行第1列,然後第2列第2列。
    檢查正方形時也是如此。你檢查方塊1 - 地方1,然後你檢查方塊2 - 地方2 ...而不是檢查第1行col 1,2,3 ...然後第2行col 1,2,3 ...等。你忘了使用k!

  2. 你是從0到9的隨機化,而不是從1到9

  3. 你正在做的& &,而你應該做的||檢查你是獨一無二的。 & &將是真實的只有兩對是相同的:rn1Array [i] = va12 AND rn2Array [i] = vb12。例如,對於i = 9:如果va = 5和rn1 [9] = 5,除非vb和rn2 [9]相等,否則它不會選擇新的va。所以,繼續這個例子,如果vb = 7但是rn2 [9] = 6,那麼當前的va將被接受!因爲你迭代所有具有相同變量的數組(它們在過去的9次比較中是獨一無二的),所以它會重新隨機化,如果有三次相同的三個數值:

    va12:說隨機選擇: 7 rn21 [i:9]說7 vb12:說隨機選擇:5 rn22 [i:9]:say 5.這是我們重新隨機化的唯一情況 但現在我們重新隨機化了,va12: 3,vb12:8 ,我們檢查rn31 [i:9]和rn32 [i:9] 只有在rn31 = 3 AND rn32 = 8的情況下,我們纔會再次進行隨機化。

  4. 您將比較的VALUE存儲在Class的行和列中。你應該存儲行和列的i和k。

  5. 您使用的變量和類名稱不清晰。

    • 調用變量類 - 不是一個好主意。
    • 調用類一樣的 - 不明確
    • 調用帶有長不清楚名陣列使代碼難以理解
  6. 你整個數組,你現在增加了對迭代。 rnArr31和rnArr32 ...

  7. 您在rn31和rn32數組中輸入的數字不是1到9。