Example #1
0
 public static bool IsPlaceable <TForeground, TBackground>
     (PlaceSendMessage p, IReadOnlyWorld <TForeground, TBackground> world)
     where TForeground : struct
     where TBackground : struct
 {
     return(p.X >= 0 && p.Y >= 0 && p.X < world.Width && p.Y < world.Height);
 }
Example #2
0
 /// <summary>
 /// Constructor to create a game.
 /// </summary>
 /// <param name="x">X/Row.</param>
 /// <param name="y">Y/Column.</param>
 public Game(int x, int y)
 {
     world  = new World(x, y);
     ui     = new ConsoleUserInterface(this, world);
     random = new Random();
     agents = new List <Agent>();
 }
Example #3
0
 /// <summary>
 /// Constructor that accepts a Game and a read-only World.
 /// </summary>
 /// <param name="game">Reference to Game.</param>
 /// <param name="world">Reference to World.</param>
 public FileReader(Game game, IReadOnlyWorld world)
 {
     scores     = new List <Highscore>();
     this.game  = game;
     this.world = world;
     CreateFile();
 }
Example #4
0
 public static ReadOnlyWorldAreaEnumerable <TForeground, TBackground> AsReadOnlyWorldAreaEnumerable <TForeground, TBackground>(
     this IReadOnlyWorld <TForeground, TBackground> world)
     where TForeground : struct
     where TBackground : struct
 {
     return(new ReadOnlyWorldAreaEnumerable <TForeground, TBackground>(world, new Rectangle(0, 0, world.Width, world.Height)));
 }
        /// <summary>
        /// Constructor to create a UI.
        /// </summary>
        /// <param name="game">Reference to the game's properties.</param>
        /// <param name="world">Reference to a read-only world.</param>
        public ConsoleUserInterface(Game game, IReadOnlyWorld world)
        {
            Console.OutputEncoding = Encoding.UTF8;

            Console.CursorVisible = false;

            this.game = game;

            fr = new FileReader(this.game, world);
        }
Example #6
0
        /// <summary>
        /// Construtor, cria uma nova instância desta classe.
        /// </summary>
        /// <param name="options">Opções do jogo.</param>
        public Game(Options options)
        {
            // Guardar as opções do jogo numa variável de instância
            this.options = options;

            // Criar o mundo de jogo com o tamanho indicado nas opções do jogo
            world = new World((int)options.XDim, (int)options.YDim);

            // Instanciar o array de agentes com o tamanho exacto para todos
            // os agentes
            agents = new Agent[options.Zombies + options.Humans];

            // Instanciar o gerador de números aleatórios
            rand = new Random();

            // Criar os zombies
            for (uint i = 0; i < options.Zombies; i++)
            {
                if (i < options.PlayerZombies)
                {
                    // Criar novo zombie controlado pelo jogador
                    NewAgent(AgentKind.Zombie, AgentMovement.Player, (int)i);
                }
                else
                {
                    // Criar novo zombie controlado pela IA
                    NewAgent(AgentKind.Zombie, AgentMovement.AI, (int)i);
                }
            }

            // Criar os humanos
            for (uint i = 0; i < options.Humans; i++)
            {
                if (i < options.PlayerHumans)
                {
                    // Criar novo humano controlado pelo jogador
                    NewAgent(AgentKind.Human, AgentMovement.Player,
                             (int)(options.Zombies + i));
                }
                else
                {
                    // Criar novo humano controlado pela IA
                    NewAgent(AgentKind.Human, AgentMovement.AI,
                             (int)(options.Zombies + i));
                }
            }
        }
Example #7
0
        public static void UploadWorld(this IBlockAreaEnumerable blockArea, IReadOnlyWorld <ForegroundBlock, BackgroundBlock> world)
        {
            var area = blockArea.Area;

            if (world.Width > area.Width || world.Height > area.Height)
            {
                throw new ArgumentException("The world is too big for this area.", nameof(world));
            }

            for (var y = area.Top; y < area.Top + world.Height; y++)
            {
                for (var x = area.Left; x < area.Left + world.Width; x++)
                {
                    blockArea.Blocks.Place(x, y, world.Foreground[x - area.Left, y - area.Top]);
                    blockArea.Blocks.Place(x, y, world.Background[x - area.Left, y - area.Top]);
                }
            }
        }
Example #8
0
        /// <summary>
        /// Atualiza a visualização do mundo de simulação no ecrã.
        /// </summary>
        /// <remarks>
        /// Este método é uma implementação de
        /// <see cref="IUserInterface.RenderWorld(IReadOnlyWorld)"/> para
        /// consola.
        /// </remarks>
        /// <param name="world">
        /// Referência só de leitura ao objeto que define o mundo de simulação.
        /// </param>
        public void RenderWorld(IReadOnlyWorld world)
        {
            // Percorrer linhas do mundo de simulação (até ao máximo calculado)
            for (int y = 0; y < worldYRenderNCells; y++)
            {
                // Caso a cache ainda não tenha sido inicializada, colocar o
                // cursor no início da linha atual
                if (cache[0, y] == UNINITIALIZED)
                {
                    SetCursor(posWorldLeft, posWorldTop + y);
                }

                // Percorrer colunas do mundo para a linha atual (até ao máximo
                // calculado)
                for (int x = 0; x < worldXRenderNCells; x++)
                {
                    // Obter objeto posição para os valores atuais de x e y
                    Coord coord = new Coord(x, y);

                    // Está alguém na posição atual?
                    if (world.IsOccupied(coord))
                    {
                        // Em caso afirmativo, tratar de mostrar esse "alguém"

                        // Variável que representa o ID único do agente
                        string agentID;

                        // Agent na posição atual
                        Agent agent = world.GetAgentAt(coord);

                        // Obter o ID único do agente
                        agentID = agent.ToString();

                        // Se o ID único do agente tiver mais de 3 carateres,
                        // reduzir para 3 de modo a não desformatar mundo
                        if (agentID.Length > 3)
                        {
                            agentID =
                                agentID.Substring(0, 3);
                        }

                        // Este agente já cá estava no turno anterior? Se sim,
                        // não é necessário desenhá-lo novamente, pelo que
                        // podemos passar para a próxima iteração do ciclo
                        if (cache[x, y] == agentID)
                        {
                            continue;
                        }

                        // Caso a cache já tenha sido inicializada, colocar o
                        // cursos na posição correta (caso contrário já lá
                        // estaria)
                        if (cache[x, y] != UNINITIALIZED)
                        {
                            SetCursor(
                                posWorldLeft + worldCellLength * x,
                                posWorldTop + y);
                        }

                        // Ativar cor correta para o agente atual
                        SetAgentColor(agent.Kind, agent.Movement);

                        // Mostrar agente bem como o espaço que lhe se segue
                        Console.Write(agentID);
                        SetDefaultColor();
                        Console.Write(" ");

                        // Atualizar cache com a informação sobre este agente
                        // nesta posição
                        cache[x, y] = agentID;
                    }
                    else
                    {
                        // Se chegarmos aqui é porque não está ninguém na
                        // posição atual

                        // Se a cache indicar que não estava cá ninguém no
                        // turno anterior, escusamos de desenhar "..." e
                        // saltamos para a próxima iteração do ciclo
                        if (cache[x, y] == EMPTY)
                        {
                            continue;
                        }

                        // Caso a cache já tenha sido inicializada, colocar o
                        // cursos na posição correta (caso contrário já lá
                        // estaria)
                        if (cache[x, y] != UNINITIALIZED)
                        {
                            SetCursor(
                                posWorldLeft + worldCellLength * x,
                                posWorldTop + y);
                        }

                        // Ativar cor por omissão e desenhar "...", que
                        // corresponde a um espaço vazio
                        SetDefaultColor();
                        Console.Write("... ");

                        // Atualizar a cache sobre esta posição, nomeadamente
                        // com a indicação que não está cá ninguém
                        cache[x, y] = EMPTY;
                    }
                }

                // É suposto desenhar o nevoeiro horizontal? Só o precisamos de
                // fazer uma vez, antes do mundo ser renderizado pela primeira
                // vez
                if (worldXRenderFog && !worldRendered)
                {
                    // Posicionar cursor no fim da linha atual
                    SetCursor(
                        posWorldLeft + worldCellLength * worldXRenderNCells,
                        posWorldTop + y);

                    // Desenhar nevoeiro
                    Console.Write("~~~ ");
                }
            }

            // É suposto desenhar o nevoeiro vertical? Só o precisamos de fazer
            // uma vez, antes do mundo ser renderizado pela primeira vez.
            if (worldYRenderFog && !worldRendered)
            {
                // Vamos usar um string builder para construir uma linha
                // inteira de nevoeiro, que será a última linha do mundo,
                // contendo um nevoeiro para cada coluna
                string fogLine = new StringBuilder().Insert(
                    // Inserir nevoeiro a partir da posição 0 do string builder
                    0, "~~~ ",
                    // Repetir esse nevoeiro o número de vezes necessária
                    worldXRenderNCells + (worldXRenderFog ? 1 : 0)).ToString();

                // Posicionar cursos no início da última linha
                SetCursor(posWorldLeft, posWorldTop + worldYRenderNCells);

                // Desenhar nevoeiro guardado no string builder
                Console.Write(fogLine);
            }

            // Especificar que o mundo já foi renderizado uma vez
            worldRendered = true;
        }
 /// <summary>
 /// Empty Constructor that extends from the constructor from
 /// the class AbstractMovement
 /// </summary>
 /// <param name="world"> World </param>
 /// <returns></returns>
 public PlayerMovement(IReadOnlyWorld world) : base(world)
 {
 }
 public ReadOnlyWorldAreaEnumerable(IReadOnlyWorld <TForeground, TBackground> world, Rectangle area)
 {
     this.World = world;
     this.Area  = area;
 }
Example #11
0
 /// <summary>
 /// Construtor, que simplesmente aceita e guarda uma referência, só de
 /// leitura, ao mundo de simulação.
 /// </summary>
 /// <param name="world">
 /// Referência, só de leitura, ao mundo de simulação.
 /// </param>
 protected AbstractMovement(IReadOnlyWorld world)
 {
     this.world = world;
 }
Example #12
0
 /// <summary>
 /// Constructor inherited from base.
 /// </summary>
 /// <param name="world">Read-only world reference.</param>
 public EnemyMovement(IReadOnlyWorld world) : base(world)
 {
 }
        /// <summary>
        /// Renders the interface to the side of the board.
        /// </summary>
        /// <param name="world">Read-only world reference.</param>
        private void RenderInterface(IReadOnlyWorld world)
        {
            Console.SetCursorPosition(0 + world.XDim * 4, 0);
            Console.Write("Your health: " + game.PlayerHP + " HP.");

            Console.SetCursorPosition(0 + world.XDim * 4, 1);
            Console.Write("Current level : " + game.Level);

            Console.SetCursorPosition(0 + world.XDim * 4, 2);
            SetColor(playerColor, 0);
            Console.Write("P");
            SetDefaultColor();
            Console.Write(" - player");

            Console.SetCursorPosition(0 + world.XDim * 4, 3);
            SetColor(fgExitColor, 0);
            Console.Write("O");
            SetDefaultColor();
            Console.Write(" - Objective");

            Console.SetCursorPosition(0 + world.XDim * 4, 4);
            SetColor(enemyColor, 0);
            Console.Write("e");
            SetDefaultColor();
            Console.Write(" - Enemy");

            Console.SetCursorPosition(0 + world.XDim * 4, 5);
            SetColor(enemyColor, 0);
            Console.Write("E");
            SetDefaultColor();
            Console.Write(" - Boss");

            Console.SetCursorPosition(0 + world.XDim * 4, 6);
            SetColor(powerUpColor, 0);
            Console.Write("q");
            SetDefaultColor();
            Console.Write(" - Small PowerUp");

            Console.SetCursorPosition(0 + world.XDim * 4, 7);
            SetColor(powerUpColor, 0);
            Console.Write("p");
            SetDefaultColor();
            Console.Write(" - PowerUp");

            Console.SetCursorPosition(0 + world.XDim * 4, 8);
            SetColor(powerUpColor, 0);
            Console.Write("Q");
            SetDefaultColor();
            Console.Write(" - Big PowerUp");

            Console.SetCursorPosition(0 + world.XDim * 4, 9);
            SetColor(obstacleColor, 0);
            Console.Write("{0}", blockedTile);
            SetDefaultColor();
            Console.Write(" - Wall");

            Console.SetCursorPosition(0 + world.XDim * 4, 12);
            Console.Write("          UP     ");
            Console.SetCursorPosition(0 + world.XDim * 4, 13);
            Console.Write("          {0}     ", upArrow);
            Console.SetCursorPosition(0 + world.XDim * 4, 14);
            Console.Write("LEFT {0}         {1} RIGHT", leftArrow, rightArrow);
            Console.SetCursorPosition(0 + world.XDim * 4, 15);
            Console.Write("          {0}     ", downArrow);
            Console.SetCursorPosition(0 + world.XDim * 4, 16);
            Console.Write("         DOWN     ");

            Console.SetCursorPosition(0, world.YDim);
        }
Example #14
0
 public ReadOnlyWorldItem(IReadOnlyWorld <TForeground, TBackground> world, int x, int y)
 {
     this._world = world;
     this.X      = x;
     this.Y      = y;
 }
 /// <summary>
 /// Método construtor, cria uma nova instância desta classe.
 /// </summary>
 /// <param name="world">
 /// Referência só de leitura ao mundo de simulação.
 /// </param>
 public PlayerMovement(IReadOnlyWorld world) : base(world)
 {
     // Este construtor simplesmente chama o construtor da classe base.
 }
 /// <summary>
 /// Método construtor.
 /// </summary>
 /// <param name="enemy">Agentes inimigos, a perseguir ou evitar.</param>
 /// <param name="runAway">
 /// Indica se os agentes inimigos devem ser evitados (<c>true</c>)
 /// ou perseguidos (<c>false</c>).</param>
 /// <param name="world">
 /// Referência, só de leitura, ao mundo de simulação.
 /// </param>
 public AIMovement(AgentKind enemy, bool runAway, IReadOnlyWorld world)
     : base(world)
 {
     this.enemy   = enemy;
     this.runAway = runAway;
 }
        /// <summary>
        /// Renders the world and outputs it as a board.
        /// </summary>
        /// <param name="world">Read-only world reference.</param>
        public void RenderWorld(IReadOnlyWorld world)
        {
            Console.SetCursorPosition(0, 0);
            for (int x = 0; x < world.XDim; x++)
            {
                for (int y = 0; y < world.YDim; y++)
                {
                    Position pos = new Position(x, y);

                    if (world.IsOccupied(pos))
                    {
                        Agent agent = world.GetAgentAt(pos);

                        if (agent.Type == AgentType.Player)
                        {
                            AgentColor(agent.Type);
                            Console.Write(" P ");
                        }
                        else if (agent.Type == AgentType.Exit)
                        {
                            AgentColor(agent.Type);
                            Console.Write(" O ");
                        }
                        else if (agent.Type == AgentType.SmallEnemy)
                        {
                            AgentColor(agent.Type);
                            Console.Write(" e ");
                        }
                        else if (agent.Type == AgentType.BigEnemy)
                        {
                            AgentColor(agent.Type);
                            Console.Write(" E ");
                        }
                        else if (agent.Type == AgentType.SmallPowerUp)
                        {
                            AgentColor(agent.Type);
                            Console.Write(" q ");
                        }
                        else if (agent.Type == AgentType.MediumPowerUp)
                        {
                            AgentColor(agent.Type);
                            Console.Write(" p ");
                        }
                        else if (agent.Type == AgentType.BigPowerUp)
                        {
                            AgentColor(agent.Type);
                            Console.Write(" Q ");
                        }
                        else if (agent.Type == AgentType.Obstacle)
                        {
                            AgentColor(agent.Type);
                            Console.Write(" {0} ", blockedTile);
                        }
                    }
                    else
                    {
                        SetDefaultColor();
                        Console.Write(" . ");
                    }
                }
                Console.WriteLine();
            }
            RenderInterface(world);
        }