Giter Club home page Giter Club logo

mc322-projeto-final's Introduction

Corridinha da Massa

Corrida da massa é um jogo de corrida em que o jogador personifica um piloto que participa de uma competição de corrida com obstáculos. Mas essa não é uma corrida normal, pois a vida do piloto depende dele completar o circuito que é imprevisível e cheio de perigos. No circuito há obstáculos, sendo alguns apenas muros intransponíveis enquanto outros labaredas de fogo mortais. Há também, no circuito, porções mágicas que dotam o carro de habilidades especiais e que podem ser essenciais para a sobrevivência do piloto.

Capa

Equipe Peixonauta

Pablo Areia Delgado. R.: 223037

Randerson Araújo de Lemos. RA.: 103897

Vídeos do Projeto

Vídeo da Prévia

vídeo

Vídeo do Jogo

vídeo

Slides do Projeto

Slides da Prévia

apresentação

Slides da Apresentação Final

apresentação

Relatório de Evolução

As princiapais mudanças que o projeto sofreu ao longo do seu desenvolvimento foram relacionadas com a arquitetura do programa. Anteriormente, a parte de Visualização (VIEW) foi concebida para ter um componente específico para o gerenciamento visual do circuito e um outro para o gerenciamento visual do piloto. Esses dois componentes se comunicariam com o componente Painel e este, juntando as informações visuais disponibilizadas, apresentaria ao usuário os elementos visuais do jogo. A arquitetura original está apresentada na figura abaixo.

Arquitetura_View_Antigo

Depois, na nova arquitetura proposta para a parte de Visualização, ficou-se apenas com o componente Painel, que ficou responsável, nessa nova versão, pelo gerenciamento das informações visuais e apresentação dessas informações ao usuário. Essa decisão veio pelo entendimento da dupla de que seria importante manter os elementos de visualização dentro de um mesmo componente (a nova arquitetura pode ser vista na seção Diagrama Geral do Projeto).

Outra evolução do código veio da transferência da funcionalidade de gerenciamento de criação de novos elementos do circuito do componente Controle para o componente Construção. A transferência foi motivada pelo aumento de coerência das atribuições de cada componente. Com ela, toda parte de gerenciamento de criação de novos elementos ficou com o componente Construtor, restando assim, com o componente Controle, apenas as atribuições de controle dos estados do jogo.

Destaques de Código

Exemplo do código onde podemos exibir o polimorfismo:

public Elemento geradorAleatorioDeElementosSemPiloto(int lin, int col)
	{
		int valor = random.nextInt(limiteSuperiorNumeroSorteado);
		
		while(true)
		{
			for(int i=0; i<valoresLimiteElementosSemPiloto.length; i++)
			{
				int valorLimite = valoresLimiteElementosSemPiloto[i];
				if(valor < valorLimite)
				{
					if(i == 0)
					{
						return new Livre(lin, col);
					}
					if(i == 1)
					{
						return new Muralha(lin, col);
					}
					if(i == 2)
					{
						return new Fogo(lin, col);
					}
					if(i == 3)
					{
						return new Porcao(lin, col);
					}
				}
				valor -= valorLimite;
			}
		}		
	}	

Livre, Muralha, Fogo e Porcao são herdeiras de Elemento e agem de formas diferentes dentro do curcuito.

Destaques de Pattern

O jogo foi organizado seguindo o Pattern Model-View-Control (a representação desse modelo junto com os componentes pode ser visto na seção Diagrama Geral do Projeto). Usar esse padrão (Pattern) foi muito importante para a estruturação dos códigos do jogo, pois já orientava os desenvolvedores sobre onde cada componente do jogo deveria ser desenvolvido.

Painel

Conclusão e Trabalhos Futuros

Concluirmos com a finalização deste trabalho que a Orientação a Objeto é um excelente paradigma de programação e auxilia o usuário na organização dos códigos e seu reaproveitamento com suas ideias de Herança e Polimorfismo. Então, o desenvolvimento do jogo foi bastante facilitado por esse paradigma assim, como também o foi, devido ao padrão arquitetural Model-View-Control.

Sobre o jogo, a dupla entende que os resultados desejados fora alcançados. Uma visualização atrativa foi alcançada, assim como uma boa jogabilidade e grau de entretenimento. Como proposto inicialmente, é uma jogo sem complicações. É sentar e jogar!

Pra trabalhos futuros, há a necessidade de se trabalhar para evitar que o piloto consiga se movimentar pelas diagonais dos obstáculos. Além disso, poderia-se pensar em um esquema de fases para o jogo, na criação de diferentes pilotos (cada qual com uma certa especialidade) e na diversificação dos obstáculos.

Documentação

Diagramas

Diagrama Geral do Projeto

Arquitetura

Diagrama Geral dos Componentes

Componente Painel

Painel

Ficha Técnica

item detalhamento
Classe Classe Painel
Autores <Pablo e Randerson>
Interfaces IPainelConstrutor
IPainelControle
IRCircuitoPainel
IRPilotoPainel
public interface IPainel extends
  IPainelConstrutor
, IPainelControle
, IRCircuitoPainel
, IRPilotoPainel
{
}

Componente Elemento

Elemento

Ficha Técnica

item detalhamento
Classe Classe Elemento
Autores <Pablo e Randerson>
Interfaces IPilotoControle
IPilotoConstrutor
IPilotoPainel
IRCircuitoPiloto
public interface IPiloto extends
  IPilotoControle
, IPilotoConstrutor
, IPilotoPainel
, IRCircuitoPiloto
{
}

Componente Circuito

Circuito

Ficha Técnica

item detalhamento
Classe Classe Circuito
Autores <Pablo e Randerson>
Interfaces ICircuitoContrutor
ICircuitoControle
ICircuitoPainel
ICircuitoPiloto
public interface ICircuito extends
  ICircuitoConstrutor
, ICircuitoControle
, ICircuitoPainel
, ICircuitoPiloto{
}

Componente Controle

Controle

Ficha Técnica

item detalhamento
Classe Classe Controle
Autores <Pablo e Randerson>
Interfaces IControleConstrutor
IRCircuitoControle
IRPilotoControle
IRPainelControle
public interface IControle extends
  IControleConstrutor
, IRCircuitoControle
, IRPilotoControle
, IRPainelControle
{
	public void comecarJogo();
}

Componente Construtor

Construtor

Ficha Técnica

item detalhamento
Classe Classe Construtor
Autores <Pablo e Randerson>
Interfaces IRCircuitoConstrutor
IRControleConstrutor
IRPilotoConstrutor
IRPainelConstrutor
public interface IConstrutor extends
  IRCircuitoConstrutor
, IRControleConstrutor
, IRPilotoConstrutor
, IRPainelConstrutor
{
	public void construir(int maxLin, int maxCol);
}

Detalhamento das Interfaces

Interface IControleConstrutor

public interface IControleConstrutor {
	Elemento geradorAleatorioDeElementosSemPiloto(int lin, int col);
}
Método Objetivo
geradorAleatorioDeElementosSemPiloto Gera um Elemento seguindo certas probabilidades
Possibilidades: Asfalto, Muro, Fogo ou Poção

Interface ICircuitoContrutor

Construtor poder criar a matriz do Objeto Circuito (matriz back-end)

public interface ICircuitoConstrutor
{
	void setMatriz(int maxLin, int maxCol, Elemento matriz[][]);
	public int getMaxLin();
	public int getMaxCol();
	public void setElemento(Elemento elemento) throws TrataExcecaoAcessoMatrizCircuito;
	public Elemento getElemento(int lin, int col) throws TrataExcecaoAcessoMatrizCircuito;
}
Método Objetivo
setMatriz Atualiza a matriz Circuito
getMaxLin Acessa o numero de linhas da matriz Circuito
getMaxCol Acessa o numero de colunas da matriz Circuito
setElemento Atualiza uma posição da matriz Circuito (ou seja, um Elemento)
getElemento Acessa uma posição da matriz Circuito (ou seja, um Elemento)

Interface ICircuitoControle

Controle ter acesso a informações sobre a matriz e poder atualizá-la

public interface ICircuitoControle {
	public int getMaxLin();
	public int getMaxCol();
	void setElemento(Elemento elemento)  throws TrataExcecaoAcessoMatrizCircuito;
	public Elemento getElemento(int lin, int col) throws TrataExcecaoAcessoMatrizCircuito;

}
Método Objetivo
getMaxLin Acessa o numero de linhas da matriz Circuito
getMaxCol Acessa o numero de colunas da matriz Circuito
setElemento Atualiza uma posição da matriz Circuito (ou seja, um Elemento)
getElemento Acessa uma posição da matriz Circuito (ou seja, um Elemento)

Interface ICircuitoPainel

Interligar as matrizes back-end e front-end

public interface ICircuitoPainel
{
	public int getMaxLin();
	public int getMaxCol();
	public Elemento getElemento(int lin, int col) throws TrataExcecaoAcessoMatrizCircuito;
}
Método Objetivo
getMaxLin Acessa o numero de linhas da matriz Circuito
getMaxCol Acessa o numero de colunas da matriz Circuito
getElemento Acessa uma posição da matriz Circuito (ou seja, um Elemento)

Interface ICircuitoPiloto

Piloto e Circuito são independentes no código, o objeto Piloto sabe onde ele está, mas precisa de informações do Circuito para conhecer os arredores

public interface ICircuitoPiloto
{
	public int getMaxLin();
	public int getMaxCol();
	public Elemento getElemento(int lin, int col) throws TrataExcecaoAcessoMatrizCircuito;
}
Método Objetivo
getMaxLin Acessa o numero de linhas da matriz Circuito
getMaxCol Acessa o numero de colunas da matriz Circuito
getElemento Acessa uma posição da matriz Circuito (ou seja, um Elemento)

Interface IPilotoConstrutor

Construtor poder criar o Objeto Piloto

public interface IPilotoConstrutor {
	public void setPosicao(int lin, int col);
}
Método Objetivo
setPosicao Atualiza a posição do piloto (essa informação é guardada no Piloto)

Interface IPilotoControle

Controle poder ter as informações do piloto e poder atualizá-lo

public interface IPilotoControle {
	public void moverParaCima();
	public void moverParaBaixo();
	public void moverParaEsquerda();
	public void moverParaDireita();
	public int getLin();
	public int getCol();
	public void setImagemIcon1();
	public void setImagemIcon2();
	public void setImagemIcon3();
	public void setPosicao(int lin, int col);
	public void setPoderzin(int valor);
	public int getPoderzin();
}
Método Objetivo
moverParaCima Move o piloto para cima se possível
moverParaBaixo Move o piloto para baixo se possível
moverParaEsquerda Move o piloto para esquerda se possível
moverParaDireita Move o piloto para direita se possível
getLin Acessa a linha que o Elemento está
getCol Acessa a coluna que o Elemento está
setImagemIcon1,2,3 Acessam imagens específicas (1,2 ou 3) (arquivos de imagem que serão incrementados na interface gráfica)
setPosicao Atualiza a posição do piloto (essa informação é guardada no Piloto)
setPoderzin Dispara o tempo de duração da poção -> tempo = x;
getPoderzin Acessa o tempo atual restante de duração da poção

Interface IPilotoPainel

O piloto só está inserido na matriz front-end, Painel pega suas informações e atualiza a matriz

public interface IPilotoPainel
{
	public int getLin();
	public int getCol();
	public ImageIcon getImageIcon();
}
Método Objetivo
getLin Acessa a linha que o Elemento está
getCol Acessa a coluna que o Elemento está
getImageIcon Acessa a imagem de um Elemento (arquivo de imagem que será incrementado na interface gráfica)

Interface IPainelConstrutor

Construtor cria o Objeto Painel (matriz front-end) sobre as condições iniciais do objeto Circuito

public interface IPainelConstrutor
{
	public void setMatriz(int maxLin, int maxCol, JLabel matriz[][]);
}
Método Objetivo
setMatriz Atualiza a matriz Painel

Interface IPainelControle

Controle ser capaz de atualizar a interface gráfica a cada iteração

public interface IPainelControle
{
	public void atualizarPainel();
	public void mostrarPainel();
	public void atualizarImagemCircuitoPainel();
	public void atualizarImagemPilotoPainel();
	public void addPlayActionListener(ActionListener I);
	public void addPlayKeyListener(KeyListener I);
	public void atualizarScore(int valor);
	public void atualizarStatus(String mensagem);
}
Método Objetivo
atualizarPainel atualiza o estado do Painel (o que o player vai ver)
mostrarPainel manda mostrar o Painel em seu estado atualizado
atualizarImagemCircuitoPainel atualiza o circuito mostrado do Painel (matirz front-end) a partir do objeto Circuito (matriz back-end)
atualizarImagemPilotoPainel atualiza a posição do Piloto no Painel
addPlayActionListener cria um observador
addPlayKeyListener cria um observador que dispara um evento quando uma tecla é apertada
atualizarScore Atualiza a pontuação do player mostrado no painel
atualizarStatus Atualiza o status do jogo mostrado no painel

Plano de Exceções

Hierarquia Exceções

Código da Execução das Exceções

public Elemento getElemento(int lin, int col) throws TrataExcecaoAcessoMatrizCircuito
	{
		if(matriz != null)
		{
			if(lin >= 0 & lin < maxLin & col >= 0 & col < maxCol)
			{
				return matriz[lin][col];
			}
			else
			{
				throw new TrataExcecaoAcessoMatrizCircuito("Indice de linha ou coluna fora da matriz do circuito!");
			}
		}
		return null;
	}


	public void setElemento(Elemento elemento) throws TrataExcecaoAcessoMatrizCircuito
	{
		int lin = elemento.getLin();
		int col = elemento.getCol();
		if(lin >= 0 & lin < maxLin & col >= 0 & col < maxCol)
		{
			matriz[lin][col] = elemento;
		}
		else
		{
			throw new TrataExcecaoAcessoMatrizCircuito("Indice de linha ou coluna fora da matriz do circuito!");
		}
	}

Descrição das classes de exceção

Classe Descrição
Exception Engloba todas as exceções
RunTimeException Exceções que não bloqueiam, quando não tratadas, a execução do código (unchecked)
TrataExcecaoAcessoMatrizCircuito Exceções que tranta acessos fora do range do matriz do circuito

mc322-projeto-final's People

Contributors

bourbonjones avatar randersonlemos avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.