Προς το περιεχόμενο

Java simple Tick Tack Toe


Προτεινόμενες αναρτήσεις

Δημοσ.

Παιδια καλησπερα,προσπαθω να φτιαξω ενα απλο Tick Tack Toe και θα θελα λιγο τα φωτα σας

public class TsoumiTicTacToe extends JPanel
{
     JButton[] board = new JButton[9];
     int counter = 0;
     
     public TsoumiTicTacToe()
     {
         setLayout(new GridLayout(3,3));
         initializeBoard();
     }
     
    
     
    //======================================================================================
     
    
     public void initializeBoard()
     {
         for(int i=0; i <=8; i++)
         {
             board[i] = new JButton();
             board[i].setText("");
             board[i].addActionListener(new buttonListener());
             add(board[i]);
         }
     }
     
    //======================================================================================
     
     
     public void resetButtons()
     {
         for(int i=0; i <= 8; i++)
         {
             board[i].setText("");
         }
     }
     
     
    //======================================================================================
     
     
     private class buttonListener implements ActionListener
     {

        @Override
        public void actionPerformed(ActionEvent e) 
        {
             JButton buttonClicked = (JButton)e.getSource();
             
             if(counter % 2 == 0)
             {
                 buttonClicked.setText("X");
             }
             
             else
             {
                 buttonClicked.setText("O");
             } 
             
             
             if(checkHorizontalForWin()  && checkVerticalForWin()  && checkDiagonalForWin())
             {
                 JOptionPane.showConfirmDialog(null, "do you want to start a new game?");
                 resetButtons();
             } 
             
             counter++;
        }
        
        
        //======================================================================================
        
        
        public boolean checkHorizontalForWin()
        {
             
            
             if(checkForWin(0,1) && checkForWin(1,2))
             {
                  return true;
             }
             
             else if(checkForWin(3,4) && checkForWin(4,5))
             {
                  return true;
             }
             
             else if(checkForWin(6,7) && checkForWin(7,8))
             {
                  return true;
             }
             
             else
             {
                  return false;
             }
             
             
        }
        
        
         //====================================================================================== 
      
       public boolean checkVerticalForWin()
        {

            
             if(checkForWin(0,3) && checkForWin(3,6))
             {
                 return true;
             }
             
             else if(checkForWin(1,4) && checkForWin(4,7))
             {
                 return true;
             }
             
             else if(checkForWin(2,5) && checkForWin(5,8))
             {
                 return true;
             }
             
             else
             {
                return false;
             }
             
        } 
     //======================================================================================
        

         public boolean checkDiagonalForWin()
         {
             //boolean isDiagonal = false;
             
             if(checkForWin(0,4) && checkForWin(4,8))
             {
                  return true;
             }
             
             else if(checkForWin(2,4) && checkForWin(4,6))
             {
                  return true;
             }
                
             else
             {
                   return false;
             } 
             
          
        }
        
    
        
     //======================================================================================
        

 public boolean checkForWin(int x,int y)
        {
            if(board[x].getText().equals(board[y].getText()) && !board[x].getText().equals(""))
            {
                return true;
            }
            
            else
            {
                return false;
            }
        }
         
     }             
}
            

Το προβλημα μαλλον πρεπει να ειναι καθως καλω τις μεθοδους

if(checkHorizontalForWin()  && checkVerticalForWin()  && checkDiagonalForWin())

Καθως οταν τις ειχα ολους τους ελεγχους μεσα σε μια μονο μεθοδο δουλευε μια χαρα,αλλα μετα ειπα να το σπασω και καθε μεθοδο να κανει ξεχωριστα τους ελεγχους(Οριζοντια,Καθετα,Διαγωνια)

 

Οποιος εχει καμια ιδεα κ εχει ορεξη ας ριξει μια ματια.

Ευχαριστω.

 

 

 

 

 

 

 

Δημοσ.

Εκεί μέσα θα μπει μόνο όταν και οι 3 μέθοδοι σου επιστρέψουν true. Μήπως θες να το κάνεις με or;

 

Επίσης, τι συμβαίνει αν γεμίσει το ταμπλό χωρίς να έχει κερδίσει κάποιος;

  • Like 1
Δημοσ.

Λογικά || θες να βάλλεις εκει που ελεγχεις αν κέρδισε κάποιος. Επίσης βάλε και μια if σε περίπτωση που έρθει ισοπαλία ( θα το κάνεις εύκολα με το counter που έχεις ήδη δηλώσει και χρησιμοποιείς).

  • Like 1
Δημοσ. (επεξεργασμένο)

Ακριβώς ότι είπε ο anon667 , δεν γίνεται να είναι και τα 3 true, άλλαξε τα σε ||


Σίγουρα μπορεί να γίνει με χιλιάδες τρόπους οπότε δεν αλλάζω την λογική που το σκέφτηκες (καλύτερα θα ήταν να χρησιμοποιήσεις έναν πίνακα 3x3) 

 

Αλλά είπα να σου κάνω αν δεν σε πειράζει τον κώδικα λίγο ποιο κομψό για να γλυτώσεις αυτές τις άσχημες if

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 * 
 *
 */
public class TsoumiTicTacToe extends JPanel
{
	JButton[] board = new JButton[9];
	int counter = 0;

	public TsoumiTicTacToe()
	{
		setLayout(new GridLayout(3,3));
		initializeBoard();
	}



	/**
	 * Initialize the board. 
	 */
	private void initializeBoard()	
	{
		for(int i=0; i <=8; i++)
		{
			board[i] = new JButton();
			board[i].setText("");
			board[i].addActionListener(new buttonListener());
			add(board[i]);
		}
	}


	/**
	 * Reset the board. 
	 */
	private void resetButtons()
	{
		board = new JButton[9];
	}


	/**
	 * 
	 *
	 */
	private class buttonListener implements ActionListener
	{

		@Override
		public void actionPerformed(ActionEvent e) 
		{
			JButton buttonClicked = (JButton)e.getSource();
			play(buttonClicked);
			checkIfPlayerWins(); 
			counter++;
		}


		/**
		 * Checks if a player wins with horizontal, vertical or diagonal win and pop's up
		 * a confirmation dialog.
		 *  
		 */
		private void checkIfPlayerWins() {
			if(checkHorizontalForWin()  || checkVerticalForWin() || checkDiagonalForWin())
			{
				JOptionPane.showConfirmDialog(null, "do you want to start a new game?");
				resetButtons();
			}
		}


		/**
		 * Play the game (X or O).
		 * 
		 * @param buttonClicked
		 */
		private void play(JButton buttonClicked) {
			if(counter % 2 == 0)
			{
				buttonClicked.setText("X");
			}
			else
			{
				buttonClicked.setText("O");
			}
		}


		/**
		 * Checks if the win is in one of the 3 horizontal rows.
		 * 
		 * @return <b>true</b> if is in one of the 3 horizontal rows.
		 */
		private  boolean checkHorizontalForWin()
		{
			boolean firstHorizontalRow = checkForWin(0,1) && checkForWin(1,2); 
			boolean secondHorizontalRow = checkForWin(3,4) && checkForWin(4,5);
			boolean thirdHorizontalRow = checkForWin(6,7) && checkForWin(7,8);
			return firstHorizontalRow || secondHorizontalRow || thirdHorizontalRow;
		}		 

		/**
		 * Checks if the win is in one of the 3 vertical rows.
		 * 
		 * @return <b>true</b> if is in one of the 3 vertical rows.
		 */
		private  boolean checkVerticalForWin()
		{
			boolean firstVerticalRow = checkForWin(0,3) && checkForWin(3,6); 
			boolean secondVerticalRow = checkForWin(1,4) && checkForWin(4,7);
			boolean thirdVerticalRow = checkForWin(2,5) && checkForWin(5,8);
			return firstVerticalRow || secondVerticalRow || thirdVerticalRow;
		}


		/**
		 * Checks if the win is in left or right diagonal board.
		 * 
		 * @return <b>true</b> if is Left or Right Diagonal Win.
		 */
		private  boolean checkDiagonalForWin()
		{
			boolean isLeftDiagonal = checkForWin(0,4) && checkForWin(4,8);			
			boolean isRightDiagonal = checkForWin(2,4) && checkForWin(4,6);
			return isLeftDiagonal || isRightDiagonal;
		}


		/**
		 * Checks if the two parameters give a win.
		 *  
		 * @param x
		 * @param y
		 * @return true 
		 */
		private  boolean checkForWin(int x,int y)
		{
			return board[x].getText().equals(board[y].getText()) &&
					!board[x].getText().equals("");
		}

	}             
} 

Αν έκανα κανα λάθος στο refactor συγχωρέστε με , ήταν το κερασάκι για να τελειώσει η μέρα του κώδικα :)

 

Τέλος δεν χρειάζεται όλες τις μεθόδους να τις κάνεις public αν δεν χρειάζεται κάποιος άλλος access σε αυτές , οπότε είτε private είτε package visible για να μην έχεις και θέμα όταν με το καλό ασχοληθείς με junit (mocks κτλ.)

 

Όσο μικτότερα είναι τα blocks του κώδικα τόσο πιο εύκολο είναι να γράψεις και τα τεστ, όσο γελοίο και αν σου ακούγεται μην το αγνοείς και μάθε πάντα έστω και σε αυτά που μαθαίνεις να γράφεις τεστ, θα σε κάνει να γράφεις καλύτερο κώδικα.

Επεξ/σία από tsofras
Δημοσ.

 

Ακριβώς ότι είπε ο anon667 , δεν γίνεται να είναι και τα 3 true, άλλαξε τα σε ||

 

Πραγματι,παιδαριωδες λαθος αυτο.

 

Την καλημερα μου σε ολους και ευχαριστω πολυ για την πολυτιμη βοηθεια,στην ουσια δεν μ ενδιαφερει τοσο η ασκηση οσο οι διαφορες τεχνικες που προτεινετε,ετσι μαθαινουμε.

Κατα την γνωμη σας θα βοηθουσε η χρηση ArrayList,θα θελα να πειρματιστω να το κανω με διαφορετικους τροπους ετσι για να δουλευω οσα μαθαινω

Δημοσ.

Κατα την γνωμη σας θα βοηθουσε η χρηση ArrayList,θα θελα να πειρματιστω να το κανω με διαφορετικους τροπους ετσι για να δουλευω οσα μαθαινω

 

Όχι, δεν υπάρχει λόγος να χρησιμοποιήσεις κάτι δυναμικό για κάτι στατικό( 3 Χ 3).

Βρες κάποιο άλλο πρόβλημα/παιχνίδι για κάτι τέτοιο. 

Π.χ ένα παιχνίδι με χαρτιά.

Δημοσ.

 

Όχι, δεν υπάρχει λόγος να χρησιμοποιήσεις κάτι δυναμικό για κάτι στατικό( 3 Χ 3).

Βρες κάποιο άλλο πρόβλημα/παιχνίδι για κάτι τέτοιο. 

Π.χ ένα παιχνίδι με χαρτιά.

 

Σ ευχαριστω πολυ αδερφε για την συμβουλη,Να εισαι καλα

Δημοσ.

 

 

Αλλά είπα να σου κάνω αν δεν σε πειράζει τον κώδικα λίγο ποιο κομψό για να γλυτώσεις αυτές τις άσχημες if

 

σ ευχαριστω παρα πολυ αδερφε,πραγματι ειναι πιο κομψος και μου εδωσες και παρα πολυ καλες ιδεες πως να τον συμμαζεψω,να εισαι καλα φιλε μου και σ ευχαριστω για τον χρονο σου

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...