Μπορείτε να κατεβάσετε τοπικά ή να επισκευτείτε την σελίδα: https://users.iee.ihu.gr/~iee2019119/ADISE23_BattleshipGame/
- Apache2
- Mysql Server
- php
-
Κάντε clone το project σε κάποιον φάκελο
$ git clone https://github.com/iee-ihu-gr-course1941/ADISE23_BattleshipGame.git
-
Βεβαιωθείτε ότι ο φάκελος είναι προσβάσιμος από τον Apache Server. Πιθανόν να χρειαστεί να καθορίσετε τις παρακάτω ρυθμίσεις.
-
Θα πρέπει να δημιουργήσετε στην Mysql την βάση με όνομα 'battleshipgamedb' και να φορτώσετε σε αυτήν την βάση τα δεδομένα από το αρχείο schema.sql
-
Θα πρέπει να φτιάξετε το αρχείο lib/config_local.php το οποίο να περιέχει:
<?php
$DB_PASS = 'κωδικός';
$DB_USER = 'όνομα χρήστη';
?>
-
Χαρακτηριστικά και Στόχος Παιχνιδιού:
Το Battleship Game είναι ένα board game για δύο παίκτες στο οποίο οι αντίπαλοι προσπαθούν να μαντέψουν τη θέση των πολεμικών πλοίων του αντιπάλου τους και να τα βυθίσουν. Το gameplay είναι απλό. Κάθε παίκτης κρύβει πλοία σε ένα πλέγμα/πίνακα που περιέχει κάθετες και οριζόντιες συντεταγμένες χώρου. Οι παίκτες επιλέγουν εναλλάξ τις συντεταγμένες σειρών και στηλών στο πλέγμα του άλλου παίκτη σε μια προσπάθεια να αναγνωρίσουν ένα τετράγωνο που περιέχει ένα κομμάτι πλοίου. Η οθόνη παιχνιδιού του κάθε παίκτη περιλαμβάνει 2 πλέγματα/πίνακες. Το πρώτο πλέγμα χρησιμοποιείται από τον παίκτη για να «κρύψει» τη θέση των δικών του πλοίων, ενώ το δεύτερο χρησιμοποιείται για να ρίξει τις βολές προς τον αντίπαλο και να τεκμηριώσει εάν αυτές οι βολές ήταν χτυπήματα (hit) ή αστοχίες (miss).
-
Εκκίνηση Παιχνιδιού:
Κάθε παίκτης λαμβάνει τον δικό του πίνακα παιχνιδιού και πέντε πλοία διαφορετικού μήκους. Κάθε πλοίο εισάγεται από τον χρήστη στις συντεταγμένες του πίνακα που επέλεξε να τοποθετήσει. Τα πέντε πλοία είναι τα εξής:
- Carrier, που πιάνει πέντε σημεία.
- Battleship, το οποίο πιάνει τέσσερα σημεία.
- Cruiser, που πιάνει τρεία σημεία.
- Submarine, το οποίο πιάνει και αυτό τρεία σημεία.
- Destroyer, που πιάνει δύο σημεία.
Ο κάθε παίκτης δεν μπορεί να δει τις τοποθεσίες των πλοίων του αντιπάλου του. Πριν ξεκινήσει το παιχνίδι, κάθε παίκτης τοποθετεί κρυφά τα δικά του πέντε πλοία στο πλέγμα του ωκεανού, εισάγωντάς τα στον αντίστοιχο πίνακα. Κάθε πλοίο πρέπει να τοποθετείται οριζόντια ή κατακόρυφα στους χώρους του πλέγματος —όχι διαγώνια— και τα πλοία δεν μπορούν τοποθετηθούν εκτός πίνακα. Τα πλοία μπορούν να αγγίξουν το ένα το άλλο, αλλά δεν μπορούν να καταλαμβάνουν τον ίδιο χώρο στο πλέγμα. Δεν μπορείτε να αλλάξετε τη θέση των πλοίων μετά την έναρξη του παιχνιδιού.
- Carrier, που πιάνει πέντε σημεία.
-
Gameplay:
Οι παίκτες ρίχνουν εναλλάξ βολές για να προσπαθήσουν να χτυπήσουν τα εχθρικά πλοία του αντιπάλου. Στη σειρά σας, πυροβολήστε μια βολή κάνοντας κλικ σε μια συντεταγμένη στον πίνακα του αντιπάλου. Αφού πυροβολήσετε εμφανίζεται: "miss" (λευκό χρώμα) εάν δεν υπάρχει πλοίο εκεί ή "hit" (κόκκινο χρώμα) εάν έχετε μαντέψει σωστά ένα σημείο στο οποίο καταλαμβάνεται ένα κομμάτι πλοίου. Καθώς το παιχνίδι προχωρά, οι κόκκινες περιοχές θα προσδιορίζουν σταδιακά το μέγεθος και τη θέση των πλοίων του αντιπάλου σας. Όταν είναι η σειρά του αντιπάλου σας να πυροβολήσει εναντίον σας, κάθε φορά που ένα από τα πλοία σας δέχεται ένα χτύπημα, θα εμφανίζεται αντίστοιχα κόκκινο χρώμα στην συντεταγμένη του πλοίου που αντιστοιχεί στο σημείο του πίνακά σας. Όταν όλα τα κομμάτια ενός πλοίου σας έχουν κόκκινο χρώμα, τότε το πλοίο σας βυθίζεται. Ο πρώτος παίκτης που θα βυθίσει και τα πέντε πλοία του αντιπάλου του κερδίσει το παιχνίδι.
-
Modes:
- Singleplayer
- Multiplayer
-
Πίνακες:
- board:
- player
- coordinate
- ship
- state
- board_empty
- player
- coordinate
- ship
- state
- game_status
- status
- player_turn
- result
- last_change
- players
- username
- player_number
- token
- last_action
- board:
-
Διαδικασίες:
- clean_board
- Αλέξανδρος Οικονόμου 2019119
- Βασίλειος Μούρτζιος 185237
- Στυλιανός Παναγιωτόπουλος 2019123
- Κωνσταντίνος Κυριάκος Μπάτσιος 2019110
GET /board/
Επιστρέφει το Board.
POST /board/
Αρχικοποιεί το Board, δηλαδή το παιχνίδι. Γίνονται reset τα πάντα σε σχέση με το παιχνίδι.
Επιστρέφει το Board.
POST /board/set_ships/
Json Data:
Field | Description | Required |
---|---|---|
destroyer_coord1 |
H 1η συντεταγμένη του καραβιού Destroyer | yes |
destroyer_coord2 |
H 2η συντεταγμένη του καραβιού Destroyer | yes |
submarine_coord1 |
H 1η συντεταγμένη του καραβιού Submarine | yes |
submarine_coord2 |
H 2η συντεταγμένη του καραβιού Submarine | yes |
submarine_coord3 |
H 3η συντεταγμένη του καραβιού Submarine | yes |
cruiser_coord1 |
H 1η συντεταγμένη του καραβιού Cruiser | yes |
cruiser_coord2 |
H 2η συντεταγμένη του καραβιού Cruiser | yes |
cruiser_coord3 |
H 3η συντεταγμένη του καραβιού Cruiser | yes |
battleship_coord1 |
H 1η συντεταγμένη του καραβιού Battleship | yes |
battleship_coord2 |
H 2η συντεταγμένη του καραβιού Battleship | yes |
battleship_coord3 |
H 3η συντεταγμένη του καραβιού Battleship | yes |
battleship_coord4 |
H 4η συντεταγμένη του καραβιού Battleship | yes |
carrier_coord1 |
H 1η συντεταγμένη του καραβιού Carrier | yes |
carrier_coord2 |
H 2η συντεταγμένη του καραβιού Carrier | yes |
carrier_coord3 |
H 3η συντεταγμένη του καραβιού Carrier | yes |
carrier_coord4 |
H 4η συντεταγμένη του καραβιού Carrier | yes |
carrier_coord5 |
H 5η συντεταγμένη του καραβιού Carrier | yes |
Εκτελείτε μετά την εισαγωγή του κάθε πλοίου στις συντεταγμένες του πίνακα.
Ενημερώνει σε συγκεκριμένα coordinate, ship και player τα state του πίνακα board σε 'ship'.
Ενημερώνει το player_turn του πίνακα game_status αλλάζοντας την σειρά του παίκτη.
Στη συνέχεια, γίνεται ο κατάλληλος χειρισμός για την προσθήκη πράσινου χρώματος σε αυτά τα coordinate του πίνακα, τα οποία θα αντιπροσωπεύουν τα κομμάτια του κάθε πλοίου.
POST /board/make_move/
Json Data:
Field | Description | Required |
---|---|---|
choice |
Η επιλογή χτυπήματος του πάικτη | yes |
player_number |
Ο αριθμός του παίκτη που έκανε το χτύπημα | yes |
Εκτελείτε μετά την επιλογή χτυπήματος του χρήστη σε μία συντεταγμένη του αντίπαλου πίνακα.
Ενημερώνει σε συγκεκριμένο coordinate και αντίπαλο παίκτη το state του πίνακα board σε 'hit' ή 'miss' αναλόγως.
Ενημερώνει το player_turn του πίνακα game_status αλλάζοντας την σειρά του παίκτη.
Τέλος, ενημερώνει το result του πίνακα game_status, εάν υπάρξει o αντίστοιχος νικητής, και άρα το status του σε 'ended'.
GET /board/handle_hits_p1/
GET /board/handle_hits_p2/
Επιστρέφει όλα τα coordinate από τον πίνακα board, τα οποία έχουν state ίσο με 'hit'.
Το handle_hits_p1 επιστρέφει αυτά του παίκτη 1 ενώ το handle_hits_p2 επιστρέφει αυτά του παίκτη 2.
Στη συνέχεια, γίνεται ο κατάλληλος χειρισμός για την προσθήκη κόκκινου χρώματος σε αυτά τα coordinate του πίνακα, τα οποία θα αντιπροσωπεύουν όλα τα 'hit'.
GET /board/handle_miss_p1/
GET /board/handle_miss_p2/
Επιστρέφει όλα τα coordinate από τον πίνακα board, τα οποία έχουν state ίσο με 'miss'.
Το handle_miss_p1 επιστρέφει αυτά του παίκτη 1 ενώ το handle_miss_p2 επιστρέφει αυτά του παίκτη 2.
Στη συνέχεια, γίνεται ο κατάλληλος χειρισμός για την προσθήκη άσπρου χρώματος σε αυτά τα coordinate του πίνακα, τα οποία θα αντιπροσωπεύουν όλα τα 'miss'.
GET /players/
Επιστρέφει τα username όλων των παικτών από τον πίνακα players.
POST /players/
Json Data:
Field | Description | Required |
---|---|---|
username |
Το username του παίκτη | yes |
player_number |
Τον αριθμό που διάλεξε ο χρήστης να παίξει | yes |
Εκτελείτε όταν γίνει το Login.
Ενημερώνει τα username, player_number και token του πίνακα players.
Το token αυτό είναι μοναδικό και το χρησιμοποιεί ο παίκτης καθόλη τη διάρκεια του παιχνιδιού.
Τέλος, ενημερώνει το status του πίνακα game_status σε 'initialized' (login: ο 1ος παίκτης) ή σε 'started' (login: και οι δύο παίκτες).
GET /status/
Επιστρέφει τα στοιχεία του Game_status.
Το board είναι ένας πίνακας, ο οποίος στο κάθε στοιχείο έχει τα παρακάτω. Ακριβώς τα ίδια στοιχεία έχει και ο πίνακας board_empty.
Attribute | Description | Values |
---|---|---|
player |
Ο αριθμός του παίκτη | 'p1', 'p2' |
coordinate |
H συντεταγμένη | A1..J10 |
ship |
To όνομα του πλοίου | 'Destroyer', 'Submarine', 'Cruiser', 'Battleship', 'Carrier' |
state |
Η κατάσταση της συντεταγμένης | 'empty', 'ship', 'hit', 'miss' |
O κάθε παίκτης έχει τα παρακάτω στοιχεία:
Attribute | Description | Values |
---|---|---|
username |
To όνομα του παίκτη | String |
player_number |
Τον αριθμό που διάλεξε ο χρήστης να παίξει | 'p1', 'p2' |
token |
To κρυφό token του παίκτη. Δημιουργείτε μόνο τη στιγμή της εισόδου του παίκτη στο παιχνίδι | HEX |
last_action |
Τελευταία αλλαγή/ενέργεια σχετικά με τους παίκτες | TIMESTAMP |
H κατάσταση παιχνιδιού έχει τα παρακάτω στοιχεία:
Attribute | Description | Values |
---|---|---|
status |
Η τρέχον κατάσταση του παιχνιδιού | 'not active', 'initialized', 'started', 'ended', 'aborded' |
player_turn |
Η σειρά του πάικτη που παίζει | 'p1', 'p2', NULL |
result |
Ο αριθμός του παίκτη που κέρδισε | 'p1', 'p2' |
last_change |
Τελευταία αλλαγή/ενέργεια σχετικά με την κατάσταση του παιχνιδιού | TIMESTAMP |
- Timeout Check
- Background Music
- Toggle between Light Mode ⇔ Dark Mode