Use Java Swing para compreender a essência de 7 algoritmos clássicos de interpretação de aplicativos

Visualização de algoritmo

  • Este código se refere liuyuboboboa um curso "7 aplicativos clássicos interpretando a essência dos algoritmos Java" por um professor da Mukenet e fez algumas melhorias e personalizações pessoais com base no código de referência do curso.
  • Principalmente na linguagem Java, por meio de 7 jogos divertidos clássicos, o algoritmo é realmente utilizado no desenvolvimento real.

Linguagem e tecnologia usada para visualização

Java Swing

Conteúdo visual

1. Algoritmo de simulação de probabilidade

Use o algoritmo de Monte Carlo para simular e calcular PI

2. Algoritmo de classificação

Visualização de classificação de seleção

Visualização de classificação por inserção

Visualização da classificação por mesclagem

3. O labirinto resolve automaticamente o labirinto

  • Observação: o jogo de solução automática de labirinto adiciona um evento de clique do teclado. Pressionar o botão correspondente do teclado acionará a operação correspondente

    • Pressione o número 1: algoritmo de passagem de profundidade para gerar labirinto
    • Pressione o número 2: algoritmo de passagem de profundidade não recursivo para gerar um labirinto
    • Pelo número 3: algoritmo de passagem em amplitude gera labirinto
    • Pressione o número 4: algoritmo de passagem de fila aleatório para gerar labirinto
    • Pressione o número 5: algoritmo de fila aleatório aprimorado para gerar labirinto
    • Pressione o número 7: algoritmo recursivo de passagem em profundidade para resolver o labirinto
    • Pressione o número 8: algoritmo transversal não recursivo de profundidade para resolver o labirinto
    • Pressione o número 9: algoritmo de passagem em largura para resolver o labirinto
    • Pressione o número 0: limpe a tela e o jogo retorna ao estado nebuloso
  • Leia as informações do labirinto do arquivo e visualize-as;

Método de escrita recursiva de passagem em profundidade + método de retrocesso para resolver a visualização do labirinto;

Método de escrita não recursiva de passagem de profundidade para resolver a visualização do labirinto;

Algoritmo de passagem em largura para resolver a visualização do labirinto;

4. Gere um labirinto

  • Para simplificar, no labirinto de M linhas e N colunas, estipule primeiro que a entrada do labirinto é (1, 0) e a saída é (M-2, N-1)

Preparação antes que o labirinto seja gerado

O que se segue é um labirinto de 61 x 91. A intersecção de linhas ímpares e colunas ímpares é uma passagem (sem parede). Você precisa gerar um mapa como este antes de gerar o labirinto. Em seguida, ele só precisa atravessar primeiro todas as estradas que se cruzam em linhas ímpares e colunas ímpares em profundidade e, em seguida, quebrar a parede antes das duas estradas para produzir um labirinto.

imagem-20210326235007632

O algoritmo recursivo de passagem em profundidade gera um labirinto

Algoritmo de passagem de profundidade não recursivo para gerar um labirinto

Algoritmo transversal não recursivo para gerar um labirinto

Crie uma fila aleatória para tornar o processo de geração do labirinto mais aleatório

Adicione névoa à parte não gerada para tornar o processo de geração do labirinto mais ornamental e misterioso

Por favor, consulte o código de fila aleatórioRandomQueue.java

O processo de geração do labirinto aleatório é mostrado na figura abaixo:

O processo de solução do labirinto aleatório é mostrado na figura abaixo:

Aumente a aleatoriedade do labirinto gerado

Depois de muitas vezes de geração de labirinto e processo de solução, a tendência geral do caminho de solução de labirinto é uma curva não muito tortuosa do canto superior esquerdo para o canto inferior direito, e a aleatoriedade não é forte o suficiente, então o código de elementos de acesso aleatório da fila aleatória é otimizado. Consulte EnhancedRandomQueue.java

O processo de geração do labirinto após aumentar a aleatoriedade é mostrado na figura a seguir:

O processo de resolução do labirinto após aumentar a aleatoriedade é mostrado na figura abaixo:

5. Campo Minado

Vitória e fim de jogo do Campo Minado

game Over

Nota: Depois que o jogo terminar, você pode pressionar Enter para reiniciá-lo!

image-20210328180303684

vitória

imagem-20210328212853457

30 minas aleatórias no tabuleiro de jogo

imagem-20210328141001452

Avaliação de algoritmo aleatório

  • Objetivo do algoritmo: colocar aleatoriamente um número especificado de minas no mesmo número de grades na área de jogo

  • Use um grande número de vezes para contar os três algoritmos de embaralhamento aleatório, consulteRandomAlgorithmAssessment.java

    • arr: a matriz a ser planejada aleatoriamente; mineNumber: o número de minas (menor que o comprimento da matriz)

    • Algoritmo Aleatório 1: Troque o valor em cada grade com o valor na grade aleatória

      for (int i = 0; i < arr.length; i++) {
              
              
          int j = (int) (Math.random() * arr.length);
          swap(arr, i, j);
      }
      
    • Algoritmo Aleatório 2: Troque o valor na grade onde cada mina está localizada com o valor na grade aleatória

      for (int i = 0; i < mineNumber; i++) {
              
              
          int j = (int) (Math.random() * arr.length);
          swap(arr, i, j);
      }
      
    • Algoritmo de Knuth: obter aleatoriamente os elementos do intervalo [i, n), e trocar com o i-ésimo elemento

      for (int i = 0; i < arr.length; i++) {
              
              
          int j = (int) (Math.random() * (arr.length - i) + i);
          swap(arr, i, j);
      }
      
    • Outra maneira de escrever o algoritmo de knuth é obter elementos aleatoriamente do intervalo [0, i + 1) e, em seguida, trocá-los com o i-ésimo elemento

      for (int i = arr.length - 1; i >= 0; i--) {
          int j = (int) (Math.random() * (i + 1));
          swap(arr, i, j);
      }
      
    • Para cada algoritmo no caso de N = 10000000, n = 10, m = 5 (N é o número de estatísticas, n é o comprimento da matriz, m é o número de trovões na matriz), a frequência de aparecimento de trovões em cada posição na matriz é o seguinte, conforme mostrado na figura:

      imagem-20210328160137277

      imagem-20210328155957042

6. O jogo da caixa móvel fornece as etapas de solução

introdução do jogo:

Este é um jogo Sokoban de combinação de 3 semelhantes, que é diferente do Sokoban tradicional. Este Sokoban requer que você mova a caixa dentro de um determinado número de etapas, de modo que três caixas idênticas no painel do jogo possam ser conectadas em uma linha ou linha, que pode ser eliminada. Condições, além disso, o jogo está equipado com um sistema de gravidade. Se a caixa alta se mover para a esquerda ou direita ou a caixa abaixo dela for eliminada, fará com que a caixa caia. Depois de cair , ele irá detectar se há um novo apagável contínuo As três caixas conectadas, a capa do jogo é a seguinte

image-20210329180005073

Este é um certo nível do jogo: é necessário eliminar todas as caixas sob a condição de mover um passo.

image-20210329180302902

Simbolização de objetos do jogo

Agora converta a distribuição das caixas no nível acima em uma matriz de caracteres bidimensional e salve-o no arquivo junto com o número de operações.

1
.....
..A..
..B..
..A..
..B..
.BAB.
.BAB.
.ABA.

Em seguida, use o código para ler o número de etapas da operação e a matriz bidimensional de caracteres.Para alinhar os caracteres em cada coluna, as posições vazias são indicadas por pontos e diferentes tipos de caixas são indicados por letras diferentes.

Renderizar objetos de jogo simbólicos

Depois de ler o código, ele é renderizado na página conforme mostra a figura abaixo: Como não há caixa de material do jogo original, encontrei algumas fotos na Internet para substituí-lo.

image-20210329182751415

Veja as etapas da solução

Para tornar a solução mais intuitiva, uma coordenada é escrita no meio de cada caixa, que representa a linha e coluna onde a caixa está localizada no momento.

imagem-20210329181210898

De acordo com os resultados impressos pelo console e as coordenadas no mapa, vá para o jogo para realizar as operações correspondentes para passar de nível.

交换 (3, 2)(4, 2)
游戏有解!

7. Desenhe um gráfico fractal

Desenhe círculos concêntricos recursivamente

imagem-20210329193958960

Insira a descrição da imagem aqui

Desenhar recursivamente o gráfico fractal vicsek (retangular)

Você pode pressionar de 0 a 6 no teclado para realizar fractais com tempos de recursão diferentes

Inicialize o número padrão de recursão para 0, mostrando que toda a área é uma cor

Pressione o teclado de 1 a 6 respectivamente para desenhar o seguinte gráfico fractal

Desenhe recursivamente o gráfico fractal SierpinskiCarpet (retangular)

Desenhe recursivamente o gráfico fractal SierpinskiTriangle (triângulo)

Desenhe recursivamente o gráfico fractal KochSnowflake (floco de neve)

Desenhe recursivamente um gráfico fractal de árvore binária

Acho que você gosta

Origin blog.csdn.net/qq_38505969/article/details/115322169
Recomendado
Clasificación