0

我一直在尝试在 java 中创建和填充树,然后使用 minimax 算法为 AI 找到最佳课程。

生成树的递归函数:

public void gen(Node n, int depth){ 
    if(depth == 6){
        n = new Node();  
        n.depth = height;
    }
    else{
        n = new Node();
        n.depth = depth;            
        gen(n.e1, depth+1);
        gen(n.e2, depth+1);
        gen(n.e3, depth+1);
        gen(n.p1, depth+1);
        gen(n.p2, depth+1);
         gen(n.p3, depth+1);
        }
    }

用值填充树的函数:

public void score(Node node, char a){       
    //Assigning scores to states to find utility value
    //Changing state strings to reflect current state of nodes and phase
    if(node!=null && node.depth!=6){
           if(node.depth%2==1){
            //Player's turn
            node.state = node.state.substring(0, node.depth))+a+node.state.substring((node.depth+2));           
            score(node.e1, 'a');
            score(node.e2, 'b');
            score(node.e3, 'a');
            score(node.p1, 'b');
            score(node.p2, 'a');
            score(node.p3, 'b');
            }
            else if(node.depth%2==0){
            //AI's turn
            node.state = node.state.substring(0,(node.depth+4))+a+node.state.substring((node.depth+6));
            score(node.e1, 'a');
            score(node.e2, 'b');
            score(node.e3, 'a');
            score(node.p1, 'b');
            score(node.p2, 'a');
            score(node.p3, 'b');
            }
        }       
    }

通过打印内容来测试功能以查看是否一切正常:

public void printTree(Node node){           
        if(node!=null){
            System.out.println(node.depth + " " + node.state);
            printTree(node.e1);
            printTree(node.e2);
            printTree(node.e3);
            printTree(node.p1);
            printTree(node.p2);
            printTree(node.p3);
        }
    }

并且,节点类本身: final class Node {
public String state = "BCXXXCXXX";

//utility value
public int score;
public int oscore;
public int utility;
public int min;
public int max;
public int depth;

Node p1;
Node p2;
Node p3;    
Node e1;
Node e2;
Node e3;

public Node()
{

}

}

我运行打印功能,它打印出我期望的第一个节点的 1 BxXXCXXX。我用一个空节点调用它,深度为 1。为什么它不生成(或打印)树的其余部分,深度为 6?

尽管我认为这可能无关紧要,但此代码最终将用于 Android 游戏。

4

1 回答 1

2

JavaNode按值传递,因此您的分配n = new Node();无效。你的gen函数应该返回它创建的节点,而不是把一个作为参数。

public Node gen(int depth){ 
    Node n = new Node();
    if (depth == 6){
        n.depth = height;
    } else {
        n.depth = depth;            
        n.e1 = gen(depth+1);
        n.e2 = gen(depth+1);
        n.e3 = gen(depth+1);
        n.p1 = gen(depth+1);
        n.p2 = gen(depth+1);
        n.p3 = gen(depth+1);
    }
    return n;
}
于 2011-12-02T19:09:41.713 回答