Está en la página 1de 9

ΗΥ-252

Αντικειμενοστρεφής
Προγραμματισμός
Αναφορά
Προγραμματιστικής Εργασίας
Χειμερινού Εξαμήνου 2007

1
Επιμέλεια : Μάριος Πράσινος (1907) & Ιωάννης Μανουσάκης (1957)

Περιεχόμενα

Περιεχόμενα...................................................................................................................2

Γενικά.............................................................................................................................2

Περιγραφή Μεθόδων και Δεδομένων των Κλάσεων.....................................................4

Backgammon..............................................................................................................4

PortesGame................................................................................................................6

Dice............................................................................................................................8

Περιγραφή για το πώς μπορεί να χρησιμοποιηθεί η βιβλιοθήκη σας για να


δημιουργηθεί ένα καινούριο παιχνίδι τάβλι...................................................................8

Γενικά

2
Στην 1η φάση της κατασκευής του Backgammon θα περιγράψουμε αναλυτικά το
κομμάτι GameCore της εργασίας μας.

Όπως ζητήθηκε από την εκφώνιση της εργασίας θα υλοποιήσουμε τα παιχνίδια :


πόρτες, πλακωτό και φεύγα με την προτεινόμενη ιεραρχέια κλάσεων :

Θα κατασκευάσουμε μία κλάση με όνομα Backgammon που θα υλοποιεί την


δοσμένγη διεπαφή BackgammonGame και θα είναι abstract, έτσι ώστε να μπορούν
να κληρονομηθούν ή να τροποποιηθούν μερικές μέθοδοι της.

Θα κατασκευάσουμε επίσης τις εξής 3 υποκλάσεις της Backgammon :

a) PortesGame

b) PlakotoGame

c) FevgaGame

Οι τρεις αυτές κλάσεις θα κληρονομούν όλες όλες τις μεθόδους της υπερακλάσης
Backgammon που είναι κοινές για τα 3 παιχνίδια και θα υλοποιούν μόνο τις κλάσεις
που διαφέρουν σε κάθε παιχνίδι.

Έτσι με την χρήση αφαιρετικών κλάσεων, διεπαφών, κληρονομικότητας και


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

Επίσης κρίναμε απαραίτητο να κατασκευάσουμε την κλάση Dice που θα υλοποιεί ένα
εξάεδρο δίκαιο ζάρι. Στην υλοποίηση της κλάσης Backgammon θα μας χρειαστούν 2
τέτοια ζάρια.

Στην συνέχεια θα περιγράψουμε αναλυτικά τις μεθόδους και τα δεδομένα των


κλάσεων που θα υλοποιήσουμε.

3
Περιγραφή Μεθόδων και Δεδομένων των
Κλάσεων

Backgammon

Η κλάση Backgammon υλοποιεί το interface BackgammonGame, και όπως είπαμε


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

Η κλάση αυτή κληρονομεί από το interface BackgammonGame τα εξής :

• public enum Color { BLACK, WHITE };

• public enum PointType {C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12,
C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24,
BLACK_START, WHITE_START, BLACK_BAR, WHITE_BAR,
BLACK_BEAR_OFF, WHITE_BEAR_OFF};

• public enum GameState{BEFORE_ROLL,HAS_MOVES,IS_WON};

Σε αυτήν την κλάση θα έχουμε τα εξής δεδομένα:

private Dice[] pairOfDice;


Ένας πίνακας τύπου Dice που θα περιέχει δύο instances του αντικειμένου Dice,
δηλαδή τα δύο ζάρια που χρειαζόμαστε.

private GameState State;


Ένα δεδομένο τύπου GameState με όνομα State, που θα αποθηκεύει την κατάσταση
του παιχνιδίου.

private Color Player;


Ένα δεδομένο τύπου Color με όνομα Player, που θα αποθηκεύει τον τρέχοντα παίχτη,
δηλαδή τον παίχτη που εχει σείρα.

private ArrayList<Color> Points[];


Ένας πίνακας τύπου ArrayList<Color> που θα περιέχει 24 Arraylists τύπου Color,
δηλαδή ένας πίνακας με τις 24 θέσεις του Backgammon, όπου κάθε θέση είναι μία
λίστα από αντικείμενα τύπου Color(δηλαδή πούλια).

private Stack<PointType[]> LatestMoves;

4
Μία στοίβα από πίνακες τύπου PointType. Οι πίνακες θα έχουν 2 στοιχεία, την αρχή
και το τέλος μίας κίνησης, δηλαδή μία ολοκληρομένη κίνηση. Ουσιαστικά είναι μία
στοίβα από κινήσεις που θα χρειαστούμε για να μπορούμε να κάνουμε undo.

Σε αυτήν την κλάση θα έχουμε τις εξής μεθόδους:

public void initialize();


Αυτή η μέθοδος είναι υπεύθυνη για αρχικοποίηση της κατάστασης στην αρχική
κατάσταση και τοποθετεί τα πούλια στις κατάλληλες θέσεις.
Αυτή η μέθοδος δεν θα υλοποιήθει σε αυτή την κλάση, αλλά θα γινεί overridden στις
3 υποκλάσεις, επειδή υπάρχουν διαφορές στην αρχικοποίηση ανάλογα με το παιχνίδι.

public void RollDice();


Αυτή η μέθοδος είναι υπεύθυνη για την ρίψη των ζαριών τυχαία και την αλαγή της
κατάστασης από την BEFORE_ROLL στην HAS_MOVES.
Σε αυτήν την μέθοδο θα χρησιμοποιούμε μεθόδους της κλάσης Dice.

public boolean makeMove(PointType sourcePointIndex, PointType


destPointIndex);
Αυτή η μέθοδος ελένγχει άν η κίνηση (από το sourcePointIndex στο destPointIndex)
που παίρνει ως όρισμα είναι έγκυρη(σε αυτήν την περίπτωση επιστρέφει true) ή
άκυρη(αυτήν την περίπτωση επιστρέφει false).

public boolean undoMove();


Αυτή η μέθοδος αναιρεί την ακριβώς προηγούμενη κίνηση.
Σε αυτήν την μέθοδο θα χρησιμοποιήσουμε τα δεδομένα που θα περιέχει την
δεδομέμη στιγμή η στοίβα LatestMoves.

public boolean isWon();


Αυτή η μέθοδος ελέγχει αν κάποιος παίχτης έχει κερδίσει, δηλαδή αν έχει
τοποθετήσει όλα τα πούλια του στην αντίστοιχη θέση BEAR_OFF και επιστρέφει
true αν κάποιος παίχτης έχει κερδίσει, αλλιώς επιστρέφει false.

public Map<PointType,List<Color>> getPoints();


Αυτή η μέθοδος επιστρέφει όλες τις θέσεις του παιχνιδιού με όλα τα πούλια
τοποθετημένα στις αντίστοιχες θέσεις σε μία δεδομένη στιγμή. Ουσιαστικά
επιστρέφει την εικόνα του παιχνιδιού σε μία συγκεκριμένη στιγμή.
Σε αυτήν τη μέθοδο θα χρησημοποιήσουμε ένα HashMap για την υλοποίησή της.

public List<Color> getPoint(PointType pointIndex);


Αυτή η μέθοδος επιστρέφει μία λίστα με όλα τα Colors (δηλαδή τα πούλια) που
βρίσκονται σε μία συγκεκριμένη θέση pointIndex.

public GameState getState();

5
Αυτή η μέθοδος επιστρέφει το δεδομένο τύπου GameState που είναι αποθηκευμένο
στην μεταβλητή State, δηλαδή την τρέχουσα κατάσταση του παιχνιδιού.
Αυτή η μέθοδος έιναι τύπου accessor.

public int[] getDice();


Αυτή η μέθοδος επιστρέφει 2 ακεραίους που τους παίνει από τα 2 instances της
κλάσης Dice που είναι αποθηκευμένα στή μεταβλητή pairOfDice.
Αυτή η μέθοδος έιναι τύπου accessor.

public Color getCurrentPlayer();


Αυτή η μέθοδος επιστρέφει το δεδομένο τύπου Color που είναι αποθηκευμένο στην
μεταβλητή Player, δηλαδή τον παίχτη που έχει σειρά.
Αυτή η μέθοδος έιναι τύπου accessor.

public List<List<PointType[]>> findPossibleMoves();


Αυτή η μέθοδος επιστρέφει μία λίστα με όλες τις δυνατές κινήσεις ενός παίκτη με
μία δεδομένη ζαρία και μία δεδομένη εικόνα του παιχνιδιού.
Αυτή η μέθοδος δεν θα υλοποιηθεί σε αυτή την κλάση, αλλά θα γίνει overridden στις
3 υποκλάσεις, επειδή υπάρχουν διαφορές στις δυνατές κινήσεις ανάλογα με το
παιχνίδι.

PortesGame

Η κλάση PortesGame είναι υπεύθυνη για την αναπαράσταση ενός παιχνιδιού πόρτες.
Επεκτείνει την υπερκλάση Backgammon και κληρονομεί όλα τα δεδομένα και τις
μεθόδους της εκτός από τις εξής τις οποίες κάνει override:

public void initialize()


Αυτή η μέθοδος όπως είπαμε είναι υπεύθυνη για αρχικοποίηση της κατάστασης στην
αρχική κατάσταση και τοποθετεί τα πούλια στις κατάλληλες θέσεις.
Για τις πόρτες οι θέσεις είναι οι εξής:

Για τον Παίκτη 1 (Λευκά) Για τον Παίκτη 2 (Μάυρα)


Θέση 6 : 5 πούλια Θέση 1 : 2 πούλια
Θέση 8 : 3 πούλια Θέση 12 : 5 πούλια
Θέση 13 : 5 πούλια Θέση 17 : 3 πούλια
Θέση 24 : 2 πούλια Θέση 19 : 5 πούλια

6
Τα πούλια των 2 παικτών έιναι συμμετρικά τοποθετημένα.

public List<List<PointType[]>> findPossibleMoves()


Αυτή η μέθοδος αναλύει και επιστρέφει μία λίστα με όλες τις δυνατές κινήσεις
βάθους 1 σύμφωνα με τους κανόνες των πορτών. Ειδικά στις πόρτες αντιθετα με το
φεύγα και το πλακωτό το χτύπημα ενός παίκτη ισοδυναμεί με είσοδο του πουλιού απο
την θέση 1-6 για τα Λευκά και 19 - 24 για τα μάυρα.

PlakotoGame

Η κλάση PlakotoGame είναι υπεύθυνη για την αναπαράσταση ενός παιχνιδιού


πλακωτό. Επεκτείνει την υπερκλάση Backgammon και κληρονομεί όλα τα δεδομένα
και τις μεθόδους της εκτός από τις εξής τις οποίες κάνει override:

public void initialize()


Αυτή η μέθοδος όπως είπαμε είναι υπεύθυνη για αρχικοποίηση της κατάστασης στην
αρχική κατάσταση και τοποθετεί τα πούλια στις κατάλληλες θέσεις.
Για το πλακωτό οι θέσεις είναι οι εξής:
• Όλα τα πούλια του Παίκτη 1 (Λευκά) τοποθετούνται στη θέση 1
• Όλα τα πούλια του Παίκτη 2 (Μάυρα) τοποθετούνται στη θέση 24

public List<List<PointType[]>> findPossibleMoves()


Αυτή η μέθοδος αναλύει και επιστρέφει μία λίστα με όλες τις δυνατές κινήσεις
βάθους 1 σύμφωνα με τους κανόνες του πλακωτού. Ειδικά στο πλακωτό αντιθετα με
τις πόρτες και το φεύγα αν ένα πούλι έιναι πλακωμένο δεν μπορλει να κάνει καμία
κίνηση.

FevgaGame

Η κλάση FevgaGame είναι υπεύθυνη για την αναπαράσταση ενός παιχνιδιού φεύγα.
Επεκτείνει την υπερκλάση Backgammon και κληρονομεί όλα τα δεδομένα και τις
μεθόδους της εκτός από τις εξής τις οποίες κάνει override:

public void initialize()


Αυτή η μέθοδος όπως είπαμε είναι υπεύθυνη για αρχικοποίηση της κατάστασης στην
αρχική κατάσταση και τοποθετεί τα πούλια στις κατάλληλες θέσεις.

7
Για το πλακωτό οι θέσεις είναι οι εξής:
• Όλα τα πούλια του Παίκτη 1 (Λευκά) τοποθετούνται στη θέση 13
• Όλα τα πούλια του Παίκτη 2 (Μάυρα) τοποθετούνται στη θέση 1

public List<List<PointType[]>> findPossibleMoves()


Αυτή η μέθοδος αναλύει και επιστρέφει μία λίστα με όλες τις δυνατές κινήσεις
βάθους 1 σύμφωνα με τους κανόνες του φεύγα. Ειδικά στο φεύγα αντιθετα με τις
πόρτες και το πλακωτό κάθε πούλι αποτελεί πόρτα.

Dice
Η κλάση Dice είναι υπεύθυνη για την αναπαράσταση ενός 6 άεδρου ζαριού.
Περιέχει το ιδιωτικό δεδομένο:

private int Value = 0;


που κρατάει την τιμή του ζαριού

και έχει τις εξής 2 μεθόδους:

public int roll();


Η μέθοδος αυτή αλλάζει την τρέχουσα έδρα του ζάριου ψευδο-τυχαία με την χρήση
της κλάσης (Java) Random και την επιστρέφει.

public int getDice();


Η μέθοδος αυτή επιστρέφει την τρέχουσα τιμή του ζαριού (χωρίς να την αλλάζει).
Αυτή η μέθοδος έιναι τύπου accessor.

Περιγραφή για το πώς μπορεί να


χρησιμοποιηθεί η βιβλιοθήκη σας για να
δημιουργηθεί ένα καινούριο παιχνίδι τάβλι.

Όπως υλοποιήσαμε τα 3 είδη παιγνίδιων τάβλι, μπορούμε να υλοποιήσουμε


οποιοδήποτε άλλο είδος. Σε κάθε πιρίπτωση θα φτιάχνουμε μια υποκλάση της
Backgammon η οποία θα κληρονομεί όλα τα πεδία και τις μεθόδους της εκτός απο

8
τις public void initialize()και public List<List<PointType[]>> findPossibleMoves()
τις οποίες θα κανει override και θα τις υλοποιεί σύμφωνα με τους εκάστοτε κανόνες.

También podría gustarte