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:

Exibições: 5233

Responder esta

Respostas a este tópico

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");

}

}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço