【问题标题】:clarifying this Java code and few ambiguities of this bot code [closed]澄清这个Java代码和这个机器人代码的一些歧义[关闭]
【发布时间】:2020-05-08 17:27:44
【问题描述】:

我正在使用 Java 编写这个 Chess 机器人代码,这对我来说是新的。虽然我了解代码的大部分功能,但我不确定我是否完全理解它。除此之外,在代码中几乎没有让我感到困惑的事情。例如这个private d a; 我认为我们需要指定Java 中每个变量的类型。 还有这个

private static final b h = new b((State)null, 1.0D / 0.0);

我们是在声明 b 还是 h?什么是 1.0D / 0.0 ?听起来不像是一个正常的变量。

这里是完整的代码:

public abstract class AIBot extends Bot {
    private d a;
    private int b;
    private int c;
    private boolean d;
    private boolean e;
    private c f;
    private static final Comparator g = new a();
    private static final b h = new b((State)null, 1.0D / 0.0);
    private static final b i = new b((State)null, -1.0D / 0.0);

    public AIBot(String var1, d var2, int var3, boolean var4, boolean var5, InputStream var6) {
        super(var1);
        this.c = 0;
        this.a = var2;
        this.b = var3 << 1;
        this.d = var4;
        this.e = var5;
        if (var6 == null) {
            this.f = null;
        } else {
            try {
                this.f = new c(var6);
            } catch (IOException var7) {
                throw new RuntimeException("Failed to read opening book", var7);
            }
        }
    }

    public AIBot(String var1, d var2, int var3, boolean var4, boolean var5) {
        this(var1, var2, var3, false, false, (InputStream)null);
    }

    protected State chooseMove(State var1) {
        State var2 = null;
        if (this.f != null) {
            var2 = this.f.a(var1);
        }

        if (var2 == null) {
            State var3 = var1;
            Player var8 = var1.player;
            AIBot var7 = this;
            b var4 = null;

            for(int var6 = 2; var6 <= var7.b; var6 += 2) {
                var7.c = var6;
                b var5 = var7.a(var8, var3, 0, -1.0D / 0.0, 1.0D / 0.0);
                if (var4 == null) {
                    var4 = var5;
                }

                if (var3.searchLimitReached()) {
                    break;
                }

                var4 = var5;
            }

            State var9;
            for(var9 = var4.a; var9.previous != var3; var9 = var9.previous) {
            }

            var2 = var9;
        }

        return var2;
    }

    private final Iterable a(Iterable var1) {
        if (!this.d) {
            return var1;
        } else {
            PriorityQueue var2 = new PriorityQueue(g);
            Iterator var3 = var1.iterator();

            while(var3.hasNext()) {
                State var4 = (State)var3.next();
                var2.add(var4);
                if (var4.searchLimitReached()) {
                    break;
                }
            }

            return var2;
        }
    }

    private final b a(Player var1, State var2, int var3, double var4, double var6) {
        if (this.a(var2, var3)) {
            return new b(var2, this.a.a(var2, var1));
        } else {
            b var8 = i;
            Iterator var10 = this.a(var2.next()).iterator();

            while(var10.hasNext()) {
                State var9 = (State)var10.next();
                b var10000 = var8;
                int var10004 = var3 + 1;
                double var17 = var6;
                double var15 = var4;
                int var12 = var10004;
                State var11 = var9;
                Player var21 = var1;
                AIBot var20 = this;
                b var10001;
                if (this.a(var11, var12)) {
                    var10001 = new b(var11, this.a.a(var11, var1));
                } else {
                    b var13 = h;
                    Iterator var19 = this.a(var11.next()).iterator();

                    while(var19.hasNext()) {
                        State var14 = (State)var19.next();
                        b var23 = var20.a(var21, var14, var12 + 1, var15, var17);
                        if ((var13 = var23.b < var13.b ? var23 : var13).b <= var15) {
                            break;
                        }

                        var17 = Math.min(var17, var13.b);
                        if (var11.searchLimitReached()) {
                            break;
                        }
                    }

                    var10001 = var13;
                }

                b var22 = var10001;
                var8 = var10000;
                if ((var8 = var22.b > var8.b ? var22 : var8).b >= var6) {
                    break;
                }

                var4 = Math.max(var4, var8.b);
                if (var2.searchLimitReached()) {
                    break;
                }
            }

            return var8;
        }
    }

    private final boolean a(State var1, int var2) {
        if (var1.over) {
            return true;
        } else if (var1.searchLimitReached()) {
            return true;
        } else if (var2 < this.c) {
            return false;
        } else if (this.e) {
            return var1.board.countPieces() == var1.previous.board.countPieces() || var2 >= this.c * 3;
        } else {
            return true;
        }
    }
}

【问题讨论】:

  • I thought we need to specify the type of every variable in Java——所以如果你看到声明private d a,那么d必须是类型。
  • 请解释一下你做什么了解。
  • 看起来有些代码被混淆了——这就是为什么你只有一个字母的变量名和变量类型
  • 试图理解这段代码是浪费时间。
  • 关于private d a; - d 或任何小写字母的事实并不意味着它必须可变。 d 是有效的类名。您必须记住,首先您有对象类型 - d,然后是变量名 - a

标签: java bots chess


【解决方案1】:

private d a; - d 或任何小写字母的事实并不意味着它必须可变。 d 是有效的类名。您必须记住,首先您有对象类型 - d,然后是变量名 - a

1.0D / 0.0 也可以。文字末尾的 D 表示其类型为double。 因此,这样的事情是可以的:double d = 1.0D;,但float d = 1.0D; 会出现错误。将 Double 除以零将导致称为 正无穷大,请参阅常量:Double.POSITIVE_INFINITY

【讨论】:

  • 吹毛求疵,但 Double.POSITIVE_INFINITY 或 Double.NEGATIVE_INFINITY。它让我真正进行了测试:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 2014-06-24
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多