Índice:
- Etapa 1: todas as peças
- Etapa 2: Como conectar as peças ao Arduino
- Etapa 3: Fluxograma do Programa
- Etapa 4: Programando o Joystick
- Etapa 5: O primeiro nível
- Etapa 6: detecção de colisão
- Etapa 7: os dois últimos níveis
Vídeo: Recriando o jogo mais difícil do mundo no Arduino: 7 etapas
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:37
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.
- Juntei todas as peças necessárias.
- Eu conectei as partes.
- Eu escrevi um esboço que usava o joystick para mover os LEDs dos jogadores em todos os módulos.
- Eu projetei os primeiros obstáculos e os adicionei ao esboço para que eles emulassem o jogo mais difícil do mundo.
- Em seguida, adicionei um código para detectar uma colisão com os obstáculos, o que reiniciará o jogo.
- E então projetei mais dois níveis de obstáculos.
Etapa 1: todas as peças
Aqui está uma lista de todas as peças de que você precisa:
- Um conector Arduino UNO e USB:
- Um módulo de quatro 8x8: matriz de LED
- Um joystick:
- 10 fios macho para fêmea:
Etapa 2: Como conectar as peças ao Arduino
Como conectar a matriz de LED ao Arduino
- GND vai para GND
- VCC vai para 5V
- DataIn vai para o pino digital 12
- CLK vai para o pino digital 11
- CS ou LOAD vai para o pino digital 10
Como conectar o joystick
- GND vai para GND
- 5V vai para 5V
- VRx vai para o pino analógico A0
- VRy vai para o pino analógico A1
- SW não é usado
A bateria se conecta ao conector 9v para dar energia ao Arduino
Etapa 3: 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:
O inversor solar fora da rede mais eficiente do mundo: 3 etapas (com fotos)
O inversor solar fora da rede mais eficiente do mundo: a energia solar é o futuro. Os painéis podem durar muitas décadas. Digamos que você tenha um sistema solar não conectado à rede. Você tem uma geladeira / freezer e um monte de outras coisas para executar em sua bela cabine remota. Você não pode se dar ao luxo de desperdiçar energia
Lanterna recarregável mais minúscula do mundo (Ultrabright): 4 etapas
Lanterna recarregável mais minúscula do mundo (Ultrabright): Olá pessoal, adoro trabalhar com leds, então neste tutorial vou mostrar a vocês como construir a lanterna recarregável mais minúscula. As dimensões desta lanterna são de aproximadamente 14 × 12 × 10 mm.Eu usei leds Piranha que são Ultrabright e não esquentam
Flip-It! - O jogo mais idiota do mundo ?: 7 etapas (com imagens)
Flip-It! - o jogo mais idiota do mundo ?: Origins: este é um jogo que desenvolvi ao longo de alguns anos 2018-2019. Ele era originalmente chamado de " Estúpido Flip " e surgiu do meu interesse em criar jogos interativos simples e divertidos que também pudessem ser usados para ensinar programação. Isso é abo
WAVE - o torno de solda faça você mesmo mais simples do mundo! (PCB Helping Hands): 6 etapas (com fotos)
WAVE - o torno de solda faça você mesmo mais simples do mundo! (PCB Helping Hands): WAVE é provavelmente o dispositivo Helping Hands mais estranho que você já viu. Por que é chamado de " WAVE "? Porque é um dispositivo Helping-Hands que foi construído com peças de micro-ondas! Mas o fato de WAVE parecer estranho, Não significa que não pode ser o
Medidor de bateria mais fácil do mundo até 5v em MAh: 3 etapas
Medidor de bateria mais fácil do mundo de até 5v em MAh: um Arduino e um resistor é tudo de que precisamos para construir este projeto que cria um medidor de capacidade para baterias de tensão de até 5v. Podem ser usadas baterias de ácido, alcalinas, NiCd, íons de lítio e Lipo. O mercado está cheio de baterias falsas que alegam grande capacidade b