2015-09-09 6 views
9

Ich arbeite gerade an einem Tic Tac Toe Programm für eine Aufgabe. Das Problem, das ich habe, ist, wenn ich meinen Spieler zähle (entweder der X- oder der Y-Spieler), scheint es, dass beide Spieler gleich zählen. Zum Beispiel sieht er nach dem dritten Spiel drei Spiele und zählt sie als Gewinner, obwohl nur zwei Spiele eines Spielers und eines Spiels des anderen beendet wurden.Problem wird kompiliert?

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); 
    } 
} 
public class TicTacToeModel 
{ 

    double xpos,ypos,xr,yr; 
    char[][] position = {{' ',' ',' '}, 
         {' ',' ',' '}, 
         {' ',' ',' '}}; 


    public void computePos(int row, int col, int h, int w) 
    { 
     xpos=(col+0.5)*w/3.0; 
     ypos=(row+0.5)*h/3.0; 
     xr=w/8.0; 
     yr=h/8.0; 
    } 

public boolean isEmpty(int xpos, int ypos) 
{ 

    if(position[xpos][ypos]==' ') 
    return true; 

    return false; 
} 

public void placeO(int xpos, int ypos) 
{ 

    position[xpos][ypos]='O'; 

} 

public int putX(){ 
    for(int i=0; i<3;i++){ 
     for(int j = 0;j<3;j++) { 
      if(position[i][j]==' ') { 
       position[i][j]='X'; 
       return 0; 
      } 
     } 
    } 
    return -1; //some error occurred. This is odd. No cells were free. 
} 


public void printBoard(){ 
    for(int i=0;i<3;i++) 
     System.out.println(position[i][0]+"|"+position[i][1]+"|"+position[i][2]); 
} 
} 

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); 
     } 
    } 
} 

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; 

public class TicTacToeViewController implements MouseListener{ 

TicTacToeView view; 
TicTacToeModel model; 
Color oColor=Color.BLUE, xColor=Color.RED; 

public void mousePressed(MouseEvent e) {} 
public void mouseReleased(MouseEvent e) {} 
public void mouseEntered(MouseEvent e) {} 
public void mouseExited(MouseEvent e) {} 
public TicTacToeViewController(TicTacToeView view, TicTacToeModel model) { 
    this.view = view; 
    this.model = model; 

    view.addMouseListener(this); 
} 

public void play(int xpos, int ypos) { 
    if (model.isEmpty(xpos,ypos)) { 

    model.placeO(xpos, ypos); 

    drawBoard(); 
    view.repaint(); 
     model.putX(); 
     if(didWin("X")){ 
      JOptionPane.showMessageDialog(null,"X Wins","Winner", JOptionPane.INFORMATION_MESSAGE); 
      } 
     if(didWin("O")) 
     JOptionPane.showMessageDialog(null,"O Wins","Winner",JOptionPane.INFORMATION_MESSAGE); 



    } 
} 


    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; 
     if (model.position[i][j]=='O') { 

      view.shapes.add(new Ellipse2D.Double(xpos-xr, ypos-yr, xr*2, yr*2)); 
     } 
     else if (model.position[i][j]=='X') { 
      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); 
    } 
} 
    public void mouseClicked(MouseEvent e) { 
    int ypos=e.getX()*3/view.getWidth(); 
    int xpos=e.getY()*3/view.getHeight(); 
    //System.out.println("Play "+xpos+","+ypos); 
    play(xpos,ypos); 
} 

public boolean didWin(char player) { 

    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 ==2) 
       return true; 
     } 

    } 
    count=0; 
    } 
    for(int k = 0; k<3; k++) 
    { 
     for(int l= 0; l<3; l++) 
     { 
      if(model.position[l][k]==player) 
      { 
       count2++; 
       if(count2 ==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; 
    } 

} 

Meine Frage ist, wenn jemand über meine Logik schauen und sehen kann, warum das Spiel nur drei Züge erlaubt. Mit anderen Worten, das O geht, das X geht, dann geht das O, und das Spiel kündigt einen Gewinner an. Außerdem suche ich keine Code-Antwort, sondern welchen Teil ich untersuchen sollte, um meinen Code zu reparieren.

+1

Sie fragen nicht nach einer "Code-Antwort", aber Sie bitten um eine Debugging-Antwort. Stelle sicher, dass jede Klasse und jede Funktion das tut, was du denkst, dass sie es unabhängig machen - nicht indem du sie erneut liest, wie du sicher schon oft getan hast, sondern indem du sie testet. Sie müssen sie nicht formell testen; Schreiben Sie einfach einen kleinen Code, der jedes Stück einzeln verwendet, und stellen Sie sicher, dass es sich in Ordnung verhält. – Fabian

Antwort

2

Für den Anfang, möchten Sie Ihre Zählung zu sehen, ob es == 3 oder zumindest ist> 2, nicht == 2.

+4

Sie, mein guter Herr, sind ein Genie. Vielen Dank. Ich bin mir nicht sicher, wie ich das durchgehen lasse. –

+2

Es ist leicht, Zählindexpositionen zu verwechseln (die bei 0 beginnen und diese einschließen) mit regulärem Zählen (das bei 0 beginnt, aber nicht mit 0 beginnt) –

5

Es klingt wie der Fehler in der didWin() -Methode, wenn alles andere funktioniert.

+3

Darauf konzentriere ich mich jetzt auch. Es scheint mir nur, als ob meine Logik in Ordnung wäre ... –

4

Ich denke, wenn Sie die didWin nennen nur habe ich ein ‚‘ glaube nicht, es ändert wirklich alles tho