Compare commits
7
Commits
ebced2aa74
..
v1.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
83d5217151 | ||
|
|
4745c1403e | ||
|
|
ba5b297078 | ||
|
|
be9db10803 | ||
|
|
7dd8ede2f0 | ||
|
|
5d8d06c793 | ||
|
|
960dd89f4e |
@@ -1,6 +1,5 @@
|
|||||||
bin/
|
bin/
|
||||||
doc/
|
doc/
|
||||||
out/
|
out/
|
||||||
deliverable/
|
|
||||||
.classpath
|
.classpath
|
||||||
.project
|
.project
|
||||||
|
|||||||
Binary file not shown.
@@ -2,3 +2,5 @@
|
|||||||
*.log
|
*.log
|
||||||
*.out
|
*.out
|
||||||
*.gz
|
*.gz
|
||||||
|
*.svg
|
||||||
|
*.xcf
|
||||||
|
|||||||
+1
-1
Submodule report/config updated: 665a0fc185...4b3765f4ab
Binary file not shown.
|
Before Width: | Height: | Size: 538 KiB After Width: | Height: | Size: 527 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 263 KiB After Width: | Height: | Size: 267 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 23 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 50 KiB |
Binary file not shown.
+180
-66
@@ -1,26 +1,36 @@
|
|||||||
%
|
%
|
||||||
% Report for data structures 2020-2021 assignment part 1.
|
% Report for data structures 2020-2021 assignment part A.
|
||||||
%
|
%
|
||||||
% authors:
|
% authors:
|
||||||
|
% Αναστασία Φώτη ΑΕΜ 8959
|
||||||
|
% anastaskf@ece.auth.gr
|
||||||
|
%
|
||||||
% Χρήστος Χουτουρίδης ΑΕΜ 8997
|
% Χρήστος Χουτουρίδης ΑΕΜ 8997
|
||||||
% cchoutou@ece.auth.gr
|
% cchoutou@ece.auth.gr
|
||||||
|
|
||||||
|
% AuthReportConfig requirements
|
||||||
|
% ===============================================================
|
||||||
|
\newcommand{\AuthorName}{Αναστασία Φώτη}
|
||||||
|
\newcommand{\AuthorMail}{anastaskf@ece.auth.gr}
|
||||||
|
\newcommand{\AuthorAEM}{8959}
|
||||||
|
|
||||||
% Document configuration
|
\newcommand{\CoAuthorName}{Χρήστος Χουτουρίδης}
|
||||||
|
\newcommand{\CoAuthorMail}{cchoutou@ece.auth.gr}
|
||||||
|
\newcommand{\CoAuthorAEM}{8997}
|
||||||
|
|
||||||
|
\newcommand{\DocTitle}{Λαβύρινθος: Ο Θησέας και ο Μινώταυρος Α}
|
||||||
|
\newcommand{\Department}{Τμημα ΗΜΜΥ. Τομεάς Ηλεκτρονικής}
|
||||||
\newcommand{\ClassName}{Δομές δεδομένων}
|
\newcommand{\ClassName}{Δομές δεδομένων}
|
||||||
\newcommand{\DocTitle}{Λαβύρινθος: Ο Θησέας και ο Μινώταυρος 1}
|
|
||||||
\newcommand{\InstructorName}{Σιάχαλου Σταυρούλα}
|
\newcommand{\InstructorName}{Σταυρούλα Σιάχαλου}
|
||||||
\newcommand{\InstructorMail}{ssiachal@auth.gr}
|
\newcommand{\InstructorMail}{ssiachal@auth.gr}
|
||||||
\newcommand{\CurrentDate}{\today}
|
\newcommand{\CurrentDate}{\today}
|
||||||
|
|
||||||
\input{config/AuthReportConfig.tex}
|
\input{config/AuthReportConfig.tex}
|
||||||
|
|
||||||
%\renewcommand{\AuthorName}{Χρήστος Χουτουρίδης}
|
|
||||||
%\renewcommand{\AuthorMail}{cchoutou@ece.auth.gr}
|
|
||||||
%\renewcommand{\AuthorAEM}{8997}
|
|
||||||
|
|
||||||
\setFancyHeadLR{\ClassName}{\DocTitle}
|
\setFancyHeadLR{\ClassName}{\DocTitle}
|
||||||
%\setFancyHeadLERO{\ClassName}{\DocTitle}
|
%\setFancyHeadLERO{\ClassName}{\DocTitle}
|
||||||
|
%\BottomTitleSpace{8em}
|
||||||
|
|
||||||
% Document
|
% Document
|
||||||
% =================
|
% =================
|
||||||
@@ -35,32 +45,31 @@
|
|||||||
\section{Εισαγωγή}
|
\section{Εισαγωγή}
|
||||||
Η παρούσα εργασία αφορά τη δημιουργία ενός παιχνιδιού λαβυρίνθου με θέμα \textit{“Μια νύχτα στο μουσείο”}.
|
Η παρούσα εργασία αφορά τη δημιουργία ενός παιχνιδιού λαβυρίνθου με θέμα \textit{“Μια νύχτα στο μουσείο”}.
|
||||||
Στο συγκεκριμένο παιχνίδι καλούμαστε να δημιουργήσουμε ένα λαβύρινθο μέσα στον οποίο κινούνται με τυχαίο τρόπο δύο παίχτες, ο Θησέας και ο Μινώταυρος.
|
Στο συγκεκριμένο παιχνίδι καλούμαστε να δημιουργήσουμε ένα λαβύρινθο μέσα στον οποίο κινούνται με τυχαίο τρόπο δύο παίχτες, ο Θησέας και ο Μινώταυρος.
|
||||||
Στόχος του Μινώταυρου είναι να “πιάσει” τον Θησέα και στόχος του Θησέα είναι να βρει όλα τα εφόδια που είναι τυχαία κατανεμημένα στο ταμπλό πριν ξημερώσει και πριν τον πιάσει ο Μινώταυρος.
|
Στόχος του Μινώταυρου είναι να “πιάσει” τον Θησέα και στόχος του Θησέα είναι να βρει όλα τα εφόδια που είναι τυχαία κατανεμημένα στο ταμπλό, πριν ξημερώσει και πριν τον πιάσει ο Μινώταυρος.
|
||||||
Στο παιχνίδι αυτό υπάρχουν δύο βασικά προβλήματα τα οποία χρειάζεται να λύσουμε.
|
Στο παιχνίδι αυτό υπάρχουν δύο βασικά προβλήματα τα οποία χρειάζεται να λύσουμε.
|
||||||
Το πρόβλημα της δημιουργίας του λαβύρινθου και το πρόβλημα της λειτουργίας των παιχτών και του υπόλοιπου παιχνιδιού.
|
Το πρόβλημα της δημιουργίας του λαβύρινθου και το πρόβλημα της λειτουργίας των παιχτών και του υπόλοιπου παιχνιδιού.
|
||||||
|
|
||||||
\par Κατά την άποψή μας η δημιουργία του ταμπλό είναι το κυριότερο από τα δύο προβλήματα.
|
\par Κατά την άποψή μας, σε αυτό το πρώτο μέρος της εργασίας, η δημιουργία του ταμπλό είναι το κυριότερο από τα δύο προβλήματα.
|
||||||
Το ταμπλό αποτελείται από πλακίδια και τοίχους.
|
Το ταμπλό αποτελείται από πλακίδια και τοίχους.
|
||||||
Τα πλακίδια είναι διατεταγμένα σε τετραγωνικό σχήμα και ανάμεσά τους τοποθετούνται οι τοίχοι.
|
Τα πλακίδια είναι διατεταγμένα σε τετραγωνικό σχήμα και ανάμεσά τους τοποθετούνται οι τοίχοι.
|
||||||
Το πρόβλημα έγκειται στην επιλογή και τοποθέτηση τοίχων με τέτοιο τρόπο ώστε να πληρούνται οι προδιαγραφές του παιχνιδιού όπως πχ κάθε πλακίδιο να μπορεί να έχει το πολύ δύο τοίχους ή τα εξωτερικά πλακίδια να έχουν τοίχο από την έξω μεριά.
|
Το πρόβλημα έγκειται στην επιλογή και τοποθέτηση τοίχων με τέτοιο τρόπο ώστε να πληρούνται οι προδιαγραφές του παιχνιδιού όπως πχ κάθε πλακίδιο να έχει το πολύ δύο τοίχους ή τα εξωτερικά πλακίδια να έχουν τοίχο από την έξω μεριά.
|
||||||
Μετά από μια πιο λεπτομερή ανάλυση του προβλήματος, διαπιστώσαμε πως οι δοθείσες προδιαγραφές δεν αποτρέπουν τη δημιουργία κλειστών δωματίων, κάτι που θεωρήσαμε άδικο, με αποτέλεσμα, όπως περιγράφουμε και αναλυτικά παρακάτω, \textbf{να προσθέσουμε έναν ακόμη περιορισμό}.
|
Μετά από μια πιο λεπτομερή ανάλυση του προβλήματος, διαπιστώσαμε πως οι δοθείσες προδιαγραφές δεν αποτρέπουν τη δημιουργία κλειστών δωματίων, κάτι που θεωρήσαμε άδικο, με αποτέλεσμα, όπως περιγράφουμε και αναλυτικά παρακάτω, \textbf{να προσθέσουμε έναν ακόμη περιορισμό}.
|
||||||
\textbf{Την αποτροπή κλειστών δωματίων στο ταμπλό}.
|
\textbf{Την αποτροπή κλειστών δωματίων στο ταμπλό}.
|
||||||
|
|
||||||
\par Το πρόβλημα της λειτουργίας του υπόλοιπου παιχνιδιού έχει να κάνει με τη δημιουργία των παιχτών καθώς και τις κινήσεις τους.
|
\par Το πρόβλημα της λειτουργίας του υπόλοιπου παιχνιδιού έχει να κάνει με τη δημιουργία των παιχτών καθώς και τις κινήσεις τους.
|
||||||
Οι προδιαγραφές αφορούν περιορισμούς στην κίνηση των παιχτών και τον τρόπο με τον οποίο λειτουργεί το παιχνίδι.
|
Οι προδιαγραφές αφορούν περιορισμούς στην κίνηση των παιχτών και τον τρόπο με τον οποίο λειτουργεί το παιχνίδι.
|
||||||
Για παράδειγμα οι παίχτες δεν μπορούν να περάσουν μέσα από τοίχους, ή οι παίχτες κινούνται κατά ένα πλακίδιο τη φορά κλτ.
|
Για παράδειγμα οι παίχτες δεν μπορούν να περάσουν μέσα από τοίχους, ή οι παίχτες κινούνται κατά ένα πλακίδιο τη φορά κλτ.
|
||||||
Σε αντίθεση με τη λύση στο πρόβλημα του ταμπλό εδώ δεν απαιτήθηκαν ιδιαίτερες τεχνικές.
|
Σε αντίθεση με το πρόβλημα του ταμπλό εδώ η λύση ήταν τετριμμένη.
|
||||||
|
|
||||||
\section{Παραδοτέα}
|
\section{Παραδοτέα}
|
||||||
Τα επισυναπτόμενα παραδοτέα αποτελούνται από:
|
Τα επισυναπτόμενα παραδοτέα αποτελούνται από:
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Τον \eng{\textbf{root}}κατάλογο στον οποίο υπάρχει και το \eng{project}του \eng{eclipse.}
|
\item Τον \eng{\textbf{root}} κατάλογο στον οποίο υπάρχει και το \eng{project} του \eng{eclipse}.
|
||||||
\item Ένας υποκατάλογος \eng{\textbf{src/}}με τον κώδικα της \eng{java,}αποτελούμενο από ένα αριθμό αντικειμένων ενσωματωμένο στο πακέτο \eng{host.labyrinth.}
|
\item Ένας υποκατάλογος \eng{\textbf{src/}} με τον κώδικα της \eng{java}, αποτελούμενο από ένα αριθμό αντικειμένων ενσωματωμένο στο πακέτο \eng{host.labyrinth}.
|
||||||
Αναφορά σε αυτό τον κατάλογο υπάρχει στο \eng{eclipse project.}
|
|
||||||
\item Ένας υποκατάλογος \eng{\textbf{out/}} που περιέχει το παραγόμενο \eng{command line jar} του παιχνιδιού.
|
\item Ένας υποκατάλογος \eng{\textbf{out/}} που περιέχει το παραγόμενο \eng{command line jar} του παιχνιδιού.
|
||||||
\item Ένας υποκατάλογος \eng{\textbf{doc/}}με την τεκμηρίωση του κώδικα όπως αυτή έχει παραχθεί από τα σχόλια, με το εργαλείο \eng{doxygen.}
|
\item Ένας υποκατάλογος \eng{\textbf{doc/}} με την τεκμηρίωση του κώδικα όπως αυτή έχει παραχθεί από τα σχόλια, με το εργαλείο \eng{doxygen}.
|
||||||
Το αρχείο ρυθμίσεων του \eng{doxygen}είναι στον \eng{root} με το όνομα \eng{Doxyfile.}
|
Το αρχείο ρυθμίσεων του \eng{doxygen} είναι στον \eng{root} με το όνομα \eng{Doxyfile}.
|
||||||
Η πλοήγηση στην τεκμηρίωση μπορεί να γίνει ανοίγοντας το αρχείο \eng{doc/index.html}
|
Η πλοήγηση στην τεκμηρίωση μπορεί να γίνει ανοίγοντας το αρχείο \eng{doc/html/index.html}
|
||||||
\item Ένας υποκατάλογος \eng{\textbf{report/}} που περιέχει την \textbf{παρούσα αναφορά}.
|
\item Ένας υποκατάλογος \eng{\textbf{report/}} που περιέχει την \textbf{παρούσα αναφορά}.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
Εκτός από τα επισυναπτόμενα αρχεία διαθέσιμο υπάρχει και το \textbf{\eng{git} αποθετήριο} ολόκληρης της εργασίας \href{https://git.hoo2.net/hoo2/Labyrinth}{εδώ}.
|
Εκτός από τα επισυναπτόμενα αρχεία διαθέσιμο υπάρχει και το \textbf{\eng{git} αποθετήριο} ολόκληρης της εργασίας \href{https://git.hoo2.net/hoo2/Labyrinth}{εδώ}.
|
||||||
@@ -70,32 +79,33 @@
|
|||||||
Πριν ασχοληθούμε όμως με τα ζητηθέντα αντικείμενα του προγράμματος, θα πρέπει να αναφερθούμε σε ορισμένες δομές που προστέθηκαν, αλλά και κάποιες σχεδιαστικές επιλογές που έγιναν για να απλοποιήσουν τον κώδικα.
|
Πριν ασχοληθούμε όμως με τα ζητηθέντα αντικείμενα του προγράμματος, θα πρέπει να αναφερθούμε σε ορισμένες δομές που προστέθηκαν, αλλά και κάποιες σχεδιαστικές επιλογές που έγιναν για να απλοποιήσουν τον κώδικα.
|
||||||
|
|
||||||
\subsection{\eng{Accessor - mutator idiom}}
|
\subsection{\eng{Accessor - mutator idiom}}
|
||||||
Στις προδιαγραφές της εργασίας αφήνεται να εννοηθεί πως ζητείται η χρήση του \eng{\textit{accessor - mutator idiom.}}
|
Στις προδιαγραφές της εργασίας αφήνεται να εννοηθεί πως ζητείται η χρήση του \eng{\textit{accessor - mutator idiom}}.
|
||||||
Θα πρέπει να παραδεχτούμε όμως, πως \textbf{θεωρούμε το συγκεκριμένο ιδίωμα ιδιαίτερα προβληματικό}.
|
Θα πρέπει να παραδεχτούμε όμως, πως \textbf{θεωρούμε το συγκεκριμένο ιδίωμα ιδιαίτερα προβληματικό}.
|
||||||
Ο κύριος λόγος είναι πως παραβιάζει θεμελιακά τις αφαιρέσεις.
|
Ο κύριος λόγος είναι πως παραβιάζει θεμελιακά τις αφαιρέσεις προδίδοντας τον εσωτερικό σχεδιασμό του αντικειμένου.
|
||||||
Εν αντιθέτως με το ιδίομα αυτό, \textbf{τα αντικείμενα που υλοποιούνται ως αφαιρέσεις μπορούν να προσφέρουν μεθόδους που εκτελούν κάποια λειτουργία, κρύβοντας τελείως τις εσωτερικές λεπτομέρειες τις υλοποίησης}.
|
Ακόμα δίνει πρόσβαση στην εσωτερική δομή του “πίσω από την πλάτη” του αντικειμένου.
|
||||||
|
Εν αντιθέτως με το ιδίωμα αυτό, \textbf{τα αντικείμενα που υλοποιούνται ως αφαιρέσεις θα μπορούσαν να προσφέρουν μεθόδους που εκτελούν κάποια λειτουργία, κρύβοντας τελείως τις εσωτερικές λεπτομέρειες της υλοποίησης}.
|
||||||
Αυτός είναι και ο δρόμος που διαλέξαμε για το σχεδιασμό του προγράμματος.
|
Αυτός είναι και ο δρόμος που διαλέξαμε για το σχεδιασμό του προγράμματος.
|
||||||
Η κάθε τάξη προσφέρει δημόσια ένα αριθμό από μεθόδους που είναι απαραίτητες για την εκάστοτε απαιτούμενη λειτουργικότητα και κρύβει όσο καλύτερα γίνεται την εσωτερική υλοποίηση.
|
Η κάθε τάξη του προγράμματός μας προσφέρει δημόσια ένα αριθμό από μεθόδους που είναι απαραίτητες για την εκάστοτε απαιτούμενη λειτουργικότητα και κρύβει όσο καλύτερα γίνεται την εσωτερική υλοποίηση.
|
||||||
Ενώ λοιπόν υλοποιήσαμε το ζητηθέν \eng{get-set} ζευγάρι για την κάθε μεταβλητή των τάξεων, δεν το χρησιμοποιήσαμε πουθενά μέσα στο πρόγραμμα.
|
Ενώ λοιπόν υλοποιήσαμε το ζητηθέν \eng{get-set} ζευγάρι για την κάθε μεταβλητή των τάξεων, δεν το χρησιμοποιήσαμε πουθενά μέσα στο πρόγραμμα.
|
||||||
|
|
||||||
\subsection{Ενοποιημένο σύστημα συντεταγμένων}
|
\subsection{Ενοποιημένο σύστημα συντεταγμένων}
|
||||||
Στις προδιαγραφές της εργασίας περιγράφεται επίσης ένα διπλό σύστημα συντεταγμένων, τόσο για τα πλακίδια όσο και για τα εφόδια.
|
Στις προδιαγραφές της εργασίας περιγράφεται επίσης ένα διπλό σύστημα συντεταγμένων, τόσο για τα πλακίδια όσο και για τα εφόδια.
|
||||||
Ένα καρτεσιανό που διευθυνσιοδοτεί ως προς δύο άξονες και περιέχει ένα ζευγάρι γραμμής και στήλης και ένα μονοδιάστατο που αποτελείται από τον γραμμικό συνδυασμό των προηγουμένων.
|
Ένα καρτεσιανό που διευθυνσιοδοτεί ως προς δύο άξονες και περιέχει ένα ζευγάρι γραμμής και στήλης και ένα μονοδιάστατο που αποτελείται από τον γραμμικό συνδυασμό των προηγουμένων.
|
||||||
Το μονοδιάστατο αντικατοπτρίζει και την απεικόνιση στη μνήμη ενός πίνακα 2 διαστάσεων σε \eng{row major order.}
|
Το μονοδιάστατο αντικατοπτρίζει και την απεικόνιση στη μνήμη ενός πίνακα 2 διαστάσεων σε \eng{row major order}.
|
||||||
|
|
||||||
\par Γενικά θεωρούμε ότι κάτι τέτοιο δημιουργεί πλεονασμό δεδομένων και επομένως είναι κακή πρακτική.
|
\par Γενικά θεωρούμε πως κάτι τέτοιο δημιουργεί πλεονασμό δεδομένων και επομένως είναι κακή πρακτική.
|
||||||
Αυτό γιατί μεταξύ άλλων μειονεκτημάτων, που κυρίως αφορά τον πολυνηματικό προγραμματισμό, οδηγεί και σε προγραμματιστικά λάθη που πιθανώς θα αφήνουν τα δύο συστήματα ασυγχρόνιστα.
|
Αυτό γιατί μεταξύ άλλων μειονεκτημάτων, που κυρίως αφορά τον πολυνηματικό προγραμματισμό, οδηγεί και σε προγραμματιστικά λάθη που πιθανώς θα αφήνουν τα δύο συστήματα ασυγχρόνιστα.
|
||||||
Για να λύσουμε αυτό το πρόβλημα \textbf{δημιουργήσαμε την τάξη\eng{Position,}}στην οποία εσωτερικά χρησιμοποιούμε μόνο το ένα από τα δύο συστήματα, για την ακρίβεια το μονοδιάστατο και ταυτόχρονα παρέχουμε μεθόδους για την πρόσβαση στη θέση και από τα δύο συστήματα.
|
Για να λύσουμε αυτό το πρόβλημα \textbf{δημιουργήσαμε την τάξη \eng{Position}}, στην οποία εσωτερικά χρησιμοποιούμε μόνο το ένα από τα δύο συστήματα, για την ακρίβεια το μονοδιάστατο και ταυτόχρονα παρέχουμε μεθόδους για την πρόσβαση στη θέση και από τα δύο συστήματα.
|
||||||
Η τάξη μεταξύ άλλων προσφέρει και \textbf{στατικές μεθόδους για τις μετατροπές} προσφέροντας έτσι μια είδους εργαλειοθήκη για την εφαρμογή.
|
Η τάξη μεταξύ άλλων προσφέρει και \textbf{στατικές μεθόδους για τις μετατροπές} προσφέροντας έτσι μια είδους εργαλειοθήκη για την εφαρμογή.
|
||||||
Για την παρούσα εργασία χρησιμοποιήσαμε την \eng{Position} όπου ήταν δυνατό.
|
Για την παρούσα εργασία χρησιμοποιήσαμε την \eng{Position} όπου ήταν δυνατό.
|
||||||
|
|
||||||
\subsection{Αναβάθμιση της τάξης \eng{Tile}}
|
\subsection{Αναβάθμιση της τάξης \eng{Tile}}
|
||||||
Κατά τον προγραμματισμό του παιχνιδιού παρατηρήσαμε πως τόσο η τάξη \eng{Tile} όσο και η \eng{Supply} έχουν πληροφορίες για τη θέση τους στο ταμπλό.
|
Κατά τον προγραμματισμό του παιχνιδιού παρατηρήσαμε πως τόσο η τάξη \eng{Tile} όσο και η \eng{Supply} έχουν πληροφορίες για τη θέση τους στο ταμπλό.
|
||||||
Αυτό σημαίνει πως τόσο τα πλακίδια όσο και τα εφόδια ανήκουν στο ταμπλό.
|
Αυτό σημαίνει πως τόσο τα πλακίδια όσο και τα εφόδια ανήκουν στο ταμπλό.
|
||||||
Ακόμα σημαίνει πως δημιουργούν επιπλέον πλεονασμό σε δεδομένα, καθώς απαιτούνται οι συντεταγμένες των εφοδίων μέσα στην\eng{Supply.}
|
Ακόμα σημαίνει πως δημιουργούν επιπλέον πλεονασμό σε δεδομένα, καθώς απαιτείται οι συντεταγμένες του πλακιδίου που βρίσκεται το εφόδιο να επαναληφθούν μέσα στην \eng{Supply}.
|
||||||
Κάτι τέτοιο γίνεται αντιληπτό και από τις προδιαγραφές της \eng{Board} η οποία είναι αυτή που περιέχει τους πίνακες αναφορών τόσο των πλακιδίων όσο και των εφοδίων.
|
Κάτι τέτοιο γίνεται αντιληπτό και από τις προδιαγραφές της \eng{Board} η οποία είναι αυτή που περιέχει τους πίνακες αναφορών τόσο των πλακιδίων όσο και των εφοδίων.
|
||||||
\textbf{Μια ποιο διαισθητική προσέγγιση βέβαια θα ήθελε τα εφόδια να ανήκουν στα πλακίδια} και όχι στο ταμπλό.
|
\textbf{Μια πιο διαισθητική προσέγγιση βέβαια θα ήθελε τα εφόδια να ανήκουν στα πλακίδια} και όχι στο ταμπλό.
|
||||||
Με αυτό τον τρόπο η τάξη\eng{Supply} δεν θα είχε πληροφορίες θέσης, αλλά αντίθετα η τάξη\eng{Tile}θα είχε επιπρόσθετη πληροφορία για το αν υπάρχει εφόδιο ή όχι.
|
Με αυτό τον τρόπο η τάξη \eng{Supply} δεν θα είχε τις επαναλαμβανόμενες πληροφορίες θέσης, αλλά αντίθετα η τάξη \eng{Tile} θα είχε απλώς μια επιπρόσθετη πληροφορία για το αν υπάρχει εφόδιο ή όχι.
|
||||||
|
|
||||||
\par Όπως είναι φυσικό θελήσαμε να υλοποιήσουμε αυτή την προσέγγιση.
|
\par Όπως είναι φυσικό θελήσαμε να υλοποιήσουμε αυτή την προσέγγιση.
|
||||||
Αν όμως μετακινούσαμε τις αναφορές των εφοδίων στην \eng{Tile} θα αλλοιώναμε τις προδιαγραφές της εκφώνησης.
|
Αν όμως μετακινούσαμε τις αναφορές των εφοδίων στην \eng{Tile} θα αλλοιώναμε τις προδιαγραφές της εκφώνησης.
|
||||||
@@ -108,31 +118,36 @@
|
|||||||
\item \eng{\textbf{\textit{void pickSupply (Supply[] supplies, int supplyId)}}}\\
|
\item \eng{\textbf{\textit{void pickSupply (Supply[] supplies, int supplyId)}}}\\
|
||||||
που δίνει την δυνατότητα σε κάποιο παίκτη να “σηκώσει” το εφόδιο.
|
που δίνει την δυνατότητα σε κάποιο παίκτη να “σηκώσει” το εφόδιο.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
Έτσι έχουμε ομοιομορφία με τις αντίστοιχες μεθόδους \eng{\textit{boolean hasWall(int direction)}}και\eng{\textit{int hasWalls()}}της\eng{Tile.}
|
Έτσι έχουμε ομοιομορφία με τις αντίστοιχες μεθόδους \eng{\textit{boolean hasWall(int direction)}} και \eng{\textit{int hasWalls()}} της \eng{Tile}.
|
||||||
\par Ένας παρατηρητικός αναγνώστης θα διαπιστώσει πως οι συναρτήσεις για τα εφόδια είναι αναγκασμένες να πάρουν τον πίνακα αναφορών στα εφόδια ως όρισμα.
|
\par Ένας παρατηρητικός αναγνώστης θα διαπιστώσει πως οι συναρτήσεις για τα εφόδια είναι αναγκασμένες να πάρουν τον πίνακα αναφορών στα εφόδια ως όρισμα.
|
||||||
Αυτό είναι το τίμημα που πρέπει να πληρώσουμε προωθώντας τις μεθόδους αυτές στην\eng{Tile.}
|
Αυτό είναι το τίμημα που πρέπει να πληρώσουμε προωθώντας τις μεθόδους αυτές στην \eng{Tile}.
|
||||||
|
|
||||||
|
|
||||||
\section{\eng{Concepts}}
|
\section{\eng{Concepts}}
|
||||||
Η δημιουργία της \eng{Board} αποτέλεσε τον μεγαλύτερο όγκο του κώδικα της παρούσας εργασίας.
|
Η δημιουργία της \eng{Board} αποτέλεσε τον μεγαλύτερο όγκο του κώδικα της παρούσας εργασίας.
|
||||||
Για να κάνουμε τον κώδικα καθαρότερο αλλά και ευκολότερο στην κατανόηση επινοήσαμε κάποια\eng{\textbf{concepts}.}
|
Για να κάνουμε τον κώδικα καθαρότερο αλλά και ευκολότερο στην κατανόηση επινοήσαμε κάποια \eng{\textbf{concepts}}.
|
||||||
Η ιδέα των \eng{concepts} προέρχεται από την \eng{C++} όπου τα \eng{concepts} είναι ένα είδους \eng{compile time predicate} και εφαρμόζεται στους τύπους δεδομένων.
|
Η ιδέα των \eng{concepts} προέρχεται από την \eng{C++} όπου τα \eng{concepts} είναι ένα είδους \eng{compile time predicate} και εφαρμόζεται στους τύπους δεδομένων.
|
||||||
Εμείς για την εργασία υλοποιήσαμε κάποια \eng{concepts} σε μορφή συναρτήσεων κατά την εκτέλεση του προγράμματος.
|
Εμείς για την εργασία υλοποιήσαμε κάποια \eng{concepts} σε μορφή συναρτήσεων κατά την εκτέλεση του προγράμματος.
|
||||||
Τα\eng{concepts}αυτά αφορούν έννοιες σχετικές με την εφαρμογή και έχουν την μορφή\eng{predicate.}
|
Τα \eng{concepts} αυτά αφορούν έννοιες σχετικές με την εφαρμογή και έχουν την μορφή \eng{predicate}.
|
||||||
Μας δίνεται έτσι η δυνατότητα να ελέγχουμε αν κάποια είσοδός ενός \eng{concept}πληροί τις προδιαγραφές του ή όχι.
|
Μας δίνεται έτσι η δυνατότητα να ελέγχουμε αν κάποια είσοδός ενός \eng{predicate-concept} πληροί τις προδιαγραφές του ή όχι.
|
||||||
Στο σχήμα \ref{fig:concepts} φαίνεται μια οπτικοποιημένη έκδοση τους.
|
Στο σχήμα \ref{fig:concepts} φαίνεται μια οπτικοποιημένη έκδοση τους.
|
||||||
|
|
||||||
\subsection{Πλακίδιο φρουρός - \textit{\eng{isSentinel()}}}
|
\subsection{Πλακίδιο φρουρός - \textit{\eng{isSentinel()}}}
|
||||||
\WrapFigure{0.5}{r}{fig:concepts}{images/concepts.png}{Οπτική αναπαράσταση των\eng{concepts}που χρησιμοποιούμε σε ένα ταμπλό $7x7$}
|
\WrapFigure{0.45}{r}{fig:concepts}{images/concepts.png}{
|
||||||
Πρόκειται για\eng{concept}που μας επιτρέπει να ελέγξουμε αν το πλακίδιο είναι \textbf{“πλακίδιο φρουρός”}.
|
Οπτική αναπαράσταση των \eng{concepts} που χρησιμοποιούμε σε ένα ταμπλό $7x7$.
|
||||||
|
Με πράσινο αναπαρίστανται όσα πληρούν κάποιο \eng{concept} και με κόκκινο όσα όχι.
|
||||||
|
Τα πλακίδια με το γκρι χρώμα, είναι τα πλακίδια φρουροί.
|
||||||
|
}
|
||||||
|
Πρόκειται για \eng{concept} που μας επιτρέπει να ελέγξουμε αν το πλακίδιο είναι \textit{”πλακίδιο φρουρός”}.
|
||||||
Αν δηλαδή βρίσκεται στα εξωτερικά άκρα του ταμπλό.
|
Αν δηλαδή βρίσκεται στα εξωτερικά άκρα του ταμπλό.
|
||||||
Η υλοποίηση αυτού του \eng{concept} γίνεται μέσω τεσσάρων συναρτήσεων που ελέγχουν χωριστά τις τέσσερεις διευθύνσεις του ταμπλό.
|
Η υλοποίηση αυτού του \eng{concept} γίνεται μέσω τεσσάρων συναρτήσεων που ελέγχουν χωριστά τις τέσσερεις διευθύνσεις του ταμπλό.
|
||||||
|
|
||||||
\par Για την παράδειγμα η \eng{\textit{boolean isLeftSentinel (int tileId)}}μας δίνει την δυνατότητα να ελέγξουμε αν το πλακίδιο είναι “πλακίδιο φρουρού” αριστερά του ταμπλό.
|
\par Για την παράδειγμα η \eng{\textit{boolean isLeftSentinel (int tileId)}} μας δίνει την δυνατότητα να ελέγξουμε αν το πλακίδιο είναι \textit{πλακίδιο φρουρού} αριστερά του ταμπλό.
|
||||||
Αυτό είναι χρήσιμο για λειτουργίες όπως για παράδειγμα αν θέλουμε να δούμε μήπως χρειάζεται να τοποθετηθεί τοίχος αριστερά του πλακιδίου.
|
Αυτό είναι χρήσιμο για λειτουργίες όπως για παράδειγμα αν θέλουμε να δούμε μήπως χρειάζεται να τοποθετηθεί εξωτερικός τοίχος αριστερά του πλακιδίου.
|
||||||
Αντίστοιχα υπάρχουν και οι υπόλοιπες συναρτήσεις για τις υπόλοιπες διευθύνσεις.
|
Αντίστοιχα υπάρχουν και οι υπόλοιπες συναρτήσεις για τις υπόλοιπες διευθύνσεις.
|
||||||
|
|
||||||
\subsection{Διασχίσιμη διεύθυνση - \textit{\eng{isWalkable()}}}
|
\subsection{Διασχίσιμη διεύθυνση - \textit{\eng{isWalkable()}}}
|
||||||
Πρόκειται για\eng{predicate}που μας επιτρέπει να ελέγξουμε αν μια διεύθυνση σε κάποιο πλακίδιο είναι \textbf{“διασχίσημη”}.
|
Πρόκειται για \eng{predicate} που μας επιτρέπει να ελέγξουμε αν μια διεύθυνση σε κάποιο πλακίδιο είναι \textit{”διασχίσημη διεύθυνση”}.
|
||||||
Αν δηλαδή κάποιος παίκτης μπορεί να κινηθεί σε αυτή.
|
Αν δηλαδή κάποιος παίκτης μπορεί να κινηθεί σε αυτή.
|
||||||
Για να ισχύει κάτι τέτοιο θα πρέπει:
|
Για να ισχύει κάτι τέτοιο θα πρέπει:
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
@@ -141,26 +156,27 @@
|
|||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
\subsection{Χτίσιμη διεύθυνση - \textit{\eng{isWallableDir()}}}
|
\subsection{Χτίσιμη διεύθυνση - \textit{\eng{isWallableDir()}}}
|
||||||
Πρόκειται για\eng{predicate}που μας επιτρέπει να ελέγξουμε αν μια διεύθυνση κάποιου πλακιδίου είναι \textbf{”χτίσιμη”}.
|
Πρόκειται για \eng{predicate} που μας επιτρέπει να ελέγξουμε αν μια διεύθυνση κάποιου πλακιδίου είναι \textit{”χτίσιμη διεύθυνση”}.
|
||||||
Αν δηλαδή μπορούμε να τοποθετήσουμε τοίχο στη διεύθυνση αυτή.
|
Αν δηλαδή μπορούμε να τοποθετήσουμε τοίχο στη διεύθυνση αυτή.
|
||||||
Για να είναι μια διεύθυνση χτίσιμη θα πρέπει:
|
Για να είναι μια διεύθυνση χτίσιμη θα πρέπει:
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Η διεύθυνση να είναι “διασχίσιμη”.
|
\item Η διεύθυνση να είναι \textit{διασχίσιμη}.
|
||||||
\item Το γειτονικό πλακίδιο σε αυτή τη διεύθυνση να μην περιέχει ήδη τον μέγιστο αριθμό πλακιδίων.
|
\item Το γειτονικό πλακίδιο σε αυτή τη διεύθυνση να μην περιέχει ήδη τον μέγιστο επιτρεπτό αριθμό τοίχων.
|
||||||
\item Ο τοίχος να μην δημιουργεί κάποιο κλειστό δωμάτιο.\\
|
\item Ο τοίχος να μην δημιουργεί κάποιο κλειστό δωμάτιο.\\
|
||||||
Αυτή η τελευταία \textbf{η απαίτηση δεν υπάρχει στις προδιαγραφές} και την παίρνουμε υπόψιν μόνο αν ο χρήστης την έχει ζητήσει από την γραμμή εντολών.
|
\end{itemize}
|
||||||
|
Αυτή η τελευταία \textbf{απαίτηση δεν υπάρχει στις προδιαγραφές} και την παίρνουμε υπόψιν, όπως θα δούμε και στην ενότητα \ref{sec:excecutable}, μόνο αν ο χρήστης την έχει ζητήσει από την γραμμή εντολών.
|
||||||
Ο λόγος είναι γιατί ο υπολογισμός της κοστίζει και αυτό μπορεί να μην παίζει ρόλο για ταμπλό μεγέθους $15x15$, αλλά αν ζητηθεί κάποιο πολύ μεγαλύτερο τότε ο χρόνος είναι υπολογίσιμος.
|
Ο λόγος είναι γιατί ο υπολογισμός της κοστίζει και αυτό μπορεί να μην παίζει ρόλο για ταμπλό μεγέθους $15x15$, αλλά αν ζητηθεί κάποιο πολύ μεγαλύτερο τότε ο χρόνος είναι υπολογίσιμος.
|
||||||
Φυσικά στον κώδικα κάνουμε χρήση αυτού του \eng{concept} μόνο κατά τη δημιουργία του ταμπλό, με αποτέλεσμα να μην επιβαρύνεται καθόλου η λειτουργία του προγράμματος κατά τη διάρκεια του παιχνιδιού.
|
Φυσικά στον κώδικα κάνουμε χρήση αυτού του \eng{concept} μόνο κατά τη δημιουργία του ταμπλό, με αποτέλεσμα να μην επιβαρύνεται καθόλου η λειτουργία του προγράμματος κατά τη διάρκεια του παιχνιδιού.
|
||||||
|
Έτσι προτείνουμε στον αναγνώστη και χρήστη της εφαρμογής μας να κάνει χρήση αυτής της επιλογής.
|
||||||
Αναφερόμαστε αναλυτικά σε αυτό τον αλγόριθμο στην ενότητα \ref{sec:isRoomCreator}
|
Αναφερόμαστε αναλυτικά σε αυτό τον αλγόριθμο στην ενότητα \ref{sec:isRoomCreator}
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsection{Χτίσιμο πλακίδιο - \textit{\eng{isWallable()}}}
|
\subsection{Χτίσιμο πλακίδιο - \textit{\eng{isWallable()}}}
|
||||||
Πρόκειται για\eng{predicate}που μας επιτρέπει να ελέγξουμε αν κάποιο πλακιδίο είναι \textbf{”χτίσιμo”}.
|
Πρόκειται για \eng{predicate} που μας επιτρέπει να ελέγξουμε αν κάποιο πλακίδιο είναι \textit{”χτίσιμo πλακίδιο”}.
|
||||||
Αν δηλαδή μπορούμε σε κάποια πλευρά του πλακιδίου να τοποθετήσουμε τοίχο.
|
Αν δηλαδή υπάρχει κάποια πλευρά του πλακιδίου στην οποία μπορούμε να τοποθετήσουμε τοίχο.
|
||||||
Για να ισχύει αυτό θα πρέπει:
|
Για να ισχύει αυτό θα πρέπει:
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Το πλακίδιο να μην έχει ήδη τον μέγιστο αριθμό τοίχων.
|
\item Να υπάρχει τουλάχιστον μία \textit{χτίσιμη διεύθυνση} στο πλακίδιο.
|
||||||
\item Να υπάρχει τουλάχιστον μία “χτίσιμη” διεύθυνση στο πλακίδιο.
|
\item Το πλακίδιο να μην έχει ήδη τον μέγιστο επιτρεπτό αριθμό τοίχων.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
\subsection{Δημιουργός κλειστού δωματίου - \textit{\eng{isRoomCreator()}}} \label{sec:isRoomCreator}
|
\subsection{Δημιουργός κλειστού δωματίου - \textit{\eng{isRoomCreator()}}} \label{sec:isRoomCreator}
|
||||||
@@ -172,29 +188,31 @@
|
|||||||
Θέλαμε λοιπόν ένα τρόπο αναπαράστασης των τοίχων που να βολεύει για το συγκεκριμένο πρόβλημα.
|
Θέλαμε λοιπόν ένα τρόπο αναπαράστασης των τοίχων που να βολεύει για το συγκεκριμένο πρόβλημα.
|
||||||
Η λύση που χρησιμοποιήσαμε συνοψίζεται στα εξής:
|
Η λύση που χρησιμοποιήσαμε συνοψίζεται στα εξής:
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Οι διασταυρώσεις ανάμεσα στα πλακίδια ονομάζονται κόμβοι και η θέση τους αναπαρίστανται μονοδιάστατα σαν διεύθυνση σε\eng{row majer order.}
|
\item Οι γωνίες των πλακιδίων ονομάζονται κόμβοι και η θέση τους αναπαρίστανται με έναν αύξοντα αριθμό που ισοδυναμεί με την αναπαράσταση δισδιάστατου πίνακα σε \eng{row major order}.
|
||||||
\item Ο κάθε κόμβος αποτελεί τον κόμβο-γωνία \eng{(vertex)} ενός γράφου.
|
\item Ο κάθε κόμβος αποτελεί τον κόμβο-γωνία \eng{(vertex)} ενός γράφου.
|
||||||
\item Ο κάθε τοίχος αναπαρίσταται ως ακμή στον γράφο.
|
\item Ο κάθε τοίχος αναπαρίσταται ως ακμή \eng{(edge)} στον γράφο.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
Για παράδειγμα ένας τοίχος αριστερά του πλακιδίου `0` αναπαρίσταται ως η ακμή `(0,4)`,
|
Για παράδειγμα στο σχήμα \ref{fig:graph}, που φαίνεται και ένα παράδειγμα αναπαράστασης, ο τοίχος αριστερά του πλακιδίου `3` αναπαρίσταται ως η ακμή `(4,8)`.
|
||||||
Στο σχήμα \ref{fig:graph} φαίνεται ένα παράδειγμα αναπαράστασης.
|
|
||||||
\InsertFigure{0.6}{fig:graph}{images/graph.png}{
|
\InsertFigure{0.6}{fig:graph}{images/graph.png}{
|
||||||
\\(α) Διευθυνσιοδότηση πλακιδίων(τετραγωνάκια) και κόμβων(σφαίρες) ενός ταμπλό $3x3$.\\
|
\\(α) Διευθυνσιοδότηση πλακιδίων(τετραγωνάκια) και κόμβων(σφαίρες) ενός ταμπλό $3x3$.\\
|
||||||
(β) Ένας συνεκτικός γράφος που προκύπτει από το (α) ξεκινώντας από τον τοίχο (7, 11).
|
(β) Ένας συνεκτικός γράφος που προκύπτει από το (α) ξεκινώντας από τον τοίχο (7, 11).
|
||||||
|
Για τον εν λόγο τοίχο θέλουμε να διαπιστώσουμε αν δημιουργεί κλειστό δωμάτιο.
|
||||||
|
Κάτι που σε αυτή την περίπτωση δεν συμβαίνει.
|
||||||
}
|
}
|
||||||
|
|
||||||
\par Για τον αλγόριθμο υλοποιήσαμε δύο αντικείμενα.
|
\par Για τον αλγόριθμο υλοποιήσαμε δύο τάξεις.
|
||||||
Το\eng{\textbf{Edge}}που δημιουργεί ζευγάρια κόμβων ώστε να μπορεί να αποθηκεύσει τον κάθε τοίχο(ακμή) και το\eng{\textbf{Graph}}που προσφέρει λειτουργίες δημιουργίας συνεκτικού γράφου λαμβάνοντας ως είσοδο τοίχους(ακμές).
|
Την \eng{\textbf{Edge}} που δημιουργεί ζευγάρια κόμβων ώστε να μπορεί να αποθηκεύσει τον κάθε τοίχο(ακμή) και την \eng{\textbf{Graph}} που προσφέρει λειτουργίες δημιουργίας συνεκτικού γράφου λαμβάνοντας ως είσοδο τοίχους(ακμές).
|
||||||
|
|
||||||
\par Η λειτουργία του είναι απλή.
|
\par Η λειτουργία του είναι απλή.
|
||||||
Κάθε φορά που ελέγχουμε αν μία διεύθυνση πλακιδίου είναι χτίσιμη, \textbf{δημιουργούμε το μεγαλύτερο δυνατό συνεκτικό γράφο που περιέχει τον εν λόγο τοίχο} και όλους τους ήδη τοποθετημένους τοίχους.
|
Κάθε φορά που ελέγχουμε αν μία διεύθυνση πλακιδίου είναι \textit{χτίσιμη}, \textbf{δημιουργούμε το μεγαλύτερο δυνατό συνεκτικό γράφο που περιέχει τον εν λόγο τοίχο} και όλους τους ήδη τοποθετημένους τοίχους.
|
||||||
Αν στον γράφο που προκύπτει υπάρχει κάποιος κόμβος περισσότερες από μία φορές, δηλαδή ο γράφος δεν είναι απλός, τότε αυτό σημαίνει πως στον εν λόγο κόμβο μπορούμε να πάμε ακολουθώντας κάποιο τοίχο από τουλάχιστον δύο κατευθύνσεις.
|
Αν στον γράφο που προκύπτει υπάρχει κάποιος κόμβος περισσότερες από μία φορές, δηλαδή ο γράφος δεν είναι απλός, τότε αυτό σημαίνει πως στον εν λόγο κόμβο μπορούμε να πάμε ακολουθώντας τοίχους από τουλάχιστον δύο κατευθύνσεις.
|
||||||
Άρα το ταμπλό περιέχει κάποιο κλειστό δωμάτιο.
|
Άρα το ταμπλό περιέχει κάποιο κλειστό δωμάτιο.
|
||||||
Αφού τον αλγόριθμο τον εκτελούμε για κάθε πιθανή χτίσιμη διεύθυνση, τότε ο τοίχος που προκαλεί το κλειστό δωμάτιο είναι αυτός που ελέγχουμε την εκάστοτε στιγμή.
|
Αφού τον αλγόριθμο τον εκτελούμε για κάθε πιθανή \textit{χτίσιμη διεύθυνση}, τότε ο τοίχος που προκαλεί το κλειστό δωμάτιο είναι ο τρέχον.
|
||||||
|
|
||||||
\par Για την λειτουργία του αλγόριθμου χρειαζόμαστε όλους τους τοίχους που είναι ήδη τοποθετημένοι στο ταμπλό στη μορφή\eng{Edge.}
|
\par Για την λειτουργία του αλγόριθμου χρειαζόμαστε όλους τους τοίχους που είναι ήδη τοποθετημένοι στο ταμπλό στη μορφή \eng{Edge}.
|
||||||
Γιαυτό προσθέσαμε στην τάξη \eng{Board} μια λίστα αναφορών \eng{(ArrayList)} και σε αυτήν αποθηκεύουμε κάθε τοίχο που δημιουργούμε.
|
Γιαυτό προσθέσαμε στην τάξη \eng{Board} μια λίστα αναφορών \eng{(ArrayList)} και σε αυτήν αποθηκεύουμε κάθε τοίχο που δημιουργούμε.
|
||||||
Τον αλγόριθμο μπορούμε να τον ενεργοποιήσουμε αν περάσουμε στο πρόγραμμα ως επιλογή το όρισμα\eng{\texttt{-{}-norooms}} από τη γραμμή εντολών.
|
Τον αλγόριθμο μπορούμε να τον ενεργοποιήσουμε αν περάσουμε στο πρόγραμμα ως επιλογή το όρισμα \eng{\texttt{-{}-norooms}} από τη γραμμή εντολών
|
||||||
|
\footnote{Συνίσταται ανεπιφύλακτα η χρήση αυτής της επιλογής}.
|
||||||
|
|
||||||
\par Δυστυχώς η κωδικοποίηση που χρησιμοποιούμε εδώ δεν ταιριάζει με αυτή της υπόλοιπης εφαρμογής.
|
\par Δυστυχώς η κωδικοποίηση που χρησιμοποιούμε εδώ δεν ταιριάζει με αυτή της υπόλοιπης εφαρμογής.
|
||||||
Αυτό έχει σαν αποτέλεσμα να πρέπει να δημιουργούμε τον γράφο κάθε φορά.
|
Αυτό έχει σαν αποτέλεσμα να πρέπει να δημιουργούμε τον γράφο κάθε φορά.
|
||||||
@@ -205,17 +223,19 @@
|
|||||||
Φυσικά θα μπορούσαμε να χρησιμοποιήσουμε υπομνηματισμό και να αποθηκεύουμε τους γράφους
|
Φυσικά θα μπορούσαμε να χρησιμοποιήσουμε υπομνηματισμό και να αποθηκεύουμε τους γράφους
|
||||||
Όμως λόγο του ότι η επιβάρυνση λαμβάνει χώρα μόνο μία φορά κατά την εκκίνηση, σε συνδυασμό με το μικρό μέγεθος του ταμπλό, αποφασίσαμε να μην προχωρήσουμε σε περαιτέρω βελτιστοποίηση.
|
Όμως λόγο του ότι η επιβάρυνση λαμβάνει χώρα μόνο μία φορά κατά την εκκίνηση, σε συνδυασμό με το μικρό μέγεθος του ταμπλό, αποφασίσαμε να μην προχωρήσουμε σε περαιτέρω βελτιστοποίηση.
|
||||||
|
|
||||||
|
|
||||||
\section{Υλοποίηση}
|
\section{Υλοποίηση}
|
||||||
Για την δημιουργία της εφαρμογής, εκτός από τα ζητηθέντα αντικείμενα υλοποιήσαμε και τα παρακάτω.
|
Για την μεταγλώττιση της εφαρμογής, απαιτείται \eng{java} έκδοση 8 ή και μεταγενέστερη καθώς έχουμε κάνει χρήση \eng{lambdas}.
|
||||||
|
Όσο αφορά την υλοποίηση, εκτός από τα ζητηθέντα αντικείμενα υλοποιήσαμε και τα παρακάτω.
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item \eng{\textbf{Const}}\\
|
\item \eng{\textbf{Const}}\\
|
||||||
Το αντικείμενο αυτό περιέχει σταθερές για όλη την εφαρμογή.
|
Το αντικείμενο αυτό περιέχει σταθερές για όλη την εφαρμογή.
|
||||||
\item \eng{\textbf{Session}}\\
|
\item \eng{\textbf{Session}}\\
|
||||||
Το αντικείμενο αυτό περιέχει όλες τις τιμές της εφαρμογής που αποτελούν επιλογές, όπως πχ το μέγεθος του ταμπλό, τον αριθμό των εφοδίων κτλ.
|
Το αντικείμενο αυτό περιέχει όλες τις τιμές της εφαρμογής που αποτελούν ρυθμίσεις ή επιλογές, όπως πχ το μέγεθος του ταμπλό, τον αριθμό των εφοδίων κτλ.
|
||||||
\item \eng{\textbf{Direction}}\\
|
\item \eng{\textbf{Direction}}\\
|
||||||
Το αντικείμενο αυτό λειτουργεί σαν \eng{C++ enumerator} και παρέχει ονοματολογία στις διευθύνσεις που χρησιμοποιούμε στην εφαρμογή.
|
Το αντικείμενο αυτό λειτουργεί σαν \eng{C++ enumerator} και παρέχει ονοματολογία στις διευθύνσεις που χρησιμοποιούμε στην εφαρμογή.
|
||||||
\item \eng{\textbf{DirRange}}\\
|
\item \eng{\textbf{DirRange}}\\
|
||||||
Ομοίως ένα βοηθητικό αντικείμενο αυτή τη φορά για την δημιουργία σε βρόχους επανάληψης.
|
Ομοίως ένα βοηθητικό αντικείμενο αυτή τη φορά για την αυτόματη δημιουργία διευθύνσεων σε βρόχους επανάληψης.
|
||||||
\item \eng{\textbf{Edge}}\\
|
\item \eng{\textbf{Edge}}\\
|
||||||
Το αντικείμενο αυτό όπως είδαμε και στην ενότητα \ref{sec:isRoomCreator}, λειτουργεί ως αναπαράσταση των τοίχων με τη μορφή ακμών ενός γράφου.
|
Το αντικείμενο αυτό όπως είδαμε και στην ενότητα \ref{sec:isRoomCreator}, λειτουργεί ως αναπαράσταση των τοίχων με τη μορφή ακμών ενός γράφου.
|
||||||
Προσφέρει \eng{constructor} που δέχεται για ορίσματα συντεταγμένες από πλακίδια και διευθύνσεις.
|
Προσφέρει \eng{constructor} που δέχεται για ορίσματα συντεταγμένες από πλακίδια και διευθύνσεις.
|
||||||
@@ -223,19 +243,113 @@
|
|||||||
\item \eng{\textbf{Graph}}\\
|
\item \eng{\textbf{Graph}}\\
|
||||||
Το αντικείμενο αυτό υλοποιεί λειτουργίες ενός συνεκτικού γράφου.
|
Το αντικείμενο αυτό υλοποιεί λειτουργίες ενός συνεκτικού γράφου.
|
||||||
Ο \eng{constructor} της τάξης δέχεται ως όρισμα μια ακμή και στην ουσία δημιουργεί τους 2 πρώτους κόμβους.
|
Ο \eng{constructor} της τάξης δέχεται ως όρισμα μια ακμή και στην ουσία δημιουργεί τους 2 πρώτους κόμβους.
|
||||||
Οι βασικές λειτουργίες είναι η \eng{\textit{attach()}}η οποία δέχεται μια ακμή και αν κάποιος κόμβος της ακμής ανήκει ήδη στο γράφο τότε τοποθετεί και τον άλλο.
|
Οι βασικές λειτουργίες είναι η \eng{\textit{attach()}} η οποία δέχεται μια ακμή και προσπαθεί να τοποθετήσει τους κόμβους της στο γράφο με συνεκτικό τρόπο.
|
||||||
Και η \eng{\textit{count()}} η οποία δέχεται ένα κόμβο και μετράει πόσες φορές ο κόμβος αυτός περιέχεται στον γράφο.
|
Και η \eng{\textit{count()}} η οποία δέχεται ένα κόμβο και μετράει πόσες φορές ο κόμβος αυτός περιέχεται στον γράφο.
|
||||||
\item \eng{\textbf{Position}}\\
|
\item \eng{\textbf{Position}}\\
|
||||||
Το αντικείμενο αυτό χρησιμοποιείται για να παρέχει ένα ενοποιημένο σύστημα συντεταγμένων για όλη την εφαρμογή.
|
Το αντικείμενο αυτό χρησιμοποιείται ως ένα κοινό σύστημα αναπαράστασης συντεταγμένων για την εφαρμογή.
|
||||||
|
Ακόμα προσφέρει μεθόδους μετατροπής της μιας αναπαράστασης στην άλλη.
|
||||||
|
Οι αναπαραστάσεις αυτές όπως αναφερθήκαμε και παραπάνω είναι η καρτεσιανή που περιέχει δύο μεταβλητές για την γραμμή και τη στήλη και η μονοδιάστατη \eng{(id)}.
|
||||||
\item \eng{\textbf{Range}}\\
|
\item \eng{\textbf{Range}}\\
|
||||||
Το αντικείμενο χρησιμοποιείται για να δημιουργεί εύρη τιμών.
|
Το αντικείμενο χρησιμοποιείται για να δημιουργεί εύρη τιμών.
|
||||||
|
Για παράδειγμα ο κώδικας παρακάτω δημιουργεί ένα \eng{range} με όλες τις διευθύνσεις.
|
||||||
|
\setEnglish
|
||||||
|
\begin{verbatim}
|
||||||
|
Range dirs = new Range(DirRange.Begin, DirRange.End, DirRange.Step);
|
||||||
|
for (int dir = dirs.get() ; dir != Const.EOR ; dir = dirs.get()) {
|
||||||
|
// use dir
|
||||||
|
}
|
||||||
|
\end{verbatim}
|
||||||
|
\setGreek
|
||||||
\item \eng{\textbf{ShuffledRange}}\\
|
\item \eng{\textbf{ShuffledRange}}\\
|
||||||
Το αντικείμενο αυτό χρησιμοποιείται για να δημιουργεί “τυχαίως ανακατεμένα” εύρη τιμών.
|
Το αντικείμενο αυτό χρησιμοποιείται για να δημιουργεί \textit{“τυχαίως ανακατεμένα”} εύρη τιμών.
|
||||||
|
Η τάξη αυτή κληρονομεί την \eng{Range} και προσθέτει τη λειτουργία του τυχαίου ανακατέματος των τιμών.
|
||||||
|
Για παράδειγμα παρακάτω δημιουργούμε μια τυχαία σειρά από όλα τα πλακίδια του ταμπλό.
|
||||||
|
\setEnglish
|
||||||
|
\begin{verbatim}
|
||||||
|
ShuffledRange rand = new ShuffledRange(0, N*N);
|
||||||
|
for (int tileId =rand.get(); tileId!=Const.EOR ; tileId=rand.get()){
|
||||||
|
// use tileId
|
||||||
|
}
|
||||||
|
\end{verbatim}
|
||||||
|
\setGreek
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
Τόσο η \eng{Range} όσο και η \eng{ShuffledRange} έχουν μια μέθοδο \eng{\textit{get()}} η οποία επιστρέφει και αφαιρεί το πρώτο στοιχείο από το \eng{range}.
|
||||||
|
Όταν το \eng{range} είναι άδειο τότε επιστρέφει την τιμή φρουρό \eng{EOR - End of Range}.
|
||||||
|
|
||||||
\section{Εκτελέσιμο}
|
\par Τα υπόλοιπα αντικείμενα είναι τα ζητηθέντα.
|
||||||
|
Σε αυτά δεν έχουμε αλλάξει τις προδιαγραφές με εξαίρεση τις μεθόδους \eng{\textit{createBoard()}} και \eng{\textit{createSupply()}} στις οποίες προσθέσαμε σαν ορίσματα τα πλακίδια του Θησέα και του Μινώταυρου.
|
||||||
|
Ο λόγος είναι γιατί για τα εφόδια, θέλουμε να γνωρίζουμε σε ποια πλακίδια είναι οι παίχτες, ώστε να μην τοποθετήσουμε εκεί κάποιο εφόδιο.
|
||||||
|
Για το ταμπλό δε, γιατί θέλουμε να ξέρουμε σε ποια πλακίδια θα τοποθετήσουμε τους παίχτες.
|
||||||
|
|
||||||
\section{Συμπεράσματα και παρατηρήσεις}
|
|
||||||
|
\section{Εκτελέσιμο} \label{sec:excecutable}
|
||||||
|
Όπως αναφέραμε και στην παράγραφο με τα παραδοτέα, σε αυτά υπάρχει και το παραγόμενο εκτελέσιμο για την γραμμή εντολών.
|
||||||
|
Πρόκειται για ένα \eng{jar} αρχείο το οποίο μπορεί κάποιος να εκτελέσει σε ένα τερματικό, μέσω της εντολής \eng{\texttt{java -jar labyrinth}}.
|
||||||
|
\InsertFigure{0.9}{fig:executable_help}{images/screenshot_help.png}{
|
||||||
|
Οι διαθέσιμες επιλογές και οι τρόποι με τους οποίους μπορούμε να εκτελέσουμε το παιχνίδι.
|
||||||
|
}
|
||||||
|
Στον κώδικά μας χρησιμοποιούμε \eng{asserions} ώστε να ελέγξουμε την είσοδο και τις επιλογές του χρήστη.
|
||||||
|
Επομένως αν κάποιος θέλει να πειραματιστεί με τις επιλογές καλό θα ήταν να τα ενεργοποιήσει στην \eng{VM} της \eng{java} με την παράμετρο \eng{\texttt{-ea}}.
|
||||||
|
Σε αυτή την περίπτωση θα μπορούσε να εκτελέσει \eng{\texttt{java -ea -jar labyrinth -i -{}-norooms ...etc}}
|
||||||
|
|
||||||
|
\par Το παραγόμενο \eng{jar} παρέχει ένα αριθμό από επιλογές-ορίσματα τα οποία ελέγχουν την λειτουργία του παιχνιδιού.
|
||||||
|
Τις επιλογές αυτές μπορούμε να δούμε και από την γραμμή εντολών απλώς εκτελώντας την εντολή \eng{\texttt{java -jar labyrinth -h}}.
|
||||||
|
Στο σχήμα \ref{fig:executable_help} μπορούμε να δούμε ένα στιγμιότυπο με τις διαθέσιμες επιλογές-ορίσματα.
|
||||||
|
Αναλυτικά, εκτός από την \eng{\texttt{-h}} αυτές είναι:
|
||||||
|
\begin{itemize}
|
||||||
|
\item \eng{\textbf{-i}} ή \eng{\textbf{-{}-interactive}}\\
|
||||||
|
Αυτό το όρισμα ενεργοποιεί το \eng{\textit{“interactive mode”}}.
|
||||||
|
Πρόκειται για λειτουργία κατά την οποία το παιχνίδι μετά από κάθε γύρο σταματά και περιμένει είσοδο από τον χρήστη για να προχωρήσει στον επόμενο.
|
||||||
|
Αν αυτή η λειτουργία δεν είναι ενεργοποιημένη, τότε το παιχνίδι εκτελείται μονομιάς και στην έξοδο εκτυπώνονται όλοι οι γύροι αμέσως μετά την είσοδο της εντολής.
|
||||||
|
\textit{Αυτή η επιλογή είναι απενεργοποιημένη ως προεπιλογή}.
|
||||||
|
|
||||||
|
\item \eng{\textbf{-{}-norooms}}\\
|
||||||
|
Αυτό το όρισμα ενεργοποιεί την λειτουργία της εύρεσης και αποτροπής των κλειστών δωματίων.
|
||||||
|
Αν δεν γίνει χρήση αυτή της επιλογής, τότε η λειτουργία αυτή είναι απενεργοποιημένη ως προεπιλογή.
|
||||||
|
Η ενεργοποίησή της θεωρούμε πως είναι καλή επιλογή.
|
||||||
|
Ο λόγος που δεν την προ-επιλέγουμε είναι γιατί δεν ζητείται ρητά από την εκφώνηση.
|
||||||
|
|
||||||
|
\item \eng{\textbf{-b}} ή \eng{\textbf{-{}-board}}\\
|
||||||
|
Αυτό το όρισμα απαιτείται να ακολουθηθεί από ένα θετικό ακέραιο που περιγράφει το επιθυμητό μέγεθος της πλευράς του ταμπλό.
|
||||||
|
Πχ:\\[1.2ex]
|
||||||
|
\eng{\texttt{java -jar labyrinth -b 11}}\\[1.2ex]
|
||||||
|
Αν ο χρήστης δεν χρησιμοποιήσει την επιλογή τότε το προεπιλεγμένο μέγεθος είναι 15.
|
||||||
|
|
||||||
|
\item \eng{\textbf{-s}} ή \eng{\textbf{-{}-supplies}}\\
|
||||||
|
Αυτό το όρισμα απαιτείται να ακολουθηθεί από ένα θετικό ακέραιο που περιγράφει τον επιθυμητό αριθμό των εφοδίων για το παιχνίδι.
|
||||||
|
Πχ:\\[1.2ex]
|
||||||
|
\eng{\texttt{java -jar labyrinth -b 11 -s 7}}\\[1.2ex]
|
||||||
|
Αν ο χρήστης δεν χρησιμοποιήσει την επιλογή τότε ο προεπιλεγμένος αριθμός είναι 4.
|
||||||
|
|
||||||
|
\item \eng{\textbf{-r}} ή \eng{\textbf{-{}-rounds}}\\
|
||||||
|
Αυτό το όρισμα απαιτείται να ακολουθηθεί από ένα θετικό ακέραιο που περιγράφει τον επιθυμητό αριθμό γύρων μέχρι να ολοκληρωθεί το παιχνίδι.
|
||||||
|
Πχ:\\[1.2ex]
|
||||||
|
\eng{\texttt{java -jar labyrinth -r 200 -s 7}}\\[1.2ex]
|
||||||
|
Αν ο χρήστης δεν χρησιμοποιήσει την επιλογή τότε ο προεπιλεγμένος αριθμός είναι 100.
|
||||||
|
\end{itemize}
|
||||||
|
\InsertFigure{0.5}{fig:executable}{images/screenshot.png}{
|
||||||
|
Στιγμιότυπο από την εκτέλεση του προγράμματος σε \eng{interactive mode} και με αποφυγή κλειστών δωματίων.
|
||||||
|
Η εντολή που χρησιμοποιήθηκε είναι \eng{\texttt{java -jar labyrinth -i -{}-norooms}}
|
||||||
|
}
|
||||||
|
|
||||||
|
\section{Παρατηρήσεις}
|
||||||
|
Σε αυτό το σημείο θα θέλαμε να παρατηρήσουμε και μια σχεδιαστική αβλεψία.
|
||||||
|
Το κομμάτι του κώδικα που δημιουργεί χρήστες καθώς και ορισμένες επιλογές που τους αφορούν, όπως η θέση τους στο ταμπλό, οι κινήσεις κ.α., δεν είναι υλοποιημένο με τον καλύτερο δυνατό τρόπο.
|
||||||
|
Θα θέλαμε να ήταν πιο γενικό και παραμετροποιήσιμο.
|
||||||
|
Ο λόγος που δεν είναι, έχει να κάνει αρκετά και με την υποψία μας, πως αυτό το υποσύστημα θα χρειαστεί να αλλάξει αρκετά στις επόμενες εργασίες.
|
||||||
|
Αν εκτιμήσαμε λανθασμένα, τότε είναι απλώς κρίμα.
|
||||||
|
|
||||||
|
\par Μια τεχνική που δεν χρησιμοποιήσαμε αλλά μας προβλημάτισε αν θα το κάναμε ή όχι ήταν τα \eng{generics}.
|
||||||
|
Η αρχική μας σκέψη, καθώς ήμαστε επηρεασμένοι ξεκάθαρα από την \eng{C++}, ήταν οι τάξεις \eng{Edge, Graph, Range} και \eng{ShuffledRange} να είναι \eng{generics}.
|
||||||
|
Το γεγονός όμως ότι τα αντικείμενα αυτά θα τα χρησιμοποιούσαμε μονάχα σε αυτή την εργασία, μας απέτρεψε.
|
||||||
|
Μια απλή υλοποίηση μόνο για \eng{int} ήταν αρκετή και κάτι διαφορετικό θα εισήγαγε περιττή πολυπλοκότητα.
|
||||||
|
|
||||||
|
\par Κλείνοντας θα θέλαμε να παρατηρήσουμε πως η παρούσα υλοποίηση θεωρούμε ότι ήταν μια προσπάθεια να ισορροπήσουμε μεταξύ των ζητηθέντων και μεταξύ πρακτικών που ίσως μας βοηθήσουν στη συνέχεια για συγγραφή ευκολότερου και καθαρότερου κώδικα.
|
||||||
|
Γενικά πιστεύουμε πως \textbf{αν ο χρήστης μιας βάσης κώδικα έχει τη δυνατότητα να χρησιμοποιήσει λανθασμένα τον κώδικα, κάποια στιγμή θα το κάνει.}
|
||||||
|
Ακόμα και αν ο χρήστης είναι ο ίδιος ο αρχικός συντάκτης του κώδικα.
|
||||||
|
Για το λόγο αυτό προσπαθήσαμε να περιορίσουμε, όπου αυτό δεν ήταν αντίθετο με τα ζητούμενα, την δυνατότητα της λανθασμένης χρήσης εισάγοντας αρκετά επιπλέον αντικείμενα και δομές ως εργαλεία για την εφαρμογή.
|
||||||
|
Τέτοια για παράδειγμα είναι η τάξη \eng{Position} ή η αποφυγή των \eng{setters} κτλ.
|
||||||
|
Ελπίζουμε να μην θεωρηθούν υπερβολικά.
|
||||||
|
|
||||||
% References
|
% References
|
||||||
% ============================
|
% ============================
|
||||||
|
|||||||
@@ -2,9 +2,12 @@
|
|||||||
* @file Board.java
|
* @file Board.java
|
||||||
*
|
*
|
||||||
* @author
|
* @author
|
||||||
* Christos Choutouridis
|
* Anastasia Foti AEM:8959
|
||||||
|
* <anastaskf@ece.auth.gr>
|
||||||
|
*
|
||||||
|
* @author
|
||||||
|
* Christos Choutouridis AEM:8997
|
||||||
* <cchoutou@ece.auth.gr>
|
* <cchoutou@ece.auth.gr>
|
||||||
* AEM:8997
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package host.labyrinth;
|
package host.labyrinth;
|
||||||
@@ -42,6 +45,7 @@ class Board {
|
|||||||
*/
|
*/
|
||||||
Board(int N, int S) {
|
Board(int N, int S) {
|
||||||
assert (N%2 != 0) : "Board's size has to be an odd number.";
|
assert (N%2 != 0) : "Board's size has to be an odd number.";
|
||||||
|
assert (S <= (N*N-2)) : "At least 2 tiles has to be without supplies.";
|
||||||
this.N = Session.boardSize = N;
|
this.N = Session.boardSize = N;
|
||||||
this.S = S;
|
this.S = S;
|
||||||
this.W = 0;
|
this.W = 0;
|
||||||
@@ -394,7 +398,7 @@ class Board {
|
|||||||
if (tiles[tileId].hasWalls() >= Const.maxTileWalls)
|
if (tiles[tileId].hasWalls() >= Const.maxTileWalls)
|
||||||
return false;
|
return false;
|
||||||
Range dirs = new Range(DirRange.Begin, DirRange.End, DirRange.Step);
|
Range dirs = new Range(DirRange.Begin, DirRange.End, DirRange.Step);
|
||||||
for (int dir ; (dir = dirs.get()) != Const.noTileId ; )
|
for (int dir = dirs.get() ; dir != Const.EOR ; dir = dirs.get())
|
||||||
if (isWallableDir(tileId, dir))
|
if (isWallableDir(tileId, dir))
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
@@ -457,7 +461,7 @@ class Board {
|
|||||||
for (int tileId, i =0, walls =0, shuffleMark =0 ; true ; ) {
|
for (int tileId, i =0, walls =0, shuffleMark =0 ; true ; ) {
|
||||||
// randomly pick a wallable tile.
|
// randomly pick a wallable tile.
|
||||||
do {
|
do {
|
||||||
if ((tileId = randTiles.get())== Const.noTileId) {
|
if ((tileId = randTiles.get())== Const.EOR) {
|
||||||
if (i == shuffleMark) // Wallable tiles exhausted.
|
if (i == shuffleMark) // Wallable tiles exhausted.
|
||||||
return walls;
|
return walls;
|
||||||
else { // Re-shuffle and continue.
|
else { // Re-shuffle and continue.
|
||||||
|
|||||||
@@ -2,9 +2,12 @@
|
|||||||
* @file Common.java
|
* @file Common.java
|
||||||
*
|
*
|
||||||
* @author
|
* @author
|
||||||
* Christos Choutouridis
|
* Anastasia Foti AEM:8959
|
||||||
|
* <anastaskf@ece.auth.gr>
|
||||||
|
*
|
||||||
|
* @author
|
||||||
|
* Christos Choutouridis AEM:8997
|
||||||
* <cchoutou@ece.auth.gr>
|
* <cchoutou@ece.auth.gr>
|
||||||
* AEM:8997
|
|
||||||
*/
|
*/
|
||||||
package host.labyrinth;
|
package host.labyrinth;
|
||||||
|
|
||||||
@@ -18,6 +21,7 @@ class Const {
|
|||||||
static final int maxTileWalls = 2; /**< Number of maximum walls for each tile on the board */
|
static final int maxTileWalls = 2; /**< Number of maximum walls for each tile on the board */
|
||||||
static final int noSupply =-1; /**< Number to indicate the absent of supply */
|
static final int noSupply =-1; /**< Number to indicate the absent of supply */
|
||||||
static final int noTileId =-1; /**< Number to indicate wrong tileId */
|
static final int noTileId =-1; /**< Number to indicate wrong tileId */
|
||||||
|
static final int EOR =-1; /**< Number to indicate the End Of Range */
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Application wide object to hold settings like values for the session.
|
* Application wide object to hold settings like values for the session.
|
||||||
@@ -193,7 +197,7 @@ class Range {
|
|||||||
int get () {
|
int get () {
|
||||||
if (!numbers.isEmpty())
|
if (!numbers.isEmpty())
|
||||||
return numbers.remove(0);
|
return numbers.remove(0);
|
||||||
return Const.noTileId;
|
return Const.EOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @name protected data types */
|
/** @name protected data types */
|
||||||
|
|||||||
@@ -2,19 +2,40 @@
|
|||||||
* @file Game.java
|
* @file Game.java
|
||||||
*
|
*
|
||||||
* @author
|
* @author
|
||||||
* Christos Choutouridis
|
* Anastasia Foti AEM:8959
|
||||||
|
* <anastaskf@ece.auth.gr>
|
||||||
|
*
|
||||||
|
* @author
|
||||||
|
* Christos Choutouridis AEM:8997
|
||||||
* <cchoutou@ece.auth.gr>
|
* <cchoutou@ece.auth.gr>
|
||||||
* AEM:8997
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @mainpage A labyrinth board game
|
* @mainpage A labyrinth board game
|
||||||
*
|
*
|
||||||
* @section intro_sec Introduction
|
* This is a console game, played by 2 players. The Theseus and Minotaur.
|
||||||
|
* The Minotaur goal is to capture Theseus. The Theseus's goal is to collect
|
||||||
|
* all the supplies of the board before Minotaur catches him and before the
|
||||||
|
* game ends.
|
||||||
*
|
*
|
||||||
* This is the introduction.
|
* In this first assignment we deal with the board's creation and a basic
|
||||||
|
* player-game logic. The game is build around a number of classes:
|
||||||
|
* - \ref Tile
|
||||||
|
* - Supply
|
||||||
|
* - Board
|
||||||
|
* - Player
|
||||||
|
* - Game
|
||||||
*
|
*
|
||||||
* etc...
|
* Which are the requested classes. We also provide some extra functionalities in:
|
||||||
|
* - Const
|
||||||
|
* - Session
|
||||||
|
* - Direction
|
||||||
|
* - DirRange
|
||||||
|
* - Edge
|
||||||
|
* - Graph
|
||||||
|
* - Position
|
||||||
|
* - Range
|
||||||
|
* - ShuffledRange
|
||||||
*/
|
*/
|
||||||
package host.labyrinth;
|
package host.labyrinth;
|
||||||
|
|
||||||
@@ -80,7 +101,7 @@ public class Game {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case "-s":
|
case "-s":
|
||||||
case "--suplies":
|
case "--supplies":
|
||||||
if (i+1 < args.length)
|
if (i+1 < args.length)
|
||||||
Session.supplySize = Integer.parseInt(args[++i]);
|
Session.supplySize = Integer.parseInt(args[++i]);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -2,9 +2,12 @@
|
|||||||
* @file Player.java
|
* @file Player.java
|
||||||
*
|
*
|
||||||
* @author
|
* @author
|
||||||
* Christos Choutouridis
|
* Anastasia Foti AEM:8959
|
||||||
|
* <anastaskf@ece.auth.gr>
|
||||||
|
*
|
||||||
|
* @author
|
||||||
|
* Christos Choutouridis AEM:8997
|
||||||
* <cchoutou@ece.auth.gr>
|
* <cchoutou@ece.auth.gr>
|
||||||
* AEM:8997
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package host.labyrinth;
|
package host.labyrinth;
|
||||||
|
|||||||
@@ -2,9 +2,12 @@
|
|||||||
* @file Supply.java
|
* @file Supply.java
|
||||||
*
|
*
|
||||||
* @author
|
* @author
|
||||||
* Christos Choutouridis
|
* Anastasia Foti AEM:8959
|
||||||
|
* <anastaskf@ece.auth.gr>
|
||||||
|
*
|
||||||
|
* @author
|
||||||
|
* Christos Choutouridis AEM:8997
|
||||||
* <cchoutou@ece.auth.gr>
|
* <cchoutou@ece.auth.gr>
|
||||||
* AEM:8997
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package host.labyrinth;
|
package host.labyrinth;
|
||||||
|
|||||||
@@ -2,9 +2,12 @@
|
|||||||
* @file Tile.java
|
* @file Tile.java
|
||||||
*
|
*
|
||||||
* @author
|
* @author
|
||||||
* Christos Choutouridis
|
* Anastasia Foti AEM:8959
|
||||||
|
* <anastaskf@ece.auth.gr>
|
||||||
|
*
|
||||||
|
* @author
|
||||||
|
* Christos Choutouridis AEM:8997
|
||||||
* <cchoutou@ece.auth.gr>
|
* <cchoutou@ece.auth.gr>
|
||||||
* AEM:8997
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package host.labyrinth;
|
package host.labyrinth;
|
||||||
|
|||||||
Reference in New Issue
Block a user