3

我已經創建了一個tic tac toe程序,它的作用在於它允許玩家通過選擇線來選擇在二維陣列中的移動,然後計算機進行移動。如何使用隨機選擇二維數組中的位置?

該程序可以工作,但計算機的移動是連續的,而不是隨機的,並且總是會選擇陣列中的下一個可用空間。現在,我有比賽的工作,我想提高節目分爲三個難度等級:通過計算機

易=隨機生成的移動媒介=隨機生成的由計算機此舉檢查以阻止玩家和完整產品線 硬=每次通過遞歸選擇最佳移動

如何讓電腦隨機選擇我的陣列中的一組電線?

(我的for循環計算機的當前基本移動)

static void Computermove(char[,] gamegrid, char fin) 
    { 

     Console.WriteLine("\nComputer's turn"); 
     Console.ReadKey(); 

     int x = 0; 
     int y = 0; 
     for (x = 0; x < 2; x++) 
     { 
      for (y = 0; y < 2; y++) 
       if (gamegrid[x, y] == ' ') break; 
      if (gamegrid[x, y] == ' ') break; 
     } 

     if (x * y == 9) 
     { 
      fin = 'X'; 
     } 
     else 
      gamegrid[x, y] = 'O'; 

    } // End Computermove 

回答

2

創建Random類的新實例,並使用Next()方法來創建一個表示座標的兩個隨機數。

下面的代碼:

var r = new Random(); 

var randomX = r.Next(3); 
var randomY = r.Next(3); 

更新:

這裏是如何的方法可以是這樣的:

static void Computermove(char[,] gamegrid, char fin) 
{ 
    if (!ContainsEmptyCells(gamegrid)) 
    { 
     // table is full; probably nobody won 
     return; 
    } 

    bool goodRandomCoordinateFound = false; 

    int row = 0, column = 0; 

    var random = new Random(); 

    while (!goodRandomCoordinateFound) 
    { 
     row = random.Next(3); 
     column = random.Next(3); 

     if(gamegrid[row, column] == ' ') 
      goodRandomCoordinateFound = true; 
    } 

    gamegrid[row, column] = 'O'; 
} 

我發現,是造成StackOverflowException問題。這是一個非常微妙的結論,但結論是,當重試生成隨機座標時,應該使用同一個Random實例,而不是創建一個新實例。

這是因爲Random並不真正產生真正的隨機數。當創建一個new Random()實例時,它將使用基於當前時間的種子值進行初始化。

如果您使用相同的種子值創建Random的多個實例,它們將創建相同的隨機數字流。

在我們的示例中,如果我們需要生成新的隨機座標,則創建一個新的Random實例而不指定種子,因此種子使用當前時間。由於隨機實例創建速度非常快,因此種子值相同,因此隨機值相同,從而導致無限遞歸。

我已經重寫了重用random實例的方法,這會導致後續調用Next(3)以產生比我們當前擁有的值更多的值。

+0

感謝。我現在有程序按我的意願選擇隨機位置。我確實有一個錯誤,但是如果它的左邊有勝出的動作,它會在哪裏破裂? –

+0

static void Computermove(char [,] gamegrid,char fin) var random = new Random(); int row = random.Next(2); int column = random.Next(2); (gamegrid [row,column]!='') Computermove(gamegrid,fin); } else { gamegrid [row,column] ='O'; } } // End Computermove –

+0

發生未處理的'System.StackOverflowException'類型的異常 –

0

由於計算機不能選擇所有字段,則需要一個兩步驟過程

  • 計數自由字段的數目(=:N)
  • 在範圍0創建的隨機數。 。N-1
  • 使用這個號碼,以選擇一個字段
0

保持免費座標列表,每當一個座標由任玩家選擇AI或從列表中刪除。根據列表中項目的數量進行隨機化,因此如果列表中有5個條目生成1到5之間的隨機數字,請從列表中選取座標。免費座標數

或者更簡單的跟蹤,例如你有5個免費座標生成1-5號,只是遍歷板才能到第5位

相關問題