2017-02-26 92 views
1

因此,我使用的是單一字符串,並且該字符串包含井字棋板的當前狀態。它看起來像這樣:替換字符串中的單個字符

XOX 
ONX 
OXX 

「N」是一箇中性空間。

事情是我想用「X」或「O」替換那些「N」中的一個。 我嘗試使用:

board[n] = "X"; 

,但我得到

「屬性或索引不能分配,它是隻讀」

所以我試圖找出一種方法來改變那些「N」之一。這裏是我的代碼

if (manager.turn == 1 && !isUsed) 
{ 
    xSprite.enabled = true; 
    manager.board[int.Parse(gameObject.name)-1] = 'X'; 
    manager.GameEndingDraw(); 
    isUsed = true; 
    manager.turn = 2; 
} 
else if (manager.turn == 2 && !isUsed) 
{ 
    oSprite.enabled = true; 
    manager.board[int.Parse(gameObject.name)-1] = 'O'; 
    manager.GameEndingDraw(); 
    isUsed = true; 
    manager.turn = 1; 
} 
+2

'string'是immuteable。你必須做board = board.Remove(n,1).Insert(n,「X」);',但是你真的應該考慮一個不同的數據結構,比如2D char數組。 – juharr

回答

4

一個井字棋板是不是一個字符串,它是標記,如字符的3×3格。你應該把它表示一個數組,而不是字符串:

var board = new char[3, 3]; 
for (int i = 0; i < board.GetLength(0); i++) 
    for (int j = 0; j < board.GetLength(1); j++) 
     board[i, j] = 'N'; 

然後,你可以通過它的座標設定每個標記:

board[0, 0] = 'X'; 
1

這裏有4種方法可以使用:

ToCharArray

var array = board.ToCharArray(); 
array[indexOfNew] = newChar; 
board = new string(array); 

的StringBuilder

var sb = new StringBuilder(board); 
sb[indexOfNew] = newChar; 
board = sb.ToString(); 

海峽ing.Remove和String.Insert

board = board.Remove(indexOfNew, 1) 
    .Insert(indexOfNew, newChar.ToString()); 

SUBSTRING和字符串插值

board = $"{board.Substring(0, indexOfNew)}{newChar}{board.Substring(indexOfNew+1, board.Length-indexOfNew-1)}"; 

假設board包含原始字符串,newChar包含新放置的 「片」 和indexOfNew包含在索引你需要替換的字符串。

而且你當然可以換你的擴展方法選擇的選項:

public static string ReplaceAt(this string inputString, int newCharIndex, char newChar) 
{ 
    var newString = // Insert your choice of replacement from above here 
    return newString; 
}