如何获得独立点击

时间:2015-06-15 10:55:07

标签: java

我正在编写ticktacktoe游戏,我希望每次点击都有自己的独立响应。但是我的循环弄乱了我的输出。它还在建设中,但我希望看到结果让我进步

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class tictac extends JFrame implements ActionListener{

    JButton [][] game = new JButton[3][3];
    JLabel head = new JLabel("Tic-Tac-Toe");
    Font font = new Font("Time New Roman", Font.ITALIC, 20);
    GridLayout grid = new GridLayout(3,3,0,0);
    int row,column =0;
    FlowLayout flow = new FlowLayout();

    tictac(){
        super("Tic-Tac-Toe");
        //setLayout(flow);
        //add(head);

        setLayout(grid);
        setVisible(true);
        setDefaultCloseOperation(1);
        setSize(500,500);

        for (row =0; row<3;row++ ){
            for(column =0; column <3;column++){
                game[row][column]= new JButton("");
                add(game[row][column]);
                game[row][column].addActionListener(this);
            }
        }
    }


    public void actionPerformed(ActionEvent e){


        Object source = e.getSource();
        int count=1;

        for (row =0; row<3;row++ ){
            for(column =0; column <3;column++){


                if ((source == game[row][column]) && (game[row][column].getText()=="") && (count==1) )
                    game[row][column].setText("X");

                        if (source == game[row][column] && (count % 2==0))
                        game[row][column].setText("O");
                        else if (source == game[row][column] && (count % 2==1))
                            game[row][column].setText("X");


                count++;
                }// end of first for

            } // end of second for

        }
    }







public class Tester {
    public static void main(String[] args) {
        tictac two =  new tictac();
        }
}

2 个答案:

答案 0 :(得分:1)

代码中的一些问题:

  • 如评论中所述,请勿使用==进行比较。使用equals方法。 就像那样:
String str = "mytext";
if(str.equals("mytext")) // true !
  • 每次发生事件时都会调用方法actionPerformed(ActionEvent e)。这意味着如果在其主体内声明变量,它将在发生新操作时重新初始化该值。看一下变量count
  • 你的变量count似乎与玩家1和2的转向有关。问题是你在每个循环中为这个变量分配一个新值。

要解决您的问题,您应该:

  • actionPerformed方法之外声明变量。布尔值是合适的,因为你只有2个玩家,而布尔值是真或假。
  • 当玩家完成动作时修改布尔值。
  • 根据此布尔变量的值,您决定放置XO

最后有一些改进:

  • 在处理java语言时,请查看命名约定。例如,当您声明一个类时,第一个字母应该是大写的。所有这些信息都可以在那里找到:http://www.oracle.com/technetwork/java/codeconventions-135099.html
  • 另外,看一下不同的缩进样式:https://en.wikipedia.org/wiki/Indent_style; Personnaly我发现K&amp; R风格适合用java编程
  • 在您的游戏中,处理以下事实:您无法选择之前已经选择的案例。
  • 在你的游戏中,关闭窗口什么都不做。您应该查看JFrame的javadoc以使用预定义值之一作为参数。例如,您应该对此感兴趣:
setDefaultCloseOperation(EXIT_ON_CLOSE);

答案 1 :(得分:0)

如果您在评论中说明了所需的行为:

  

我希望第一次点击给我一个X,然后点击下一步   给O,然后下一个X

...然后您的actionPerformed()代码就像这样简单:

public void actionPerformed(ActionEvent e){
    ((JButton) e.getSource()).setText(clickCount++ % 2 == 0 ? "X" : "O");
}

为了工作,当然也要声明新的类字段: int clickCount = 0;