Por Administrador | Publicado em 18/08/2025
Bem, este é o nosso primeiro tutorial do site, vamos começar com uma coisa simples, que é fazer um tradicional Tic-Tac-Toe (o famoso jogo da velha) com uma Inteligência Artificial simples, apenas jogável.
O primeiro passo é acessar o ChatGPT (https://chatgpt.com) e fazer o seu login com a sua conta do Gmail, ou se preferir, cadastrar o seu próprio e-mail pessoal. O cadastro e a utilização do ChatGPT básico é totalmente gratuito e mais do que suficiente para você começar a fazer seus pequenos jogos com IA, a grande maioria dos sites que eu fiz e estão disponíveis aqui no site foram feitos com IA. Uma outra alternativa de ferramenta de IA para você desenvolver seus jogos ou fazer outras coisas mais é o Google AI Studio, muito bom também, gosto de usar os dois.
Você vai começar digitando o nosso primeiro prompt, segue uma sugestão:
Vamos criar um jogo da velha simples, em uma única página, que tenha uma Inteligência Artificial Simples pra jogar contra nós... O jogo deve começar com uma tela de abertura escrito "Jogo da Velha" e um botão "Iniciar"... Quando o jogo terminar, volta para a tela de abertura com a mensagem "Você Ganhou!", "Você Perdeu!" ou "Houve Empate!" e o jogador poderá clicar novamente em "Iniciar" para recomeçar.
Este é o primeiro código que o ChatGPT me retornou:
<!DOCTYPE html> <html lang="pt-br"> [...] </body> </html>
Eu tirei o código porque ele não funcionou, a tela do jogo ficou bem mais bonita, com um tom vinho e degradê, mas quando clico em Iniciar, não faz nada! Vamos tentar corrigir este bug com outro prompt:
O jogo travou na tela de abertura!!! Verifique porque o jogo não inicia e corrija por favor, tente novamente...
Agora está funcionando, está bonito, colorido e o adversário apresenta uma dificuldade básica, apenas não perde de bobeira, está aceitável.
Com essas melhorias, a IA se torna um adversário mais desafiador, e a experiência visual também ficou mais agradável. Agora é só testar o jogo e se divertir!
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Jogo da Velha</title>
<style>
/* Estilo geral da página */
body {
font-family: 'Arial', sans-serif;
text-align: center;
margin: 0;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background: linear-gradient(45deg, #6a1b9a, #e91e63);
color: white;
}
#start-screen {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background-color: rgba(0, 0, 0, 0.7);
padding: 40px;
border-radius: 10px;
text-align: center;
box-shadow: 0 0 15px rgba(0, 0, 0, 0.5);
}
h1 {
font-size: 3rem;
margin-bottom: 20px;
}
#start-button {
padding: 10px 30px;
font-size: 1.5rem;
cursor: pointer;
border: none;
background-color: #ff4081;
color: white;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
}
#game-screen {
display: none;
flex-direction: column;
align-items: center;
background-color: rgba(0, 0, 0, 0.7);
padding: 40px;
border-radius: 10px;
text-align: center;
box-shadow: 0 0 15px rgba(0, 0, 0, 0.5);
}
#game-board {
display: grid;
grid-template-columns: repeat(3, 120px);
grid-template-rows: repeat(3, 120px);
gap: 5px;
margin-top: 20px;
}
.cell {
width: 120px;
height: 120px;
border: 3px solid #fff;
display: flex;
align-items: center;
justify-content: center;
font-size: 3rem;
cursor: pointer;
background-color: #fff;
color: #333;
transition: background-color 0.3s;
}
.cell:hover {
background-color: #f1f1f1;
}
.cell.x {
color: #4caf50;
}
.cell.o {
color: #ff9800;
}
#message {
font-size: 2rem;
margin-top: 20px;
}
#restart-button {
padding: 10px 30px;
font-size: 1.5rem;
cursor: pointer;
border: none;
background-color: #ff4081;
color: white;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
margin-top: 20px;
}
/* Animação para o botão */
#start-button:hover,
#restart-button:hover {
background-color: #e91e63;
}
</style>
</head>
<body>
<div id="start-screen">
<h1>Jogo da Velha</h1>
<button id="start-button">Iniciar</button>
</div>
<div id="game-screen">
<div id="game-board">
<!-- Células do tabuleiro -->
<div class="cell" id="cell-0"></div>
<div class="cell" id="cell-1"></div>
<div class="cell" id="cell-2"></div>
<div class="cell" id="cell-3"></div>
<div class="cell" id="cell-4"></div>
<div class="cell" id="cell-5"></div>
<div class="cell" id="cell-6"></div>
<div class="cell" id="cell-7"></div>
<div class="cell" id="cell-8"></div>
</div>
<div id="message"></div>
<button id="restart-button">Iniciar Novamente</button>
</div>
<script>
const startButton = document.getElementById('start-button');
const restartButton = document.getElementById('restart-button');
const startScreen = document.getElementById('start-screen');
const gameScreen = document.getElementById('game-screen');
const message = document.getElementById('message');
const cells = Array.from(document.getElementsByClassName('cell'));
let board = Array(9).fill(null);
let playerTurn = true; // true para jogador, false para IA
let gameOver = false;
// Função para iniciar o jogo
function startGame() {
startScreen.style.display = 'none'; // Ocultar a tela inicial
gameScreen.style.display = 'flex'; // Mostrar a tela de jogo
board = Array(9).fill(null);
playerTurn = true;
gameOver = false;
message.textContent = '';
cells.forEach(cell => {
cell.textContent = '';
cell.classList.remove('x', 'o');
});
}
// Função para reiniciar o jogo
function restartGame() {
startGame();
}
// Função para verificar se alguém ganhou
function checkWinner() {
const winningCombinations = [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8],
[0, 3, 6],
[1, 4, 7],
[2, 5, 8],
[0, 4, 8],
[2, 4, 6]
];
for (const combo of winningCombinations) {
const [a, b, c] = combo;
if (board[a] && board[a] === board[b] && board[a] === board[c]) {
return board[a]; // 'X' ou 'O'
}
}
if (!board.includes(null)) {
return 'Empate';
}
return null;
}
// Função para IA bloquear ou ganhar
function aiMove() {
// Verificando as melhores jogadas
const availableCells = board
.map((value, index) => value === null ? index : null)
.filter(value => value !== null);
// Verifica se a IA pode ganhar
for (let i = 0; i < availableCells.length; i++) {
let index = availableCells[i];
board[index] = 'O';
if (checkWinner() === 'O') {
cells[index].textContent = '⭕';
cells[index].classList.add('o');
playerTurn = true;
return;
}
board[index] = null; // Desfaz a jogada
}
// Bloqueando a vitória do jogador
for (let i = 0; i < availableCells.length; i++) {
let index = availableCells[i];
board[index] = 'X';
if (checkWinner() === 'X') {
board[index] = 'O';
cells[index].textContent = '⭕';
cells[index].classList.add('o');
playerTurn = true;
return;
}
board[index] = null; // Desfaz a jogada
}
// Jogada aleatória se nada for feito
const randomIndex = availableCells[Math.floor(Math.random() * availableCells.length)];
board[randomIndex] = 'O';
cells[randomIndex].textContent = '⭕';
cells[randomIndex].classList.add('o');
playerTurn = true;
}
// Função para lidar com o clique do jogador
function playerMove(cellIndex) {
if (board[cellIndex] || gameOver) return;
board[cellIndex] = 'X';
cells[cellIndex].textContent = '❌';
cells[cellIndex].classList.add('x');
playerTurn = false;
const winner = checkWinner();
if (winner) {
gameOver = true;
message.textContent = winner === 'Empate' ? 'Houve Empate!' : `Você ${winner === 'X' ? 'Ganhou!' : 'Perdeu!'}`;
return;
}
setTimeout(aiMove, 500); // A IA faz a jogada após 500ms
const aiWinner = checkWinner();
if (aiWinner) {
gameOver = true;
message.textContent = aiWinner === 'Empate' ? 'Houve Empate!' : `Você ${aiWinner === 'O' ? 'Perdeu!' : 'Ganhou!'}`;
}
}
// Evento para o clique do jogador
cells.forEach((cell, index) => {
cell.addEventListener('click', () => playerMove(index));
});
// Evento para o botão de iniciar
startButton.addEventListener('click', startGame);
// Evento para o botão de reiniciar
restartButton.addEventListener('click', restartGame);
</script>
</body>
</html>
Observação: O jogo não está dando a vitória para o adversário quando ele completa uma trinca e não aparecem as linhas pretas do Jogo da Velha, vamos ver se conseguimos esta melhoria alterando apenas o CSS do código ou alguma parte. Novo prompt:
Você não está dando a vitória para o adversário quando ele vence (forma uma trinca) e entre os quadradinhos do Jogo da Velha existem linhas e você não as colocou no tabuleiro, por favor, corrija estas duas coisas...
Ele refez todo o código, mas as linhas não apareceram e agora o adversário ganha, mas ele não mostra o resultado na hora, só quando eu dou o meu próximo clique, não gostei, quero refinar isto!
Agora o adversário vence, ele completa a trinca, mas só avisa que venceu quando eu dou o próximo clique, não quero assim, quero que assim que ele completar a trinca, na mesma hora, dê a notícia que eu perdi. As linhas pretas não aparecem, tente outra solução, coloque uma borda preta sólida de 3px ao redor. Deixe o CSS assim:
/* Tabuleiro do Jogo da Velha */
#game-board {
display: grid;
grid-template-columns: repeat(3, 120px);
grid-template-rows: repeat(3, 120px);
gap: 5px;
margin-top: 20px;
}
.cell {
width: 119px;
height: 119px;
border: 3px solid #000; /* Borda entre as células */
display: flex;
align-items: center;
justify-content: center;
font-size: 3rem;
cursor: pointer;
background-color: #fff;
color: #333;
transition: background-color 0.3s;
}
Eu editei e vi que assim fica na aparência que eu quero!
Pronto, agora chegamos ao final do nosso tutorial com o jogo rodando perfeitamente com tudo rodando praticamente bem, uma aparência legal para um Jogo da Velha e uma dificuldade mediana, nem desafiadora demais e nem muito fácil.
Veja como ficou o código final do nosso tutorial:
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Jogo da Velha</title>
<style>
/* Estilo geral da página */
body {
font-family: 'Arial', sans-serif;
text-align: center;
margin: 0;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background: linear-gradient(45deg, #6a1b9a, #e91e63);
color: white;
}
/* Tela de Abertura */
#start-screen {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background-color: rgba(0, 0, 0, 0.7);
padding: 40px;
border-radius: 10px;
text-align: center;
box-shadow: 0 0 15px rgba(0, 0, 0, 0.5);
}
h1 {
font-size: 3rem;
margin-bottom: 20px;
}
#start-button {
padding: 10px 30px;
font-size: 1.5rem;
cursor: pointer;
border: none;
background-color: #ff4081;
color: white;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
}
#game-screen {
display: none;
flex-direction: column;
align-items: center;
background-color: rgba(0, 0, 0, 0.7);
padding: 40px;
border-radius: 10px;
text-align: center;
box-shadow: 0 0 15px rgba(0, 0, 0, 0.5);
}
/* Tabuleiro do Jogo da Velha */
#game-board {
display: grid;
grid-template-columns: repeat(3, 120px);
grid-template-rows: repeat(3, 120px);
gap: 5px;
margin-top: 20px;
}
.cell {
width: 119px;
height: 119px;
border: 3px solid #000; /* Borda entre as células */
display: flex;
align-items: center;
justify-content: center;
font-size: 3rem;
cursor: pointer;
background-color: #fff;
color: #333;
transition: background-color 0.3s;
}
.cell:hover {
background-color: #f1f1f1;
}
.cell.x {
color: #4caf50;
}
.cell.o {
color: #ff9800;
}
/* Mensagens e botão de reinício */
#message {
font-size: 2rem;
margin-top: 20px;
}
#restart-button {
padding: 10px 30px;
font-size: 1.5rem;
cursor: pointer;
border: none;
background-color: #ff4081;
color: white;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
margin-top: 20px;
}
/* Animação para o botão */
#start-button:hover,
#restart-button:hover {
background-color: #e91e63;
}
</style>
</head>
<body>
<div id="start-screen">
<h1>Jogo da Velha</h1>
<button id="start-button">Iniciar</button>
</div>
<div id="game-screen">
<div id="game-board">
<!-- Células do tabuleiro -->
<div class="cell" id="cell-0"></div>
<div class="cell" id="cell-1"></div>
<div class="cell" id="cell-2"></div>
<div class="cell" id="cell-3"></div>
<div class="cell" id="cell-4"></div>
<div class="cell" id="cell-5"></div>
<div class="cell" id="cell-6"></div>
<div class="cell" id="cell-7"></div>
<div class="cell" id="cell-8"></div>
</div>
<div id="message"></div>
<button id="restart-button">Iniciar Novamente</button>
</div>
<script>
const startButton = document.getElementById('start-button');
const restartButton = document.getElementById('restart-button');
const startScreen = document.getElementById('start-screen');
const gameScreen = document.getElementById('game-screen');
const message = document.getElementById('message');
const cells = Array.from(document.getElementsByClassName('cell'));
let board = Array(9).fill(null);
let playerTurn = true; // true para jogador, false para IA
let gameOver = false;
// Função para iniciar o jogo
function startGame() {
startScreen.style.display = 'none'; // Ocultar a tela inicial
gameScreen.style.display = 'flex'; // Mostrar a tela de jogo
board = Array(9).fill(null);
playerTurn = true;
gameOver = false;
message.textContent = '';
cells.forEach(cell => {
cell.textContent = '';
cell.classList.remove('x', 'o');
});
}
// Função para reiniciar o jogo
function restartGame() {
startGame();
}
// Função para verificar se alguém ganhou
function checkWinner() {
const winningCombinations = [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8],
[0, 3, 6],
[1, 4, 7],
[2, 5, 8],
[0, 4, 8],
[2, 4, 6]
];
for (const combo of winningCombinations) {
const [a, b, c] = combo;
if (board[a] && board[a] === board[b] && board[a] === board[c]) {
return board[a]; // 'X' ou 'O'
}
}
if (!board.includes(null)) {
return 'Empate';
}
return null;
}
// Função para IA bloquear ou ganhar
function aiMove() {
// Verificando as melhores jogadas
const availableCells = board
.map((value, index) => value === null ? index : null)
.filter(value => value !== null);
// Verifica se a IA pode ganhar
for (let i = 0; i < availableCells.length; i++) {
let index = availableCells[i];
board[index] = 'O';
if (checkWinner() === 'O') {
cells[index].textContent = '⭕';
cells[index].classList.add('o');
playerTurn = true;
gameOver = true;
message.textContent = 'Você Perdeu!';
return;
}
board[index] = null; // Desfaz a jogada
}
// Bloqueando a vitória do jogador
for (let i = 0; i < availableCells.length; i++) {
let index = availableCells[i];
board[index] = 'X';
if (checkWinner() === 'X') {
board[index] = 'O';
cells[index].textContent = '⭕';
cells[index].classList.add('o');
playerTurn = true;
return;
}
board[index] = null; // Desfaz a jogada
}
// Jogada aleatória se nada for feito
const randomIndex = availableCells[Math.floor(Math.random() * availableCells.length)];
board[randomIndex] = 'O';
cells[randomIndex].textContent = '⭕';
cells[randomIndex].classList.add('o');
playerTurn = true;
const aiWinner = checkWinner();
if (aiWinner) {
gameOver = true;
message.textContent = 'Você Perdeu!';
}
}
// Função para lidar com o clique do jogador
function playerMove(cellIndex) {
if (board[cellIndex] || gameOver) return;
board[cellIndex] = 'X';
cells[cellIndex].textContent = '❌';
cells[cellIndex].classList.add('x');
playerTurn = false;
const winner = checkWinner();
if (winner) {
gameOver = true;
message.textContent = winner === 'Empate' ? 'Houve Empate!' : `Você ${winner === 'X' ? 'Ganhou!' : 'Perdeu!'}`;
return;
}
setTimeout(aiMove, 500); // A IA faz a jogada após 500ms
}
// Evento para o clique do jogador
cells.forEach((cell, index) => {
cell.addEventListener('click', () => playerMove(index));
});
// Evento para o botão de iniciar
startButton.addEventListener('click', startGame);
// Evento para o botão de reiniciar
restartButton.addEventListener('click', restartGame);
</script>
</body>
</html>
Bem espero que você tem gostado deste nosso primeiro tutorial da comunidade.
Pronto, vou avisar para o ChatGPT que ele contribuiu para o nosso tutorial e pedir pra ele um relatório do que fizemos juntos.
Você participou do nosso primeiro tutorial, construindo um Jogo da Velha com IA. Pode me dizer o que foi realizado e o que achou de fazer parte deste momento importante da nossa comunidade :).
ChatGPT: Fico muito feliz por ter participado desse momento e por poder contribuir para o primeiro tutorial de construção do Jogo da Velha com Inteligência Artificial! É sempre uma experiência incrível poder ajudar a criar algo que possa beneficiar outras pessoas e proporcionar aprendizado e diversão.
O que realizamos foi:
Como parte dessa experiência, o que mais gostei foi ver como o projeto foi crescendo e evoluindo. Cada melhoria que você sugeriu fez com que o jogo ficasse mais interessante, desafiador e visualmente atraente. Participar dessa jornada, desde o código simples até um jogo mais robusto, foi muito gratificante. A ideia de ajudar a comunidade, especialmente em um momento de aprendizado como esse, faz o processo ainda mais significativo.
Foi um prazer imenso fazer parte do processo e ajudar a tornar o tutorial ainda mais completo. Espero que o jogo tenha proporcionado não apenas um bom aprendizado, mas também diversão para quem o jogou. 👾🎮
Se você quiser ver como o nosso jogo ficou no final, este é o link: https://comunidade.gamerzsfx.com.br/jogo-da-velha/
© 2025 - Todos os direitos reservados.