有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

swing无法在Tictaoe的java游戏中画线

我只使用一个叫做Game的类。事实上,我对GUI还不熟悉。 它运行良好,但如果有人赢了,它不会在每次点击后检查赢家时画线。我不确定这是不是一个愚蠢的问题:|

package com.Myproject.main;



import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Game extends JFrame implements Runnable , ActionListener
{
JButton x0y0 , x1y0 , x2y0 ;
JButton x0y1 , x1y1 , x2y1 ;
JButton x0y2 , x1y2 , x2y2 ;
int turn = 0;
Graphics g;
Thread thread = new Thread();
String symbolx0y0;
String symbolx1y0;
String symbolx2y0;
String symbolx0y1;
String symbolx1y1;
String symbolx2y1;
String symbolx0y2;
String symbolx1y2;
String symbolx2y2;
public Game()
{
    setSize(300 , 300);
    setTitle("Tic Tac Toe");
    setLocationRelativeTo(null);
    getContentPane().setLayout(null);
    x0y0 = new JButton("Click me");
    x1y0 = new JButton("Click me");
    x2y0 = new JButton("Click me");
    x0y1 = new JButton("Click me");
    x1y1 = new JButton("Click me");
    x2y1 = new JButton("Click me");
    x0y2 = new JButton("Click me");
    x1y2 = new JButton("Click me");
    x2y2 = new JButton("Click me");
    x0y0.setBounds( 0 , 0 , 90 , 90);
    x1y0.setBounds( 91 , 0 , 90 , 90);
    x2y0.setBounds( 182 , 0 , 90 , 90);
    x0y1.setBounds( 0 , 91 , 90 , 90);
    x1y1.setBounds( 91 , 91 , 90 , 90);
    x2y1.setBounds( 182 , 91 , 90 , 90);
    x0y2.setBounds( 0 , 182 , 90 , 90);
    x1y2.setBounds( 91 , 182 , 90 , 90);
    x2y2.setBounds( 182 , 182 , 90 , 90);
    getContentPane().add(x0y0);
    getContentPane().add(x1y0);
    getContentPane().add(x2y0);
    getContentPane().add(x0y1);
    getContentPane().add(x1y1);
    getContentPane().add(x2y1);
    getContentPane().add(x0y2);
    getContentPane().add(x1y2);
    getContentPane().add(x2y2);
    x0y0.addActionListener(this);
    x1y0.addActionListener(this);
    x2y0.addActionListener(this);
    x0y1.addActionListener(this);
    x1y1.addActionListener(this);
    x2y1.addActionListener(this);
    x0y2.addActionListener(this);
    x1y2.addActionListener(this);
    x2y2.addActionListener(this);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
}
public void run()
{
    while(true)
    {

    }
}
public static void main(String[] args)
{
    Game game = new Game();

}
 public void actionPerformed(ActionEvent e)
{
    if(e.getSource() == x0y0)
    {
        if(turn%2==0){
        x0y0.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Circle.png"));
        turn++ ;
        setSymbolx0y0("Circle");
        return;
        }
        if(turn%2!=0){
         x0y0.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Cross.png"));
         turn++ ;
         setSymbolx0y0("Cross");
         return;
        }
    }
    if(e.getSource() == x1y0)
    {
        if(turn%2==0){
        x1y0.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Circle.png"));
        turn++ ;
        setSymbolx1y0("Circle");
        return;
        }
        if(turn%2!=0){
         x1y0.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Cross.png"));
         turn++ ;
         setSymbolx1y0("Cross");
         return;
        }
    }
    if(e.getSource() == x2y0)
    {
        if(turn%2==0){
        x2y0.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Circle.png"));
        turn++ ;
        setSymbolx2y0("Circle");
        return;
        }
        if(turn%2!=0){
         x2y0.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Cross.png"));
         turn++ ;
         setSymbolx2y0("Cross");
         return;
        }
    }
    if(e.getSource() == x0y2)
    {
        if(turn%2==0){
        x0y2.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Circle.png"));
        turn++ ;
        setSymbolx0y2("Circle");
        return;
        }
        if(turn%2!=0){
         x0y2.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Cross.png"));
         turn++ ;
         setSymbolx0y2("Cross");
         return;
        }
    }
    if(e.getSource() == x1y2)
    {
        if(turn%2==0){
        x1y2.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Circle.png"));
        turn++ ;
        setSymbolx1y2("Circle");
        return;
        }
        if(turn%2!=0){
         x1y2.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Cross.png"));
         turn++ ;
         setSymbolx1y2("Cross");
         return;
        }
    }
    if(e.getSource() == x2y2)
    {
        if(turn%2==0){
        x2y2.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Circle.png"));
        turn++ ;
        setSymbolx2y2("Circle");
        return;
        }
        if(turn%2!=0){
         x2y2.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Cross.png"));
         turn++ ;
         setSymbolx2y2("Cross");
         return;
        }
    }
    if(e.getSource() == x0y1)
    {
        if(turn%2==0){
        x0y1.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Circle.png"));
        turn++ ;
        setSymbolx0y1("Circle");
        return;
        }
        if(turn%2!=0){
         x0y1.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Cross.png"));
         turn++ ;
         setSymbolx0y1("Cross");
         return;
        }
    }
    if(e.getSource() == x1y1)
    {
        if(turn%2==0){
        x1y1.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Circle.png"));
        turn++ ;
        setSymbolx1y1("Circle");
        return;
        }
        if(turn%2!=0){
         x1y1.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Cross.png"));
         turn++ ;
         setSymbolx1y1("Cross");
         return;
        }
    }
    if(e.getSource() == x2y1)
    {
        if(turn%2==0){
        x2y1.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Circle.png"));
        turn++ ;
        setSymbolx2y1("Circle");
        return;
        }
        if(turn%2!=0){
         x2y1.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Cross.png"));
         turn++ ;
         setSymbolx2y1("Cross");
         return;
        }
    }
    checkWinner();
}
public void drawCircle(Graphics g){
g.drawString("Circle Won" , 30 , 30);
}
public void drawCross(Graphics g){
g.drawString("Cross Won" , 30 , 30);
}
 public void checkWinner(){
     if(symbolx2y0 == symbolx1y1 && symbolx1y1 == symbolx2y2 && symbolx2y2 == "Circle") drawCircle(g);
     if(symbolx2y0 == symbolx1y1 && symbolx1y1 == symbolx2y2 && symbolx2y2 == "Cross")drawCross(g);
     if(symbolx0y0 == symbolx1y1 && symbolx2y2 == symbolx1y1 && symbolx0y0 == "Circle")drawCircle(g);
     if(symbolx0y0 == symbolx1y1 && symbolx2y2 == symbolx1y1 && symbolx0y0 == "Cross")drawCross(g);
     if(symbolx0y0 == symbolx1y0 && symbolx1y0 == symbolx2y0 && symbolx0y0 == "Circle")drawCircle(g);
     if(symbolx0y0 == symbolx1y0 && symbolx1y0 == symbolx2y0 && symbolx0y0 == "Cross")drawCross(g);
     if(symbolx0y1 == symbolx1y1 && symbolx1y1 == symbolx2y1 && symbolx0y1 == "Circle")drawCircle(g);
     if(symbolx0y1 == symbolx1y1 && symbolx1y1 == symbolx2y1 && symbolx0y1 == "Cross")drawCross(g);
     if(symbolx0y2 == symbolx1y2 && symbolx1y2 == symbolx2y2 && symbolx0y2 == "Circle")drawCircle(g);
     if(symbolx0y2 == symbolx1y2 && symbolx1y2 == symbolx2y2 && symbolx0y2 == "Cross")drawCross(g);
     if(symbolx0y0 == symbolx0y1 && symbolx0y1 == symbolx0y2 && symbolx0y2 == "Circle")drawCircle(g);
     if(symbolx0y0 == symbolx0y1 && symbolx0y1 == symbolx0y2 && symbolx0y2 == "Cross")drawCross(g);
     if(symbolx1y0 == symbolx1y1 && symbolx1y1 == symbolx1y2 && symbolx1y2 == "Circle")drawCircle(g);
     if(symbolx1y0 == symbolx1y1 && symbolx1y1 == symbolx1y2 && symbolx1y2 == "Cross")drawCross(g);
     if(symbolx2y0 == symbolx2y1 && symbolx2y2 == symbolx2y1 && symbolx2y1 == "Circle")drawCircle(g);
     if(symbolx2y0 == symbolx2y1 && symbolx2y2 == symbolx2y1 && symbolx2y1 == "Cross")drawCross(g);
}
public String setSymbolx0y0(String symbolx0y0){
    return this.symbolx0y0 = symbolx0y0;

}
public String setSymbolx1y0(String symbolx1y0){
    this.symbolx1y0 = symbolx1y0;
    return symbolx1y0;
}
public String setSymbolx2y0(String symbolx2y0){
    this.symbolx2y0 = symbolx2y0;
    return symbolx2y0;
}
public String setSymbolx0y1(String symbolx0y1){
    this.symbolx0y1 = symbolx0y1;
    return symbolx0y1;
}
public String setSymbolx1y1(String symbolx1y1){
    this.symbolx1y1 = symbolx1y1;
    return symbolx1y1;
}
public String setSymbolx2y1(String symbolx2y1){
    this.symbolx2y1 = symbolx2y1;
    return symbolx2y1;
}
public String setSymbolx0y2(String symbolx0y2){
    this.symbolx0y2 = symbolx0y2 ;
    return symbolx0y2;
}
public String setSymbolx1y2(String symbolx1y2){
    this.symbolx1y2 = symbolx1y2;
    return symbolx1y2;
}
public String setSymbolx2y2(String symbolx2y2){
    this.symbolx2y2 = symbolx2y2;
    return symbolx2y2;
}

}


共 (1) 个答案

  1. # 1 楼答案

    1. symbolx2y2 == "Circle"不是String比较在Java中的工作方式,您应该使用类似"Circle".equals(symbolx2y2)的东西。这也适用于symbolx1y1 == symbolx2y2
    2. g从未被赋值,所以它将是null,此外,这不是定制绘画在Swing中的工作方式。有关详细信息,请参见Painting in AWT and SwingPerforming Custom Painting。话虽如此,基于您的代码,我不会使用它,相反,我会显示一个对话框,其中包含您想要显示的任何消息。有关详细信息,请参见How to Make Dialogs
    3. 避免使用null布局,像素完美的布局在现代ui设计中是一种错觉。影响零部件单个尺寸的因素太多,您无法控制。Swing的设计初衷是与布局管理器一起工作,丢弃这些布局管理器将导致无止境的问题,您将花费越来越多的时间来纠正这些问题。有关详细信息,请参见Laying Out Components Within a Container
    4. Thread thread = new Thread();什么也没做,基本上是一种浪费
    5. 您应该确保您的UI是在事件调度线程的上下文中创建和操作的,有关详细信息,请参见Initial Threads
    6. 避免直接从JFrame扩展,您没有向类添加任何新功能,只是将自己锁定在单个用例中。最好从JPanel开始,并将其添加到JFrame的实例或您想要的任何容器中