Καλησπέρα!
Είμαι φοιτητής του τμήματος Πληροφορικής ΑΠΘ και, στα πλαίσια εργασίας στο μάθημα Τεχνολογία λογισμικού, επέλεξα να μελετήσω το συγκεκριμένο έργο σας. Πρόκειται για μια εργασία μελέτης ενός έργου ανοιχτού κώδικα και εύρεσης πιθανών bugs και επίλυσής τους, αλλά και προτάσεων επέκτασης του project.
Μελετώντας το project σας, παρατήρησα πως όταν ένα παιχνίδι έρχεται ισοπαλία δεν εμφανίζεται το κατάλληλο μήνυμα της ισοπαλίας και ερώτηση για νέο παιχνίδι, αλλά ξεκινάει αμέσως καινούργιο παιχνίδι. Εξαιτίας αυτής της παράληψης, υπάρχουν περιπτώσεις που οδηγούν σε bug. Όταν ένας χρήστης επιλέξει το game mode Minimax AI Vs Minimax AI, με τα default depths (5 και 5), το παιχνίδι οδηγείται πάντα σε ισοπαλία. Αυτό οδηγεί σε έναν ατέρμων βρόγχο (infinite loop) και ο χρήστης χάνει τον έλεγχο του παιχνιδιού και δε μπορεί να το σταματήσει παρά μόνο διακόπτοντας την εκτέλεση του προγράμματος. Μελετώντας τον κώδικα το λάθος βρίσκεται στην κλάση Board.java και στις γραμμές 197-198.
Παραθέτω το κομμάτι του κώδικα στο οποίο αναφέρομαι:
public boolean checkForDraw() {
if (gameOver)
return false;
for(int row=0; row<numOfRows; row++) {
for(int col=0; col<numOfColumns; col++) {
if(gameBoard[row][col] == Constants.EMPTY) {
return false;
}
}
}
return true;
}
Εδώ, η 2η και η 3η γραμμή δημιουργούν το πρόβλημα καθώς η 2η γραμμή ελέγχει αν τελείωσε το παιχνίδι και αν ναι, τότε η 3η επιστρέφει λάθος (δηλαδή ότι δεν υπάρχει ισοπαλία) χωρίς να πραγματοποιήσει κάποιον έλεγχο. Αυτό το λάθος προφανώς θα έγινε εκ παραδρομής, και πιθανώς να μπήκαν επιτηδευμένα αυτές οι γραμμές για δοκιμές. Στην ουσία οι δύο αυτές γραμμές κώδικα πρέπει να αφαιρεθούν και δε θα υπάρχει πλέον κανένα πρόβλημα.
Ακόμη, προτείνω την επέκταση του προγράμματος με προσθήκη επιπλέον αλγορίθμων ή τακτικών παιχνιδιού από τον υπολογιστή. Για παράδειγμα μια περίπτωση που σκέφτηκα είναι το Random Choice AI Vs Random Choice AI, όπου ο υπολογιστής τοποθετεί τις μάρκες σε τυχαίες στήλες. Αυτή η λειτουργία θα είναι για τη διασκέδαση του παίκτη, ο οποίος θα προσπαθούσε να μαντέψει ποιος από τους δύο παίκτες θα είναι ο νικητής. Για αυτό ετοίμασα την κλάση RandomChoiceAi, η οποία περιλαμβάνει τη λειτουργία που αναλύθηκε παραπάνω και μπορεί να προστεθεί στο project, κάνοντας τις κατάλληλες προσθήκες μερικών γραμμών κώδικα σε συγκεκριμένες από τις υπάρχουσες κλάσεις.
Παραθέτω τη νέα κλάση:
public class RandomChoiceAi {
private int aiPlayer;
public RandomChoiceAi(int aiLetter) {
this.aiPlayer = aiLetter;
}
public int getAiPlayer() {
return aiPlayer;
}
// Initiates the random move
public Move randomMove(Board board) {
Random r = new Random();
if((board.checkForGameOver())) {
Move lastMove = new Move(board.getLastMove().getRow(), board.getLastMove().getColumn(), board.evaluate());
return lastMove;
}
int col = r.nextInt(7);
while (board.checkFullColumn(col)){
col = r.nextInt(7);
}
int row = board.getEmptyRowPosition(col);
return new Move(row,col,aiPlayer);
}
}
Μπορείτε να μελετήσετε αυτή τη νέα λειτουργία με τα παρακάτω αρχεία (προσπάθησα να κάνω branch με τις αλλαγές, αλλά το push δεν το δεχόταν), όπου περιέχουν έτοιμες όλες τις αλλαγές που απαιτούνται στον κώδικα. Αν σας αρέσει μπορείτε να την προσθέσετε στο project σας, ακόμη και κάνοντας τυχόν αλλαγές πάνω σε αυτά που μπορεί να επιθυμείτε.
Board.txt
Connect4Gui.txt
GameMode.txt
RandomChoiceAi.txt
SettingsWindow.txt
Ευχαριστώ εκ των προτέρων για την ανάγνωση!
Με χαρά περιμένω τυχόν απάντηση σας!