Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Tic-Tac-Toe';X';直到第2次'之后才出现;O';已单击_Java_Arrays_Tic Tac Toe - Fatal编程技术网

Java Tic-Tac-Toe';X';直到第2次'之后才出现;O';已单击

Java Tic-Tac-Toe';X';直到第2次'之后才出现;O';已单击,java,arrays,tic-tac-toe,Java,Arrays,Tic Tac Toe,您好,我一直在用Java开发一个Tic-Tac-Toe应用程序,我已经在使用它了,但我的问题是,当我与X比赛时,在我单击放置第一个O的点后,X不可见。X在那里,但在我单击第二个O的点后,它才可见。我不明白为什么。我将在下面提供代码 public class TicTacToeApp{ public static void main(String[] args){ TicTacToeView view = new TicTacToeView(); TicTacToeModel mo

您好,我一直在用Java开发一个Tic-Tac-Toe应用程序,我已经在使用它了,但我的问题是,当我与X比赛时,在我单击放置第一个O的点后,X不可见。X在那里,但在我单击第二个O的点后,它才可见。我不明白为什么。我将在下面提供代码

public class TicTacToeApp{
public static void main(String[] args){
    TicTacToeView view = new TicTacToeView();
    TicTacToeModel model = new TicTacToeModel();
    TicTacToeViewController controller = new TicTacToeViewController(view,model);
    view.setVisible(true);
}
}

公共类模型{
双XPO、YPO、xr、yr;
字符[][]位置={{{'','','',},
{' ',' ',' '},
{' ',' ',' '}};
/**
*将行、列转换为分辨率为h×w的任何屏幕的单元格中心。
*这是理想的景观。
*/
公共无效计算(整数行、整数列、整数h、整数w){
xpos=(col+0.5)*w/3.0;
ypos=(世界其他地区+0.5)*h/3.0;
xr=w/8.0;
yr=h/8.0;
}
/**
*如果xpos ypos处的单元格为空,则返回true
*验证XPO和YPO是否在范围内。
*/
公共布尔值为空(int xpos,int ypos){
如果(位置[XPO][YPO]='')
{
返回true;
}
返回false;
}
/*
*将O放置在xpos和YPO位置。无需额外验证。
*/
公共无效地点(int XPO、int YPO){
位置[XPO][YPO]='O';
}
/**
*真正愚蠢的策略是让电脑玩“井字游戏”。
*在下一个可用空间中从左到右放置一个X,然后
*自上而下。
*/
公共int putX(){

对于play方法中的TicTakToeController类中的(inti=0;i),应该在model.putX()方法之后调用drawBoard()和view.repaint()

完整方法

 public void play(int ypos, int xpos) {
        if (model.isEmpty(xpos,ypos)) {// changed x and y because it lands   in    the wrong position.
        // TO DO: Put the O in xpos ypos using the model.
     model.placeO(xpos,ypos);
     // TO DO: Put the X using the model.
     drawBoard();
     view.repaint();
     model.putX();
     drawBoard();
     view.repaint();



    }
    // TO DO: add the conditions inside the () of the if's that determine  the   winner.
        if( didWin('X') ) 
        JOptionPane.showMessageDialog(null,"X Wins","Winner",    JOptionPane.INFORMATION_MESSAGE);
    else if ( didWin('O')  )
        JOptionPane.showMessageDialog(null,"O    Wins","Winner",JOptionPane.INFORMATION_MESSAGE);
}
  import java.awt.*;
  import javax.swing.*;
  import java.awt.event.*;
  import java.awt.geom.*;
  import javax.swing.*;
  import javax.swing.event.*;
  import java.util.ArrayList;

public class TicTacToeView extends JFrame{

private JButton oButton, xButton;
public JPanel board;
public ArrayList<Shape> shapes;

public TicTacToeView(){
    shapes = new ArrayList<Shape>();
    JPanel topPanel=new JPanel();
    topPanel.setLayout(new FlowLayout());
    add(topPanel, BorderLayout.NORTH);
    add(board=new Board(), BorderLayout.CENTER);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(500, 500);
}


private class Board extends JPanel {
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        int w=getWidth();
        int h=getHeight();
        Graphics2D g2d = (Graphics2D) g;

        // Draw the grid
        g2d.setPaint(Color.WHITE);
        g2d.fill(new Rectangle2D.Double(0, 0, w, h));
        g2d.setPaint(Color.BLACK);
        g2d.setStroke(new BasicStroke(4));
        g2d.draw(new Line2D.Double(0, h/3, w, h/3));
        g2d.draw(new Line2D.Double(0, h*2/3, w, h*2/3));
        g2d.draw(new Line2D.Double(w/3, 0, w/3, h));
        g2d.draw(new Line2D.Double(w*2/3, 0, w*2/3, h));
        //draw circles and xs by visiting elements in the array List.
        for(Shape shape : shapes){
            g2d.setPaint(Color.BLUE);
            g2d.draw(shape);
        }
    }
  }

 /*
 * Adds the mouse listener passed to Board.
 */
    public void addMouseListener(MouseListener ml){
    board.addMouseListener(ml);
}


  public static void main(String[] args) {
    TicTacToeView ttv = new TicTacToeView();
    ttv.setVisible(true);

   }
 }



import java.awt.event.*;
import java.awt.geom.*;
import java.awt.Graphics2D;
import java.awt.Color;
import javax.swing.JOptionPane;

/*
* This is the controller for the tic-tac-toe.
* Notice that it implements a MouseListener that 
* can be attached to a graphical component and therefore
* complies with the interface MouseListener.
*/
public class TicTacToeViewController implements MouseListener{

TicTacToeView view;
TicTacToeModel model;
Color oColor=Color.BLUE, xColor=Color.RED;
    public TicTacToeViewController(TicTacToeView view, TicTacToeModel model) { 
    this.view = view;
    this.model = model;
  // do this
  view.addMouseListener(this);
}

/** Ask the model what's the next move.
 */
    public void play(int ypos, int xpos) {
        if (model.isEmpty(xpos,ypos)) {// changed x and y because it lands   in    the wrong position.
        // TO DO: Put the O in xpos ypos using the model.
     model.placeO(xpos,ypos);
     // TO DO: Put the X using the model.
     drawBoard();
     view.repaint();
     model.putX();


    }
    // TO DO: add the conditions inside the () of the if's that determine  the   winner.
        if( didWin('X') ) 
        JOptionPane.showMessageDialog(null,"X Wins","Winner",    JOptionPane.INFORMATION_MESSAGE);
    else if ( didWin('O')  )
        JOptionPane.showMessageDialog(null,"O    Wins","Winner",JOptionPane.INFORMATION_MESSAGE);
}


/** Control the drawing of O and X.
 * This looks at the model to see where there are Xs and Os and draws two     diagonal
 * lines or a circle (an Ellipse, actually) in the positions given.
 */
public void drawBoard() {
    Graphics2D g2d = (Graphics2D)view.board.getGraphics();

    for (int i=0; i<3; i++) 
        for(int j=0; j<3;j++) {
               model.computePos(i,j,view.board.getHeight(),view.board.getWidth());
            double xpos = model.xpos;
            double xr = model.xr;
            double ypos = model.ypos;
            double yr = model.yr;
            // TODO: Complete the expressions within the if statements as    follows:
            // if the array that represents the board has a O in position i, j... else,
            // if it has an X...
            if ( model.position[i][j]=='O' ) {
                // Adds a circle (which is an Ellipse of sorts) to the list of elements to draw
           view.shapes.add(new Ellipse2D.Double(xpos-xr, ypos-yr, xr*2, yr*2));
            }
            if  (model.position[i][j]=='X' ) {
          // Adds two lines crossed (the X) to the list of shapes to draw.
              view.shapes.add(new Line2D.Double(xpos-xr, ypos-yr, xpos+xr,   ypos+yr));
              view.shapes.add(new Line2D.Double(xpos-xr, ypos+yr, xpos+xr, ypos-yr));
            }
            System.out.println("Coords: xpos:"+xpos+", ypos:"+ypos+", xr"+xr+", yr"+yr);
    }
}

/** MouseListener event
 * Converts the coordinates of the mouse into the corresponding row and   column of the cell
 */
  public void mouseClicked(MouseEvent e) {
  int xpos=e.getX()*3/view.getWidth();
  int ypos=e.getY()*3/view.getHeight();
  //System.out.println("Play "+xpos+","+ypos);
  play(xpos,ypos);
}

/**
 * Check wheather player has won. Checks happen against the model.
 */
  public boolean didWin(char player) {
    // TO DO
  int count = 0;
  int count2 = 0;

  for(int i = 0; i < 3; i++)
  {

     for(int j = 0; j<3; j++)
     {

        if(model.position[i][j]== player)
        {
        count++;
        if(count == 3 )
        return true;
        }
    }
  count = 0;
   }
  for(int n = 0; n < 3; n++)
     {
        for(int n2=0; n2 <3; n2++)
           {
              if(model.position[n][n2]==player)
                 {
                 count2++;
                 if(count2 == 3)// if doesnt work change back to 2
                 return true;
                 }
           } count2=0;
 }
     if(model.position[0][0]==player && model.position[1][1]==player &&   model.position[2][2]==player)
    return true;

    if(model.position[0][2]==player && model.position[1][1]==player && model.position[2][0]==player)
    return true;






  return false;
  }




    /** Ignore other mouse events*/
    public void mousePressed(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
}
model.putX();
drawBoard();
view.repaint();
 public void play(int ypos, int xpos) {
        if (model.isEmpty(xpos,ypos)) {// changed x and y because it lands   in    the wrong position.
        // TO DO: Put the O in xpos ypos using the model.
     model.placeO(xpos,ypos);
     // TO DO: Put the X using the model.
     drawBoard();
     view.repaint();
     model.putX();
     drawBoard();
     view.repaint();



    }
    // TO DO: add the conditions inside the () of the if's that determine  the   winner.
        if( didWin('X') ) 
        JOptionPane.showMessageDialog(null,"X Wins","Winner",    JOptionPane.INFORMATION_MESSAGE);
    else if ( didWin('O')  )
        JOptionPane.showMessageDialog(null,"O    Wins","Winner",JOptionPane.INFORMATION_MESSAGE);
}