Ir ao conteúdo

kampa896

Membro Pleno
  • Posts

    75
  • Cadastrado em

  • Última visita

Reputação

68
  1. @Alexsander Gutierrez você me explicou em poucos minutos o que estou horas pesquisando. Muito obrigado, meu amigo!
  2. Muito obrigado @Alexsander Gutierrez, realmente o que estava faltando é o arrow function. Porém esbarrei em outro problema. O primeiro foi adicionar o evento, e agora quero retirar. Após ser declarado o jogador vencedor, os eventos de adicionar elementos no tabuleiro continua funcionando. Eu quero deixar sem eventos, após declarado o vencedor. Porém, a minha função "removeClicks" adicionada após a declaração dos vencedores não funciona. Pesquisei usando até o ChatGPT e não localizo o erro, pois ele retorna que está tudo certo. Sabe orientar onde está o erro? let jogadoresAtivos = false; function removeClicks() { const btnClick = document.querySelectorAll('.table-data'); btnClick.forEach(function (elemento) { elemento.removeEventListener('click', setOnCeil); }); } function cellWins(cell) { cell.style.border = '8px solid #F94A29'; cell.style.backgroundColor = '#FC7300'; } window.onload = function () { document.getElementById('players').style.visibility = 'hidden'; document.getElementById('jogadorAtual').style.visibility = 'hidden'; document.getElementById('jogo').style.visibility = 'hidden'; }; const infoBtn = document.getElementById('info'); infoBtn.addEventListener('click', () => { alert( 'Jogo da Velha feito com HTML, CSS e JavaScript\n' + 'Desenvolvido por: @campanaricarlos\n' + 'GitHub: https://github.com/ccampa896\n' + 'LinkedIn: https://www.linkedin.com/in/carlos-campanari-9b4b3b1b3/\n' ); }); const iconsBtn = document.getElementById('icons'); iconsBtn.addEventListener('click', () => { alert('Icons by https://icons.getbootstrap.com/'); }); function useLightTheme() { document.body.style.color = '#212529'; document.body.style.backgroundColor = '#f1f5f9'; const hash = document.getElementById('hashtag'); const controller = document.getElementById('controller'); hash.style.border = '0px solid #fff'; controller.style.border = '0px solid #fff'; } function useDarkTheme() { document.body.style.color = '#f1f5f9'; document.body.style.backgroundColor = '#212529'; const hash = document.getElementById('hashtag'); const controller = document.getElementById('controller'); hash.style.margin = '10px'; controller.style.margin = '10px'; hash.style.border = '5px solid #fff'; controller.style.border = '5px solid #fff'; hash.style.borderRadius = '10px'; controller.style.borderRadius = '10px'; } const lightBtn = document.getElementById('is-light'); const darkBtn = document.getElementById('is-dark'); lightBtn.addEventListener('click', useLightTheme); darkBtn.addEventListener('click', useDarkTheme); function jogadores() { let elementos = document.querySelectorAll('.tresD'); elementos.forEach(function (elemento) { elemento.remove(); }); document.getElementById('players').style.visibility = 'visible'; } const btnJogadores = document.getElementById('jogadores'); btnJogadores.addEventListener('click', jogadores); let NomeJogador1 = ''; let NomeJogador2 = ''; const btnSubmit = document.getElementById('submit'); btnSubmit.addEventListener('click', () => { NomeJogador1 = document.getElementById('jogador1').value; NomeJogador2 = document.getElementById('jogador2').value; jogadoresAtivos = true; alert( 'Jogadores cadastrados!\n' + 'Jogador 1: ' + NomeJogador1 + '\n' + 'Jogador 2: ' + NomeJogador2 ); let elementos = document.querySelectorAll('#players'); document.getElementById('jogador1').value = ''; document.getElementById('jogador2').value = ''; elementos.forEach(function (elemento) { elemento.remove(); }); }); function Jogador(nome, forma) { this.nome = nome; this.forma = forma; } let jogador1, jogador2; //Jogador da rodada let jogadorAtual; let formas = ['X', 'O']; /* 0 1 2 3 4 5 6 7 8 */ let tabuleiro = new Array(9); const setLabelJogadorAtual = function () { document.getElementById('jogadorAtualh3').innerHTML = 'Jogador atual: ' + jogadorAtual.nome; }; function iniciarJogo() { if (jogadoresAtivos) { alert( 'Para iniciar um novo jogo, clique em "Reiniciar"\n' + 'Ou clique em "Parar jogo" para finalizar o jogo atual!' ); alert( 'Jogo iniciado!\n' + 'Jogador 1: ' + NomeJogador1 + '\n' + 'Jogador 2: ' + NomeJogador2 + '\n' + 'Boa sorte!' ); jogador1 = new Jogador(NomeJogador1, 0); //X jogador2 = new Jogador(NomeJogador2, 1); //O jogadorAtual = jogador1; setLabelJogadorAtual(); document.getElementById('jogadorAtual').style.visibility = 'visible'; document.getElementById('jogo').style.visibility = 'visible'; } else { alert('Você precisa informar os jogadores!'); } } const btnIniciarJogo = document.getElementById('iniciarJogo'); btnIniciarJogo.addEventListener('click', iniciarJogo); /*Verifica se o tabuleiro está completamente preenchido, se estiver, significa que ninguém venceu a rodada*/ tabuleiroIsFilled = function () { let preenchidos = 0; for (let i = 0; i < tabuleiro.length; i++) if (tabuleiro[i] != undefined) preenchidos++; return preenchidos == tabuleiro.length; }; /*Verifica a existência de ocorrências de um mesmo elemento(X ou O) nas linhas do tabuleiro, procurando um vencedor*/ const table_datas = document.querySelectorAll('.table-data'); allElementsInSomeLine = function () { for (let i = 0; i < 7; i += 3) { if ( tabuleiro[i] == 'X' && tabuleiro[i + 1] == 'X' && tabuleiro[i + 2] == 'X' ) { cellWins(table_datas[i]); cellWins(table_datas[i + 1]); cellWins(table_datas[i + 2]); alert(jogador1.nome + ' wins!!!'); removeClicks(); } if ( tabuleiro[i] == 'O' && tabuleiro[i + 1] == 'O' && tabuleiro[i + 2] == 'O' ) { cellWins(table_datas[i]); cellWins(table_datas[i + 1]); cellWins(table_datas[i + 2]); alert(jogador2.nome + ' wins!!!'); removeClicks(); } } }; /*Verifica a existência de ocorrências de um mesmo elemento(X ou O) nas colunas do tabuleiro, procurando um vencedor*/ allElementsInSomeColumn = function () { for (let i = 0; i < 3; i++) { if ( tabuleiro[i] == 'X' && tabuleiro[i + 3] == 'X' && tabuleiro[i + 6] == 'X' ) { cellWins(table_datas[i]); cellWins(table_datas[i + 3]); cellWins(table_datas[i + 6]); alert(jogador1.nome + ' wins!!!'); removeClicks(); if ( tabuleiro[i] == 'O' && tabuleiro[i + 3] == 'O' && tabuleiro[i + 6] == 'O' ) { cellWins(table_datas[i]); cellWins(table_datas[i + 3]); cellWins(table_datas[i + 6]); alert(jogador2.nome + ' wins!!!'); removeClicks(); } } } }; /*Verifica a existência de ocorrências de um mesmo elemento(X ou O) nas diagonais do tabuleiro, procurando um vencedor*/ allElementsInSomeDiagonal = function () { if (tabuleiro[0] == 'X' && tabuleiro[4] == 'X' && tabuleiro[8] == 'X') { alert(jogador1.nome + ' wins!!!'); cellWins(table_datas[0]); cellWins(table_datas[4]); cellWins(table_datas[8]); removeClicks(); } else if ( tabuleiro[2] == 'X' && tabuleiro[4] == 'X' && tabuleiro[6] == 'X' ) { alert(jogador1.nome + ' wins!!!'); cellWins(table_datas[2]); cellWins(table_datas[4]); cellWins(table_datas[6]); removeClicks(); } else if ( tabuleiro[0] == 'O' && tabuleiro[4] == 'O' && tabuleiro[8] == 'O' ) { alert(jogador2.nome + ' wins!!!'); cellWins(table_datas[0]); cellWins(table_datas[4]); cellWins(table_datas[8]); removeClicks(); } else if ( tabuleiro[2] == 'O' && tabuleiro[4] == 'O' && tabuleiro[6] == 'O' ) { alert(jogador2.nome + ' wins!!!'); cellWins(table_datas[2]); cellWins(table_datas[4]); cellWins(table_datas[6]); removeClicks(); } }; const btnCell0 = document.getElementById('cell0'); const btnCell1 = document.getElementById('cell1'); const btnCell2 = document.getElementById('cell2'); const btnCell3 = document.getElementById('cell3'); const btnCell4 = document.getElementById('cell4'); const btnCell5 = document.getElementById('cell5'); const btnCell6 = document.getElementById('cell6'); const btnCell7 = document.getElementById('cell7'); const btnCell8 = document.getElementById('cell8'); /*Preenche a célula da tabela HTML escolhida pelo usuário ao clicar, além de cuidar do jogador atual da rodada e chamar as funções de verificação de algum ganhador */ function setOnCeil(cell, pos) { if (tabuleiro[pos] == undefined) { cell.innerText = formas[jogadorAtual.forma]; tabuleiro[pos] = formas[jogadorAtual.forma]; if (jogadorAtual == jogador1) { jogadorAtual = jogador2; } else { jogadorAtual = jogador1; } setLabelJogadorAtual(); } else { alert('Célula já preenchida! Escolha outra!'); } allElementsInSomeLine(); allElementsInSomeColumn(); allElementsInSomeDiagonal(); if (tabuleiroIsFilled()) { alert('Nobody wins! :(. Try Again'); pararJogo(); } } btnCell0.addEventListener('click', () => { setOnCeil(btnCell0, 0); }); btnCell1.addEventListener('click', () => { setOnCeil(btnCell1, 1); }); btnCell2.addEventListener('click', () => { setOnCeil(btnCell2, 2); }); btnCell3.addEventListener('click', () => { setOnCeil(btnCell3, 3); }); btnCell4.addEventListener('click', () => { setOnCeil(btnCell4, 4); }); btnCell5.addEventListener('click', () => { setOnCeil(btnCell5, 5); }); btnCell6.addEventListener('click', () => { setOnCeil(btnCell6, 6); }); btnCell7.addEventListener('click', () => { setOnCeil(btnCell7, 7); }); btnCell8.addEventListener('click', () => { setOnCeil(btnCell8, 8); }); function pararJogo() { if (jogadoresAtivos) { alert( 'Jogo finalizado!\n' + 'Obrigado por jogar!\n' + 'Página recarregada!' ); jogadoresAtivos = false; window.location.reload(); } else { alert('O jogo não foi iniciado!\n' + 'Comece um novo jogo!'); } } const btnPararJogo = document.getElementById('pararJogo'); btnPararJogo.addEventListener('click', pararJogo); const btnJogoDaVelha = document.getElementById('jogo_wiki'); btnJogoDaVelha.addEventListener('click', () => { alert('Página recarregada!\n' + 'Você será redirecionado para a Wikipédia!'); window.location.reload(); window.open('https://pt.wikipedia.org/wiki/Jogo_da_velha'); }); const btnResetarJogo = document.getElementById('reset'); btnResetarJogo.addEventListener('click', () => { alert('Página recarregada!\n' + 'Jogo resetado!'); window.location.reload(); });
  3. Pessoal, bom dia. Não consigo achar o erro de lógica ou de escopo da minha variável "jogadorAtual" para este jogo simples de jogo da velha. O console do navegador apresenta o seguinte erro: "Uncaught TypeError: jogadorAtual is undefined". Os códigos da página: HTML: <!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Jogo da Velha</title> <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-aFq/bzH65dt+w6FI2ooMVUpc+21e0SRygnTpmBvdBgSdnuTN7QbdgL+OapgHtvPp" crossorigin="anonymous" /> <link rel="stylesheet" href="./style.css" /> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-qKXV1j0HvMUeCBQ+QVp7JcfGl760yU08IQ+GpUo5hlbpg51QRiuqHAJz8+BrxE/N" crossorigin="anonymous" ></script> <script src="./index.js" defer></script> </head> <header> <nav class="navbar bg-body-tertiary"> <div class="container-fluid"> <a class="navbar-brand" title="Jogo da Velha: Wikipédia, a enciclopédia livre" href="#" id="jogo_wiki" > <img src="./imagens/hash.svg" alt="Logo" width="30" height="24" class="d-inline-block align-text-top" /> Jogo da Velha </a> <a class="navbar-brand" id="jogadores" href="#"> <img src="./imagens/person-fill.svg" alt="Logo" width="30" height="24" class="d-inline-block align-text-top" /> Jogadores </a> <a class="navbar-brand" id="iniciarJogo" href="#"> <img src="./imagens/play-circle.svg" alt="Logo" width="30" height="24" class="d-inline-block align-text-top" /> Iniciar </a> <a class="navbar-brand" href="#"> <img src="./imagens/repeat.svg" alt="Logo" width="30" height="24" class="d-inline-block align-text-top" /> Reiniciar </a> <a class="navbar-brand" id="pararJogo" href="#"> <img src="./imagens/x-lg.svg" alt="Logo" width="30" height="24" class="d-inline-block align-text-top" /> Parar jogo </a> <a class="navbar-brand" id="is-light" href="#"> <img src="./imagens/sun-fill.svg" alt="Logo" width="30" height="24" class="d-inline-block align-text-top" /> Modo Claro </a> <a class="navbar-brand" id="is-dark" href="#"> <img src="./imagens/moon-fill.svg" alt="Logo" width="30" height="24" class="d-inline-block align-text-top" /> Modo Escuro </a> <a class="navbar-brand" id="info" href="#"> <img src="./imagens/info.svg" alt="Logo" width="30" height="24" class="d-inline-block align-text-top" /> Info </a> <a class="navbar-brand" id="icons" href="#"> <img src="./imagens/images.svg" alt="Logo" width="30" height="24" class="d-inline-block align-text-top" /> Icons </a> </div> </nav> </header> <body> <div class="clearfix"> <img src="./imagens/hash.svg" class="float-end" id="hashtag" alt="hashtag" /> <p> O jogo da velha (português brasileiro) ou jogo do galo (português europeu) ou três em linha é um jogo e/ou passatempo popular. É um jogo de regras extremamente simples, que não traz grandes dificuldades para seus jogadores e é facilmente aprendido. A origem é desconhecida, com indicações de que pode ter começado no antigo Egito, onde foram encontrados tabuleiros esculpidos na rocha, que teriam mais de 3.500 anos. De alguma forma, é um jogo "aparentado" dos "Merels". </p> <img src="./imagens/controller.svg" class="float-start" id="controller" alt="controller" /> <p> Algumas lendas urbanas contam que o jogo terá nascido em Portugal, na cidade de Almada no ano 545. No entanto, só foi popularizado no ano 1500, pelo descobridor Pedro Álvares Cabral, que adorava jogar este jogo durante as suas viagens. Álvares Cabral terá decidido que este jogo seria o primeiro a ser ensinado ao povo indígena no Brasil. O jogo pode ser jogado sobre um tabuleiro ou mesmo sendo riscado sobre um pedaço de papel ou mesa. O menor tabuleiro do mundo foi feito com DNA. </p> <p> Se os dois jogadores jogarem sempre da melhor forma, o jogo terminará sempre em empate. A lógica do jogo é muito simples, de modo que não é difícil deduzir ou decorar todas as possibilidades para efetuar a melhor jogada - apesar de o número total de possibilidades ser muito grande, a maioria delas é simétrica, além de que as regras são simples. Por esse motivo, é muito comum que o jogo empate (ou "dê velha"). </p> <br /> <div class="tresD"> <div class="front"> <img src="./imagens/notebook.png" alt="Tecnologia da Informação" /> </div> <div class="back"> <img src="./imagens/hash.png" alt="Tecnologia da Informação" /> </div> </div> </div> <div id="jogadorAtual"> <h3 id="jogadorAtualh3"></h3> </div> <div id="players"> <h3>Jogadores</h3> <label for="Jogador 1"> Jogador 1: </label> <input type="text" id="jogador1" /> <br /> <br /> <label for="Jogador 1"> Jogador 2: </label> <input type="text" id="jogador2" /> <br /> <br /> <input type="submit" id="submit" value="Ok" /> </div> <div id="jogo"> <table cellpadding="0" cellspacing="0" id="table"> <tr> <td class="table-data" id="cell0" > &nbsp; </td> <td class="table-data" id="cell1" > &nbsp; </td> <td class="table-data" id="cell2" > &nbsp; </td> </tr> <tr> <td class="table-data" id="cell3" > &nbsp; </td> <td class="table-data" id="cell4" > &nbsp; </td> <td class="table-data" id="cell5" > &nbsp; </td> </tr> <tr> <td class="table-data" id="cell6" > &nbsp; </td> <td class="table-data" id="cell7" > &nbsp; </td> <td class="table-data" id="cell8" > &nbsp; </td> </tr> </table> </body> </html> JavaScript: let jogadoresAtivos = false; function cellWins(cell) { cell.style.hover = 'transform: scale(1.2);'; } window.onload = function () { document.getElementById('players').style.visibility = 'hidden'; document.getElementById('jogadorAtual').style.visibility = 'hidden'; document.getElementById('jogo').style.visibility = 'hidden'; }; const infoBtn = document.getElementById('info'); infoBtn.addEventListener('click', () => { alert( 'Jogo da Velha feito com HTML, CSS e JavaScript\n' + 'Desenvolvido por: @campanaricarlos\n' + 'GitHub: https://github.com/ccampa896\n' + 'LinkedIn: https://www.linkedin.com/in/carlos-campanari-9b4b3b1b3/\n' ); }); const iconsBtn = document.getElementById('icons'); iconsBtn.addEventListener('click', () => { alert('Icons by https://icons.getbootstrap.com/'); }); function useLightTheme() { document.body.style.color = '#212529'; document.body.style.backgroundColor = '#f1f5f9'; const hash = document.getElementById('hashtag'); const controller = document.getElementById('controller'); hash.style.border = '0px solid #fff'; controller.style.border = '0px solid #fff'; } function useDarkTheme() { document.body.style.color = '#f1f5f9'; document.body.style.backgroundColor = '#212529'; const hash = document.getElementById('hashtag'); const controller = document.getElementById('controller'); hash.style.margin = '10px'; controller.style.margin = '10px'; hash.style.border = '5px solid #fff'; controller.style.border = '5px solid #fff'; hash.style.borderRadius = '10px'; controller.style.borderRadius = '10px'; } const lightBtn = document.getElementById('is-light'); const darkBtn = document.getElementById('is-dark'); lightBtn.addEventListener('click', useLightTheme); darkBtn.addEventListener('click', useDarkTheme); function jogadores() { let elementos = document.querySelectorAll('.tresD'); elementos.forEach(function (elemento) { elemento.remove(); }); document.getElementById('players').style.visibility = 'visible'; } const btnJogadores = document.getElementById('jogadores'); btnJogadores.addEventListener('click', jogadores); let NomeJogador1 = ''; let NomeJogador2 = ''; const btnSubmit = document.getElementById('submit'); btnSubmit.addEventListener('click', () => { NomeJogador1 = document.getElementById('jogador1').value; NomeJogador2 = document.getElementById('jogador2').value; jogadoresAtivos = true; alert( 'Jogadores cadastrados!\n' + 'Jogador 1: ' + NomeJogador1 + '\n' + 'Jogador 2: ' + NomeJogador2 ); let elementos = document.querySelectorAll('#players'); elementos.forEach(function (elemento) { elemento.remove(); }); }); function Jogador(nome, forma) { this.nome = nome; this.forma = forma; } let jogador1, jogador2; //Jogador da rodada let jogadorAtual; let formas = ['X', 'O']; /* 0 1 2 3 4 5 6 7 8 */ let tabuleiro = new Array(9); const setLabelJogadorAtual = function () { document.getElementById('jogadorAtualh3').innerHTML = 'Jogador atual: ' + jogadorAtual.nome; }; function iniciarJogo() { if (jogadoresAtivos) { alert( 'Para iniciar um novo jogo, clique em "Reiniciar"\n' + 'Ou clique em "Parar jogo" para finalizar o jogo atual!' ); alert( 'Jogo iniciado!\n' + 'Jogador 1: ' + NomeJogador1 + '\n' + 'Jogador 2: ' + NomeJogador2 + '\n' + 'Boa sorte!' ); jogador1 = new Jogador(NomeJogador1, 0); //X jogador2 = new Jogador(NomeJogador2, 1); //O jogadorAtual = jogador1; setLabelJogadorAtual(); document.getElementById('jogadorAtual').style.visibility = 'visible'; document.getElementById('jogo').style.visibility = 'visible'; } else { alert('Você precisa informar os jogadores!'); } } jogadorAtual = jogador1; const btnIniciarJogo = document.getElementById('iniciarJogo'); btnIniciarJogo.addEventListener('click', iniciarJogo); /*Verifica se o tabuleiro está completamente preenchido, se estiver, significa que ninguém venceu a rodada*/ tabuleiroIsFilled = function () { let preenchidos = 0; for (let i = 0; i < tabuleiro.length; i++) if (tabuleiro[i] != undefined) preenchidos++; return preenchidos == tabuleiro.length; }; /*Verifica a existência de ocorrências de um mesmo elemento(X ou O) nas linhas do tabuleiro, procurando um vencedor*/ allElementsInSomeLine = function () { for (let i = 0; i < 7; i += 3) { if ( tabuleiro[i] == 'X' && tabuleiro[i + 1] == 'X' && tabuleiro[i + 2] == 'X' ) { alert(jogador1.nome + ' wins!!!'); pararJogo(); } if ( tabuleiro[i] == 'O' && tabuleiro[i + 1] == 'O' && tabuleiro[i + 2] == 'O' ) { alert(jogador2.nome + ' wins!!!'); pararJogo(); } } }; /*Verifica a existência de ocorrências de um mesmo elemento(X ou O) nas colunas do tabuleiro, procurando um vencedor*/ allElementsInSomeColumn = function () { for (let i = 0; i < 3; i++) { if ( tabuleiro[i] == 'X' && tabuleiro[i + 3] == 'X' && tabuleiro[i + 6] == 'X' ) { alert(jogador1.nome + ' wins!!!'); pararJogo(); } if ( tabuleiro[i] == 'O' && tabuleiro[i + 3] == 'O' && tabuleiro[i + 6] == 'O' ) { alert(jogador2.nome + ' wins!!!'); pararJogo(); } } }; /*Verifica a existência de ocorrências de um mesmo elemento(X ou O) nas diagonais do tabuleiro, procurando um vencedor*/ allElementsInSomeDiagonal = function () { if ( (tabuleiro[0] == 'X' && tabuleiro[4] == 'X' && tabuleiro[8] == 'X') || (tabuleiro[2] == 'X' && tabuleiro[4] == 'X' && tabuleiro[6] == 'X') ) { alert(jogador1.nome + ' wins!!!'); pararJogo(); } else if ( (tabuleiro[0] == 'O' && tabuleiro[4] == 'O' && tabuleiro[8] == 'O') || (tabuleiro[2] == 'O' && tabuleiro[4] == 'O' && tabuleiro[6] == 'O') ) { alert(jogador2.nome + ' wins!!!'); pararJogo(); } }; /*Preenche a célula da tabela HTML escolhida pelo usuário ao clicar, além de cuidar do jogador atual da rodada e chamar as funções de verificação de algum ganhador */ function setOnCeil(cell, pos) { if (tabuleiro[pos] == undefined) { cell.textContent = jogadorAtual.forma; tabuleiro[pos] = jogadorAtual.forma; if (jogadorAtual == jogador1) { jogadorAtual = jogador2; } else { jogadorAtual = jogador1; } setLabelJogadorAtual(); } else { alert('Célula já preenchida! Escolha outra!'); } allElementsInSomeLine(); allElementsInSomeColumn(); allElementsInSomeDiagonal(); if (tabuleiroIsFilled()) { alert('Nobody wins! :(. Try Again'); pararJogo(); } } const btnCell0 = document.getElementById('cell0'); const btnCell1 = document.getElementById('cell1'); const btnCell2 = document.getElementById('cell2'); const btnCell3 = document.getElementById('cell3'); const btnCell4 = document.getElementById('cell4'); const btnCell5 = document.getElementById('cell5'); const btnCell6 = document.getElementById('cell6'); const btnCell7 = document.getElementById('cell7'); const btnCell8 = document.getElementById('cell8'); btnCell0.addEventListener('onclick', setOnCeil(btnCell0, 0)); btnCell1.addEventListener('onclick', setOnCeil(btnCell1, 1)); btnCell2.addEventListener('onclick', setOnCeil(btnCell2, 2)); btnCell3.addEventListener('onclick', setOnCeil(btnCell3, 3)); btnCell4.addEventListener('onclick', setOnCeil(btnCell4, 4)); btnCell5.addEventListener('onclick', setOnCeil(btnCell5, 5)); btnCell6.addEventListener('onclick', setOnCeil(btnCell6, 6)); btnCell7.addEventListener('onclick', setOnCeil(btnCell7, 7)); btnCell8.addEventListener('onclick', setOnCeil(btnCell8, 8)); const pararJogo = function () { if (jogadoresAtivos) { alert( 'Jogo finalizado!\n' + 'Obrigado por jogar!\n' + 'Página recarregada!' ); jogadoresAtivos = false; document.getElementById('jogador1').value = ''; document.getElementById('jogador2').value = ''; window.location.reload(); } else { alert('O jogo não foi iniciado!\n' + 'Comece um novo jogo!'); } }; const btnPararJogo = document.getElementById('pararJogo'); btnPararJogo.addEventListener('click', pararJogo); const btnJogoDaVelha = document.getElementById('jogo_wiki'); btnJogoDaVelha.addEventListener('click', () => { alert('Página recarregada!\n' + 'Você será redirecionado para a Wikipédia!'); window.location.reload(); window.open('https://pt.wikipedia.org/wiki/Jogo_da_velha'); }); CSS: * { padding: 0; margin: 0; box-sizing: border-box; } .clearfix { padding: 30px; text-align: justify; } .float-end { padding: 10px; height: 150px; width: 150px; } .float-start { padding: 10px; height: 150px; width: 150px; } .tresD { height: 400px; width: 220px; position: relative; perspective: 1000px; margin: 0 auto; } .front, .back { position: absolute; backface-visibility: hidden; transform-style: preserve-3d; transition: all 1s ease; } .front { transform: rotateY(0deg); } .back { transform: rotateY(180deg); } .tresD:hover .front { transform: rotateY(-180deg); } .tresD:hover .back { transform: rotateY(0deg); } #players { margin: 0 auto 50px; width: 250px; border: 2px solid black; background-color: #f2f2f2; padding: 20px; text-align: center; } h3 { font-size: 24px; color: #333; } label { font-size: 16px; color: #666; } #submit { margin-top: 4px; height: 25px; width: 150px; font-size: 14px; } #jogadorAtual { margin: 0 auto 50px; width: 250px; border: 2px solid black; background-color: #f2f2f2; padding: 20px; text-align: center; font-weight: bold; } #jogadorAtualh3 { font-size: 24px; color: #333; } #table { margin: 0 auto; width: 400px; border: 2px solid black; background-color: #f2f2f2; padding: 20px; text-align: center; } #table tr { height: 100px; } #table td { width: 100px; border: 1px solid black; font-size: 100px; } #table td:hover { border: 3px solid black; cursor: pointer; } #jogo { padding-bottom: 50px; }
  4. Pessoal, boa noite. Para praticar, estou utilizando o SGBD MySQL e o aplicativo MySQL Workbench com o banco de dados SAKILA, disponível em https://dev.mysql.com/doc/sakila/en/sakila-installation.html. E estou com a seguinte dúvida: ------------------------------------------------ 2. A gerência da rede deseja entender se no mês de maio de 2005 houve diferença na recorrência dos consumidores fidelizados (ou seja, que realizaram mais de um aluguel) entre as duas lojas. Seu desafio é escrever uma consulta que retorne o número médio de dias entre os aluguéis desses consumidores, por loja que estão registrados. Dicas de como construir essa consulta: - Descubra, primeiro, quem são os consumidores (pelo seu customer_id) que queremos analisar: realizaram dois ou mais aluguéis no mês de maio de 2005. Os consumidores analisados podem ser identificados usando o seguinte comando: SELECT customer_id AS id_consumidor, COUNT(rental_id) AS qtd_alugueis, DATE_FORMAT(rental_date, "%Y-%m") AS ano_mes FROM sakila.rental WHERE YEAR(rental_date) = 2005 AND MONTH(rental_date) = 5 GROUP BY customer_id, DATE_FORMAT(rental_date, "%Y-%m") HAVING qtd_alugueis >= 2 ORDER BY customer_id; ------------------------------------------------------------- - Depois, avalie a diferença de tempo entre cada aluguel e o seguinte, por consumidor. Você precisará de uma função de janela para isso. Podemos avaliar com o seguinte comando: WITH fid AS ( SELECT customer_id AS id_consumidor, COUNT(rental_id) AS qtd_alugueis FROM sakila.rental WHERE YEAR(rental_date) = 2005 AND MONTH(rental_date) = 5 GROUP BY customer_id HAVING qtd_alugueis >= 2 ORDER BY customer_id ) SELECT id_consumidor, rental_id, rental_date, LEAD(rental_date) OVER (PARTITION BY id_consumidor ORDER BY id_consumidor) FROM fid LEFT JOIN rental ON fid.id_consumidor = rental.customer_id WHERE YEAR(rental_date) = 2005 AND MONTH(rental_date) = 5; Neste último item, ele pede a diferença de tempo entre cada aluguel e o seguinte, porém eu não consegui achar em lugar nenhum alguma função de janela que trabalhe com função de datas. Alguém tem alguma dica em relação a essa questão?
      • 1
      • Obrigado
  5. @arfneto desculpa a demora pra responder. Serviço e faculdade não tá fácil. Mas, mais uma vez, outra aula de linguagem C. Entreguei meu trabalho de uma forma mais simples, mas estou estudando estas formas que você me passou. Muito obrigado!
  6. Eu agradeço toda atenção e todo ensinamento compartilhado. Vou reler o material de estrutura de dados com uma outra visão depois dessa aula com esta visão simples, porém poderosa e objetiva!
  7. @arfnetomeu amigo, só tenho a agradecer sua paciência em me dar essa aula em C. Tem muito material que você postou para eu ler com calma e pesquisar. Mais uma vez, obrigado!
  8. @arfnetoa disciplina é sobre estrutura de dados, porém não entendi exatamente. Entendi que você quis dizer que usar exemplos de playlist de música não teria sentido em usar lista. Mas com seus ensinamentos localizei a função certa e como implementar no código. Muito obrigado, como sempre! Aproveitando a oportunidade e fugindo do item do tópico, linguagem C consegue apagar dados de um arquivo? Nas aulas iniciais aprendi a manipular lendo e escrevendo, mas nunca pensei em apagar. Neste exemplo, se eu quisesse apagar uma linha do arquivo CSV, teria como?
  9. Muito obrigado, eu vou pesquisar sobre isso e aguardo caso você encontre esses exemplos.
  10. @arfnetosobre os anexos você tem razão, não irá ocorrer de novo. E realmente, o exercício pediu uma simulação de playlist, por linha de comando, bem básica. Realmente não tem nada a ver, somente para fins didáticos. Usei variáveis grandes para eu poder entender o que elas significam, mas entendi o ponto que atrapalha a leitura, implementação e teste. Porém, cada nó dessa lista tem que ser uma música, e com o método que você utilizou aí em baixo eu ainda não consegui entender como meu programa vai ler os dados do arquivo CSV e inserir em cada nó da lista. Eu só queria entender a lógica para utilizar funções de leitura de um arquivo e inserir em cada nó de uma lista. Apesar de você ter toda razão em eu não utilizar o '\n' como delimitador, foi o modo que consegui usando as funções de leitura. Mas mesmo assim eu apenas consegui ler e jogar na tela, e não em cada elemento da lista. Mas suas observações são pertinentes como sempre, muito obrigado.
  11. Boa tarde, pessoal. Estou com uma dificuldade em um exercício de lista encadeada. Trata-se de uma simulação de playlist por linha de comando. Consegui fazer um que o programa lê todos os dados do teclado, porém eu gostaria de já ter algumas músicas cadastradas em um arquivo CSV. O código a seguir é o que funciona. #include <stdio.h> #include <stdlib.h> #include <string.h> int menu(); void InserirInicio(int num, char nome[20], char banda[20], int duracao[2]); int Remover(int num); void Listar(); struct playlist_Simples { int id; //criado número que será o identificador da música adicionada char nome[20]; //criado vetor para armazenar o nome da música com tamanho máximo de caracteres char banda[20]; //criado vetor para armazenar o nome da banda com tamanho máximo de caracteres int duracao[2]; //criado um vetor para armazenar os minutos e segundos em formato texto struct playlist_Simples *prox; } *Head; int main() { int op, num, duracao[2]; char nome[20], banda[20]; Head = NULL; while (1) { op = menu(); switch (op) { case 1: printf("Digite o ID da música: "); scanf("%d", &num); getchar(); printf("Digite o nome da música: "); fgets(nome, 20, stdin); nome[strlen(nome) - 1] = '\0'; printf("Digite o nome da banda: "); fgets(banda, 20, stdin); banda[strlen(banda) - 1] = '\0'; printf("Digite o tempo de duração: "); scanf("%d:%d", &duracao[0], &duracao[1]); getchar(); InserirInicio(num, nome, banda, duracao); break; case 2: int res; printf("Digite o numero a ser removido: "); scanf("%d", &num); getchar(); res = Remover(num); if (res == 1) printf("Música removida."); else printf("Música não encontrada."); break; case 3: Listar(); break; case 4: return 0; default: printf("Opção inválida.\n"); } } return 0; } int menu() { int op; printf("1.Inserir música\n"); printf("2.Remover música\n"); printf("3.Listar músicas\n"); printf("4.Sair\n"); printf("Digite sua escolha: "); printf("\n\n"); scanf("%d", &op); getchar(); return op; } void InserirInicio(int num, char nome[20], char banda[20], int duracao[2]){ struct playlist_Simples *NovoElemento; NovoElemento = (struct playlist_Simples *)malloc(sizeof(struct playlist_Simples)); NovoElemento->id = num; strcpy(NovoElemento->nome, nome); strcpy(NovoElemento->banda, banda); NovoElemento->duracao[0] = duracao[0]; NovoElemento->duracao[1] = duracao[1]; if (Head == NULL){ Head = NovoElemento; Head->prox = NULL; } else{ NovoElemento->prox = Head; Head = NovoElemento; } } int Remover(int num){ struct playlist_Simples *ElementoVarredura; ElementoVarredura = (struct playlist_Simples *)malloc(sizeof(struct playlist_Simples)); struct playlist_Simples *Anterior; Anterior = (struct playlist_Simples *)malloc(sizeof(struct playlist_Simples)); ElementoVarredura = Head; while(ElementoVarredura != NULL){ if(ElementoVarredura->id == num){ if(ElementoVarredura == Head){ Head = ElementoVarredura->prox; free(ElementoVarredura); return 1; } else{ Anterior->prox = ElementoVarredura->prox ; free(ElementoVarredura); return 1; } } else{ Anterior = ElementoVarredura; ElementoVarredura = ElementoVarredura->prox; } } return 0; } void Listar() { struct playlist_Simples *ElementoVarredura; ElementoVarredura = (struct playlist_Simples *)malloc(sizeof(struct playlist_Simples)); ElementoVarredura = Head; if (ElementoVarredura == NULL) { return; } while (ElementoVarredura != NULL) { printf("ID: %d; Nome: %s; Banda: %s; Duração: %d:%d\n", ElementoVarredura->id, ElementoVarredura->nome, ElementoVarredura->banda, ElementoVarredura->duracao[0], ElementoVarredura->duracao[1]); ElementoVarredura = ElementoVarredura->prox; } printf("\n\n"); return; } Porém eu gostaria que esta lista fosse previamente preenchida com dados de um arquivo CSV. #include <stdio.h> #include <stdlib.h> #include <string.h> struct playlist_Simples { char id; //criado número que será o identificador da música adicionada, em formato de caractere char nome[20]; //criado vetor para armazenar o nome da música com tamanho máximo de caracteres char banda[20]; //criado vetor para armazenar o nome da banda com tamanho máximo de caracteres char duracao[10]; //criado um vetor para armazenar os minutos e segundos em formato texto struct playlist_Simples *prox; } *Head; int main(){ FILE *arquivo; arquivo = fopen("album.csv", "ra"); while(feof(arquivo) == 0){ char n[20]; fgets(n, 20, arquivo); n[strlen(n) - 1] = '\0'; printf("%s\n", n); } return 0; } Como eu faço pra jogar esses dados iniciais para a lista encadeada? Não estou achando uma função de leitura que eu consiga jogar na lista, para depois poder adicionar outras manualmente. album.csv
  12. @mauro_b obrigado pela dica, meu amigo. Vendo as opções do UDebug você tinha razão. Porém ainda não é essa a resposta correta. Fiz a alteração conforme sua dica, mas continua dando 5% de erro. Mas obrigado mesmo assim! from sys import stdin lista = [] total = [] igual = False for line in stdin: if line == '': break valor = line.split('\n') qtd = int(valor[0]) for i in range(qtd): valores = input().split() if valores == []: continue else: minuto = int(valores[0]) dist = int(valores[1]) media = dist / minuto lista.append(media) if max(lista) == media: if i != 0: for j in range(i): if media == lista[j]: igual = True if not igual: total.append(i+1) tam = len(total) for i in range(tam): print(total[i]) lista.clear() total.clear() igual = False
  13. Senhores, estou com uma dúvida neste exercício, 2551, do site https://www.beecrowd.com.br/judge/pt/problems/view/2551. Verifiquei alguns casos de teste pelo site https://www.udebug.com/URI/2551, que serve para depuração e todos casos são válidos. Porém o julgador online ainda dá 5% de erro. Alguém poderia ajudar? from sys import stdin lista = [] total = [] igual = False for line in stdin: if line == '': break valor = line.split('\n') qtd = int(valor[0]) for i in range(qtd): valores = input().split() minuto = int(valores[0]) dist = int(valores[1]) media = dist / minuto lista.append(media) if max(lista) == media: if i != 0: for j in range(i): if media == lista[j]: igual = True if not igual: total.append(i+1) tam = len(total) for i in range(tam): print(total[i]) lista.clear() total.clear() igual = False
  14. @Midori eu entendi, meu amigo. Mas olha que estranho. A lista 'lista1' recebe o valor da lista 'total[n]'. Ou seja, a lista 'total' é uma lista de lista. A lista 'lista1' vai receber o valor da lista 'total' de índice 'n'. Se eu colocar o valor de 10^8 como diz no enunciado do exercício, a própria plataforma da erro de limite de memória, como postei aí em cima. Além do mais, a variável 'lista1' é uma variável local, que recebe os valores do 'range' do for a qual ela pertence. Então nunca terá um valor acima do índice, entende? Por isso que não estou entendendo este erro. Mas agradeço a atenção, meu amigo.
  15. @Midori sim, simplificar a função estourará no tempo. Sim, o desafio valeu a pena, pra entender a lógica utilizada na programação dinâmica. Eu só estou com dúvida na questão da lista mesmo. Porque que está dando erro IndexError. Mas vou continuar pesquisando. Obrigado pela atenção.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!