Skip to content

MartinBronzo/ingswAM2021-Bindi-Borsatto-Bronzo

Repository files navigation

Final Project Software Engineering Politecnico di Milano (academic year 2020/21)

Introduction

Welcome to our Software Engineering 1 final project, undertaken as part of the academic year 2020-2021 coursework, earning us 3CFU (academic credits). This project represents the culmination of our efforts in the course, showcasing our skills and understanding of software engineering principles.

Project Overview

Our endeavor focuses on the digital adaptation of the board game Maestri del Rinascimento (Masters of Renaissance). This strategic board game, set in the Renaissance era, challenges players to navigate the intricacies of commerce, resource management, and strategic decision-making. Our software implementation aims to faithfully recreate the engaging gameplay experience of the physical board game in a digital format.

Creators

Ludovica Bindi
Andrea Borsatto
Martin Bronzo

Project Delivery (In Italian) - ingswAM2021-Bindi-Borsatto-Bronzo

Recap

Questa applicazione è la nostra versione software del gioco da tavolo Maestri del Rinascimento. Abbiamo applicato le seguenti funzionalità:
  • Regole complete (partita solitario inclusa)
  • CLI
  • GUI
  • Partite multiple
  • Resilienza alle disconnessioni

UML e User Diagram

Questi sono gli UML del nostro model:

Questo è l'UML del Controller:

Questi sono gli User Diagram che abbiamo preparato per la progettazione della comunicazione tra client e server:

Aspetti salienti

Vogliamo evidenziare le seguenti parti della nostra realizzazione dell'applicazione:

  • Lettura degli elementi del gioco da file XML:
    • Una volta che una partita viene creata, vengono letti da vari file XML come sono composte le Carte Sviluppo, le carte Leader, le Tessere Favore Papale e i Seganlini delle Azioni di Lorenzo, oltre che alla struttura del Tracciato Fede e del Mercato
    • Questo ci permette una maggiore estendebilità del codice poiché modifiche dei valori di questi elementi diventano trasparenti al nostro codice
  • Utilizzo del pattern Observer all'interno del Model:
    • Abbiamo utilizzato questo pattern per attivare i Rapporti in Vaticano (le Celle Papali una volta attraversate notificano gli Observer) e per reagire ai Segnalini di Lorenzo (una volta estratti questi chiamano gli Observer)
    • Questo ci ha permesso di separare la logica della struttura degli elementi del gioco da cosa succede quando questi vengono attivati
  • Invio di JSON tra client e server:
    • Abbiamo incapsulato dentro degli oggetti standard (i Command per la comunicazione Client - Server e i ResponseMessage per il contrario) i nostri messaggi particolari: entrambi contengono due campi che si riferiscono al tipo di messaggio incapsulato e all'effettivo messaggio salvato anch'esso come JSON
    • Questa particolare struttura ci ha permesso una standardizzazione della ricezione e invio di messaggi che ha facilitato la scrittura del codice
  • Effetti delle leadercard
    • Nella nostra implementazione, gli effetti delle Carte Leader sono degli oggetti che quest'ultime posseggono come attributo per poter utilizzare un approccio più funzionale: ai metodi che implementano delle azioni in cui si possono utilizzare gli effetti di queste carte viene passato un oggetto Effect che si occupa di applicare il suo potere in modo trasparente al metodo stesso (questo non è vero per gli effetti chiamati ExtraSlot perché il loro effetto è in sostanza attivabile una sola volta)
    • Inoltre, tutti gli effetti delle carte estendono una classe generica Effect che contiene una implementazione "dumb" di tutti i metodi con cui gli Effetti svolgono il proprio compito: sarà poi compito di ciascuna classe effetto particolare reimplementare i metodi di loro pertinenza. Questo può risultare in un vantaggio qualora a un metodo venga passato un Effetto di tipo sbagliato perché questo metodo non lancerebbe eccezioni (semplicemente non si guadagna nulla da questo utilizzo)
  • Comunicazione essenziale
    • Abbiamo deciso di avere una comunicazione molto limitata nel numero di messaggi scambiati per svolgere una determinata azione: la memoria dell'interazione viene salvata lato Client, semplificando così la scrittura del Server
    • Le comunicazioni per svolgere una azione (per es., comprare dal mercato) sono così strutturate: prima il client chiede quale possibile outcome avrebbe da questa sua azione (quante e quali risorse otterebbe), poi successivamente avendo questa informazione risponde al server specifacando tutti i dettagli per svolgere questa azione (su quale scaffale depositare quale risorsa e quale scartare)
  • Struttura intelligente GUI (panel manager e riutilizzo componenti visivi)
    • La nostra GUI è stata progettata cercando di avere una alta separazione dei compiti: abbiamo una classe, GuiClient, che si occupa solo dell'interazione con il Server (invio e ricezione dei messaggi) e una classe PanelManager che si occupa solo di cambiare le viste per l'utente. Questo ci ha facilitato nella fase di scrittura e di debugging
    • Inoltre, dopo aver pianificato cosa volessimo che l'utente vedesse e potesse fare (tramite questo disegno), abbiamo creato prima gli oggetti comuni (per es., i Depositi su cui si potessero fare dei drop di risorse, i Depositi da cui fare drag di risorse, etc.) per poter poi ricreare le nostre viste semplicemente mettendo insieme i vari pezzi che ci servivano

Cheats

Abbiamo implementato un comando di cheat (da CLI scrivere "CHEAT", da GUI cliccare sul bottone "Cheat") che permette di guadagnare risorse e depositarle nel Forziere senza prenderle dal Mercato o attivando la produzione. Le risorse vengono distribuite a tutti i giocatori.

Comandi da utilizzare

Per runnare la nostra applicazione, prima bisogna far partire il server tramite

java -jar AM52-1.0-SNAPSHOT-jar-with-dependencies.jar --server 9047

Purtroppo abbiamo avuto problemi con la creazione del JAR del server perché questo non riesce a trovare dinamicamente i file XML di configurazione descritti sopra. Se il server viene fatto partire da Intellij e si fa partire il client pure da JAR, si può usare traquillamente l'applicativo.

Successivamente si può utilizzare la CLI:

java -jar AM52-1.0-SNAPSHOT-jar-with-dependencies.jar --cli --IP 127.0.0.1 9047
java -jar AM52-1.0-SNAPSHOT-jar-with-dependencies.jar -c --IP 127.0.0.1 9047

O la GUI:

java -jar AM52-1.0-SNAPSHOT-jar-with-dependencies.jar --IP 127.0.0.1 9047

Creatori

Made with love by (in ordine alfabetico)
Ludovica Bindi (10619971)
Andrea Borsatto (10628989)
Martin Bronzo (10619358)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages