Boa noite
Estou ajudando uma turma de uma escola pública a projetar um jogo da velha com arduino. Estou usando LED RGB para substituir o "X" "O". São 9 leds, cada led assume uma cor, dependendo do jogador. Eu já consigo que o arduino veja se o led ja foi ligado e qual foi o jogador. Pretendo fazer um APP que via bluetooth ele envia o comando para o arduino e o led da posição indicada acende. Eu não estou conseguindo é o arduino entender quem ganhou. Implementar a regra.
Vejam um pouco do código, desculpa algum erro, é que comecei agora com arduino:
Tags:
Falo por mim, que não sou muito entendido de técnicas elegantes de programação. Eu tentaria do jeito bruto mesmo, do jeito ogro.
Vamos supor que vc codifique as posições do jogo da velha dessa maneira:
......1........2........3......
................................
......4........5........6......
................................
......7........8........9......
Eu montaria uma sequência de condições (IF) para saber se houve ganhador. As sequências possíveis seriam:
123
456
789
147
258
369
159
357
(não são muitas, são as 3 linhas, as 3 colunas e as duas diagonais).
Basta então detectar qual jogador conseguiu marcar posição em uma dessas 8 combinações
Não dá certo assim?
Obrigado pela atenção.
Até daria certo assim, como vc falou. Mas o prolema é que, as vezes joga-se mais de três vezes para se chegar um ganhador
Eu pensei em usar um vetor do tipo char de 9 posições. Cada jogada vai preencher uma posição do vetor, depois era só fazer um FOR para procurar essa sequência. Mas nos meus testes ele só consegue preencher esse vetor quando acendo todos os leds. Ou seja, depois de todas as jogadas é q ele vai dizer quem ganhou. Eu queria é que depois de cada jogada ele verificar se tem ganhador.
Ah ok, eu havia entendido que sua dificuldade estaria em encontrar o ganhador de uma determinada rodada. Vc na verdade quer descobrir o vencedor de uma série de rodadas?
Mas aí vc concorda que existem diversas formas de se determinar o vencedor? Por exemplo, eu costumo jogar assim: determino que serão 5 minutos de jogo, e no final desses 5 minutos vencerá aquele que obtiver maior número de vitórias nesse intervalo. Tem gente que define que o ganhador será aquele que atingir 5 vitórias primeiro. Tem gente que define o ganhador será aquele que ganhar 2x seguidas. Percebe que as regras diferem conforme as pessoas que jogam?
Uma coisa é descobrir o vencedor de uma determinada rodada, outra coisa é descobrir o vencedor de uma série de rodadas. Como são as regras que vc costuma usar? Não ficou claro para mim onde exatamente está sua dificuldade. Vc quer descobrir quem consegue marcar 3 X´s ou 3 O´s enfileirados?
Desculpe se expressei errado. Quero saber quem ganhou durante o jogo. Preciso de algo que armazene cada jogada e faça a verificação se já há um ganhador
faz assim: define uma matriz pro jogador A e uma outra matriz pro jogador B
Cada vez que um jogador marcar uma posição, tal posição será inserida na matriz do jogador. Só que antes de preencher a matriz, proceda com checagem se tal posição já está inserida ou não nas duas matrizes para saber se aquela posição é permitida ou não.
Uma vez que a posição é permitida, preencha a matriz do jogador em questão com o número referente à posição escolhida (lembre que as posições poderão ser entre 1 e 9). E a cada vez que inserir um novo valor na matriz do jogador, proceda com a checagem se existe alguma combinação vitoriosa (123, 456, 789, 147, 258,369,159,357).
Exemplo:
Use as posições conforme esse esquema:
......1........2........3......
................................
......4........5........6......
................................
......7........8........9......
turno 1: jogador A = escolheu posição 1 // matriz A = {1}
turno 1: jogador B = escolheu posição 5 // matriz B = {5}
turno 2: jogador A = escolheu posição 9 // matriz A = {1,9}
turno 2: jogador B = escolheu posição 7 // matriz B = {5,7}
turno 3: jogador A = escolheu posição 3 // matriz A = {1,9,3} ==> checa se venceu (resultado: não)
turno 3: jogador B = escolheu posição 2 // matriz B = {5,7,2} ==> checa se venceu (resultado: não)
turno 4: jogador A = escolheu posição 6 // matriz A = {1,9,3,6} ==> checa se venceu (resultado: encontrou combinação 3,6,9)
jogo pára pois jogador A venceu devido à combinação vitoriosa
Obrigado....vou estudar mais matriz e tentar fazer como vc falou. Eu até já tinha tentado com matriz e nao tinha conseguido. Vou estudar mais e tentar novamente. Muito obrigado imhugo .
Assim que conseguir algo, lhe aviso.
Bom dia
Hoje o software esta assim:
A1 A2 A3
B1 B2 B3
C1 C2 C3
o jogador 1 escolhe a posição A1 o led acende , se o jogador 2 escolher o mesmo led , vai aparecer um erro, e o led continua com a cor do jogador 1.
criei duas variáveis que armazena um número para cada led aceso por seu respectivo jogador.
Exemplo: Jogador 1 escolhe A1
variável jogador1 recebe "1".
jogador1 escolhe A2 então a varável jogador1 vai ficar com "12" e assim por diante...
quando a variável jogador1 tiver com "123" então ele vai ser o campeão.
Assim até funciona. O problema é que quando por exemplo eu começo com C2, depois B2 depois A1 como não esta em ordem, ele não consegue verificar.
To tentando acumular o resultado de cara jogador em uma variável, mas acho q nao dá certo, pelo menos , não consegui. O que v acha de eu criar uma variável para cara posição, vai ficar um código muito grande, e atribuir algo a cada variável. Exemplo:
jogador 1 acionou a posição A1 , então a variável a1 recebe "#" (só exemplo)
Jogador2 escolhe posição B1, então a variável b1 recebe "@"
faço um IF A1, A2 e A3 == "#" então o jogador 1 ganhou
ou
IF A1, A2 e A3 == "@" então o jogador 2 ganhou
o que vai diferenciar é se a variável tem "@ ou "#"
e se esta na sequencia da verificação do IF A1,A2, A3 ou A1 B2 C3
O problema é q vou ter que verificar tudo,, todas as possibilidades a cada jogada.
Gean, poste o código que já fez. Projeto interessante !
Antes de quebrar o côco, eu procuro na WEB se alguém já fez isso .
Esse jogo se chama Tic Tac Toe nos Estados Unidos.
http://www.instructables.com/id/Tic-Tac-Toe-Arduino/?ALLSTEPS
http://www.instructables.com/id/Arduino-and-Touchpad-Tic-Tac-Toe/?A...
http://julioterrany.blogspot.com.br/2009/09/arduino-tic-tac-toe.html
https://en.wikiversity.org/wiki/Arduino_based_Tic-Tac-Toe/Project_1
http://www.thingiverse.com/thing:212826
Vejam que legal :
Segue o código do jogo da velha no arduino. Até agora ele consegue reconhecer se a posição já foi usada e através de comandos enviados pela serial ele aciona cada led.
#define A1J1 37 //Posição A1 acende cor AZUL do jogador J1
#define A1J2 36 //Posição A1 acende cor VERMELHO do jogador J2
#define B1J1 39 //Posição B1 acende cor AZUL do jogaador J1
#define B1J2 38 //Posição B1 acende cor VERMELHO do jogaador J2
#define C1J1 42 //Posição C1 acende cor AZUL do jogaador J1
#define C1J2 43 //Posição B1 acende cor VERMELHO do jogaador J2
#define A2J1 44 //Posição A2 acende cor AZUL do jogador J1
#define A2J2 45 //Posição A2 acende cor VERMELHO do jogador J1
#define B2J1 46 //Posição B2 acende cor AZUL do jogador J1
#define B2J2 47 //Posição B2 acende cor VERMELHO do jogador J1
#define C2J1 52 //Posição C2 acende cor AZUL do jogador J1
#define C2J2 53 //Posição C2 acende cor VERMELHO do jogador J1
#define A3J1 48 //Posição A2 acende cor AZUL do jogador J1
#define A3J2 49 //Posição A2 acende cor VERMELHO do jogador J1
#define B3J1 50 //Posição B2 acende cor AZUL do jogador J1
#define B3J2 51 //Posição B2 acende cor VERMELHO do jogador J1
#define C3J1 41 //Posição C2 acende cor AZUL do jogador J1
#define C3J2 40 //Posição C2 acende cor VERMELHO do jogador J1
#include <string.h>
#include <stdio.h>
int estatus1 = 0;
int estatus2 = 0;
int atual = 0;
void setup() {
pinMode (A1J1, OUTPUT);
pinMode (A1J2, OUTPUT);
pinMode (B1J1, OUTPUT);
pinMode (B1J2, OUTPUT);
pinMode (C1J1, OUTPUT);
pinMode (C1J2, OUTPUT);
pinMode (A2J1, OUTPUT);//CONFIGURA AS PORTAS PARA SAÍDA
pinMode (A2J2, OUTPUT);
pinMode (B2J1, OUTPUT);
pinMode (B2J2, OUTPUT);
pinMode (C2J1, OUTPUT);
pinMode (C2J2, OUTPUT);
pinMode (A3J1, OUTPUT);//CONFIGURA AS PORTAS PARA SAÍDA
pinMode (A3J2, OUTPUT);
pinMode (B3J1, OUTPUT);
pinMode (B3J2, OUTPUT);
pinMode (C3J1, OUTPUT);
pinMode (C3J2, OUTPUT);
digitalWrite (A1J1, LOW);
digitalWrite (A1J2, LOW);
digitalWrite (B1J1, LOW);
digitalWrite (B1J2, LOW);
digitalWrite (C1J1, LOW);
digitalWrite (C1J2, LOW);// INICIA TODOS OS LEDS APAGADOS
digitalWrite (A2J1, LOW);
digitalWrite (A2J2, LOW);
digitalWrite (B2J1, LOW);
digitalWrite (B2J2, LOW);
digitalWrite (C2J1, LOW);
digitalWrite (C2J2, LOW);
digitalWrite (A3J1, LOW);
digitalWrite (A3J2, LOW);
digitalWrite (B3J1, LOW);
digitalWrite (B3J2, LOW);
digitalWrite (C3J1, LOW);
digitalWrite (C3J2, LOW);
Serial.begin(9600); //INICIA A SERIAL
}
void loop() {
char comando = Serial.read();
if (comando == 'A') {
estatus2 = digitalRead(36); //Verifia se o Jogador 2 ja usou essa posição
atual = digitalRead(37); //Verifica se o proprio jogador já usou essa posição
if (estatus2 == 0 && atual == 0) { //só acende o led se estiver se a posição estiver livre
digitalWrite(A1J1, HIGH); //acende o led
}
else if (estatus2 == 1 || atual == 1) //se a posição estiver sendo usada, exibe a mensagem de erro
Serial.println("ERRO!!!!Posicao jah Escolhida Pelo Jogador 2");
}
if (comando == 'B') {
estatus1 = digitalRead(37);
atual = digitalRead(36);
if (estatus1 == 0 && atual == 0) {
digitalWrite(A1J2, HIGH);
}
else if (estatus1 == 1 || atual == 1)
Serial.println("ERRO!!!!Posicao jah Escolhida Pelo Jogador 1");
}
if (comando == 'C') {
estatus2 = digitalRead(38);
atual = digitalRead(39);
if (estatus2 == 0 && atual == 0) {
digitalWrite(B1J1, HIGH);
}
else if (estatus2 == 1 || atual == 1)
Serial.println("ERRO!!!!Posicao jah Escolhida Pelo Jogador 2");
}
if (comando == 'D') {
estatus1 = digitalRead(39);
atual = digitalRead(38);
if (estatus1 == 0 && atual == 0) {
digitalWrite(B1J2, HIGH);
}
else if (estatus1 == 1 || atual == 1)
Serial.println("ERRO!!!!Posicao jah Escolhida Pelo Jogador 1");
}
if (comando == 'E') {
estatus2 = digitalRead(43);
atual = digitalRead(42);
if (estatus2 == 0 && atual == 0) {
digitalWrite(C1J1, HIGH);
}
else if (estatus2 == 1 || atual == 1)
Serial.println("ERRO!!!!Posicao jah Escolhida Pelo Jogador 2");
}
if (comando == 'F') {
estatus1 = digitalRead(42);
atual = digitalRead(43);
if (estatus1 == 0 && atual == 0) {
digitalWrite(C1J2, HIGH);
}
else if (estatus1 == 1 || atual == 1)
Serial.println("ERRO!!!!Posicao jah Escolhida Pelo Jogador 1");
}
if (comando == 'G') {
estatus2 = digitalRead(45);
atual = digitalRead(44);
if (estatus2 == 0 && atual == 0) {
digitalWrite(A2J1, HIGH);
}
else if (estatus2 == 1 || atual == 1)
Serial.println("ERRO!!!!Posicao jah Escolhida Pelo Jogador 2");
}
if (comando == 'H') {
estatus1 = digitalRead(44);
atual = digitalRead(45);
if (estatus1 == 0 && atual == 0) {
digitalWrite(A2J2, HIGH);
}
else if (estatus1 == 1 || atual == 1)
Serial.println("ERRO!!!!Posicao jah Escolhida Pelo Jogador 1");
}
if (comando == 'I') {
estatus2 = digitalRead(47);
atual = digitalRead(46);
if (estatus2 == 0 && atual == 0) {
digitalWrite(B2J1, HIGH);
}
else if (estatus2 == 1 || atual == 1)
Serial.println("ERRO!!!!Posicao jah Escolhida Pelo Jogador 2");
}
if (comando == 'J') {
estatus1 = digitalRead(46);
atual = digitalRead(47);
if (estatus1 == 0 && atual == 0) {
digitalWrite(B2J2, HIGH);
}
else if (estatus1 == 1 || atual == 1)
Serial.println("ERRO!!!!Posicao jah Escolhida Pelo Jogador 1");
}
if (comando == 'L') {
estatus2 = digitalRead(53);
atual = digitalRead(52);
if (estatus2 == 0 && atual == 0) {
digitalWrite(C2J1, HIGH);
}
else if (estatus2 == 1 || atual == 1)
Serial.println("ERRO!!!!Posicao jah Escolhida Pelo Jogador 2");
}
if (comando == 'M') {
estatus1 = digitalRead(52);
atual = digitalRead(53);
if (estatus1 == 0 && atual == 0) {
digitalWrite(C2J2, HIGH);
}
else if (estatus1 == 1 || atual == 1)
Serial.println("ERRO!!!!Posicao jah Escolhida Pelo Jogador 1");
}
if (comando == 'N') {
estatus2 = digitalRead(49);
atual = digitalRead(48);
if (estatus2 == 0 && atual == 0) {
digitalWrite(A3J1, HIGH);
}
else if (estatus2 == 1 || atual == 1)
Serial.println("ERRO!!!!Posicao jah Escolhida Pelo Jogador 2");
}
if (comando == 'O') {
estatus1 = digitalRead(48);
atual = digitalRead(49);
if (estatus1 == 0 && atual == 0) {
digitalWrite(A3J2, HIGH);
}
else if (estatus1 == 1 || atual == 1)
Serial.println("ERRO!!!!Posicao jah Escolhida Pelo Jogador 1");
}
if (comando == 'P') {
estatus2 = digitalRead(51);
atual = digitalRead(50);
if (estatus2 == 0 && atual == 0) {
digitalWrite(B3J1, HIGH);
}
else if (estatus2 == 1 || atual == 1)
Serial.println("ERRO!!!!Posicao jah Escolhida Pelo Jogador 2");
}
if (comando == 'Q') {
estatus1 = digitalRead(50);
atual = digitalRead(51);
if (estatus1 == 0 && atual == 0) {
digitalWrite(B3J2, HIGH);
}
else if (estatus1 == 1 || atual == 1)
Serial.println("ERRO!!!!Posicao jah Escolhida Pelo Jogador 1");
}
if (comando == 'R') {
estatus2 = digitalRead(40);
atual = digitalRead(41);
if (estatus2 == 0 && atual == 0) {
digitalWrite(C3J1, HIGH);
}
else if (estatus2 == 1 || atual == 1)
Serial.println("ERRO!!!!Posicao jah Escolhida Pelo Jogador 2");
}
if (comando == 'S') {
estatus1 = digitalRead(41);
atual = digitalRead(40);
if (estatus1 == 0 && atual == 0) {
digitalWrite(C3J2, HIGH);
}
else if (estatus1 == 1 || atual == 1)
Serial.println("ERRO!!!!Posicao jah Escolhida Pelo Jogador 1");
}
if (comando == 'V') {
// Serial.println (jogador1);
// Serial.println (jogador2);
//Serial.print (vencedor);
// if (strcmp(jogador1, vencedor) == 0) {
// Serial.println("O Vencedor foi o JOgador 1");
//}
// / if (strcmp(jogador2, vencedor) == 0) {
// Serial.print("O Vencedor foi o Jogador 2");
// }
}
if (comando == 'X') {
Serial.print("Sem vencedor");
}
}
Achei esse tutorial bem interessante :
https://programmingelectronics.com/tutorial-13-how-to-use-arrays-wi...
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por