我正在写一个程序,它的工作原理是填充一个二维数组来检查获胜条件,它是零和十字,所以二维数组是在单击一个按钮时填充的,1表示一个圆,2表示一个十字,然后checkWin()将按照这个原则工作,而不是实际的代码...
if (myArray[0][0] == 1 && myArray[0][1] == 1 && myArray[0][2] == 1){
setBoolWinVal = true;
} else {
if(myArray[0][0] == 2 && myArray[0][1] == 2 && myArray[0][2] == 2){
setBoolWinVal = true;
}你可以立即看到,对于每个获胜条件,这将是混乱的,有没有办法重写这个win检查来缩短它?
发布于 2009-03-18 22:33:41
这看起来像是家庭作业,所以我不会完全放弃它。但请注意以下几点:
您可以从编写一个函数开始,该函数确定行、列或对角线是否具有三个相同类型的内容(并且该内容不是空白单元格)。然后为每个行、列和对角线调用该函数一次。
发布于 2009-03-18 22:43:48
以下是(未经测试的)代码。它肯定不是生产质量的:)
请注意其他答案中的一些优化:
。
int find_winner(int[][] arr) {
// check rows
for (int i = 0; i < 3; ++i) {
int player = arr[i][0];
if (player < 1) continue; // nb: prior version didn't check for empty cells
if (arr[i][1] == player && arr[i][2] == player) return player;
}
// check cols
for (int i = 0; i < 3; ++i) {
int player = arr[0][i];
if (player < 1) continue;
if (arr[1][i] == player && arr[2][i] == player) return player;
}
// check diagonals
int player = arr[1][1];
if (player < 1) return -1;
if ((arr[0][0] == player && arr[2][2] == player) ||
(arr[2][0] == player && arr[0][2] == player)) return player;
// no winner found
return -1;
}发布于 2009-03-18 22:43:41
最明显的方法是循环遍历行、列或对角线上的3个元素,并检查它们是否相同。
另一种方法是使用更紧凑的表示-例如,int,其中9个单元分别由2位或两个短片表示,每个玩家一个。然后使用查找表或按位操作将状态映射到win lose。
如果一个比特代表一个单元格,而你有一个填充比特,那么每个玩家的瓦片都是3个十六进制数字0-7。
对角线是:
cells & 0x421 == 0x421
cells & 0x124 == 0x124垂直线是:
cells & (cells>>4) & (cells>>8) != 0水平线
cells & (cells>>1) & (cells>>2) != 0使用64位模式来表示国际象棋游戏中可能的走法,也使用了类似的技术。
https://stackoverflow.com/questions/660349
复制相似问题