CSE 210: Programação com Classes

S06 - Projeto: Programa de Metas Eternas

Visão Geral do Problema

Muitas pessoas estabelecem metas para áreas que desejam melhorar em suas vidas. Essas metas podem ser muito importantes para nos ajudar em nosso crescimento, como destacado no programa Crianças e Jovens da Igreja. Mas, apesar das nossas melhores intenções, muitas vezes temos dificuldade em atingir esses objetivos.

Pense por um instante sobre quais são os maiores desafios que impedem alguém de atingir as metas definidas?

Existem várias motivos que você pode encontrar, como esquecer, não ter tempo suficiente, e programas ou aplicativos poderiam ajudar com muitas delas. Além desses desafios gerais, alguns que são específicos para as metas podem incluir:

Ideia de Solução

Gamificação é a ideia de transformar algo em um jogo. Pode incluir vários conceitos diferentes, mas geralmente envolve ganhar prêmios à medida que você "sobe de nível" com mais pontos.

Considere um programa que monitora vários tipos de metas que as pessoas fazem, que são metas na vida real, como estudar as escrituras todos os dias, terminar um projeto ou até mesmo abandonar um mau hábito. Este programa pode ser criado para monitorar seu progresso em direção a essas metas e oferecer pontos, prêmios ou outras comemorações para mantê-lo motivado a continuar trabalhando.

Um programa como esse pode ser mais sério e monitorar o progresso das metas, ou pode ser tão engraçado e pessoal quanto você quiser (por exemplo, um Unicórnio Ninja nível 13). A ideia é envolver a parte do nosso cérebro que adora ver essas "vitórias" e realizações enquanto trabalhamos em nossos objetivos.

Não importa qual seja o formato exato, o programa pode ajudar cada um de nós em nossa "Missão Eterna" de retornar para estar com nosso Pai Celestial.

Especificação

Crie um programa de Missão Eterna para rastrear vários tipos de metas.

Seu programa pode incluir qualquer tipo de componente de "gamificação" que você desejar, mas cada programa deve ter a seguinte funcionalidade básica.

Requisitos Funcionais

Seu programa deve fazer o seguinte:

  1. Fornecer metas simples que possam ser marcadas como concluídas e fazer o usuário ganhar pontos.
  2. Fornecer metas eternas que nunca são concluídas, mas cada vez que o usuário as registra, ganha pontos.
    • Por exemplo, cada vez que você lê suas escrituras, você ganha 100 pontos.
  3. Estabelecer uma meta de lista de tarefas que deve ser cumprida um certo número de vezes para ser concluída. Cada vez que o usuário registra essa meta, ele ganha pontos, mas quando atinge o valor desejado, ele ganha um bônus.
    • Por exemplo, se você definir uma meta de ir ao templo 10 vezes, poderá ganhar 50 pontos cada vez que for, e um bônus de 500 pontos na 10ª vez.
  4. Exibir a pontuação do usuário.
  5. Permitir que o usuário crie novas metas de qualquer tipo.
  6. Permitir que o usuário registre um evento (o que significa que ele atingiu uma meta e deve receber pontos).
  7. Mostrar uma lista de objetivos. Esta lista deve indicar se a meta foi concluída ou não (por exemplo, [ ] comparado a [X]) e, para metas da lista de tarefas, deve mostrar quantas vezes a meta foi concluída (por exemplo, Concluída 2/5 vezes).
  8. Permitir que os objetivos do usuário e sua pontuação atual sejam salvos e carregados.

Requisitos de Design

Além disso, seu programa deve:

  1. Use herança, tendo uma classe separada para cada tipo de atividade com uma classe base para conter quaisquer atributos ou comportamentos compartilhados.
  2. Use polimorfismo fazendo com que classes derivadas sobrescrevam métodos de classe base quando apropriado.
  3. Siga os princípios de encapsulamento e abstração tendo variáveis membro privadas e colocando itens relacionados na mesma classe.

Demonstrando Criatividade e Indo Além dos Requisitos

Atender aos requisitos básicos torna seu programa elegível para receber 93% da nota. Para receber 100% na tarefa, você precisa demonstrar criatividade e superar esses requisitos.

Aqui estão algumas ideias que você pode considerar:

Relate o que você fez para superar os requisitos adicionando uma descrição disso em um comentário no arquivo Program.cs.

Demonstração em Vídeo

O vídeo a seguir demonstra como esse programa deve funcionar:

Link direto: ▶️Demonstração do Programa de Metas Eternas (8 minutos)

Ajuda com o Código

Você pode achar o código a seguir útil neste projeto:

Lendo Arquivos de Texto em C#

A maneira mais fácil de ler um arquivo de texto em C# é ler o arquivo inteiro em uma matriz de strings (uma por linha) usando a função System.IO.File.ReadAllLines(). Então, você pode percorrer cada string como faria com qualquer lista.

À medida que você percorre cada string, você pode dividi-la com base em um caractere separador e obter as partes necessárias pelo índice delas.

A seguir mostramos um exemplo de leitura de um arquivo e divisão das strings.


string nomeDoArquivo = "meuArquivo.txt";
string[] linhas = System.IO.File.ReadAllLines(nomeDoArquivo);

foreach (string linha em linhas)
{
    string[] partes = linha.Split(",");

    string primeiroNome = partes[0];
    string sobrenome = partes[1];
}

Há muitas outras maneiras de trabalhar com arquivos em C#, algumas das quais seriam mais eficientes se o arquivo for muito grande e você não quiser armazená-lo todo na memória de uma vez, mas essa abordagem funcionará bem para este projeto.

Escrevendo Arquivos de Texto em C#

Você pode criar ou escrever um arquivo de texto em C# usando uma classe chamada System.IO.StreamWriter. Ao criar um objeto desta classe, você pode usar os métodos Write() e WriteLine()da mesma forma que os métodos Console.Write(), exceto que eles gravarão as strings no arquivo em vez de no Console.

Para garantir que o arquivo seja fechado e a memória liberada adequadamente quando você terminar, a melhor prática é colocar o objeto StreamWriter em um bloco using. Isso funciona da mesma forma que um bloco "with" em Python e garante que os recursos sejam liberados quando você sai dessa área do código.

O seguinte mostra um exemplo de como escrever texto em um novo arquivo


// Não se esqueça de colocar isso no topo, para que o C# saiba onde encontrar a classe StreamWriter
using System.IO; 

...

string nomeDoArquivo = "meuArquivo.txt";

usando (StreamWriter arquivoSaida = new StreamWriter(nomeDoArquivo))
{
    // Você pode adicionar texto ao arquivo com o método WriteLine
    arquivoSaida.WriteLine("Esta será a primeira linha do arquivo.");
    
    // Você pode usar $ e incluir variáveis como com Console.WriteLine
    string cor = "Azul";
    arquivoSaida.WriteLine($"Minha cor favorita é {cor}");
}
Salvando e Carregando objetos em C#

Transformar um objeto em uma string para que você possa salvá-lo, carregá-lo ou enviá-lo para outro programa na internet é chamado de "Serialização" e "Desserialização". Dependendo da complexidade do seu objeto, isso pode exigir que você seja um pouco criativo na forma como é feito. Existem bibliotecas de funções que outros escreveram para ajudar a serializar e desserializar objetos em vários formatos (por exemplo, JSON, XML, etc.). Embora você possa usar um deles se quiser, muitas vezes eles podem dar bastante trabalho para serem configurados corretamente, então, no nosso caso simples, provavelmente é mais fácil não usar nenhum deles.

Em vez disso, considere criar um método que retorne uma string contendo os dados necessários para seu objeto, como: ObterRepresentacaoString(). Isso pode incluir primeiro o tipo do objeto (para que você saiba depois qual deve usar) e, depois, quaisquer detalhes do objeto. Por exemplo, se você tivesse um objeto Pessoa, ele poderia retornar uma string como esta: "Pessoa:Brigham,Young".

Então, se você quisesse salvar uma lista inteira de pessoas, você poderia percorrê-las e, para cada uma, chamar o método ObterRepresentacaoEmTexto() e então salvar a string em um arquivo.

Da mesma forma, quando for a hora de carregar o arquivo, você pode ler a linha e primeiro dividi-la com base nos dois-pontos : para obter o tipo do objeto (Pessoa) e os detalhes ("Brigham,Young"). Então, você poderia criar um método chamado CriarPessoa que aceitaria a string de detalhes ("Brigham,Young"). Este método pode dividir a string em vírgulas para obter os vários itens. Então, ele poderia criar um novo objeto Pessoa, definir todos os valores e retorná-lo.

Como observação paralela, esse padrão de criação de um método (ou uma classe) para ajudar a criar objetos para você é comum o suficiente para ter um nome: O Padrão Factory (Fábrica). Em cursos futuros, você aprenderá mais sobre o Padrão Factory e como lidar com muitas das complexidades que podem surgir ao criar objetos.

Design

Você trabalhará com seu grupo para criar um design para este programa. Então, cada um escreverá o código do programa individualmente.

Design Final (não abra até depois da reunião de design)

Para fins de referência, aqui está uma cópia do design que foi criado durante a atividade de design.

Para entender as decisões que levaram a esse design, certifique-se de percorrer a atividade de design passo a passo antes de usar esse design para iniciar seu código.

Diagrama de classe do Programa Missão Eterna

Desenvolver o Programa

No repositório do curso, encontre o projeto MetasEternas na pasta semana06 e escreva seu programa lá.

Envio

  1. Desenvolva o programa usando o princípio de Polimorfismo conforme descrito acima.
  2. Não se esqueça de descrever tudo o que você fez para superar os requisitos nos comentários do arquivo Program.cs.
  3. Confirme (commit) e envie (push) seu código-fonte para o GitHub.
  4. Verifique se você consegue ver seu código atualizado no GitHub.
  5. No Canvas, envie um link para seu repositório GitHub. No comentário de envio, descreva qualquer coisa que você tenha feito para mostrar criatividade e superar os requisitos básicos.