Softwares e sistemas
Recrie o jogo K-Star Patrol no Assembly 8086
3. Requisitos
Esta seção apresenta os requisitos do jogo.
3.1 Vídeo
O programa deve usar o modo de vídeo 320 x 200 (modo de vídeo = 13H). Neste modo de vídeo, a tela é dividida em 320 colunas e 200 linhas, conforme mostrado na Figura 1. Cada pixel ocupa um byte na memória e pode, portanto, assumir uma das 256 cores diferentes (28 possibilidades = 256 cores). A memória de vídeo neste modo, portanto, ocupa 320 * 200 bytes, ou seja, 64000 bytes.
************
Figura 1. Estrutura do modo de vídeo 320 x 200
Como o vídeo usa o método de mapeamento de E/S de memória, parte da memória principal é reservada para o vídeo. O segmento de memória de vídeo usado pelo modo 13h começa na posição A000h. Para plotar um pixel na tela, basta escrever a cor desejada para o pixel em uma dessas posições, conforme mostrado na Tabela 1. Para exibir um pixel na posição (100,10), ou seja, na coluna 100, linha 10, basta escrever o valor da cor na posição 100 + 10 * 320 do segmento de memória A000H (o endereço inicial da memória de vídeo é A000H:0000H).
Tabela 1 - Código de cores.
************
Embora a interrupção 10H (vídeo) realize a escrita de pixels na tela, a operação de escrita por endereçamento de memória (endereçamento indireto) é mais eficiente do que via interrupção. O motivo para isso é que a interrupção deve esperar que a CPU a manipule. Assim: “A CPU está ocupada agora, mas se você sair da sua rotina após o sinal – entraremos em contato com você.” Além disso, é possível usar instruções de manipulação de strings para auxiliar na escrita. Portanto, instruções de endereçamento indireto ou manipulação de strings devem ser usadas para executar a escrita de pixels (no caso de escrita de texto, interrupções podem ser usadas).
3.2 Tela inicial
A tela inicial deve ter 3 elementos, conforme ilustrado na Figura 2:
Nome do jogo: Você deve imprimir o nome "K-Star Patrol" usando o gerador de arte ASCII em ************ em verde claro (0AH) em duas linhas.
Elementos do jogo: Entre o título e o menu de opções, deve haver um voo alternado entre as naves aliadas e alienígenas. O ciclo começará com o movimento da nave aliada (cor branca - 0FH), que se moverá da coluna 0 para a coluna 319, onde desaparecerá. No momento em que a nave aliada desaparecer, uma nave alienígena (cor azul claro - 09H) aparecerá na coluna 319 e começará a se mover para a esquerda, até atingir a coluna 0, onde também desaparecerá. O processo será repetido indefinidamente, alternando entre o voo da nave aliada e da nave alienígena.
Menu: As opções "Play" e "Quit" devem ser exibidas, cada uma delimitada por uma caixa composta pelos seguintes caracteres: 218 ("┌"), 191 ("┐"), 192 ("└"), 217 (" ┘"), 196 ("─") e 179 ("│"). O usuário pode navegar entre as opções usando as teclas para cima e para baixo, movendo a seleção de uma opção para outra. A seleção ativa será destacada em vermelho claro (0CH) e a seleção não ativa será destacada em branco (0F). Ao pressionar a tecla Enter, a opção selecionada será executada.
************
Figura 2 - Exemplo da tela inicial do jogo
3.3 Setor
O jogo terá três setores, cada um caracterizado por um terreno montanhoso diferente dos outros. Antes de cada setor, uma tela inicial será exibida por 4 segundos (configurável), conforme ilustrado na Figura 3. Os textos dessa tela devem ser apresentados em cores diferentes, produzidas pelo gerador de arte ASCII. A duração de cada setor será de 60 segundos, e esse tempo será exibido na barra de status. O tempo de duração pode ser ajustado por meio de uma constante pré-definida no código.
************
Figura 3 - Tela de apresentação dos setores.
3.4 O Jogo
Para atender aos objetivos da disciplina e ao tempo disponível para a tarefa, o jogo passou por algumas adaptações em seu funcionamento. A tela do jogo deve ser semelhante à Figura 4, composta por três áreas principais: o status do jogo na parte superior, o espaço do planeta no centro e a superfície montanhosa do planeta na parte inferior. Cada um desses elementos será detalhado nas seções a seguir.
************
Figura 4 - Tela do Jogo.
3.4.1. Status do jogo
O status do jogo consiste na pontuação e no tempo restante, conforme ilustrado na Figura 5. Ele deve ser exibido no topo da tela, com a pontuação alinhada à esquerda e o tempo restante alinhado à direita. O tempo deve ser atualizado em intervalos de um segundo. Quando o tempo acabar, o jogo deve exibir a próxima tela de setor e reiniciar o jogo, mantendo a pontuação inalterada.
************
Figura 5 - Status do jogo
3.4.2 Naves aliadas
O jogo começa com uma nave líder (cor branca) e uma patrulha de 8 naves aliadas em cores diferentes. A patrulha deve ser alinhada à esquerda (coluna 0) com espaçamento uniforme entre as naves. A nave líder deve ser posicionada centralmente em relação à patrulha e estar aproximadamente 32 pixels à frente das naves aliadas. Cada nave terá 9 pixels de altura e 15 pixels de largura.
O objetivo da nave líder é destruir as naves alienígenas antes que elas colidam com a líder ou qualquer uma das naves patrulha. A nave líder pode ser movida verticalmente usando as teclas de seta para cima e para baixo, com o movimento limitado pela altura ocupada pelas 8 naves aliadas.
A nave líder pode disparar pressionando a barra de espaço. O tiro terá as mesmas dimensões das naves, ocupando 9 pixels de altura e 15 pixels de largura, e viajará até atingir uma nave alienígena ou atingir o lado direito da tela. Ao colidir com uma nave alienígena, tanto o tiro quanto a nave alienígena devem desaparecer. Destruir uma nave alienígena adicionará 100 pontos à pontuação.
Se a nave líder for destruída por uma colisão com uma nave alienígena, uma nave patrulha deve substituí-la, sempre selecionando a nave mais próxima do topo da tela.
3.4.3 Naves alienígenas
As naves alienígenas surgem da metade direita da tela (acima da coluna 160), em posições aleatórias. Cada nave tem 9 pixels de altura e 15 pixels de largura. O número máximo de naves alienígenas simultâneas varia de acordo com o setor:
Setor 1: até 10 naves
Setor 2: até 15 naves
Setor 3: até 20 naves
As naves alienígenas se movem para o lado esquerdo da tela. Elas podem ser destruídas por tiros (cada nave alienígena destruída vale 100 pontos) ou colidindo com uma nave patrulha ou com a nave líder, resultando também na destruição da nave patrulha/líder. Se uma nave alienígena atingir a coluna 0 sem ser destruída, ela escapará do setor.
Durante o movimento, para cada movimento horizontal de 10 pixels, a nave alienígena deve se mover 5 pixels para cima ou para baixo, diagonalmente e aleatoriamente. A velocidade horizontal das naves alienígenas será o dobro da velocidade de movimento vertical da nave líder.
3.4.4 Superfície Planetária
A superfície do planeta é composta por montanhas e pequenos lagos localizados nos vales. As montanhas devem ser representadas em marrom (06H), enquanto os lagos serão destacados em ciano claro (0BH). Para criar um efeito de movimento, a superfície deve se mover para a esquerda na mesma velocidade das naves alienígenas.
A superfície ocupará as 20 linhas inferiores da tela, com um desenho irregular que representa o terreno rochoso. Este desenho deve se estender por 480 pixels de largura (equivalente a 1,5 vezes a largura da tela), garantindo continuidade visual conforme você se move.
3.5 Pontuação
Existem várias maneiras de ganhar e perder pontos no jogo. Para cada nave alienígena destruída, 100 pontos serão adicionados à pontuação. Ao completar um setor e avançar para o próximo, o jogador receberá um bônus. Este bônus é calculado multiplicando o número de naves aliadas restantes no final do setor pelos seguintes valores:
Setor 1: 1.000 pontos por nave
Setor 2: 2.000 pontos por nave
No entanto, para cada nave alienígena que escapar no final de um setor, haverá uma redução na pontuação, de acordo com o setor:
Setor 1: -10 pontos por nave alienígena
Setor 2: -20 pontos por nave alienígena
Setor 3: -30 pontos por nave alienígena
3.5 Tela de fim de jogo
A tela de fim de jogo pode ser exibida em duas situações:
Todas as naves foram destruídas: Neste caso, a tela exibirá a mensagem "GAME OVER" em duas linhas, em vermelho, usando um gerador de arte ASCII.
Conclusão dos 3 setores: A tela exibirá a mensagem "WINNER!" em verde, também com o gerador de arte ASCII. Abaixo, a pontuação final será exibida em branco.
Em ambos os casos, o usuário deve pressionar qualquer tecla para retornar à tela inicial.
4. Restrições de trabalho
Impressão e ocultação: a exibição ou ocultação de navios, terrenos e tiros deve ser feita exclusivamente por meio de endereçamento indireto ou instruções de manipulação de strings.
Evitar duplicação de rotinas: o código deve evitar a duplicação de rotinas. Por exemplo, se for possível implementar uma única rotina de movimento para todos os elementos (como naves alienígenas, tiros e naves amigáveis), não deve haver rotinas separadas para cada tipo.
Configuração de tempo: o intervalo entre os movimentos dos elementos do jogo (50 ms) e a duração de cada etapa devem ser configuráveis.
Compatibilidade do ambiente de montagem: o programa deve funcionar corretamente quando montado usando a GUI do Turbo Assembler (Windows) ou o Turbo Assembler (em uma máquina virtual).
5. Entrega mínima
Para garantir um padrão mínimo de implementação, cada trabalho deve incluir e funcionar de acordo com os seguintes requisitos:
Tela inicial: todos os elementos devem estar visíveis e operacionais, incluindo movimento da nave e funcionalidade do menu.
Jogabilidade: após a tela de introdução do setor, o jogo deve exibir todos os elementos necessários (status, naves e superfície). A nave líder deve se mover verticalmente usando as setas para cima e para baixo. As naves alienígenas devem aparecer aleatoriamente e se mover para a esquerda (o movimento diagonal aleatório é opcional). A superfície deve ser visível, embora seu movimento seja opcional. A implementação de detecção de tiro e colisão é opcional. A pontuação deve ser incrementada quando uma nave alienígena atinge o lado esquerdo da tela. O cronômetro de 60 segundos para mudança de setor deve ser funcional, e a mudança de setor deve ocorrer no final desse tempo.
Fim de jogo: o jogo deve detectar o fim quando o jogador passa por todos os 3 setores ou perde todas as naves.
Todos os itens mencionados devem ser implementados e funcionais. Recursos não descritos aqui ou definidos como opcionais, incluindo relatórios, também serão avaliados para pontuação.
6. Entregas
A submissão do trabalho deverá ser feita através deste site, enviando um arquivo compactado (em formato RAR ou ZIP) contendo dois arquivos:
Código-fonte do programa: Incluir apenas o arquivo com a extensão .ASM. A inclusão de um executável resultará na perda de 0,5 pontos da nota final.
Relatório do artigo: Deve ser submetido em formato PDF, usando o formato do periódico Scientia cum Industria. Excluir a primeira página que contém o resumo gráfico e não é necessário incluir o título em inglês e o resumo. A formatação será considerada na avaliação do artigo. Documentos em Word ou LibreOffice resultarão na perda de 0,5 pontos da nota final. O relatório deve ter pelo menos as seguintes seções:
Seção 1 Jogabilidade: Descreva a operação geral do jogo, incluindo imagens que representam os três elementos principais: tela inicial, tela do jogo e tela final. Explique qualquer funcionalidade que não esteja funcionando ou não esteja totalmente implementada conforme solicitado. Esta seção deve funcionar como um manual de operação para o jogo, sem entrar em detalhes do código.
Seção 2 Solução: Detalhe a lógica do programa e o algoritmo usado. Esta seção pode incluir várias figuras (devidamente identificadas e referenciadas no texto), incluindo um fluxograma de solução que facilite a compreensão do algoritmo e do código.
Seção 2.1 Algoritmo: Descreva o fluxo principal do programa, incluindo um fluxograma que ilustre como o loop do jogo funciona. Mostre o tamanho do código em bytes e o número de linhas de código.
Seção 2.2 Memória: Detalhe as principais variáveis ou blocos de memória usados no programa. Inclua o tamanho da memória ocupada pelos dados e código e explique o processo usado para estimar o tamanho de cada um.
Seção 2.3 Rotinas: Liste e descreva as principais rotinas (PROC) do programa, como movimento de nave, controle de fogo e movimento de terreno. Para a rotina de geração de números aleatórios, especifique a fonte do programa ou algoritmo usado (consulte a seção Referências do diário para formatação).
Seção 2.4 Instruções 8086: Inclua esta seção somente se você usar instruções 8086 não abordadas em aula ou exercícios. Explique por que a instrução é necessária e como ela funciona.
Seção 3 Conclusões: Discuta as dificuldades encontradas durante o desenvolvimento do programa e as lições aprendidas com o trabalho.
Seção 4 Referências: Liste quaisquer sites ou livros usados, de acordo com as normas da ABNT, e cite-os no texto.
7. Dicas
Esta seção tem como objetivo fornecer algumas dicas para facilitar a implementação do trabalho.
7.1. Escrevendo Strings com Cor
Para escrever uma string, você pode usar a função 13H da interrupção 10H:
AH = 13h
AL = modo
bit 0:1- atualiza a posição do cursor após a escrita
bit 1:1- a string contém caracteres e atributos
BL = atributo de caractere se o bit 1 em AL for 0
BH = número da página do vídeo
DH,DL = posição de impressão da linha, coluna
CX = comprimento, em caracteres, da string
ES:BP = endereço do início da string
Observação: esta interrupção reconhece os códigos CR, LF e backspace.
7.2. Suspensão da execução por um determinado período de tempo
A interrupção 15h fornece uma variedade de serviços, incluindo a função AH=86H, que permite que a execução do programa seja suspensa por um intervalo de tempo especificado. O intervalo é definido em microssegundos (1/1.000.000 de um segundo) e é especificado pelos registradores CX e DX, onde CX contém os 16 bits mais significativos e DX contém os 16 bits menos significativos.
Para converter o intervalo de tempo desejado em microssegundos, você precisa definir CX e DX adequadamente. Por exemplo, para um intervalo de 2 segundos (2.000.000 microssegundos), CX deve ser definido como o valor 1EH e DX como o valor 8480H, já que 1E8480H é a representação hexadecimal de ********** Leitura do teclado sem espera
A interrupção 16h fornece várias funções relacionadas ao teclado. Para ler um pressionamento de tecla sem que o programa tenha que esperar, você pode usar a interrupção 16h para verificar o status do teclado. Especificamente, o serviço AH=01H permite que você verifique se há alguma tecla no buffer do teclado. Se o buffer estiver vazio, o Zero Flag (ZF) será definido.
Para ler uma tecla do buffer, você deve usar o serviço AH=00H da mesma interrupção. Este serviço não apenas retorna o código da tecla pressionada, mas também remove a tecla do buffer.
7.4. Definir constante com tamanho de memória
Na linguagem assembly, o símbolo $ é uma referência ao deslocamento atual (ou posição atual) dentro de um segmento de código ou dados. É útil principalmente para cálculos envolvendo endereços e deslocamentos durante o tempo de montagem. O valor de $ $ pode ser usado para calcular comprimentos ou distâncias entre diferentes partes de código ou dados, particularmente em tabelas, blocos de memória ou instruções que exigem referência a endereços relativos.
Imagine que você está criando um buffer de dados e deseja armazenar o tamanho do buffer em outro lugar. Você pode usar este $ para calcular o tamanho do buffer diretamente no tempo de montagem:
buffer db "Text example"
equ size $ - buffer; Calcula o tamanho do buffer
Neste exemplo:
buffer é o rótulo que marca o início dos dados.
O valor de $ - buffer calcula o número de bytes entre o deslocamento atual (posição $) e o início do buffer. Assim, o valor de tamanho armazenará o tamanho do buffer automaticamente.
Você conhece alguém que se encaixa bem no projeto? Ganhe comissão indicando freelancers! Por cada inscrição você ganha 5 € diretamente na sua conta e quando o freelancer é contratado pela plataforma você ganha 2% dos ganhos deste freelancer!
Preencha os detalhes do profissional que você gostaria de recomendar:
Quando o freelancer aceitar o convite, ele será automaticamente adicionado à sua rede e você ganhará 2% a mais todos os ganhos deste freelancer através da plataforma. Para mais informações consulte nosso Termos e Condições
Nenhum freelancer interessado ainda
{{item.displayDisciplines}}
Você tem uma conta stand-by e já respondeu a 1 projeto neste período de assinatura.
Atualize sua conta agora com apenas 1 clique e responda a projetos ilimitados.