bazinga13 Δημοσ. 29 Νοεμβρίου 2016 Δημοσ. 29 Νοεμβρίου 2016 Παιδια καλησπερα,προσπαθω να φτιαξω ενα απλο 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()) Καθως οταν τις ειχα ολους τους ελεγχους μεσα σε μια μονο μεθοδο δουλευε μια χαρα,αλλα μετα ειπα να το σπασω και καθε μεθοδο να κανει ξεχωριστα τους ελεγχους(Οριζοντια,Καθετα,Διαγωνια) Οποιος εχει καμια ιδεα κ εχει ορεξη ας ριξει μια ματια. Ευχαριστω.
anon667 Δημοσ. 29 Νοεμβρίου 2016 Δημοσ. 29 Νοεμβρίου 2016 Εκεί μέσα θα μπει μόνο όταν και οι 3 μέθοδοι σου επιστρέψουν true. Μήπως θες να το κάνεις με or; Επίσης, τι συμβαίνει αν γεμίσει το ταμπλό χωρίς να έχει κερδίσει κάποιος; 1
eaglej Δημοσ. 29 Νοεμβρίου 2016 Δημοσ. 29 Νοεμβρίου 2016 Λογικά || θες να βάλλεις εκει που ελεγχεις αν κέρδισε κάποιος. Επίσης βάλε και μια if σε περίπτωση που έρθει ισοπαλία ( θα το κάνεις εύκολα με το counter που έχεις ήδη δηλώσει και χρησιμοποιείς). 1
tsofras Δημοσ. 29 Νοεμβρίου 2016 Δημοσ. 29 Νοεμβρίου 2016 (επεξεργασμένο) Ακριβώς ότι είπε ο 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 του κώδικα τόσο πιο εύκολο είναι να γράψεις και τα τεστ, όσο γελοίο και αν σου ακούγεται μην το αγνοείς και μάθε πάντα έστω και σε αυτά που μαθαίνεις να γράφεις τεστ, θα σε κάνει να γράφεις καλύτερο κώδικα. Επεξ/σία 29 Νοεμβρίου 2016 από tsofras
bazinga13 Δημοσ. 30 Νοεμβρίου 2016 Μέλος Δημοσ. 30 Νοεμβρίου 2016 Ακριβώς ότι είπε ο anon667 , δεν γίνεται να είναι και τα 3 true, άλλαξε τα σε || Πραγματι,παιδαριωδες λαθος αυτο. Την καλημερα μου σε ολους και ευχαριστω πολυ για την πολυτιμη βοηθεια,στην ουσια δεν μ ενδιαφερει τοσο η ασκηση οσο οι διαφορες τεχνικες που προτεινετε,ετσι μαθαινουμε. Κατα την γνωμη σας θα βοηθουσε η χρηση ArrayList,θα θελα να πειρματιστω να το κανω με διαφορετικους τροπους ετσι για να δουλευω οσα μαθαινω
NickSym Δημοσ. 30 Νοεμβρίου 2016 Δημοσ. 30 Νοεμβρίου 2016 Κατα την γνωμη σας θα βοηθουσε η χρηση ArrayList,θα θελα να πειρματιστω να το κανω με διαφορετικους τροπους ετσι για να δουλευω οσα μαθαινω Όχι, δεν υπάρχει λόγος να χρησιμοποιήσεις κάτι δυναμικό για κάτι στατικό( 3 Χ 3). Βρες κάποιο άλλο πρόβλημα/παιχνίδι για κάτι τέτοιο. Π.χ ένα παιχνίδι με χαρτιά.
bazinga13 Δημοσ. 30 Νοεμβρίου 2016 Μέλος Δημοσ. 30 Νοεμβρίου 2016 Όχι, δεν υπάρχει λόγος να χρησιμοποιήσεις κάτι δυναμικό για κάτι στατικό( 3 Χ 3). Βρες κάποιο άλλο πρόβλημα/παιχνίδι για κάτι τέτοιο. Π.χ ένα παιχνίδι με χαρτιά. Σ ευχαριστω πολυ αδερφε για την συμβουλη,Να εισαι καλα
bazinga13 Δημοσ. 1 Δεκεμβρίου 2016 Μέλος Δημοσ. 1 Δεκεμβρίου 2016 Αλλά είπα να σου κάνω αν δεν σε πειράζει τον κώδικα λίγο ποιο κομψό για να γλυτώσεις αυτές τις άσχημες if σ ευχαριστω παρα πολυ αδερφε,πραγματι ειναι πιο κομψος και μου εδωσες και παρα πολυ καλες ιδεες πως να τον συμμαζεψω,να εισαι καλα φιλε μου και σ ευχαριστω για τον χρονο σου 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα