Jogo do galo c#

Devil_Angel100

Power Member
Boas gente, estou a fazer o jogo do galo com 1 listbox ond adiciono os jogadores (minimo 2)
e depois de meter novo jogo blokeio a listbox e passam os nomes paras as labels ate aqui tudo bem, tenho 9 butoes vazios e quando clico num determinado butao ja me muda para o X ou O dependo do jogador ate aqui tambem tudo bem o problema e que quando faz a sequencia nao sei como verificar o nome da imagem assim dizia que por exemplo bt1,bt5,bt9 se o nome da imagem for o mesmo diz que o jogador X ganhou

eu nao estou a meter enable nem disable no butao estou a dizer que se determinado jogador clicar entao bt1.Image = galo4.Properties.Resources.x;

vai me buscar a imagem que guardei

entao por exemplo eu queria dizer que se bt1.image.name and bt5.image.name and bt9.image.name == x.png

msgbox ("ganhou o jogador x")

aqui deixo uma imagem para ser mais facil de entender

 
na minha opinião, devias criar uma classe cujo construtor é invocado quando começas o jogo.
Essa classe devia ter como variável de instância uma matriz 3x3 de inteiros(assumir 1 para X, 2 para O, e 0 para vazio por exemplo).
Algo do género:
Código:
public class Galo
{
private int[,] tabuleiro;
 
//Construtor
public Galo()
{
tabuleiro = new int[3, 3];
//assigna 0(vazio) a todos os quadrados
for(int b = 0; b < 3; b++)
for (int a = 0; a < 3; a++)
this.tabuleiro[a,b] = 0;
}
//Propriedade tabuleiro
public int[,] Tabuleiro
{ 
get {return this.tabuleiro ;} 
set {this.tabuleiro = value;} 
}
}

Vais ficar com um objecto matriz assim:

a a a
b 0 0 0
b 0 0 0
b 0 0 0
 
...dentro da classe podes criar um mtodo que testa se alguem ganhou o jogo quando acabou de jogar. Esse caso pode devolver 0 se no h vencedor, 1, se ganharam os X ou 2 se ganharam os O

Código:
//podes usar um mtodo para varrer linhas e colunas e no fim as diagonais
public int Vitoria()
{
//testa as verticais 
for (int b = 0; b < 3; b++)
{
if (tabuleiro[0, b] == tabuleiro[1, b] && tabuleiro[1, b] == tabuleiro[2, b])
return tabuleiro[0, b];
}
//testa as horizontais
for (int a = 0; a < 3; a++)
{
if (tabuleiro[a, 0] == tabuleiro[a, 1] && tabuleiro[a, 1] == tabuleiro[a, 2])
return tabuleiro[0, a];
}
//testa as diagonais
if (tabuleiro[0, 0] == tabuleiro[1, 1] && tabuleiro[1, 1] == tabuleiro[2, 2])
return tabuleiro[1,1];
if (tabuleiro[0, 2] == tabuleiro[1, 1] && tabuleiro[1, 1] == tabuleiro[2, 0])
return tabuleiro[0, 2];
//retorna 0 se no h victoria
return 0;
}
 
Ah, e tens de acrescentar um Método dentro da classe para te marcar as posições (X ou O)
Leva como parâmetros a posição X, a posição Y, e qual a marcação (1 ou 2 para X ou O)

Public void Marcar (int x, int y, int mark)
{
this.tabuleiro[x,y] = mark;
}


depois na mainclass, só tens de:

- quando inicias um jogo crias um novo objecto Galo
Código:
Galo novoJogo = new Galo();

- no evento do botão, depois de mudar a imagem, invocas a função Marcar para marcar a jogada no tabuleiro:
Código:
//neste ex. estás a dizer que o jogador dos X, jogou na casa 1, 2
novoJogo.Marcar(1, 2, 1);

no fim de cada jogada, podes fazer o teste da victória:

if (novoJogo.Victoria != 0)
Switch (Victoria)
Case 1: //Os X ganharam
Case 2: //Os O ganharam


espero que tenha ajudado, qq coisa apita
 
Eu também estou a fazer um (com A.I. e tudo, em expert... nem me fales da dor de cabeça XD). Bom, mas eu usei variáveis: int Board1 = 0; in Board2 = 0; etc. Se for igual a 0, então o quadrado está livre o o jogador pode jogar. Se for 1, o jogador já lá jogou (ou o jogador 1, dependendo se é multiplayer). Se for 2, o computador já jogou e a mesma situação respectivamente ao multiplayer. Para veres quem ganhou, é simples, eu declarei mais variáveis, neste caso BoardA123, e quando o jogador (ou jogador 1) joga no quadrado 1, soma-se um valor a BoardA123, e etc. Para verificar, basta ver se BoardA123 == 3; se BoardA456 == 3; etc., e o mesmo para o computador (ou jogador 2), neste caso atribuído BoardB123 e por aí adiante. Para fazeres o risquinho, em vez de veríficares as BoardA e B todas ao mesmo tempo, verifica uma a uma, e depois escreves o código para a função do risco respectivamente.
 
Ah, e tens de acrescentar um Método dentro da classe para te marcar as posições (X ou O)
Leva como parâmetros a posição X, a posição Y, e qual a marcação (1 ou 2 para X ou O)

Public void Marcar (int x, int y, int mark)
{
this.tabuleiro[x,y] = mark;
}


depois na mainclass, só tens de:

- quando inicias um jogo crias um novo objecto Galo
Código:
Galo novoJogo = new Galo();
- no evento do botão, depois de mudar a imagem, invocas a função Marcar para marcar a jogada no tabuleiro:
Código:
//neste ex. estás a dizer que o jogador dos X, jogou na casa 1, 2
novoJogo.Marcar(1, 2, 1);
no fim de cada jogada, podes fazer o teste da victória:

if (novoJogo.Victoria != 0)
Switch (Victoria)
Case 1: //Os X ganharam
Case 2: //Os O ganharam


espero que tenha ajudado, qq coisa apita

andrepadez muito obrigado pela dica mas há uma coisa que nao entendo muito bem, tem se de fazer isso para o evento click de todos os butoes?

e tambem nao entendo muito bem porque optaste por usar um construtor, é apenas para evitar erros na memoria dinamica?

cumprimentos
 
Ok, vou-te explicar teoricamente... funciona como uma hierarquia: Primeiro vês onde podes jogar, e depois fazes um random disso. MAS se em vez de jogares ao calhas, puderes jogar logicamente, jogas. MAS se puderes efectuar alguma tática, fá-la. MAS se puderes, vais antes bloquear uma combinação do adversário. MAS se der, vais antes completar uma combinação tua. Por aí fora... (pode não parecer grande A.I., até porque está bastante resumida, mas se perderes algum tempo vais ver... XD. Eu por acaso andava hoje a tentar limar o meu Bot no Expert, e está mesmo invencível... só se der algum erro ou qualquercoisa do género, mas que eu tenha visto consegue sempre empatar... ou ganhar :P). Para as táticas aconselho-te então a "trackares" as jogadas do Jogador e do Bot até à terceira, são sempre úteis...
Voltando ao outro assunto, para veres quem ganhou, cria uma void à parte e depois chama-a com Nome(null, null);. Para "trackares" o jogador, vais ter de "repetir" o código, pois muda nos valores.
Outra coisa, não faças isto:
(Sendo Quadrado1 uma variável correspondente ao estado do quadrado 1 ou A1 ou como lhe quiseres chamar, e por aí adiante)
int Jogada = 0;
private void AI(object sender, EventArgs e)
{
Random Aleatorio = new Random();
Jogada = Aleatorio.Next(1, 9);
if (Jogada == 1 && Quadrado1 != 0)
{
AI(null, null);
}
/*
E etc. para as outros quadrados
*/
VerificacaoVencedor(null, null);
Torna o código pouco eficiente, demasiadamente, e só ganhas problemas... E até te pode crashar com o programa. Conta antes primeiro os casos, declara uma variavel correspondente a cada quadrado e, faz um random de mínimo 1 e máximo o numero de quadrados disponíveis. Explico-te agora com código:
int Quadrados = 0;
int Q1 = 0;
int Q2 = 0;
int Q3 = 0;
int Q4 = 0;
int Q5 = 0;
int Q6 = 0;
int Q7 = 0;
int Q8 = 0;
int Q9 = 0;
if (Quadrado1 == 0)
{
Quadrados += 1;
Q1 = 1;
Q2 = Q1;
Q3 = Q2;
Q4 = Q3;
Q5 = Q4;
Q6 = Q5;
Q7 = Q6;
Q8 = Q7;
Q9 = Q8;
}
if (Quadrado2 == 0)
{
Quadrados += 1;
Q2 = Q1 + 1;
Q3 = Q2;
Q4 = Q3;
Q5 = Q4;
Q6 = Q5;
Q7 = Q6;
Q8 = Q7;
Q9 = Q8;
}
if (Quadrado3 == 0)
{
Quadrados += 1;
Q3 = Q2 + 1;
Q4 = Q3;
Q5 = Q4;
Q6 = Q5;
Q7 = Q6;
Q8 = Q7;
Q9 = Q8;
}
if (Quadrado4 == 0)
{
Quadrados += 1;
Q4 = Q3 + 1;
Q5 = Q4;
Q6 = Q5;
Q7 = Q6;
Q8 = Q7;
Q9 = Q8;
}
if (Quadrado5 == 0)
{
Quadrados += 1;
Q5 = Q4 + 1;
Q6 = Q5;
Q7 = Q6;
Q8 = Q7;
Q9 = Q8;
}
if (Quadrado6 == 0)
{
Quadrados += 1;
Q6 = Q5 + 1;
Q7 = Q6;
Q8 = Q7;
Q9 = Q8;
}
if (Quadrado7 == 0)
{
Quadrados += 1;
Q7 = Q6 + 1;
Q8 = Q7;
Q9 = Q8;
}
if (Quadrado8 == 0)
{
Quadrados += 1;
Q8 = Q7 + 1;
Q9 = Q8;
}
if (Quadrado9 == 0)
{
Quadrados += 1;
Q9 = Q8 + 1;
}
if (Quadrado1 != 0)
{
Q1 = 0;
}
if (Quadrado2 != 0)
{
Q2 = 0;
}
if (Quadrado3 != 0)
{
Q3 = 0;
}
if (Quadrado4 != 0)
{
Q4 = 0;
}
if (Quadrado5 != 0)
{
Q5 = 0;
}
if (Quadrado6 != 0)
{
Q6 = 0;
}
if (Quadrado7 != 0)
{
Q7 = 0;
}
if (Quadrado8 != 0)
{
Q8 = 0;
}
if (Quadrado9 != 0)
{
Q9 = 0;
}
Depois disto, fazes uma random, como a que eu te disse, e depois ves se o valor da random é igual a Q1 (caso queiras jogar no quadrado 1), então jogada = 1 e etc.

int PreJogada = 0;
try
{
PreJogada = Aleatorio.Next(1, Quadrados);
}
catch (System.Exception)
{
PreJogada= 10; //Assim não vai jogar em lado nenhum
}

E depois:

if (PreJogada == Q1)
{
Jogada = 1;
}
/*
E por aí adiante para o resto
*/
VerificacaoVencedor(null, null);

E assim, já temos A.I. para não escrever por cima e para jogar ao calhas... bastante bom =) O resto pensa, é claro... também tens neurónios :D Se publicares um jogo, com esta A.I., não deve ficar lá muito bem visto, por isso, mão à obra...
 
Última edição:
Isso também dá, e é relativamente fácil de implementar, mas o computador só vai empatar =) (Além de não teres também possibilidade de implementar a famosa personalidade, nem de costumizares o nível de dificuldade).
 
Back
Topo