Skip to content

Latest commit

 

History

History
488 lines (405 loc) · 13.7 KB

06.md

File metadata and controls

488 lines (405 loc) · 13.7 KB

Pergunta

6 - Cria um projeto no Visual Studio que respeite o seguinte diagrama UML. O projeto deve ter funcionalidade mínima para demonstrar as relações indicadas no diagrama.

uml06

Soluções

Solução 1

Classe Program:

using System;

internal class Program
{
    static void Main(string[] args)
    {
        Game game = new Game();
        game.GameLoop();

        Console.WriteLine($"\nNumber of Games Played: {Game.gamesPlayed}");
    }
}

Classe Game:

using System;
using System.Collections.Generic;

public class Game
{
    static internal int gamesPlayed;
    private int numberOfPlayers;
    private Map currentMap;

    internal void GameLoop()
    {
        gamesPlayed = 0;
        List<Player> players;


        players = new List<Player>();
        {
            // Pede ao utilizador o número de jogadores
            Console.WriteLine("Create Dungeon Map\nHow many players " +
                "will spawn?");
            // Converte o input para int e guarda o mesmo na variável de 
            // mesmo tipo numberOfPlayers
            numberOfPlayers = Convert.ToInt32(Console.ReadLine());
            // Instancia Players, de número igual à variável numberOfPlayers
            // dada, pedindo os parâmetros necessários para a instanciação
            for (int id = 0; id < numberOfPlayers; id++)
            {
                Console.WriteLine("Insert player's name:");
                string playerName = Console.ReadLine();
                players.Add(new Player(id, playerName, 100.0, 100.0));
            }
        }
        // Instanciar um objeto da classe DungeonMap, guardado numa
        // variável de tipo Map
        currentMap = new DungeonMap("Dungeon", "dng.PNG", 
            players, 5);
        // ToString() da classe DungeonMap
        Console.WriteLine($"\n{currentMap}");
        // Imprimir os nomes dos jogadores neste mapa
        currentMap.PrintPlayerNames();
        // Aumentar o número de jogos jogados
        gamesPlayed++;


        players = new List<Player>();
        {
            // Pede ao utilizador o número de jogadores
            Console.WriteLine("Create Dungeon Map\nHow many players " +
                "will spawn?");
            // Converte o input para int e guarda o mesmo na variável de 
            // mesmo tipo numberOfPlayers
            numberOfPlayers = Convert.ToInt32(Console.ReadLine());
            // Instancia Players, de número igual à variável numberOfPlayers
            // dada, pedindo os parâmetros necessários para a instanciação
            for (int id = 0; id < numberOfPlayers; id++)
            {
                Console.WriteLine("Insert player's name:");
                string playerName = Console.ReadLine();
                players.Add(new Player(id, playerName, 100.0, 100.0));
            }
        }
        // Instanciar um objeto da classe OpenWorldMap, guardado numa
        // variável de tipo Map
        currentMap = new OpenWorldMap("openWrld",
            "opnWrld.PNG", players, 100.0f, 150.0f);
        // ToString() da classe OpenWorldMap
        Console.WriteLine($"\n{currentMap}\n");
        // Imprimir os nomes dos jogadores neste mapa
        currentMap.PrintPlayerNames();
        // Aumentar o número de jogos jogados
        gamesPlayed++;


        players = new List<Player>();
        {
            // Pede ao utilizador o número de jogadores
            Console.WriteLine("Create Dungeon Map\nHow many players " +
                "will spawn?");
            // Converte o input para int e guarda o mesmo na variável de 
            // mesmo tipo numberOfPlayers
            numberOfPlayers = Convert.ToInt32(Console.ReadLine());
            // Instancia Players, de número igual à variável numberOfPlayers
            // dada, pedindo os parâmetros necessários para a instanciação
            for (int id = 0; id < numberOfPlayers; id++)
            {
                Console.WriteLine("Insert player's name:");
                string playerName = Console.ReadLine();
                players.Add(new Player(id, playerName, 100.0, 100.0));
            }
        }
        // Instanciar um objeto da classe DungeonMap, guardado numa
        // variável de tipo Map
        currentMap = new DungeonMap("Dungeon2", "dng2.PNG", 
            players, 5);
        // ToString() da classe DungeonMap
        Console.WriteLine($"\n{currentMap}\n");
        // Imprimir os nomes dos jogadores neste mapa
        currentMap.PrintPlayerNames();
        // Aumentar o número de jogos jogados
        gamesPlayed++;


        players = new List<Player>();
        {
            // Pede ao utilizador o número de jogadores
            Console.WriteLine("Create Dungeon Map\nHow many players " +
                "will spawn?");
            // Converte o input para int e guarda o mesmo na variável de 
            // mesmo tipo numberOfPlayers
            numberOfPlayers = Convert.ToInt32(Console.ReadLine());
            // Instancia Players, de número igual à variável numberOfPlayers
            // dada, pedindo os parâmetros necessários para a instanciação
            for (int id = 0; id < numberOfPlayers; id++)
            {
                Console.WriteLine("Insert player's name:");
                string playerName = Console.ReadLine();
                players.Add(new Player(id, playerName, 100.0, 100.0));
            }
        }
        // Instanciar um objeto da classe OpenWorldMap, guardado numa
        // variável de tipo Map
        currentMap = new OpenWorldMap("openWrld2",
            "opnWrld2.PNG", players, 200.0f, 450.0f);
        // ToString() da classe OpenWorldMap
        Console.WriteLine($"\n{currentMap}\n");
        // Imprimir os nomes dos jogadores neste mapa
        currentMap.PrintPlayerNames();
        // Aumentar o número de jogos jogados
        gamesPlayed++;
    }
}

Classe Map:

using System;
using System.Collections.Generic;

public abstract class Map
{
    // Declarar Variáveis
    public string Name { get; }
    protected string Filename { get; }
    protected ICollection<Player> players;

    // Construtor da classe Map, com os parâmetros name, filename e
    // numberOfPlayers
    public Map(string name, string filename, List<Player> players)
    {
        this.players = players;
        Name = name;
        Filename = filename;
    }

    public override string ToString() => $"Name: {Name}\nFilename: " +
        $"{Filename}\nNumber of Players: {players.Count}\n";

    public void PrintPlayerNames()
    {
        foreach(Player p in players)
        {
            Console.WriteLine($"Player Name: {p.Name}");
        }
        Console.WriteLine();
    }
}

Classe DungeonMap:

using System.Collections.Generic;

public class DungeonMap : Map
{
    public int NumberOfDungeons { get; set; }

    public DungeonMap(string name, string filename, List<Player> players,
        int numberOfDungeons) : base(name, filename, players)
    {
        NumberOfDungeons = numberOfDungeons;
    }

    public override string ToString() => base.ToString() + $"Number of " +
        $"Dungeons: {NumberOfDungeons}\n";
}

Classe OpenWorldMap:

using System.Collections.Generic;

public class OpenWorldMap : Map
{
    public float Width { get; }
    public float Height { get; }

    public OpenWorldMap(string name, string filename, List<Player> players,
        float width, float height) : base(name, filename, players)
    {
        Width = width;
        Height = height;
    }

    public override string ToString() => base.ToString() + $"Width: " +
        $"{Width}\nHeight: {Height}";
}

Classe Player:

public class Player
{
    public int ID { get; }
    public string Name { get; }
    private double health;
    private double shield;

    public Player(int id, string name, double health, double shield)
    {
        ID = id;
        Name = name;
        this.health = health;
        this.shield = shield;
    }
}

Nota: Código de teste para este exercício encontra-se neste repositório.

Por Pedro Inácio.

Solução 2

Player

public class Player
{
    public int ID { get; }
    public string Name { get; }
    private double health, shield;

    public Player(int id, string name, double health, double shield)
    {
        ID = id;
        Name = name;
        this.health = health;
        this.shield = shield;
    }

    public void PrintPlayerName()
    {
        Console.WriteLine($"{Name}.");
    }
}

Map

public abstract class Map
{
    public string Name { get; }
    protected string Filename { get; }

    private List<Player> playerList;

    public Map(string name, string filename)
    {
        Name = name;
        Filename = filename;
        playerList = new List<Player>();
    }

    public void AddPlayer(Player player)
    {
        playerList.Add(player);
    }

    public void PrintPlayerNames()
    {
        foreach(Player p in playerList)
        {
            p.PrintPlayerName();
        }
    }
}

DungeonMap

public class DungeonMap : Map
{
    public int NumberOfDungeons { get; }

    public DungeonMap(string name, string filename, int numberOfDungeons)
        : base(name, filename)
    {
        NumberOfDungeons = numberOfDungeons;
    }
}

OpenWorldMap

public class OpenWorldMap : Map
{
    public float Width { get; }
    public float Height { get; }

    public OpenWorldMap(string name, string filename, int w, int h)
        : base(name, filename)
    {
        Width = w;
        Height = h;
    }
}

Game

public class Game
{
    internal static int gamesPlayed;
    private int numberOfPlayers;

    private Map map;

    internal void GameLoop()
    {
        // Loop boolean.
        bool run = true;
        // Variables to use for user input.
        string inputStringName, inputStringFilename;
        int inputInt, inputIntDungeons, inputIntWidth, inputIntHeight;
        double inputDoubleHealth, inputDoubleShield;

        Console.WriteLine("Welcome to a simple Map creator game!\n");

        // Engage a loop to keep the program always running.
        while (run)
        {
            Console.WriteLine("\tStarting new Map creation process...\n");
            Console.WriteLine("What type of Map do you want?\n('1' for " +
                "Dungeon | '2' for Open World)\n");
            Console.WriteLine("If you simply wish to stop, use '3'.");

            // Read user's input.
            inputInt = int.Parse(Console.ReadLine());

            // Outcome based on user input...

            // Exit.
            if (inputInt == 3) break;

            if (inputInt == 1)
            Console.WriteLine("Creating a Dungeon map...\n");
            else if (inputInt == 2)
            Console.WriteLine("Creating a Open World Map...\n");

            Console.WriteLine("What would you like to call it?\n");
                inputStringName = Console.ReadLine();
                inputStringFilename = inputStringName.ToLower();

            if (inputInt == 1)
            {
                Console.WriteLine("How many dungeons would you like?");
                inputIntDungeons = int.Parse(Console.ReadLine());

                // After all values inserted, instantiate a DungeonMap.
                map = new DungeonMap
                (
                    inputStringName, inputStringFilename, inputIntDungeons
                );
            }
            else if (inputInt == 2)
            {
                Console.WriteLine("Height?");
                inputIntHeight = int.Parse(Console.ReadLine());
                Console.WriteLine("Width?");
                inputIntWidth = int.Parse(Console.ReadLine());

                map = new OpenWorldMap
                (
                    inputStringName, inputStringFilename, inputIntWidth,
                    inputIntHeight
                );
            }

            Console.WriteLine($"Success! Your map's called {map.Name}.\n");
            Console.WriteLine("Time to add some players!\n");
            Console.WriteLine("How many players do you want to add?\n");
            numberOfPlayers = int.Parse(Console.ReadLine());
            Console.WriteLine($"Creating {numberOfPlayers} player(s)...");

            // Add a player to the list based on amount of players decided.
            for (int i = 0; i < numberOfPlayers; i++)
            {
                int playerID = i;
                Console.WriteLine("Name?\n");
                inputStringName = Console.ReadLine();
                Console.WriteLine("Health amount?\n");
                inputDoubleHealth = double.Parse(Console.ReadLine());
                Console.WriteLine("Shield amount?\n");
                inputDoubleShield = double.Parse(Console.ReadLine());

                Player newPlayer = new Player
                (
                    playerID, inputStringName,
                    inputDoubleHealth, inputDoubleShield
                );

                map.AddPlayer(newPlayer);
            }

            Console.WriteLine($"Success! {inputInt} player(s) created.\n");
            Console.WriteLine("With everything done and dusted...\n");
            Console.WriteLine("\t- - -\n");
            Console.WriteLine($"Your map is called {map.Name}...\n");
            Console.WriteLine($"It has {numberOfPlayers} player(s)...");
            Console.WriteLine($"And their names are...");
            map.PrintPlayerNames();

            // Count up the amount of games played (times looped).
            gamesPlayed++;

            Console.WriteLine("\n");
        }
    }
}

Program

internal class Program
{
    static void Main(string[] args)
    {
        Game game = new Game();
        game.GameLoop();

        Console.WriteLine($"\nYou played {Game.gamesPlayed} game(s)!");
    }
}

Por Inácio Amerio