Pesquisar neste blog

30/03/2021

Traceroute - Teste 2

 a. Visite o site <www.traceroute.org> e realize traceroutes de duas cidades diferentes na França para o mesmo hospedeiro de destino nos Estados Unidos. Quantos enlaces são iguais nos dois traceroutes ? O enlace transatlântico é o mesmo ?

b. Repita (a), mas dessa vez escolha uma cidade na França e outra cidade na Alemanha.

c. Escolha uma cidade nos Estados Unidos e realize traceroutes para dois hosts, cada um em uma cidade diferente na China. Quantos enlaces são comuns nos dois tracroutes ? Os dois traceroutes divergem antes de chegar à China ?


Resolução:

a) Cidade escolhia foi a capital da França (Paris) do site www.paris.fr































b)

































Para o site na cidade da Alemanha, nota-se que não há enlaces em comum ou links de comunicação. Percebe-se que o IP de origem são divergentes entre si em vista de um servidor estar localizado na França (212.95.66.126) e outro no Alemanha (172.217.22.4). Além disso, os saltos 9Sde um enlace e outro também são diferentes para com o rastreamento, sendo 10 saltos para França e 8 para a Alemanha.


c) Para o site https://www.walmart.com dos EUA



















Para o site www.sinopecgroup.com situado na China





















Para um servidor pertencente ao EUA e rastreando 2 sites em cidades diferentes da China, nota -se que nos traceroutes há em comum tanto o endereço origem IP(67.210.17.1)  e (205.210.17.1) , há também uma diferença nos saltos (7 no primeiro e 11 no segundo). Sim, os traceroutes divergem


28/03/2021

Traceroute - Teste 1

Execute o programa Traceroute (traceroute.org) para verificar a rota entre uma origem e um destino, no mesmo continente, para três horários diferentes do dia.

a. Determine a média e o desvio-padrão dos atrasos de ida e volta para cada um dos três horários.

b. Determine o número de roteadores no caminho para cada um dos três. Os caminhos mudaram em algum dos horários?

c. Faça o mesmo para uma origem e um destino em continentes diferentes. compare os resultados dentro do mesmo continente com os resultados entre continentes diferentes.

Resolução:

a)

Horário 1 as 21:55 para http://www.buenosaires.pe.gov.br/  - ip: 191.252.86.160 

Mínimo = 35ms, Máximo = 57ms, Média = 46ms

Desvio padrão = sqrt((35-46)^2 + (57-46)^2 )/2 = 11 ms



__________ // _______________

Horário 2 as 23:45 para http://www.rmparaguay.com - ip: 31.170.161.245

Mínimo = 166ms, Máximo = 167ms, Média = 166ms

Desvio padrão = sqrt((166 -166)^2 + (166-167)^2 )/2 = 0,7ms



_________________ // _______________

Horário 3 as 00:00 para pluslaboral.cl - ip: 185.230.63.107

Mínimo = 151ms, Máximo = 153ms, Média = 152ms

Desvio padrão = sqrt((151-152)^2 + (153-152)^2 )/2 = 1 ms



b)

21 roteadores para o  ip: 191.252.86.160  às 00:05 hs

25 roteadores para o ip: 31.170.161.245   às 00:18 hs

20 roteadores para o ip: 185.230.63.107  às 00:29 hs

(Não) o que muda é apenas o tempo de acesso aos roteadores



c)

Horário 1 as 22:30 para corporate.exxonmobi.com   na AMÉRICA DO NORTE 

Mínimo = 38ms , Máximo = 40ms,  Média = 39ms

Desvio padrão = sqrt((38-39)^2 + (40-39)^2 )/2 = 1,41ms

com 19 roteadores



Horário 1 as 23:34 para internationalpaper.com   na AMÉRICA DO NORTE 

Mínimo = 177ms , Máximo = 506ms,  Média = 338ms

Desvio padrão = sqrt((177-338)^2 + (506-338)^2 )/2 = 232,7ms

com 25 roteadores

________________ // ____________



Horário 2 as 23:37 para cisco.com   na EUROPA 

Mínimo = 167ms , Máximo = 178ms,  Média = 170ms

Desvio padrão = sqrt((167-170)^2 + (178-170)^2 )/2 = 8,54ms

com 21 roteadores



Horário 2 as 23:44 para dhl.com   na EUROPA 

Mínimo = 156ms , Máximo = 189ms,  Média = 164ms

Desvio padrão = sqrt((156-164)^2 + (189-164)^2 )/2 = 26,25ms

com 19 roteadores

__________ // ____________



Horário 3 as 23:55 para uchile.com   na AMERICA DO SUL 

Mínimo = 169ms , Máximo = 170ms,  Média = 169ms

Desvio padrão = sqrt((169-169)^2 + (170-169)^2 )/2 = 0,7 ms

com 20 roteadores



Horário 3 as 00:01 para braspar.org   na AMERICA DO SUL 

Mínimo = 194ms , Máximo = 437ms,  Média = 341 ms

Desvio padrão = sqrt((194-341)^2 + (437-341)^2 )/2 = 111,32 ms

com 22 roteadores

26/03/2021

Vazão fim a fim e links de gargalo

Considere o cenário mostrado abaixo, com quatro servidores diferentes conectados a quatro clientes diferentes em quatro caminhos de três saltos. Os quatro pares compartilham um middle hop comum com uma capacidade de transmissão de R = 100 Mbps. Os quatro links dos servidores para o link compartilhado têm uma capacidade de transmissão de R S = 70 Mbps. Cada um dos quatro links do link do meio compartilhado para um cliente tem uma capacidade de transmissão de R C = 40 Mbps por segundo. 


1) Qual é o throughput final máximo possível (em Mbps) para cada um dos quatro pares de cliente para servidor, assumindo que o link do meio é compartilhado de forma justa (isto é, divide sua taxa de transmissão igualmente entre os quatro pares) ?

2) Qual link é o link de gargalo para cada sessão ?

3) Supondo que os remetentes estejam enviando na taxa máxima possível, quais são as utilizações do link para os links do remetente (R S ), links do cliente (R C ) e o link do meio (R) ? 
























Resolução:

1) A taxa de transferência final máxima alcançável é de 25 Mbps.

2) Este é um quarto da capacidade de transmissão do hop médio compartilhado, que é o link de gargalo. A capacidade total de transmissão do salto compartilhado é de 100 Mbps, que é compartilhada igualmente entre os quatro pares servidor-cliente, dando a cada um uma parcela igual de 25 Mbps. Isso é menor que a capacidade de transmissão do primeiro salto de 70 Mbps e também menor que a capacidade de transmissão do terceiro salto de 40 Mbps.

3) A utilização de links de remetentes é de 35,71%. A utilização de links de receptores é de 62,5%. A utilização do link do meio é 100%.

24/03/2021

Comutação de Pacotes e Comutação de Circuitos

 Considere os dois cenários abaixo:

  • Um cenário de comutação de circuitos no qual os usuários do N cs , cada um exigindo uma largura de banda de 20 Mbps, devem compartilhar um link de capacidade de 150 Mbps.
  • Um cenário de comutação de pacotes com usuários N ps compartilhando um link de 150 Mbps, onde cada usuário novamente requer 20 Mbps ao transmitir, mas só precisa transmitir 10% do tempo.



















a) Quando a comutação de circuitos é usada, qual é o número máximo de usuários comutados por circuito que podem ser suportados? Explique sua resposta.

Resolução

Quando a comutação de circuitos é usada, no máximo 7 usuários comutados por circuito que podem ser suportados. Isso ocorre porque cada usuário comutado por circuito deve receber sua largura de banda de 20 Mbps, e há 150 Mbps de capacidade de link que podem ser alocados.

b) Para o restante deste problema, suponha que a comutação de pacotes seja usada. Suponha que haja 13 usuários de comutação de pacotes (isto é, N ps = 13). Esses muitos usuários podem ser suportados em comutação de circuitos? Explicar. 

Resolução:

Não. Sob a comutação de circuitos, cada um dos 13 usuários precisaria ser alocado a 20 Mbps, para um agregado de 260 Mbps - mais do que os 150 Mbps de capacidade de link disponíveis.


13/03/2021

JQuery em HTML

Arquivo: entendendoJQuery.html
<!DOCTYPE html>
<html>

<head>
    <meta charset='UTF-8'>
    <title>Entendendo jQuery</title>
    <link rel='stylesheet' href='css/estilo.css'>
    <script src="js/jquery.js"></script>
</head>

<body class="conteudo exercicio">
    <h1>Entendendo jQuery</h1>
    <div>1</div>
    <div>2</div>

    <script>
        //conjunto de seletores 'div'
        //$('div').hide(5000) // tempo de processo para esconder o processo
        //$('div').hide(5000).show(7000)//escondendo e aparecendo por 5 e 7 segundos
        $('div').hide(5000).show(5000).fadeOut(7000)
        console.log($('div').get(1));
        console.log($.isEmptyObject({nome: null}));
        console.log(jQuery.inArray(3, [123]));// está dentro do array o número 1, 2, 3 ?
        
        //função para colocar uma propriedade css
        $.fn.fundoVerde = function(){
            this.css('background-color','green')
            return this // retorna o próprio objeto
        }

        $('body').fundoVerde().fadeOut(7000)
    </script>
</body>


Arquivo: estilo.css

@font-face {
    font-family'Oswald';
    srcurl('../fonts/Oswald-Regular.ttf'format('truetype');
}

* {
    font-family'Oswald'sans-serif;
}

html {
    height100%;
}

body {
    margin0;
    background-color#0D262D;
    color#fff;
    height100%;
}

table {
    border-collapsecollapse;
}

tr {
    border-bottomsolid 1px white;
}

td {
    font-size1.6em;
    padding10px;
}

li {
    font-size1.6em;
}

.conteudo {
    displayflex;
    flex-directioncolumn;
    align-itemscenter;
    min-height100%;
}

.exercicio div {
    font-size1.8em;
    bordersolid 5px #fff;
    padding0px 40px;
    margin10px;
}

.exercicio div:nth-of-type(1) {
    background-colordarkgoldenrod;
}

.exercicio div:nth-of-type(2) {
    background-colorcrimson;
}

.exercicio div:nth-of-type(3) {
    background-colordarkcyan;
}

.exercicio div:nth-of-type(4) {
    background-colordarkorchid;
}

.exercicio div:nth-of-type(5) {
    background-colordodgerblue;
}

.exercicio div:nth-of-type(6) {
    background-colorsalmon;
}

.exercicio .destaque {
    bordersolid 10px greenyellow;
    colorgreenyellow;
    font-weightbold;
}







Vazão fim a fim e links de gargalo

Considere o cenário mostrado abaixo, com quatro servidores diferentes conectados a quatro clientes diferentes em quatro caminhos de três saltos. Os quatro pares compartilham um middle hop comum com uma capacidade de transmissão de R = 100 Mbps. Os quatro links dos servidores para o link compartilhado têm uma capacidade de transmissão de R S = 70 Mbps. Cada um dos quatro links do link do meio compartilhado para um cliente tem uma capacidade de transmissão de R C = 40 Mbps por segundo. 
Você pode querer rever a Figura no texto/apresentação antes de responder às seguintes perguntas:

1) Qual é o throughput final máximo possível (em Mbps) para cada um dos quatro pares de cliente para servidor, assumindo que o link do meio é compartilhado de forma justa (isto é, divide sua taxa de transmissão igualmente entre os quatro pares) ?

2) Qual link é o link de gargalo para cada sessão?

3) Supondo que os remetentes estejam enviando na taxa máxima possível, quais são as utilizações do link para os links do remetente (R S ), links do cliente (R C ) e o link do meio (R)?

























Resolução:

1) A taxa de transferência final máxima alcançável é de 25 Mbps.

2)
Este é um quarto da capacidade de transmissão do hop médio compartilhado, que é o link de gargalo. A capacidade total de transmissão do salto compartilhado é de 100 Mbps, que é compartilhada igualmente entre os quatro pares servidor-cliente, dando a cada um uma parcela igual de 25 Mbps. Isso é menor que a capacidade de transmissão do primeiro salto de 70 Mbps e também menor que a capacidade de transmissão do terceiro salto de 40 Mbps.

3) 
A utilização do servidor = gargalo R / R S = 25/40 = 0,625
A utilização do cliente = gargalo R / R C = 25/70 = 0,3571
A utilização do link compartilhado = gargalo R / (R / 4) = 25 / (100/4) = 1 

Portanto: 
A utilização de links de remetentes é de 35,71%. A utilização de links de receptores é de 62,5%. A utilização do link do meio é 100%

Exercício 1 de Circuitos Polifásicos

04) Dado o diagrama fasorial referente a um circuito polifásico trifásico equilibrado em
estrela, pede-se:


















a) O fasor tensão de fase
b) O ângulo de fase
c) O fator de potência

Resolução:

a) Circuito 1
Ufa = 125|_0° [V] , Ufb = 125|_120° [V]

Circuito 2
Ufa = 380 |_0° [V] , Ufb = 380 |_120° [V]

b) Circuito 1

Angulo = arc tang (X / R) 


Circuito 2

Angulo = arc tang (X / R) 


c) Circuito 1
Fp = Kw / sqrt( Kw2 + KVar2  ) = 125 / (1252 + 52) = 0,999...

Circuito 2
Fp  = 380 / (3802 + 9,52) = 0,9996...


5) O esquema abaixo, representa um sistema polifásico trifásico equilibrado em estrela.
Por meio de fasores, pede-se:














a) O fasor tensão de fase
b) O fasor corrente de fase
c) O fasor tensão de linha
d) A impedância de cada fase
e) O triângulo de potência referente à impedância de cada fase.
f) O triângulo de potência total.


Resolução:

a)
 se pode definir pelo gráfico de fasores: Se o fasor no gráfico deve estar em RMS (não está claro, mas considero que o gráfico está em RMS), os fasores das tensões de fase são: Ufa =150 <0°V, Ufb =150 <-120°V e 150 <+120°V.

b)
o fasor da corrente de fase pode também ser extraído do gráfico: Ifa =2.5<(-120°+90)A =  Ifa =2.5<(-30°)A,  Ifb =2.5<(-30-120°)A e  Ifc =2.5<(-30+20°)A

c)
a tensão de linha pode ser definido pelas tensões de fase Uab = Ufa-Ufb ou Uab = Ufa*sqrt(3) <(ângulo de Ufa)+30°, então Uab=150*sqrt(3)<+30°,  Ubc=150*sqrt(3)<-90° e  Ubc=150*sqrt(3)<+150°

d)
A impedância da fase pode ser determinada por Zf = Ufa/Ifa ou Zf=(150<0°)/(2.5<-30°) = 60<+30°Ohms

e)
O triângulo das potências de cada fase pode ser obtido pela fórmula da potência complexa: S=Ufa*conjugado(Ifa): S =150<0°*2;5<+30° = 375<30° VA ou S =  324.7595264191645+187.5j VA

f)
o triângulo das potências deve ser o triângulo da fase multiplicado por 3

11/03/2021

Atraso de transmissão

1) Considere a figura abaixo, na qual um único roteador está transmitindo pacotes, cada um com comprimento L bits, sobre um único link com taxa de transmissão R Mbps para outro roteador na outra extremidade do link.













Suponha que o tamanho do pacote seja L = 8000 bits e que a taxa de transmissão do link ao longo do link para o roteador à direita seja R = 1 Mbps.

1.a) Qual é o atraso de transmissão (o tempo necessário para transmitir todos os bits de um pacote para o link) ?

Resolução:
O atraso de transmissão do link = L / R = 8000 bits / 1 Mbps (1000000 bytes) = 8 ms ou 0,008 s

1.b) Qual é o número máximo de pacotes por segundo que podem ser transmitidos pelo link ?

Resolução:
O link pode transmitir 125.000000 pacotes por segundo

TAMANHO PACOTE = L bits 

Velocidade de transmissão do enlace com R bits/s


2) Considere a figura abaixo, com três links, cada um com a taxa de transmissão especificada e o tamanho do link.















Encontre o atraso de fim a fim (incluindo atrasos de transmissão e atrasos de propagação em cada um dos três links, mas ignorando atrasos de enfileiramento e atraso de processamento) de quando o host da esquerda começa a transmitir o primeiro bit de um pacote para o momento em que o último Um bit desse pacote é recebido no servidor à direita. A velocidade de atraso de propagação de luz em cada link é 3x10 ** 8 m / seg. 

Observe que as taxas de transmissão estão em Mbps e as distâncias de link estão em Km. Suponha um comprimento de pacote de 4000 bits. 

 
Dê sua resposta em milissegundos.

Observação:

dfimafim=N(dproc+dtrans+dprop)

dprop=d/s

dtrans=L/R


Resolução 1:

Atraso na transmissão do link 1 = L / R = 4000 bits / 100 Mbps = 0,040000 ms. 
Atraso de propagação do link 1 = d / s = 1 Km / 3 * 10 ** 8 m / seg = 0,003333 ms. 
Atraso na transmissão do link 2 = L / R = 4000 bits / 1000 Mbps = 0,004000 mseg. 
Atraso de propagação do link 2 = d / s = 1000 Km / 3 * 10 ** 8 m / seg = 3,3333333 ms. 
Atraso na transmissão do link 3 = L / R = 4000 bits / 100 Mbps = 0,040000 ms. 
Atraso de propagação do link 3 = d / s = 1 Km / 3 * 10 ** 8 m / seg = 0,003333 ms. 

Assim, o atraso total de ponta a ponta é a soma desses seis atrasos: 3.424.000 ms.

Resolução 2:

100 Mbps = 100000000 Bits por segundo
Atraso de transmissão link1 = L/R = 4000 bits / 100000000 bit/seg = 0,00004 segundos
Atraso de propagação link1 = d/s = ( 1 * 1000 )/ (3 * 10^8) = 0,000003333 segundos
Link 1  total do atraso= dt + dp = 0,00004 seg + 0,000003333 seg = 0,000043333 segundos

1000 Mbps = 1000000000 Bit por seg
Atraso de transmissão link2 = L/R = 4000 bits / 1000000000 bit/seg = 0,000004 segundos
Atraso de propagação link2 = d/s = ( 1000 * 1000 )/ (3 * 10^8) = 0,003333 segundos
Link2 total do atraso = dt + dp = 0,000004 +0,003333 = 0,003337 segundos

100 Mbps = 100000000 Bits por segundo
Atraso de transmissão link3 = L/R = 4000 bits / 100000000 bit/seg = 0,00004 segundos
Atraso de propagação link3 = d/s = ( 1 * 1000 )/ (3 * 10^8) = 0,000003333 segundos
Link 3  total do atraso= dt + dp = 0,00004 seg + 0,000003333 seg = 0,000043333 segundos

07/02/2021






a) Encontre H(Z), faça diagrama de polos e zeros e indique a RDC
Resolução:

1.a)
















































b) Encontre a resposta ao impulso do sistema
Resolução:


























c) Escreva a equação de diferença que caracteriza o sistema
Resolução:


















d) O sistema é estável e causal ?
Resolução:


2) A entrada de um sistema LIT causal é x[n]=u[-n-1]+(1/2)n u[n]. A transformada Z da saída desse sistema é 𝑌(𝑧) = 









a) Determine H(z) e sua RDC
b) Qual a RDC para Y(z) ?
c) Determine y[n].

Resolução:








2.b)


2.c)


3) : Um sistema LIT tem resposta ao impulso definida por: 








Determine y[n], numericamente e graficamente, para x[n]= u[n]-u[n-4].

Resolução:







































4)  Considere um sistema LIT que seja estável e para o qual H(z), a transformada Z da resposta ao impulso, seja dada por:







Suponha que x[n], a entrada do sistema, seja uma sequência degrau unitário.

a) Determine a saída y[n] calculando a convolução discreta de x[n] com h[n].
b) Determine a saída y[n] calculando a transformada inversa z de Y(z).
 
Resolução :

4.a)





















4.b)

























5)  Considere a figura abaixo onde se tem a associação em cascata de dois sistemas.

a) Esboce w[n] se x[n]=(-1)n u[n]. Determine também y[n].

b) b) Determine e esboce a resposta ao impulso total do sistema em cascata, isto é, faça um gráfico da saída y[n]=h[n] quando x[n]=δ[n].

c) Esboce w[n] para x[n]=2 δ[n]+4δ[n-4]-2δ[n-12].

















Resolução :

5.a)






































5.b)





































5.c)


12/01/2021

Mensagem automática no Google Planilhas do Excel VBA

function onEdit() {//função salva automática sempre que houver alguma alteração
  
  Browser.msgBox("Olá Mundo!")
  
}



 


03/01/2021

Proteção contra curto - circuito: Exercícios Resolvidos

Lista de atividades: Proteção

1) Dimensionamento do dispositivo de proteção contra curto-circuito para o motor trifásico de 5cv de alimentação (fase-fase) de 220V, fator de potência igual a 0,7. O rendimento do motor é de 0,6. A relação IP/IN = 5. O tempo de partida é 5 segundos. 

Determinar a corrente nominal e a corrente de partida dada pela Equação 1.1







Resolução:





2) Dimensionamento do dispositivo de proteção contra curto-circuito para o motor trifásico de 14cv de alimentação (fase-fase) de 380V, fator de potência igual a 0,9. O rendimento do motor é de 0,85. A relação IP/IN = 6. O tempo de partida é 5 segundos.

Determinar a corrente nominal e a corrente de partida dada pela Equação 1.2

 





Resolução:





3) Dimensionamento do dispositivo de proteção contra curto-circuito para o motor trifásico de 50 cv de alimentação (fase-fase) de 380V, fator de potência igual a 0,92. O rendimento do motor é de 0,85. A relação IP/IN = 6. O tempo de partida é 7 segundos.

 Determinar a corrente nominal e a corrente de partida dada pela Equação 1.3








Resolução:











































4)  Dimensionamento do dispositivo de proteção contra curto-circuito para o motor trifásico de 30 cv de alimentação (fase-fase) de 380V, fator de potência igual a 0,92. O rendimento do motor é de 0,85. A relação IP/IN = 7. O tempo de partida é 6 segundos.

Determinar a corrente nominal e a corrente de partida dada pela Equação 1.4

 






Resolução:









Dimensionamento de condutores pelo método da queda de tensão

Um motor indução trifásico de 20 cv com alimentação em 220V, 60 Hz, fator de potência 0,8 e rendimento 0,96. A corrente de partida é cinco vezes a nominal. Está instalado a cerca a 50 metros do CCM. A queda de tensão desejada é de 2%.

Resolução:

Cálculo da corrente nominal:

In = ( Potencia mecanica . 736 ) / ( 3 . V . cos(θ) . n ) = 20 . 736/(3 . 220 . 0,8 . 0,96)= 50,3 [A]

Seção = 100.√3.ρ .Σ.L.I / (μ .V) 

ρ= (1/56); 
L= 50m(distância); 
In= 50,3 A;
μ= 2%(quedade tensão);
V= 220V (tensão) 

Seção = 100.√3.(1/56) . 50 . 50,3 / (2 . 220) = 17,67mm² ( comercial de 25 mm²)

Jogo do Flappy Bird com HTML

Arquivo: flappy.css
* {
    box-sizingborder-box;
}

@font-face{
    font-family'Pixel';
    srcurl('../fonts/Pixel.ttf');/*importando fonte*/
}

[wm-flappy]{
    positionrelative;/*posição relativa*/
    border5px solid dodgerblue;/*borda 5 pixel*/
    height700px;
    width1200px;
    margin15px;/*margem*/
    background-colordarkslateblue/*cor */
    overflowhidden/*qualquer item fora definida nessa div não vai aparecer*/
}

.passaro{
    positionabsolute;
    width60px;
    leftcalc(50% - 30px); /*50% à esquerda menos 30 pixel*/
}

.par-de-barreiras {
    positionabsolute;
    top0;
    height100%;
    displayflex;
    flex-directioncolumn;/*organiza na vertical*/
    justify-contentspace-between/*um embaixo , outro em cima, ...*/
}

.barreira {
    displayflex;
    flex-directioncolumn;
    align-itemscenter;
}

.barreira .borda {
    height30px;
    width130px/*largura*/
    backgroundlinear-gradient(90deg#639301#A5E82E);
    border2px solid #000;
}

.barreira .corpo { /*corpo*/
    height150px;
    width110px;
    backgroundlinear-gradient(90deg#639301#A5E82E);
    border-left2px solid #000;
    border-right2px solid #000;
}

.progresso {
    positionabsolute;
    top10px/*no topo*/
    right10px/*alinhado 10 pixel a esquerdad*/
    font-family: Pixel;
    font-size70px;
    z-index100;
}


Arquivo: flappy.js
function novoElemento(tagNameclassName) {
    const elem = document.createElement(tagName)
    elem.className = className
    return elem
}

function Barreira(reversa = false) {
    this.elemento = novoElemento('div''barreira')

    const borda = novoElemento('div''borda')
    const corpo = novoElemento('div''corpo')
    this.elemento.appendChild(reversa ? corpo : borda)
    this.elemento.appendChild(reversa ? borda : corpo)

    this.setAltura = altura => corpo.style.height = `${altura}px`
}

// const b = new Barreira(true)
// b.setAltura(300)
// document.querySelector('[wm-flappy]').appendChild(b.elemento)

function ParDeBarreiras(alturaaberturax) {
    this.elemento = novoElemento('div''par-de-barreiras')

    this.superior = new Barreira(true)
    this.inferior = new Barreira(false)

    this.elemento.appendChild(this.superior.elemento)
    this.elemento.appendChild(this.inferior.elemento)

    this.sortearAbertura = () => {
        const alturaSuperior = Math.random() * (altura - abertura)
        const alturaInferior = altura - abertura - alturaSuperior
        this.superior.setAltura(alturaSuperior)
        this.inferior.setAltura(alturaInferior)
    }

    this.getX = () => parseInt(this.elemento.style.left.split('px')[0])
    this.setX = x => this.elemento.style.left = `${x}px`
    this.getLargura = () => this.elemento.clientWidth

    this.sortearAbertura()
    this.setX(x)
}

// const b = new ParDeBarreiras(700, 200, 800)
// document.querySelector('[wm-flappy]').appendChild(b.elemento)

function Barreiras(alturalarguraaberturaespaconotificarPonto) {
    this.pares = [
        new ParDeBarreiras(alturaaberturalargura),
        new ParDeBarreiras(alturaaberturalargura + espaco),
        new ParDeBarreiras(alturaaberturalargura + espaco * 2),
        new ParDeBarreiras(alturaaberturalargura + espaco * 3)
    ]

    const deslocamento = 3
    this.animar = () => {
        this.pares.forEach(par => {
            par.setX(par.getX() - deslocamento)

            // quando o elemento sair da área do jogo
            if (par.getX() < -par.getLargura()) {
                par.setX(par.getX() + espaco * this.pares.length)
                par.sortearAbertura()
            }

            const meio = largura / 2
            const cruzouOMeio = par.getX() + deslocamento >= meio
                && par.getX() < meio
            if(cruzouOMeionotificarPonto()
        })
    }
}

function Passaro(alturaJogo) {
    let voando = false

    this.elemento = novoElemento('img''passaro')
    this.elemento.src = 'imgs/passaro.png'

    this.getY = () => parseInt(this.elemento.style.bottom.split('px')[0])
    this.setY = y => this.elemento.style.bottom = `${y}px`

    window.onkeydown = e => voando = true
    window.onkeyup = e => voando = false

    this.animar = () => {
        const novoY = this.getY() + (voando ? 8 : -5)
        const alturaMaxima = alturaJogo - this.elemento.clientHeight

        if (novoY <= 0) {
            this.setY(0)
        } else if (novoY >= alturaMaxima) {
            this.setY(alturaMaxima)
        } else {
            this.setY(novoY)
        }
    }

    this.setY(alturaJogo / 2)
}



function Progresso() {
    this.elemento = novoElemento('span''progresso')
    this.atualizarPontos = pontos => {
        this.elemento.innerHTML = pontos
    }
    this.atualizarPontos(0)
}

// const barreiras = new Barreiras(700, 1200, 200, 400)
// const passaro = new Passaro(700)
// const areaDoJogo = document.querySelector('[wm-flappy]')
// areaDoJogo.appendChild(passaro.elemento)
// areaDoJogo.appendChild(new Progresso().elemento)
// barreiras.pares.forEach(par => areaDoJogo.appendChild(par.elemento))
// setInterval(() => {
//     barreiras.animar()
//     passaro.animar()
// }, 20)

function estaoSobrepostos(elementoAelementoB) {
    const a = elementoA.getBoundingClientRect()
    const b = elementoB.getBoundingClientRect()

    const horizontal = a.left + a.width >= b.left
        && b.left + b.width >= a.left
    const vertical = a.top + a.height >= b.top
        && b.top + b.height >= a.top
    return horizontal && vertical
}

function colidiu(passarobarreiras) {
    let colidiu = false
    barreiras.pares.forEach(parDeBarreiras => {
        if (!colidiu) {
            const superior = parDeBarreiras.superior.elemento
            const inferior = parDeBarreiras.inferior.elemento
            colidiu = estaoSobrepostos(passaro.elementosuperior)
                || estaoSobrepostos(passaro.elementoinferior)
        }
    })
    return colidiu
}

function FlappyBird() {
    let pontos = 0

    const areaDoJogo = document.querySelector('[wm-flappy]')
    const altura = areaDoJogo.clientHeight
    const largura = areaDoJogo.clientWidth

    const progresso = new Progresso()
    const barreiras = new Barreiras(alturalargura200400,
        () => progresso.atualizarPontos(++pontos))
    const passaro = new Passaro(altura)

    areaDoJogo.appendChild(progresso.elemento)
    areaDoJogo.appendChild(passaro.elemento)
    barreiras.pares.forEach(par => areaDoJogo.appendChild(par.elemento))

    this.start = () => {//inicia o jogo
        // loop do jogo
        const temporizador = setInterval(() => {
            barreiras.animar()
            passaro.animar()

            if (colidiu(passarobarreiras)) {
                clearInterval(temporizador)
            }
        }, 20)
    }
}

new FlappyBird().start()


Arquivo: flappy.html
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>Flappy Bird</title>
    <link rel="stylesheet" href="css/estilo.css">
    <link rel="stylesheet" href="css/flappy.css">
</head>

<body class="conteudo">
    <h1>Flappy Bird</h1>
    <div wm-flappy></div>
    <script src="flappy.js"></script>
</body>

</html>





























Créditos para: Nilson Leitão