假設你有一些特定的起點(x,y),並且你很好奇這一行中是否有三個相同的數字開始。讓我們考慮一下你在水平方向上看的情況。然後有辦法做到這一點(忽略邊界檢查)會是這樣的:
bool IsHorizontalMatch(int x, int y) {
/* Get the value of the start position. */
const int startValue = board[x][y];
/* Confirm the two values after it match. */
for (int i = 1; i < 3; ++i)
if (board[x + i][y] != startValue)
return false;
/* If we got here, then they all match! */
return true;
}
你可以同樣寫這樣的功能對於垂直檢查:
bool IsVerticalMatch(int x, int y) {
/* Get the value of the start position. */
const int startValue = board[x][y];
/* Confirm the two values after it match. */
for (int i = 1; i < 3; ++i)
if (board[x][y + i] != startValue)
return false;
/* If we got here, then they all match! */
return true;
}
最後,一個對角線:
bool IsDiagonalDownMatch(int x, int y) {
/* Get the value of the start position. */
const int startValue = board[x][y];
/* Confirm the two values after it match. */
for (int i = 1; i < 3; ++i)
if (board[x + i][y + i] != startValue)
return false;
/* If we got here, then they all match! */
return true;
}
bool IsDiagonalUpMatch(int x, int y) {
/* Get the value of the start position. */
const int startValue = board[x][y];
/* Confirm the two values after it match. */
for (int i = 1; i < 3; ++i)
if (board[x + i][y - i] != startValue)
return false;
/* If we got here, then they all match! */
return true;
}
這個工程,但它不是很優雅;所有這三個功能看起來都非常相似!幸運的是,你可以用一個單一的統一函數來重寫它們。這個想法是這樣的 - 如果你會注意到,所有這三個函數的工作都是通過定義一些「步長」來指示你移動的方向。在水平情況下,步驟爲(+1,+0),在垂直情況下爲(+0,+1),在對角線中爲(+1,+1)或(+1,-1)。鑑於此,您可以編寫一個函數來檢查,如果三個值中的線匹配:
bool IsLinearMatch(int x, int y, int stepX, int stepY) {
/* Get the value of the start position. */
const int startValue = board[x][y];
/* Confirm the two values after it match. */
for (int i = 1; i < 3; ++i)
if (board[x + i * stepX][y + i * stepY] != startValue)
return false;
/* If we got here, then they all match! */
return true;
}
然後,您可以編寫
bool IsLineStartingAt(int x, int y) {
return IsLinearMatch(x, y, 1, 0) || // Horizontal
IsLinearMatch(x, y, 0, 1) || // Vertical
IsLinearMatch(x, y, 1, 1) || // Diagonal Down
IsLinearMatch(x, y, 1, -1) || // Diagonal Up
}
鑑於這種原始的,你可以只遍歷檢查所有可能的匹配在所有可能的起點上。
希望這會有所幫助!
編輯:感謝評論者幫助解決我的愚蠢的錯誤。 :-)
這功課嗎?你有什麼嘗試? – marcog 2011-01-08 22:43:50
它不是家庭作業,但基本上我有超過50如果陳述如果行[0] ==行[1] &&行[2],然後...但我仍然沒有所有的組合,我知道必須是更好的方法。 – FrozenWasteland 2011-01-08 22:47:29