Campo minado guiado pelos padrões de projeto MVC e Strategy. O jogo foi desenvolvido com Python 3 e a interface gráfica utiliza a biblioteca Qt5 da linguagem.
Conforme os conceitos abordados na disciplina de Programação Orientada Objetos II da Universidade Federal de Itajubá ministrada pelo professor Phyllipe, a equipe desenvolveu um campo minado com a interface gráfica Qt5 aplicando os padrões de projeto MVC e Strategy. Acesse o vídeo Minewsweeper para uma explicação mais detalhada do processo de desenvolvimento deste projeto.
As orientações estão divididas nos seguintes tópicos:
- Easy mode com MVC;
- Mid mode com MVC;
- Hard mode com MVC;
- Random mode (usuário insere as dimensões) com MVC;
- Implantar um timer básico;
- Timer utilizando os assets;
- Strategy para saves;
- Exportar save para JSON;
- Exportar save para CSV;
- Exportar save para TXT.
O núcleo da aplicação foi construída nas classes Model, View, Controller e Cell. O MVC funciona como um padrão de arquitetura de software que melhora a conexão entre as camadas de dados, lógica de negócio e interação com usuário. Através da sua divisão em três componentes, o processo de programação se torna algo mais simples e dinâmico. Como na aplicação do projeto utilizou-se uma interface gráfica, basear-se em um código monolítico juntaria todas as funções em um arquivo somente, o que tornaria a manutenção mais complicada. A fim de revolver este problema, separou-se em model, view e controller onde a criação da interface, a parte estética e sua configuração seriam referenciadas na view, enquanto toda a lógica do programa referenciaria-se na model.
-
Cell: classe de suma importância, compõe as células que geram um campo minado (matriz) e armazena os atributos e funções essenciais para validar a lógica do jogo;
-
Model: classe que implementa a lógica do jogo, define a estrutura e as funcionalidades, desde a definição do que tem no jogo até as dificuldades, formas de salvar, implementação de regras e tudo o que for necessário para o funcionamento do jogo;
-
Controller: A controller funciona como uma ponte entre a View e a Model, seria mais um nível de abstração, fazendo com que a View utilize das funções da Model sem conhecê-las. No caso desse projeto a controller faz a chamada das funções da model quando um evento ocorre na view, por exemplo, se um jogador clica em uma determinada dificuldade na interface da view, ela chama a função da controller que cria um novo jogo nessa dificuldade, todavia, essa função da controller não implementa a criação desse novo jogo na nova dificuldade, ela apenas chama as funções da model necessárias para realizar tal tarefa passando os parâmetros da view, como a nova dificuldade;
-
View: A View é a parte estética do projeto, implementa a interface gráfica e processa os eventos e interações do usuário chamando a controller, que por sua vez chama as funções que estão implementadas na Model, no nosso projeto toda a implementação da interface gráfica com PyQT está nessa classe;
Conforme o UML acima, foi necessário criar uma classe de contexto SaveGame, uma vez que python não reserva uma palavra chave para interfaces. Essa classe fica incumbida de conectar a model com a implementação do strategy pela classe (interface) TypeFile, permitindo que o usuário troque a implementação concreta do atributo TypeFile na model em tempo de execução.
O jogo permite que o usuário exporte o histórico de vitórias com o tempo de jogo para os arquivos do tipo: JSON, CSV e TXT.
Export do save como JSON:
No geral, para executar a aplicação é recomendado que o sistema já possua:
- Python3;
- Biblioteca Qt5;
- pyInstaller (se desejar gerar um executável para seu sistema);
- Git (opcional caso deseje clonar o repositório);
- Visual Studio Code (se desejar executar o jogo pelo terminal).
Vale ressaltar que um executável para Windows será disponilibizado na path Windows.
O campo minado foi testado nos seguintes sistemas operacionais (ambientes de desenvolvimento):
- Windows 10;
- Windows 11;
- Manjaro KDE;
- Ubuntu 18.04 LTS.
Para instalar a biblioteca em ambos os ambientes supracitados será necessário abrir um terminal (tanto o bash no Visual Studio Code quanto PowerShell no Windows Terminal servirão). Execute o comando abaixo para instalar a biblioteca:
pip install pyqt5
Para iniciar o jogo pelo terminal deve-se seguir as instruções abaixo.
# Clone este repositório com
$ git clone https://github.com/MatMB115/minesweeper_mvc_patterns_com221
# ou
$ git clone [email protected]:MatMB115/minesweeper_mvc_patterns_com221.git
# Acesse a pasta do projeto no seu terminal/cmd
$ cd minesweeper_mvc_patterns_com221
# Acesse a pasta do jogo
$ cd minesweeper
# Chame o interpretador do python 3 com o main.py
# Para linux
$ python3 main.py
# Para Windows
$ py main.py
# O jogo será iniciado corretamente
O jogo conta com uma tela principal que possui o campo minado usando assets inspirados no grandioso Minesweeper do Windows 95, um contador de bombas, um botão de status/start e um timer. Há também três botões na menubar para mudar o modo de jogo, exportar o histórico e sair da aplicação.
O ponto de início deste projeto foi um ambiente virtual python, as dependências utilizadas estão presentes abaixo.
Aplicação:
-> Python 3.10.8
- pyQt5
- pip
- pyInstaller
- Virtual environment
- csv
- json
Utilitários:
-> Dev
- Visual Studio Code 1.73
- PyCharm 2022.3
Matheus Martins 🧑💻 |
Breno Oliveira 🧑💻 |
Thais Souza 🧑💻 |
Matheus Luz 🧑💻 |
Repositório dedicado para o versionamento do campo minado desenvolvido usando os design patterns.