Índice:

Recriando o jogo mais difícil do mundo no Arduino: 7 etapas
Recriando o jogo mais difícil do mundo no Arduino: 7 etapas

Vídeo: Recriando o jogo mais difícil do mundo no Arduino: 7 etapas

Vídeo: Recriando o jogo mais difícil do mundo no Arduino: 7 etapas
Vídeo: CRIEI UM JOGO EM 24 HORAS 2024, Novembro
Anonim
Image
Image

Este projeto é baseado em um jogo de computador que você pode encontrar online. Seu nome é, "The Worlds Hardest Game". Consegui recriá-lo no Arduino usando uma matriz de LED de quatro módulos. Neste instrutível, eu te ensino como construí-lo sozinho. Antes de entrarmos em muitos detalhes, quero dar uma rápida visão geral das etapas que executei para criar este jogo.

  1. Juntei todas as peças necessárias.
  2. Eu conectei as partes.
  3. Eu escrevi um esboço que usava o joystick para mover os LEDs dos jogadores em todos os módulos.
  4. Eu projetei os primeiros obstáculos e os adicionei ao esboço para que eles emulassem o jogo mais difícil do mundo.
  5. Em seguida, adicionei um código para detectar uma colisão com os obstáculos, o que reiniciará o jogo.
  6. E então projetei mais dois níveis de obstáculos.

Etapa 1: todas as peças

Todas as peças
Todas as peças
Todas as peças
Todas as peças

Aqui está uma lista de todas as peças de que você precisa:

  1. Um conector Arduino UNO e USB:
  2. Um módulo de quatro 8x8: matriz de LED
  3. Um joystick:
  4. 10 fios macho para fêmea:

Etapa 2: Como conectar as peças ao Arduino

Como conectar as peças ao Arduino
Como conectar as peças ao Arduino

Como conectar a matriz de LED ao Arduino

  1. GND vai para GND
  2. VCC vai para 5V
  3. DataIn vai para o pino digital 12
  4. CLK vai para o pino digital 11
  5. CS ou LOAD vai para o pino digital 10

Como conectar o joystick

  1. GND vai para GND
  2. 5V vai para 5V
  3. VRx vai para o pino analógico A0
  4. VRy vai para o pino analógico A1
  5. SW não é usado

A bateria se conecta ao conector 9v para dar energia ao Arduino

Etapa 3: Fluxograma do Programa

Fluxograma do Programa
Fluxograma do Programa

O oval indica o início do programa.

O primeiro passo é definir todos os obstáculos.

As próximas duas etapas indicam a configuração das variáveis e a ativação de todos os módulos.

A próxima etapa é definir os LEDs para o primeiro nível e quaisquer outras variáveis.

Em seguida, exiba o nível em que o player está atualmente.

O losango indica a leitura do Joystick para ver em que direção ele está sendo empurrado.

Em seguida, mova o jogador em qualquer direção em que o joystick foi empurrado.

Verifique e veja se o jogador colidiu com um obstáculo.

Se o jogador acertar um obstáculo, volte ao primeiro nível. Caso contrário, verifique se o jogador atingiu o final do nível.

Se o jogador estiver no final do nível, defina para o próximo nível e volte para "Exibir nível atual.". Se eles não estiverem no final, mova os obstáculos e volte para "Ler Joystick".

Etapa 4: Programando o Joystick

Claro que para mover o pontinho que é o jogador, precisamos de um joystick. e para permitir que o joystick realmente mova o player, precisamos codificá-lo no IDE do Arduino. Você precisa incluir a biblioteca LedControl, que pode ser encontrada acessando o menu de esboço> Incluir bibliotecas> gerenciar bibliotecas e procurar LedControl. Aqui está a aparência do código do joystick.

#include "LedControl.h"

int DataIn = 12; int CLK = 11; int DIN = 10; LedControl lc = LedControl (DataIn, CLK, DIN, 4); // Cria objeto para quatro módulos int delaytime = 50; // velocidade na qual o jogo é executado int joystick_RtLt, joystick_UpDn; jogadores_x int = 0; // posição horizontal dos jogadores de 0 a 31 int players_y = 3; // posição vertical dos jogadores de 0 a 7 int row, column, module; void setup () {initialize_modules (); // liga e define todos os quatro módulos de led} void loop () {move_player (); // inicia o loop verificando se o jogador move o delay (delaytime); } void initialize_modules () {lc.shutdown (0, false); // inicia o módulo 0 lc.setIntensity (0, 1); lc.shutdown (1, falso); // inicia o módulo 1 lc.setIntensity (1, 1); lc.shutdown (2, falso); // inicia o módulo 2 lc.setIntensity (2, 1); lc.shutdown (3, falso); // inicia o módulo 3 lc.setIntensity (3, 1); lc.clearDisplay (0); // limpa o módulo 0} void move_player () {module = players_x / 8; // define em qual módulo o jogador está column = players_x% 8; // define a coluna onde o jogador está no módulo row = players_y; lc.setLed (módulo, linha, coluna, falso); // desliga o led na posição atual do jogador joystick_RtLt = analogRead (A0) / 204-2; // lê o X-joystick e o mapa varia de 2 a -2 if (joystick_RtLt> 0) // quando o joystick está para a direita players_x ++; // vá para a direita else if (joystick_RtLt 0) // se o joystick estiver à esquerda e não no início players_x--; // move joystick_UpDn para a esquerda = analogRead (A1) / 204 - 2; // ler o intervalo do joystick Y e mapa de 2 a -2 if (joystick_UpDn 0) // se o joystick estiver abaixado e o jogador não estiver na parte inferior players_y--; // move para baixo else if (joystick_UpDn> 0 && players_y <7) // se o joystick está para cima e o jogador não está no top players_y ++; // vai para cima módulo = players_x / 8; // define módulo para jogadores nova posição column = players_x% 8; // define a coluna para a nova posição dos jogadores row = players_y; // define a linha para a nova posição dos jogadores lc.setLed (módulo, linha, coluna, verdadeiro); // liga o led na nova posição do jogador}

Agora que você adicionou o joystick, vamos trabalhar no primeiro obstáculo!

Etapa 5: O primeiro nível

Tudo bem, agora é hora de entrar na parte principal do programa, os obstáculos! Os obstáculos são o que realmente torna este o "jogo mais difícil do mundo". Portanto, se você deseja realmente jogar o jogo, é necessário adicionar isto ao seu código:

byte obstacle [LEVELS] [SCENES] [COLUMNS] [ROWS] = {// três níveis, 8 cenas, 8 collums, 8 linhas

{{{1, 1, 1, 1, 1, 1, 0, 0}, // primeiro nível, primeira cena {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 1}, { 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{1, 1, 1, 1, 1, 0, 0, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, // primeiro nível, segunda cena {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 0, 0, 1, 1, 1, 1, 1 }, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{1, 1, 1, 1, 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, // primeiro nível, terceiro cena {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 0, 0, 1, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{1, 1, 1, 0, 0, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, // primeiro nível, quarta cena {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 0, 0, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{1, 1, 0, 0, 1, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, // primeiro nível, quinta cena {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{1, 0, 0, 1, 1, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, // primeiro nível, sexta cena {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, { 1, 1, 1, 1, 1, 0, 0, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{0, 0, 1, 1, 1, 1, 1, 1}, // primeiro nível, sétima cena {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0 }, {1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{0, 1, 1, 1, 1, 1, 1, 1}, // primeiro nível, oitavo cena {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 1, 1, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}}, configuração vazia () {initialize_modules (); // liga e define todos os quatro módulos de led start_level (0); void loop () {move_player (); // inicia o loop verificando se o jogador se move if (collision ()) {// verifica o nível de colisão = 0; // se a colisão for verdadeira, redefina o nível start_level (level); // reinicie o jogo} else if (delay_count == obstacle_delay) {// se não houver colisão, mova obstáculo a cada dois atrasos moveobstacle (); atraso_contagem = 0; } else delay_count ++; atraso (delaytime); // atrasar pela velocidade do jogo}

E esse é o primeiro obstáculo! Se você ficar entediado com isso como seu primeiro nível, você sempre pode alterar os bytes, mas lembre-se de que você precisa ter oito cenas diferentes! Vamos continuar para a próxima etapa, detecção de colisão!

Etapa 6: detecção de colisão

Esta etapa é outra parte importante do jogo, sem ela não haveria muito desafio! você poderia apenas tecer seu caminho através dos obstáculos sem quaisquer consequências! isso não seria muito divertido, certo? então vamos tornar o jogo mais desafiador (e muito mais divertido!) adicionando esta seção do programa:

void loop () {

move_player (); // inicia o loop verificando se o jogador se move if (collision ()) {// verifica o nível de colisão = 0; // se a colisão for verdadeira, redefina o nível start_level (level); // reinicie o jogo} else if (delay_count == obstacle_delay) {// se não houver colisão, mova obstáculo a cada dois atrasos moveobstacle (); atraso_contagem = 0; } else delay_count ++; atraso (delaytime); // atrasar pela velocidade do jogo} int collision () {// verificar se o jogador atingiu um obstáculo no módulo de cena = players_x / 8; coluna = jogadores_x% 8; linha = jogadores_y; if (módulo> 0) if (obstáculo [nível] [cena] [coluna] [linha] == 1) // se a posição do jogador é a mesma do obstáculo retorno (1); // colisão detectada return true return (0); // nenhum retorno de colisão falso}

E pronto! agora você pode curtir muito mais o jogo! Agora vou mostrar como programar os dois últimos níveis do jogo! você está quase terminando este instrutível, e tenho certeza que está pronto para experimentá-lo!

Etapa 7: os dois últimos níveis

Estávamos chegando ao final do instrutível, esses dois últimos níveis são tudo que você precisa para terminar este jogo. Então você pode experimentar por si mesmo! aqui está o código:

byte obstacle [LEVELS] [SCENES] [COLUMNS] [ROWS] = {// segundo e terceiro nível, 8 cenas, 8 colunas, 8 linhas

{{{1, 0, 0, 0, 0, 0, 0, 1}, // segundo nível, primeira cena {0, 1, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, { 0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 1, 0}, {1, 0, 0, 0, 0, 0, 0, 1}}, {{1, 1, 0, 0, 0, 0, 0, 1}, // segundo nível, segunda cena {0, 0, 1, 0, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 0, 1, 1, 1, 0, 0}, {0, 0, 1, 1, 1, 0, 0, 0 }, {0, 1, 0, 0, 1, 0, 0, 0}, {1, 0, 0, 0, 0, 1, 0, 0}, {1, 0, 0, 0, 0, 0, 1, 1}}, {{0, 1, 0, 0, 0, 0, 0, 0}, // segundo nível, terceira cena {0, 0, 1, 1, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 0, 1, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 0, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 0}, {0, 1, 0, 0, 0, 1, 1, 0}, {0, 0, 0, 0, 0, 0, 1, 0}}, {{0, 0, 1, 0, 0, 0, 0, 0}, // segundo nível, quarta cena {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 1}, {0, 1, 1, 1, 1, 0, 1, 0}, {0, 1, 0, 1, 1, 1, 1, 0}, {1, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0}}, {{0, 0, 0, 1, 0, 0, 0, 0}, // segundo nível, fif ª cena {0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 1, 1, 0, 0, 1}, {1, 0, 0, 1, 1, 0, 1, 0}, {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 0}}, {{0, 0, 0, 0, 1, 0, 0, 0}, // segundo nível, sexta cena {0, 0, 0, 0, 0, 1, 0, 0}, {0, 1, 1, 0, 0, 1, 0, 0}, {1, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 1, 1}, {0, 0, 1, 0, 0, 1, 1, 0}, {0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 0}}, {{0, 0, 0, 0, 0, 1, 0, 0}, // segundo nível, sétima cena {0, 0, 0, 0, 0, 1, 0, 0}, {1, 1, 1, 0, 0, 1, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 1, 1}, {0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 0, 0, 0, 0}}, {{0, 0, 0, 0, 0, 0, 1, 0}, // oitava cena de segundo nível {1, 1, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 1, 1}, {0, 1, 0, 0, 0, 0, 0, 0}}}, {{{0, 1, 0, 0, 0, 0, 0, 1}, // terceiro nível, primeira cena {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 1, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 0, 0} }, {{0, 0, 0, 0, 1, 0, 0, 1}, // terceiro nível, segunda cena {1, 0, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0}}, {{0, 1, 0, 0, 1, 0, 0, 1}, // terceiro nível, terceira cena {0, 0, 0, 1, 0, 0, 1, 0}, { 0, 0, 0, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 0}}, {{0, 0, 0, 0, 1, 0, 0, 1}, // terceiro nível, quarta cena {1, 0, 0, 1, 0, 0, 1, 0 }, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0}}, {{0, 1, 0, 0, 1, 0, 0, 1}, // terceiro nível, quinta cena {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 0, 0, 0, 0, 0}}, {{0, 0, 0, 0, 1, 0, 0, 1}, // terceiro nível, sexta cena {1, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0}}, {{0, 1, 0, 0, 1, 0, 0, 1}, // terceiro nível, sétima cena {0, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 0}}, {{0, 0, 0, 0, 1, 0, 0, 0}, // terceiro nível, oitava cena { 1, 0, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0}}}};

E é isso! você está pronto para tentar completar o jogo mais difícil do mundo. Além disso, o código completo do Arduino está anexado abaixo.

Recomendado: