2015-09-09 8 views
9

मैं वर्तमान में एक असाइनमेंट के लिए एक टिक टैक पैर कार्यक्रम पर काम कर रहा हूं। मेरे पास यह मुद्दा है जब मैं अपने खिलाड़ी (या तो 'एक्स' प्लेयर या 'वाई' प्लेयर) को गिनता हूं, ऐसा लगता है कि यह दोनों खिलाड़ियों को समान मानता है। उदाहरण के लिए, तीसरे खेल के बाद, यह तीन नाटकों को देखता है और इसे विजेता के रूप में गिना जाता है, भले ही एक खिलाड़ी के केवल दो नाटकों और दूसरे के एक खेल को पूरा कर लिया गया हो।समस्या संकलित?

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

} 

मेरा प्रश्न यह है कि कोई मेरा तर्क देख सकता है और देख सकता है कि गेम केवल तीन चालों को क्यों अनुमति देता है। दूसरे शब्दों में, ओ चला जाता है, एक्स जाता है, फिर ओ जाता है, और गेम एक विजेता की घोषणा करता है। इसके अलावा, मैं एक कोड उत्तर की तलाश नहीं कर रहा हूं, बल्कि मुझे किस भाग में अपना कोड ठीक करने का निरीक्षण करना चाहिए।

+1

आप "कोड उत्तर" नहीं मांग रहे हैं लेकिन आप एक डिबगिंग उत्तर मांग रहे हैं। सुनिश्चित करें कि प्रत्येक वर्ग और फ़ंक्शन आपको लगता है कि वे स्वतंत्र रूप से करते हैं - उन्हें फिर से पढ़कर नहीं, क्योंकि मुझे यकीन है कि आपने कई बार किया है, लेकिन उनका परीक्षण करके। आपको औपचारिक रूप से उनका परीक्षण करने की आवश्यकता नहीं है; बस एक छोटा कोड लिखें जो प्रत्येक टुकड़े का उपयोग करता है, एक बार में, और सुनिश्चित करें कि यह ठीक व्यवहार करता है। – Fabian

उत्तर

2

शुरुआत के लिए, आप अगर यह == 3 == 2.

+4

आप, मेरे अच्छे महोदय, एक प्रतिभाशाली हैं। धन्यवाद। मुझे यकीन नहीं है कि मैंने इसे किस तरह से पर्ची दी। –

+2

नियमित गणना के साथ गिनती सूचकांक स्थितियों (जो शुरू होता है और 0 शामिल करता है) को भ्रमित करना आसान है (जो शुरू होता है लेकिन इसमें 0 शामिल नहीं है) –

5

ऐसा लगता है कि अगर सबकुछ काम करता है तो त्रुटि डब्ल्यूडब्ल्यूइन() विधि में होती है।

+3

वह वहीं है जहां मैं अभी भी ध्यान केंद्रित कर रहा हूं। यह मुझे लगता है कि मेरे तर्क की तरह ठीक होना चाहिए ... –

4

मुझे लगता है कि जब आप कॉल didWin मैं ही प्रयोग किया जाता है या कम से कम> 2 नहीं, बल्कि आपके गिनती देखना चाहते हैं एक '' नहीं लगता कि यह वास्तव में कुछ भी बदलता है