2014-03-12 38 views
1

是否有可能在tictactoe中通过Button s形成一条线,当有三个Button s带有相同的符号时,例如,通过TicTacToe按钮创建一条线

picture of TicTacToe board

enter image description here

enter image description here

如果是这样,怎么能做到呢?

+0

是的,这是可能的 –

+0

你有没有尝试任何事情,或者你只是想游戏代码? – AloneInTheDark

+0

我只想知道它是否可以完成,以及需要使用哪些类的构建。但是,一个例子更受欢迎。 – Seeker

回答

2

可以做的一种方法是使用一些boolean逻辑和自定义JButton类和一些自定义绘画。例如在下面的例子中,有一个leftRight标志。如果有横向的井字脚趾,leftRight标志将被抬起,导致该线在井字游戏中的每个按钮中都被绘制出来。原谅我的井字游戏编程逻辑,它不是最终的游戏产品。它只是举例说明了O的顶行tic tac脚趾。但我相信你可以找出其他类型的tic tac toe的逻辑。例如,对于一个对角线,你可以有一个leftDiag标志,如果提出,它会画drawLine(0, 0, getWidth(), getHeight())

玩它。请享用!

enter image description here

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.GridLayout; 
import java.awt.Image; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.border.LineBorder; 

public class TTTButtons { 

    ImageIcon oooIcon; 
    MyButton[][] buttons = new MyButton[3][3]; 
    JPanel gamePanel; 

    public TTTButtons() { 
     oooIcon = new ImageIcon(getClass().getResource("/resources/ooooo.png")); 
     gamePanel = createGamePanel(); 

     JFrame frame = new JFrame("TicTacToe"); 
     frame.add(gamePanel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

    } 

    private JPanel createGamePanel() { 
     JPanel panel = new JPanel(new GridLayout(3, 3)); 
     for (int i = 0; i < buttons.length; i++) { 
      for (int j = 0; j < buttons[i].length; j++) { 
       buttons[i][j] = new MyButton(oooIcon); 
       panel.add(buttons[i][j]); 
      } 
     } 
     return panel; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new TTTButtons(); 
      } 
     }); 
    } 

    public class MyButton extends JButton { 

     Image oooImage; 
     boolean leftRight = false; 
     boolean clicked = false; 
     boolean ooo = false; 

     boolean tictactoe = false; 

     public MyButton(ImageIcon oooImage) { 
      this.oooImage = oooImage.getImage(); 
      addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        clicked = true; 
        ooo = true; 
        if (buttons[0][0].clicked && buttons[0][1].clicked && buttons[0][2].clicked) { 
         for (int i = 0; i < 3; i++) { 
          buttons[0][i].leftRight = true; 
          buttons[0][i].tictactoe = true; 
          buttons[0][i].repaint(); 
         } 
         return; 
        } 
        repaint(); 
       } 
      }); 
      setBorder(new LineBorder(Color.BLACK, 1)); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (clicked) { 
       if (ooo) { 
        g.drawImage(oooImage, 0, 0, getWidth(), getHeight(), this); 
       } 
      } else { 
       g.setColor(Color.GRAY); 
       g.fillRect(0, 0, getWidth(), getHeight()); 
      } 
      if (tictactoe) { 
       if (leftRight) { 
        g.drawLine(0, (int) (getHeight()/2), getWidth(), (int) (getHeight()/2)); 
       } 
      } 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return oooImage == null ? new Dimension(100, 100) 
        : new Dimension(oooImage.getWidth(this), oooImage.getHeight(this)); 
     } 
    } 
} 
+0

所以你知道正在创建的行,它是图形或绘图类的图像或线? – Seeker

+0

顺便说一句,我得到一个空指针错误,无论如何解决这个问题。 – Seeker

+0

这是我正在绘制的一条线。看看MyButton类中的'paintComponent'方法。有一个'tictactoe'的标志被提出,将画线 –

0

如果您使用的是JFrame,那很简单。试试这个:

if(shape1==shape2 && shape2==shape3){ 
    public void paint(Graphics g) { 
     super.paint(g); 
     Graphics2D g2 = (Graphics2D) g; 
     Line2D lin = new Line2D.Float(100, 100, 250, 260); 
     g2.draw(lin); 
    } 
} 

当然,坐标取决于你的形状。

+0

是的,我正在使用JFrame。 – Seeker

+0

嗨,关于paint关键字,我得到一个错误oid是变量paint的一个无效类型,我需要为它导入一些东西吗? – Seeker

+0

尝试这些导入:import javax.swing。*; import java.awt。*; import java.awt.geom。*; –