2017-02-26 47 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; 
}