【问题标题】:Unreachable code, if statement, in tic tac toe?井字游戏中无法访问的代码,if 语句?
【发布时间】:2014-02-01 15:20:53
【问题描述】:

我正在为我的 AP 计算机科学课程创建一个井字游戏,到目前为止它运行没有错误,或者通过简单的修复解决了错误。但是,当我向程序添加 if 语句时,它会不断显示错误,指出“无法访问代码”。我仍然无法确定原因或如何解决此问题。

我使用“Magic Square”设置游戏,其中每行和对角线都设置为一个变量并加起来为 15,这就是程序如何确定获胜者的方式。

这个if语句出现错误:

if ( topx == 15 || middlex == 15 || bottomx == 15 || leftx == 15 || 中心 == 15 ||对x == 15 ||诊断1x == 15 ||诊断2x == 15){ String XWIN = ("X 赢了!"); g.drawString(XWIN, 60, 50); }

上面的if语句是针对x播放器的,但是对于o播放器的if语句也有同样的错误。

整个代码如下所示(我为拙劣的笔记道歉)

    public void paint(Graphics g){

             this.setSize(450, 430); //sets the game screen size.

             //initial directions
            System.out.println("Player 1 (x) goes first. there are 9 boxes available.");
            System.out.println("The numbers correspond to the boxes respectively.");
            System.out.println("1 being top left, 2 being top center, 3 being top right, and so on.");      
            System.out.print("PLAYER 1 enter location of x: ");


                  setBackground( Color.black ); //background color

     //listed variables assigned to each box, x and o, respectively    
         int topx = 0;
         int middlex = 0;
         int bottomx = 0;
         int leftx = 0;
         int centerx = 0;
         int rightx = 0;
         int diag1x = 0;
         int diag2x = 0;


         int topo = 0;
         int middleo = 0;
         int bottomo = 0;
         int lefto = 0;
         int centero = 0;
         int righto = 0;
         int diag1o = 0;
         int diag2o = 0;

        //board                       
        g.setColor( Color.WHITE );  
        g.drawRect(50,50,225,225);
        g.drawLine(125, 50, 125, 275);
        g.drawLine(200, 50, 200, 275);
        g.drawLine(50, 125, 275, 125);
        g.drawLine(50, 200, 275, 200);



        //for loop and implemented scanner
        for (int  x = 1;  x <= 5; x++)   {

            g.setColor( Color.CYAN);
        Scanner keyboard1 = new Scanner(System.in);
        int p1 = keyboard1.nextInt();
        System.out.print("PLAYER 2 enter location of o: ");
        switch (p1){ 

        case 1:
            g.drawLine(75, 75, 100, 100);
            g.drawLine(100, 75, 75, 100);
        topx += 8;
        leftx += 8;
        diag1x +=8;

        break;

        case 2:
            g.drawLine(150, 75, 175, 100);
            g.drawLine(175, 75, 150, 100);
            centerx += 1;
            topx += 1;

        break;

        case 3:
            g.drawLine(225, 75, 250, 100);
            g.drawLine(250, 75, 225, 100);
            rightx += 6;
            topx += 6;
            diag2x += 6;

        break;

        case 4:
            g.drawLine(75, 150, 100, 175);
            g.drawLine(75, 175, 100, 150);
            middlex += 3;
            leftx += 3;

        break;

        case 5:
            g.drawLine(150, 150, 175, 175);
            g.drawLine(150, 175, 175, 150);
            diag1x += 5;
            diag2x += 5;
            middlex += 5;
            centerx += 5;

        break;

        case 6:
            g.drawLine(225, 150, 250, 175);
            g.drawLine(225, 175, 250, 150);
            middlex += 7;
            rightx += 7;

        break;

        case 7:
            g.drawLine(75, 225, 100, 250);
            g.drawLine(75, 250, 100, 225);
            diag2x += 4;
            leftx += 4;
            bottomx += 4;

        break;

        case 8:
            g.drawLine(150, 225, 175, 250);
            g.drawLine(150, 250, 175, 225);
            bottomx += 9;
            centerx += 9;

        break;

        case 9:
            g.drawLine(225, 225, 250, 250);
            g.drawLine(225, 250, 250, 225);
            bottomx += 2;
            rightx += 2;
            diag1x += 2;

        break;

        if ( topx == 15 || middlex == 15 || bottomx == 15 || leftx == 15 || centerx == 15 || rightx == 15 || diag1x == 15 || diag2x == 15 ) {
             String XWIN = ("X wins!");
             g.drawString(XWIN, 60, 50);
            }

        g.setColor( Color.GREEN);
        Scanner keyboard2 = new Scanner(System.in); 
        int p2  = keyboard2.nextInt();
        System.out.print("PLAYER 1 enter location of x: ");
        switch (p2){

        case 1:
            g.drawOval(75, 75, 25, 25);
            topo += 8;
            lefto += 8;
            diag1o +=8;
        break;

        case 2:
            g.drawOval(150, 75, 25, 25);
            centero += 1;
            topo += 1;
        break;

        case 3:
            g.drawOval(225, 75, 25, 25);
            righto += 6;
            topo += 6;
            diag2o += 6;
        break;

        case 4:
            g.drawOval(75, 150, 25, 25);
            middleo += 3;
            lefto += 3;
        break;

        case 5:
            g.drawOval(150, 150, 25, 25);
            diag1o += 5;
            diag2o += 5;
            middleo += 5;
            centero += 5;
        break;

        case 6:
            g.drawOval(225, 150, 25, 25);
            middleo += 7;
            righto += 7;
        break;

        case 7:
            g.drawOval(75, 225, 25, 25);
            diag2o += 4;
            lefto += 4;
            bottomo += 4;
        break;

        case 8:
            g.drawOval(150, 225, 25, 25);
            bottomo += 9;
            centero += 9;
        break;

        case 9:
            g.drawOval(225, 225, 25, 25);
            bottomo += 2;
            righto += 2;
            diag1o += 2;
        break;          

        if ( topo == 15 || middleo == 15 || bottomo == 15 || lefto == 15 || centero == 15 || righto == 15 || diag1o == 15 || diag2o == 15 ) {
             String OWIN = ("O wins!");
             g.drawString(OWIN, 60, 50);
            }
        default : System.out.println("This is not a valid input. Please enter a number 1 through 9.");

                }

            }

        }
    }

【问题讨论】:

  • 你的break在条件之前,因此无法到达代码。
  • 看来您在switch 的最后一个break; 之后定义了if。这会将其定义为无法访问的代码。
  • 另外,更正你的标签将有助于表明事情没有正确排列。
  • “显示了整个代码..” 哇! 213 LOC 在一种方法中.. 这个问题可以减少到一个不超过 50 LOC 的 MCVE。请在将来这样做。也不是说任何方法通常都不应超过“全屏”。 213 LOC 太长了!
  • OK.. 是学校规定的吗?另外:为什么选择 AWT 而不是 Swing?请参阅我在 Swing extras over AWT 上的回答,因为有很多放弃使用 AWT 组件的充分理由。 -- 有两个问题,我希望看到你的两个答案。

标签: java compiler-errors applet awt unreachable-code


【解决方案1】:

看在上帝的份上,就在休息之后。中断强制代码流结束并离开当前块,因此永远不会到达块中它之后的任何代码。所以编译器正确地抱怨。不要这样做。

您的帖子中还有很多其他有问题的代码,包括在绘制方法中使用扫描仪。

您应该放弃此代码,并阅读 Swing 教程和通用 Java 教程。一方面,您几乎不应该覆盖paint 方法,而应该覆盖JComponent 或JPanel 的paintComponent 方法。另一方面,这些方法应该仅用于绘画和绘画,并且永远不应该被扫描仪阻塞。这只会冻结您的 GUI,使其无用。

我会极大地重新构建这个程序。

  • 我根本不会在 GUI 程序中使用扫描仪。 GUI 程序本质上是事件驱动的,而 Scanner 类型代码是完全不兼容的线性控制台代码。
  • 在使用 GridLayout 的 JPanel 中保存的 JLabel 上使用诸如 MouseListener 之类的侦听器。
  • 如果我画了任何东西,它也会在 JPanel 中的 paintComponent 覆盖中。
  • 但我会尽量避免绘画,而是会根据状态交换包含“X”、“O”或空白图像的 JLabel 中的 ImageIcons。

编辑:由于您必须使用 AWT,因此对 recs 进行了一些更改:

  • 不过,出于同样的原因,请不要使用扫描仪。
  • 仍然使用事件驱动编程,例如附加到标签的 MouseListener。
  • 如果需要自定义图形,则重写paint方法。
  • 同样,此方法中不应包含任何程序逻辑和阻塞代码。它应该只用于绘图和绘图。

【讨论】:

    【解决方案2】:

    该错误与您的if 语句的内容无关;您将if 语句放在break 语句之后和随后的case 之前——程序执行无法到达该语句。 (这就是“无法访问的代码”的意思——通常,当您看到该错误时,您需要退后一步查看上下文,并尝试找出哪些输入集应该到达该行- 通常,当你试图弄清楚这一点时,你会明白为什么它不会发生。)

    【讨论】:

      猜你喜欢
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多