首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >If-else替代

If-else替代
EN

Stack Overflow用户
提问于 2009-03-18 22:28:32
回答 12查看 2.4K关注 0票数 2

我正在写一个程序,它的工作原理是填充一个二维数组来检查获胜条件,它是零和十字,所以二维数组是在单击一个按钮时填充的,1表示一个圆,2表示一个十字,然后checkWin()将按照这个原则工作,而不是实际的代码...

代码语言:javascript
复制
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检查来缩短它?

EN

回答 12

Stack Overflow用户

发布于 2009-03-18 22:33:41

这看起来像是家庭作业,所以我不会完全放弃它。但请注意以下几点:

  • 当你在一列或一条对角线上有三个相同的东西时,你就赢了。
  • 这不是你需要检查一行中是否有三个0或三个十字,而是一行中有三个相同的东西。

您可以从编写一个函数开始,该函数确定行、列或对角线是否具有三个相同类型的内容(并且该内容不是空白单元格)。然后为每个行、列和对角线调用该函数一次。

票数 7
EN

Stack Overflow用户

发布于 2009-03-18 22:43:48

以下是(未经测试的)代码。它肯定不是生产质量的:)

请注意其他答案中的一些优化:

  1. 循环的使用
  2. 我们检查相等的玩家值,而不是特定的玩家值
  3. 对角取胜必须通过cell1

代码语言:javascript
复制
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;
}
票数 3
EN

Stack Overflow用户

发布于 2009-03-18 22:43:41

最明显的方法是循环遍历行、列或对角线上的3个元素,并检查它们是否相同。

另一种方法是使用更紧凑的表示-例如,int,其中9个单元分别由2位或两个短片表示,每个玩家一个。然后使用查找表或按位操作将状态映射到win lose。

如果一个比特代表一个单元格,而你有一个填充比特,那么每个玩家的瓦片都是3个十六进制数字0-7。

对角线是:

代码语言:javascript
复制
cells & 0x421 == 0x421
cells & 0x124 == 0x124

垂直线是:

代码语言:javascript
复制
cells & (cells>>4) & (cells>>8) != 0

水平线

代码语言:javascript
复制
cells & (cells>>1) & (cells>>2) != 0

使用64位模式来表示国际象棋游戏中可能的走法,也使用了类似的技术。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/660349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档