2014-03-26 40 views
-1

我創建了一個TTT遊戲。不過,我在AI取點上遇到了麻煩。我如何避免這種情況發生,以至於在chooseCellRow:Col的方法中,它只會返回任何一個玩家尚未選擇的隨機點?TicTacToe作弊

- (void) chooseCellRow:(NSInteger)row Col:(NSInteger)col 
{ 
    //pick random spot for computer's turn 
    row = random()%2; 
    col = random()%2; 

     if (row == 0 && col == 0) { 
      [but00 setTitle:@"X" forState:0]; 
     } 
     else if (row == 0 && col == 1) { 
      [but01 setTitle:@"X" forState:0]; 
     } 
     else if (row == 0 && col == 2) { 
      [but02 setTitle:@"X" forState:0]; 
     } 

     else if (row == 1 && col == 0) { 
      [but10 setTitle:@"X" forState:0]; 
     } 
     else if (row == 1 && col == 1) { 
      [but11 setTitle:@"X" forState:0]; 
     } 
     else if (row == 1 && col == 2) { 
      [but12 setTitle:@"X" forState:0]; 
     } 

     else if (row == 2 && col == 0) { 
      [but20 setTitle:@"X" forState:0]; 
     } 
     else if (row == 2 && col == 1) { 
      [but21 setTitle:@"X" forState:0]; 
     } 
     else if (row == 2 && col == 2) { 
      [but22 setTitle:@"X" forState:0]; 
     } 
} 
+0

do row = random()%3; col = random()%3; (cell [row] [col]!='x')||(cell [row] [col]!='o')); – jsollo2

+0

jsollo,在我的回答中看到我的評論,你應該使用'&&'而不是'||'。 – paxdiablo

回答

0

作弊是一種道德的概念,它不適用於計算機,因爲它完全按照您所說的去做。然而,可以防止這種通過簡單的選擇,如果再次細胞已被佔用,僞代碼:

row = random() % 3; 
col = random() % 3; 
while cell[row][col] != empty: # Add your REAL detection code here. 
    row = random() % 3; 
    col = random() % 3; 

您還會注意到,上面的代碼將停止作弊,以及。可恥的是你只允許電腦選擇的九個可能性4 :-)

應用% 2多項會給你01,你需要使用% 3允許2爲好。


根據您的意見,您有一個包含字符佔用該小區一單元陣列,代碼continuse直到你找到一個空白單元格將沿着線:

do { 
    row = random() % 3; 
    col = random() % 3; 
} while (cell[row][col] != ' '); 
+0

請在我的O.P下看到我的評論這是我正在嘗試做的,但爲什麼這會阻止我的模擬器運行。如果我將do/while註釋掉(儘管我仍然有相同的原始問題) – jsollo2

+1

@ jsollo2,那是因爲你在表達式中使用了'||'(或)。想想看。值_has_既不是-x也不是-o,因爲它一次只能是一件事。如果它是空白的,你會得到真實的或真實的。如果x,false或true賦予true,並且如果o,true或false則賦予true。只有在x和o同時將表達式評估爲false並且循環退出。你需要使用&&'(和)。 – paxdiablo

+0

初學者錯誤。謝謝。當我添加do /時,模擬器仍然沒有運行。 – jsollo2

0

一簡單的方法是保留一個未使用的位置列表並從列表中選擇。當任一玩家移動時,移除他們從列表中選擇的位置。

另一種更簡單但效率較低的方法是讓它選擇任何位置,但如果它選取的位置已被佔用,則再試一次。