Pular para conteúdo

Faculdade

codinStruct


GitHub codinStruct/codinStruct Website codinStruct Website codinStruct Next

É o projeto mais moderno que eu já desenvolvi durante o quarto semestre da minha graduação na Doctum. Foi parte de um trabalho em grupo com tema livre em que nossa motivação foi:

O trabalho é uma plataforma que oferece um repertório de informação sobre linguagens de programação, apresentadas de diferentes formas tal que facilite o aprendizado dos usuários através de um portal que agrupa esses conhecimentos em um só lugar.

Quase todo brasileiro que busca aprender programação percebe a escassez de conteúdo nacional de qualidade sobre a área, e quando existe costuma estar em um lugar obscuro.

Conhecemos bastante as dificuldades e necessidades do possível usuário, pois passamos pelas mesmas. Isso é uma fonte de inspiração e motivação que nos mostra a utilidade de nosso projeto e transcende retorno financeiro, mas não descartamos a possibilidade de monetização.

No fim o projeto incorporou uma documentação das linguagens C, JavaScript e Python.

O projeto contêm três partes principais: O site em si, para apresentar o conteúdo; o conteúdo escrito em markdown; e um conversor de markdown para o html que seria importado pelo site.

Em retrospectiva é claro como esse trabalho é similar a projetos como MkDocs, GitBook e Jekyll, mas na época nós queríamos desenvolver tudo nós mesmos.

Quando o site foi desenvolvido nos o hosteamos na plataforma Heroku, no plano grátis, mas depois de alguns anos a plataforma essencialmente anunciou o fim do plano grátis, e como esse era apenas um projeto escolar simples não tomamos ação para manter o site funcionando pelo Heroku.

Felizmente um dos meus colegas nesse trabalho, Luiz, pessoalmente criou uma versão do conteúdo para estar acessível por meio do GitHub Pages utilizando a ferramenta mdBook, disponível em codinStruct. Adicionalmente ele também criou uma versão utilizando a ferramenta Next.js, disponível em codinStruct Next.

Arcade Mania

GitHub DaviAMSilva/Arcade_Mania GitHub DaviAMSilva/Arcade_Mania Release:latest


Esse foi um projeto que eu realizei individualmente durante o segundo semestre da minha graduação na Doctum. Ele envolvia a criação de um jogo para a plataforma Game Boy Advance da empresa Nintendo, lançado em 2001.

O projeto era de escolha livre, desde que utilizasse a linguagem C. Os motivos que me levaram a essa escolha foram basicamente:

  1. Os jogos desenvolvidos para o GBA, oficiais ou criados por fãs, são desenvolvidos em C, apesar de possivelmente utilizarem partes específicas escritas em Assembly.
  2. Eu gosto de jogos eletrônicos e não discrimino jogos clássicos ou retro.
  3. Eu possuo um Game Boy Advance SP (variação do GBA original) e poderia usar o trabalho como incentivo para comprar um aparelho e um cartucho capazes de gravar ROMs de jogos para serem jogados em hardware original.

A plataforma só está disponível para desenvolvimento amador devido ao trabalho de várias pessoas que realizaram e continuam realizando engenharia reversa no dispositivo e jogos para documentar as técnicas de desenvolvimento hoje existentes. Alguns dos projetos utilizados durante o desenvolvimento foram devkitPro, Tonc, grit, GBATek e CowBite.

Devido a essa complexidade técnica da plataforma e como ela me forçou a ser muito mais atento com o código que eu desenvolvia eu até hoje considero esse como o projeto do qual eu tenho mais orgulho de ter realizado. Para mim é um dos projetos mais organizados e completos que eu já criei devido a todas as ferramentas internas que eu tive de criar para suportar o desenvolvimento e compilação do projeto, includindo o melhor makefile que eu já criei. No final tudo valeu a pena quando eu tive a oportunidade de jogar meu jogo finalizado no meu GBA SP original, que foi uma experiência quase surreal.

Como experimentar

Baixe a release mais recente do arquivo Arcade_Mania.gba e instale um emulador do GBA (eu recomendo o mGBA). Por fim abra o arquivo no emulador e aproveite.

Esse projeto originalmente compunha apenas 2 jogos Snake e Memory Raid, mas após algum tempo depois da entrega do trabalho eu tive a vontade de implementar um porte do jogo Wordle, quando ele estava ganhando popularidade na internet. O motivo do uso desses jogos inicialmente baseia-se parcialmente do fato que Snake pode ser melhor criado usando tiles, enquanto para Memory Raid o ideal é utilizar sprites, sendo os dois principais sistemas gráficos do GBA.

  • Snake

    Snake Tela Inicial Snake Exemplo 1

    É uma versão bem simples do jogo clássico, apenas contendo a adição de um coelho que se move aleatoriamente e um power-up que te deixa invencível e aumenta a velocidade do jogo. Apesar da simplicidade ele é divertido divertido devido ao movimento errático do coelho e ao controle super rápido da cobra em si.

  • Memory Raid

    MemoryRaid Tela Inicial MemoryRaid Exemplo 1 MemoryRaid Exemplo 2

    Esse é um jogo de memorização de padrões de cores e direções de ataques que precisam ser bloqueados. É baseado em uma luta contra o personagem Undyne do jogo UNDERTALE, mas envolve a memorização em 8 direções, ao invés de reação rápida em 4 direções. Infelizmente eu não cheguei em um bom balanço do jogo, ou ele era muito rápido e difícil, ou devagar e chato, e portanto não há muito interesse de continuar jogando.

  • Wordle

    Wordle Tela Inicial Wordle Exemplo 1

    Apesar de ter sido implementado por último é o jogo mais interessante da lista, visto que é baseado diretamente em um jogo já popular e que não requer muito do aspecto gráfico. A lista de palavras utilizadas é a mesma utilizada pela versão original do New York Times.

Bibliotecas em C


GitHub DaviAMSilva/Estruturas_de_Dados GitHub DaviAMSilva/Searches GitHub DaviAMSilva/Sorts

Essas bibliotecas se referem a três conjuntos de funções e tipos de dados que eu desenvolvi enquanto estava cursando o curso de Ciência da Computação na Doctum para acelerar o desenvolvimentos das atividades. Esses projetos são:

  • Estruturas de Dados:

    Contém as estruturas de dados do tipo pilha, fila e lista e métodos para criar, acessar e modificar tais estruturas. O tipo de dado armazenado nessas estruturas é dinâmico e definido pelo usuário.

  • Searches:

    Contém diversos algoritmos de pesquisa em tipos de dados quaisquer, definidos pelo usuário.

  • Sorts:

    Contém diversos algoritmos de ordenação em tipos de dados quaisquer, definidos pelo usuário.

Eu criei essas bibliotecas durante os semestres em que cada um desses tópicos foi apresentado na faculdade. Minha principal motivação é que bem no início eu percebi o quanto eu reutilizava código pois atividades diferentes requeriam as mesmas estruturas, apenas a situação da atividade eram alteradas. Por causa disso, apesar de essas bibliotecas não terem muito utilidade prática no mundo externo, para mim elas foram de uma ajuda enorme.

A maneira como elas funcionam em geral é que elas permitem o uso de qualquer tipo de dados por meio de alocação dinâmica e conversão de ponteiros. O usuário apenas precisa definir o tamanho do tipo de dados no início e definir as funções necessárias para interagir com as bibliotecas utilizando os mesmos tipos de dados definidos.

Além disso outra vantagem é que as bibliotecas foram feitas de tal forma que o código fonte podia ser copiado para cada atividade necessária e continha um makefile para compilar cada arquivo para um arquivo de biblioteca estática (extensão .a) que poderia ser importada para os arquivos próprios da atividade por meio de outro makefile.

DIRS    := build/ lib/
SOURCES := $(wildcard source/*.c)
OBJECTS := $(patsubst source/%.c,build/%.o,$(SOURCES))
LIBS    := $(patsubst source/%.c,lib/lib%.a,$(SOURCES))

all: $(LIBS)
dirs: $(DIRS)

.PHONY: all dirs clean
.SECONDARY: $(OBJECTS)

build/%.o: source/%.c include/%.h | $(DIRS)
    gcc -c $< -Wall -O3 -o $@ -I include/

lib/lib%.a: build/%.o | $(DIRS)
    ar cr $@ $<

$(DIRS):
    mkdir -p $@

clean:
    rm -fr build/ lib/
.PHONY: all clean eds
all: $(patsubst %.c,bin/%,$(wildcard *.c))


libs := lista pilha
args := -Ieds/include -Leds/lib $(addprefix -l,$(libs))


bin/%: %.c | bin eds
    gcc $^ $(args) -O3 -Wall -Wno-unused-result -Wno-discarded-qualifiers -o $@


bin:
    mkdir -p bin/


eds:
    $(MAKE) -C eds


clean:
    rm -fr bin/