【问题标题】:Java Tic Tac Toe AI not working [closed]Java井字游戏AI不工作[关闭]
【发布时间】:2014-07-19 06:44:34
【问题描述】:

我的计算机播放器 AI 代码未按预期工作。我希望它随机移动,但阻止对手即将到来的获胜回合。但是,它有时会完全停止工作,有时即使没有传入的获胜组合,也会播放特定的动作。我的电脑 AI 代码如下。

public void compturn()
    {


        count++ ;

        if(count == 1||count == 3 || count == 5 || count == 7 || count == 9 || count == 11)
                    {
                      letter = "O" ;

                }
                else if ( count == 2 || count == 4 || count == 6 || count == 8 || count == 10)
                {
                    letter = "X" ;                  

                }
        if (b1.getText() == b2.getText() && b2.getText() != "" && b3.getText() == "")
            {
                b3.setText(letter);
                b3bool = false ;
            }
            else if (b4.getText() == b5.getText()  && b6.getText() == "")
            {
                b6.setText(letter);
                b6bool = false ;
            }
            else if (b7.getText() == b8.getText() && b9.getText() == "")
            {
                b9.setText(letter);
                b9bool = false ;
            }
            else if (b1.getText() == b4.getText() && b4.getText() != "" && b7.getText() == "")
            {
                b7.setText(letter);
                b7bool = false ;
            }
            else if (b2.getText() == b5.getText() && b8.getText() == "")
            {
                b8.setText(letter);
                b8bool = false ;
            }
            else if (b3.getText() == b6.getText() && b9.getText() == "")
            {
                b9.setText(letter);
                b9bool = false ;
            }
            else if (b1.getText() == b5.getText() && b5.getText() != "" && b9.getText() == "")
            {
                b9.setText(letter) ;
                b9bool = false ;
            }
            else if (b3.getText() == b5.getText() && b7.getText() == "")
            {
               b7.setText(letter);
               b7bool = false ;
            }
            else
            {
                randomMove();
            }
        }


    public void randomMove()
    {
       int randomnum = (int)(Math.random() * 10);
        if(randomnum == 1 )
        {
            if(b1.getText().equals("X") || b1.getText().equals("O"))
            {
                randomMove();
            }
            else 
            {
                b1.setText(letter);
            }
        }
        if(randomnum == 2 )
        {
            if(b2.getText().equals("X") || b2.getText().equals("O"))
            {
                randomMove();
            }
            else 
            {
                b2.setText(letter);
            }
        }
        if(randomnum == 3 )
        {
            if(b3.getText().equals("X") || b3.getText().equals("O"))
            {
                randomMove();
            }
            else 
            {
                b3.setText(letter);
            }
        }
        if(randomnum == 4 )
        {
            if(b4.getText().equals("X") || b4.getText().equals("O"))
            {
                randomMove();
            }
            else 
            {
                b4.setText(letter);
            }
        }
        if(randomnum == 5 )
        {
            if(b5.getText().equals("X") || b5.getText().equals("O"))
            {
                randomMove();
            }
            else 
            {
                b5.setText(letter);
            }
        }
        if(randomnum == 6 )
        {
            if(b6.getText().equals("X") || b6.getText().equals("O"))
            {
                randomMove();
            }
            else 
            {
                b6.setText(letter);
            }
        }
        if(randomnum == 7 )
        {
            if(b7.getText().equals("X") || b7.getText().equals("O"))
            {
                randomMove();
            }
            else 
            {
                b7.setText(letter);
            }
        }
        if(randomnum == 8 )
        {
            if(b8.getText().equals("X") || b8.getText().equals("O"))
            {
                randomMove();
            }
            else 
            {
                b8.setText(letter);
            }
        }
        if(randomnum == 9 )
        {
            if(b9.getText().equals("X") || b9.getText().equals("O"))
            {
                randomMove();
            }
            else 
            {
                b9.setText(letter);
            }
        }


     }

我完整的主游戏代码在这里

        public int oneplayergame()
        {
            // ----=---------------------- CREATING ALL JBUTTONS ON THE GAME SCREEN AND ADDING ACTION LISTENERS AND REACTIONS -----------------------------------------

            b1 = new JButton("");
            b1.setToolTipText("Mark this box");
            b1.setFont(TToeFont);
            b1.addActionListener(new ActionListener()
            {
                @Override
                public void actionPerformed(ActionEvent onclickb1)
                {
                   if (b1bool == true){ count++;
                    if(count == 1||count == 3 || count == 5 || count == 7 || count == 9 || count == 11)
                    {
                      letter = "O" ;

                }
                else if ( count == 2 || count == 4 || count == 6 || count == 8 || count == 10)
                {
                    letter = "X" ;                  

                }
                b1.setText(letter);
                b1bool = false ;
                calculatevictory();
                compturn();                    
                processturn();

            }}});

            b2 = new JButton("");
            b2.setFont(TToeFont);
            b2.setToolTipText("Mark this box");
            b2.addActionListener(new ActionListener()
            {
                @Override
                public void actionPerformed(ActionEvent onclickb1)
                {
                   if (b2bool == true){ count++;
                    if(count == 1||count == 3 || count == 5 || count == 7 || count == 9 || count == 11)
                    {
                      letter = "O" ;

                }
                else if ( count == 2 || count == 4 || count == 6 || count == 8 || count == 10)
                {
                    letter = "X" ;                  

                }
                b2.setText(letter);
                b2bool = false ;
                calculatevictory();
                compturn();                    
                processturn();
            }}
                });


            b3 = new JButton("");
            b3.setToolTipText("Mark this box");
            b3.setFont(TToeFont);
            b3.addActionListener(new ActionListener()
            {
                @Override
                public void actionPerformed(ActionEvent onclickb1)
                {
                     if(b3bool == true){
                         count++;
                    if(count == 1||count == 3 || count == 5 || count == 7 || count == 9 || count == 11)
                    {
                      letter = "O" ;

                }
                else if ( count == 2 || count == 4 || count == 6 || count == 8 || count == 10)
                {
                    letter = "X" ;                  

                }
                b3.setText(letter);
                b3bool = false ;
                calculatevictory();
                compturn();                    
                processturn();
            }}

            });

            b4 = new JButton("");
            b4.setToolTipText("Mark this box");
            b4.setFont(TToeFont);
            b4.addActionListener(new ActionListener()
            {
                @Override
                public void actionPerformed(ActionEvent onclickb1)
                {
                    if(b4bool == true){

                    count++;
                        if(count == 1||count == 3 || count == 5 || count == 7 || count == 9 || count == 11)
                    {
                      letter = "O" ;

                }
                else if ( count == 2 || count == 4 || count == 6 || count == 8 || count == 10)
                {
                    letter = "X" ;                  

                }
                    b4.setText(letter);
                    b4bool = false ;
                    calculatevictory();
                    compturn();                    
                    processturn();
                }}
            });

            b5 = new JButton("");
            b5.setToolTipText("Mark this box");
            b5.setFont(TToeFont);
            b5.addActionListener(new ActionListener()
            {
                @Override
                public void actionPerformed(ActionEvent onclickb1)
                {
                    if (b5bool == true){
                        count++;
                        if(count == 1||count == 3 || count == 5 || count == 7 || count == 9 || count == 11)
                    {
                      letter = "O" ;

                }
                else if ( count == 2 || count == 4 || count == 6 || count == 8 || count == 10)
                {
                    letter = "X" ;                  

                }
                    b5.setText(letter);
                    b5bool = false ;
                    calculatevictory();
                    compturn();                    
                    processturn();
                }}
            });

            b6 = new JButton("");
            b6.setToolTipText("Mark this box");
            b6.setFont(TToeFont);
            b6.addActionListener(new ActionListener()
            {
                @Override
                public void actionPerformed(ActionEvent onclickb1)
                {
                    if (b6bool == true){
                        count++;
                        if(count == 1||count == 3 || count == 5 || count == 7 || count == 9 || count == 11)
                    {
                      letter = "O" ;

                }
                else if ( count == 2 || count == 4 || count == 6 || count == 8 || count == 10)
                {
                    letter = "X" ;                  

                }
                    b6.setText(letter);
                    b6bool = false ;
                    calculatevictory();
                    compturn();                    
                    processturn();
                }}
            });

            b7 = new JButton("");
            b7.setToolTipText("Mark this box");
            b7.setFont(TToeFont);
            b7.addActionListener(new ActionListener()
            {
                @Override
                public void actionPerformed(ActionEvent onclickb1)
                {
                    if (b7bool == true){
                        count++;
                        if(count == 1||count == 3 || count == 5 || count == 7 || count == 9 || count == 11)
                    {
                      letter = "O" ;

                }
                else if ( count == 2 || count == 4 || count == 6 || count == 8 || count == 10)
                {
                    letter = "X" ;                  

                }
                    b7.setText(letter);
                    b7bool = false ;
                    calculatevictory();
                    compturn();                    
                    processturn();
                }}
            });

            b8 = new JButton("");
            b8.setToolTipText("Mark this box");
            b8.setFont(TToeFont);
            b8.addActionListener(new ActionListener()
            {
                @Override
                public void actionPerformed(ActionEvent onclickb1)
                {
                    if(b8bool == true){
                        count++;
                        if(count == 1||count == 3 || count == 5 || count == 7 || count == 9 || count == 11)
                    {
                      letter = "O" ;

                }
                else if ( count == 2 || count == 4 || count == 6 || count == 8 || count == 10)
                {
                    letter = "X" ;                  

                }
                    b8.setText(letter);
                    b8bool = false ;
                    calculatevictory();
                    compturn();                    
                    processturn();
                }}
            });

            b9 = new JButton("");
            b9.setToolTipText("Mark this box");
            b9.setFont(TToeFont);
            b9.addActionListener(new ActionListener()
            {
                @Override
                public void actionPerformed(ActionEvent onclickb1)
                {
                   if(b9bool == true){
                       count++;
                        if(count == 1||count == 3 || count == 5 || count == 7 || count == 9 || count == 11)
                    {
                      letter = "O" ;

                }
                else if ( count == 2 || count == 4 || count == 6 || count == 8 || count == 10)
                {
                    letter = "X" ;                  

                }
                    b9.setText(letter);
                    b9bool = false ;
                    calculatevictory();
                    compturn();
                    processturn();
                }}
            });

            //CREATING GAME SCREEN LAYOUT


            //CREAING GAME SCREEN CONTENT PANE AND ADDING BUTTONS TO IT



        // This method checks if someone won the game every time you click a button 

        public void calculatevictory(){
            if (b1.getText() == b2.getText() && b2.getText() == b3.getText() && b1.getText() != "")
            {
                win = true ;
            }
            else if (b4.getText() == b5.getText() && b5.getText() == b6.getText() && b4.getText() != "")
            {
                win = true ;
            }
            else if (b7.getText() == b8.getText() && b8.getText() == b9.getText() && b7.getText() != "")
            {
                win = true ;
            }
            else if (b1.getText() == b4.getText() && b4.getText() == b7.getText() && b1.getText() != "")
            {
                win = true ;
            }
            else if (b2.getText() == b5.getText() && b5.getText() == b8.getText() && b2.getText() != "")
            {
                win = true ;
            }
            else if (b3.getText() == b6.getText() && b6.getText() == b9.getText() && b3.getText() != "")
            {
                win = true ;
            }
            else if (b1.getText() == b5.getText() && b5.getText() == b9.getText() && b1.getText() != "")
            {
                win = true ;
            }
            else if (b3.getText() == b5.getText() && b5.getText() == b7.getText() && b3.getText() != "")
            {
                win = true ;
            }
            else 
            {
                win = false ;
            }
        }

        // This method sends the win message




            public void processturn()

        }
         // This method resets all game variables 

        public void resetgame()
        {
         count = 1 ; 

         b1bool = true ;
         b2bool = true ;
         b3bool = true ;
         b4bool = true ;
         b5bool = true ;
         b6bool = true ;
         b7bool = true ;
         b8bool = true ;
         b9bool = true ;
         win = false ;
         gameinit = true ;
         b1.setText("");
         b2.setText("");
         b3.setText("");
         b4.setText("");
         b5.setText("");
         b6.setText("");
         b7.setText("");
         b8.setText("");
         b9.setText("");
        }


    public void compturn()
    {
        }


    public void randomMove()
    {























     }
}

【问题讨论】:

  • 欢迎来到 Stack Overflow! SO 并不是一个“调试我的代码”站点——如果这就是你要找的,你可能应该聘请专家为你做这件事。如果您在处理该问题时遇到具体技术问题,请随时相应地编辑问题。
  • 是否有任何堆栈跟踪? @RoboticMoneylender
  • @Thomas 不,根本没有。
  • 我建议学习调试代码或编写单元测试以找出哪些测试用例通过,哪些失败。要求我们为您做这一切并不是这个网站的目的。就像上面@MichaelPetrotta 所说,如果您有具体问题,那么您可以从这里获得帮助。

标签: java artificial-intelligence tic-tac-toe


【解决方案1】:

欢迎来到 AI...您可以通过多种方式做到这一点。我会给你一些建议。

我假设计数用于确定轮到谁。我建议你宁愿创建一个整数“转”,然后简单地这样做:

turn = 1 -turn

...您当前增加计数的位置。如果它是 0 则轮到 o,否则为 x。然后,您可以删除这两个长 if 语句。 (您也可以使用布尔标志,但不是每次都使用,例如 turn = !turn。)

现在剩下的......我看到你没有数组。使用起来舒服吗?

如果是这样,不如定义获胜序列。例如:

int[][] win = new int[][]{{1,2,3}, {4,5,6}, {7,8,9}, {1,4,7}, ...}

然后你要做的就是确定你是否能赢,去看看你是否有两个令牌在现场 win[i][0]、win[i][1] 或 win[i][2] .如果第三个位置是空的,你可以赢,应该移到那里,

如果打不赢,重复上述过程防守。

如果您不必防守并且无法获胜,请移到中路。如果中心被占据,则占据一个角落,否则随机移动。

这会让你的 AI 有时仍然会失败,但会显示出一些智慧。如果您真的想构建无与伦比的东西,请查看极小极大搜索算法。

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    相关资源
    最近更新 更多