AJUDA URGENTISSIMO!(trabalho VB)

_flash_

Power Member
boa noite, estou a fazer o jogo do galo para a minha disciplina de programação, para entregar até às 8h da manhã.

surgiume um grande problema, utilizei um contador de jogadas para alternar entre jogadores (quando é um numero par=jogador 2 quando é um numero impar=jogador 1) mas acontece que na primeira jogada o programa n altera a o jogador, ou seja o jogador um joga 2 vezes depois o jogador 2 depois o 1 depois o 2 e assim socessivamente.

alguma ideia de qual seria o meu erro?

agradecia imenso a vossa ajuda.
 
Boas, se puderes, coloca o modo como estás a inicializar esse contador. Alternativamente, podias ter uma variável que variava entre 0 e 1 (primeiro e segundo jogador). Bastava por exemplo, teres uma variável jogador inicializada a 0 (primeiro jogador), e no final de cada turno, utilizavas aritmética modular para mudar de jogador (i.e. jogador = (jogador + 1) % 2).

Espero que ajude.
 
inicializo a variavel que conta as jogadas a 1 e depois para ver que jogador é tenho o seguinte código:
If jog Mod 2 = 0 Then 'se o numero de jogada for par é porque é o jogador 2 a jogar'
label11.Caption = "X" 'escreve o X no quadrado clicado'
J1.ForeColor = vbBlack 'altera a vez do jogador'
J2.ForeColor = vbRed 'altera a vez do jogador'
Else 'se o numero de jogada for impar é porque é o jogador 1 a jogar'
J2.ForeColor = vbBlack 'altera a vez do jogador'
J1.ForeColor = vbRed 'altera a vez do jogador'
label11.Caption = "O" 'escreve o O no quadrado clicado'
End If
 
Boas, coloca um pouco mais de código, nomeadamente na forma como estás a actualizuar as jogadas. Podes também experimentar utilizar o método que sugeri no post acima.
 
Boas, coloca um pouco mais de código, nomeadamente na forma como estás a actualizuar as jogadas. Podes também experimentar utilizar o método que sugeri no post acima.

Código da jogada:



Código:
If jog = 2 And J1.ForeColor = vbBlack Then
    J1.ForeColor = vbRed
    J2.ForeColor = vbBlack
ElseIf jog = 1 And J1.ForeColor = vbRed Then
    J1.ForeColor = vbBlack
    J2.ForeColor = vbRed
End If
If label11.Caption = "" Then    'se o quadrado estiver desocupado faz:'
    If jog Mod 2 = 0 Then       'se o numero de jogada for par é porque é o jogador 2 a jogar'
        label11.Caption = "X"   'escreve o X no quadrado clicado'
        J1.ForeColor = vbBlack  'altera a vez do jogador'
        J2.ForeColor = vbRed    'altera a vez do jogador'
    Else                        'se o numero de jogada for impar é porque é o jogador 1 a jogar'
        label11.Caption = "O"   'escreve o O no quadrado clicado'
        J2.ForeColor = vbBlack  'altera a vez do jogador'
        J1.ForeColor = vbRed    'altera a vez do jogador'
    End If
    jog = jog + 1
Else
    ffi = MsgBox("Ja jogaram nesse quadrado, escolha outro!", , "batota")
End If




Código de todo o quadrado:



Código:
 If label11.Caption = "" Then    'se o quadrado estiver desocupado faz:'
    If jog Mod 2 = 0 Then       'se o numero de jogada for par é porque é o jogador 2 a jogar'
        label11.Caption = "X"   'escreve o X no quadrado clicado'
        J1.ForeColor = vbBlack  'altera a vez do jogador'
        J2.ForeColor = vbRed    'altera a vez do jogador'
    Else                        'se o numero de jogada for impar é porque é o jogador 1 a jogar'
        label11.Caption = "O"   'escreve o O no quadrado clicado'
        J2.ForeColor = vbBlack  'altera a vez do jogador'
        J1.ForeColor = vbRed    'altera a vez do jogador'
    End If
    jog = jog + 1
Else
    ffi = MsgBox("Ja jogaram nesse quadrado, escolha outro!", , "batota")
End If
If label11.Caption = "X" And label12.Caption = "X" And Label13.Caption = "X" Then
    win = 1
    Line24.Visible = True
ElseIf Label21.Caption = "X" And Label22.Caption = "X" And Label23.Caption = "X" Then
    win = 1
    Line25.Visible = True
ElseIf Label31.Caption = "X" And Label32.Caption = "X" And Label33.Caption = "X" Then
    win = 1
    Line26.Visible = True
ElseIf label11.Caption = "X" And Label21.Caption = "X" And Label31.Caption = "X" Then
    win = 1
    Line21.Visible = True
ElseIf label12.Caption = "X" And Label22.Caption = "X" And Label32.Caption = "X" Then
    win = 1
    Line22.Visible = True
ElseIf Label13.Caption = "X" And Label23.Caption = "X" And Label33.Caption = "X" Then
    win = 1
    Line23.Visible = True
ElseIf label11.Caption = "X" And Label22.Caption = "X" And Label33.Caption = "X" Then
    win = 1
    Line19.Visible = True
ElseIf Label13.Caption = "X" And Label22.Caption = "X" And Label31.Caption = "X" Then
    win = 1
    Line20.Visible = True
ElseIf label11.Caption = "O" And label12.Caption = "O" And Label13.Caption = "O" Then
    win = 2
    Line24.Visible = True
ElseIf Label21.Caption = "O" And Label22.Caption = "O" And Label23.Caption = "O" Then
    win = 2
    Line25.Visible = True
ElseIf Label31.Caption = "O" And Label32.Caption = "O" And Label33.Caption = "O" Then
    win = 2
    Line26.Visible = True
ElseIf label11.Caption = "O" And Label21.Caption = "O" And Label31.Caption = "O" Then
    win = 2
    Line21.Visible = True
ElseIf label12.Caption = "O" And Label22.Caption = "O" And Label32.Caption = "O" Then
    win = 2
    Line22.Visible = True
ElseIf Label13.Caption = "O" And Label23.Caption = "O" And Label33.Caption = "O" Then
    win = 2
    Line23.Visible = True
ElseIf label11.Caption = "O" And Label22.Caption = "O" And Label33.Caption = "O" Then
    win = 2
    Line19.Visible = True
ElseIf Label13.Caption = "O" And Label22.Caption = "O" And Label31.Caption = "O" Then
    win = 2
    Line20.Visible = True
ElseIf label11 <> "" And label12 <> "" And Label13 <> "" And Label21 <> "" And Label22 <> "" And Label23 <> "" And Label31 <> "" And Label32 <> "" And Label33 <> "" Then
    MsgBox (" Empate!!")
    *****.Enabled = True
    label11.Caption = ""
    label12.Caption = ""
    Label13.Caption = ""
    Label21.Caption = ""
    Label22.Caption = ""
    Label23.Caption = ""
    Label31.Caption = ""
    Label32.Caption = ""
    Label33.Caption = ""
    Line19.Visible = False
    Line20.Visible = False
    Line21.Visible = False
    Line22.Visible = False
    Line23.Visible = False
    Line24.Visible = False
    Line25.Visible = False
    Line26.Visible = False
    
    win = 0
End If
If win = 1 Then
    tdgfh = MsgBox(" O jogador1(" & nome1 & ") Ganhou ", , "winner")
    win1 = win1 + 1
    *****.Enabled = True
    label11.Caption = ""
    label12.Caption = ""
    Label13.Caption = ""
    Label21.Caption = ""
    Label22.Caption = ""
    Label23.Caption = ""
    Label31.Caption = ""
    Label32.Caption = ""
    Label33.Caption = ""
    Line19.Visible = False
    Line20.Visible = False
    Line21.Visible = False
    Line22.Visible = False
    Line23.Visible = False
    Line24.Visible = False
    Line25.Visible = False
    Line26.Visible = False
    
    win = 0
ElseIf win = 2 Then
    tdgfh = MsgBox(" O jogador2(" & nome2 & ") Ganhou ", , "winner")
    win2 = win2 + 1
    *****.Enabled = True
    label11.Caption = ""
    label12.Caption = ""
    Label13.Caption = ""
    Label21.Caption = ""
    Label22.Caption = ""
    Label23.Caption = ""
    Label31.Caption = ""
    Label32.Caption = ""
    Label33.Caption = ""
    Line19.Visible = False
    Line20.Visible = False
    Line21.Visible = False
    Line22.Visible = False
    Line23.Visible = False
    Line24.Visible = False
    Line25.Visible = False
    Line26.Visible = False
    
    win = 0
End If
 
Essas noções de Matemática...

Resto da divisão de 1 por 2 = 0; (Jogador 2)
Resto da divisão de 2 por 2 = 0; (Jogador 2)
Resto da divisão de 3 por 2 = 1; (Jogador 1)
Resto da divisão de 4 por 2 = 0; (Jogador 2)
Resto da divisão de 5 por 2 = 1; (Jogador 1)

(Já entendeste aonde é que estás a errar? Matemática básica...)

Basicamente inicializa o teu contador com um numero ímpar superior a 2, pode ser 3, 5, ou até 101, desde que seja ímpar.
E, porque não simplesmente usares um marcador em booleano? É tão mais simples de controlar e implementar

Basta associar o 0 ao Jogador 1 e o 1 ao Jogador 2.
So precisas de alterar a "polaridade" cada vez que um joga:

- Quando é a vez do Jogador 1 mete o valor em 1;
- Quando é a vez do Jogador 2 mete o valor em 0;

- Se Valor == 0 'Vez do Jogador 1';
- Se Valor == 1 'Vez do Jogador 2';

Epah, até dá para simplificar o sistema se compreenderes que 0 indica um 'Não' e 1 um 'Sim':

- Se Valor 'Vez do Jogador 2';
- Se Não Valor (em C é !Valor, acho que em VB é o mesmo) 'Vez do Jogador 1';

São praticas muito mais "nucleares" que te vão criar um programa muito mais limpo, simples e eficiente.
Epah, até podias muito bem nem usar contadores, bastava usares recursividade aplicando apenas uma função que estava desenvolvida para se ir chamando a si própria alterando apenas certos dados.

Mas já pedias ao teu professor para vos ensinar os benefícios de uma traçagem...
Olhei para a tua função de controle e encontrei logo o erro, nem tive que ler o resto do programa.

Mas deves estar no 9º/10º e ainda vais no primeiro Período... é compreensível.
 
Essas noções de Matemática...

Resto da divisão de 1 por 2 = 0; (Jogador 2)
Resto da divisão de 2 por 2 = 0; (Jogador 2)
Resto da divisão de 3 por 2 = 1; (Jogador 1)
Resto da divisão de 4 por 2 = 0; (Jogador 2)
Resto da divisão de 5 por 2 = 1; (Jogador 1)

(Já entendeste aonde é que estás a errar? Matemática básica...)

Basicamente inicializa o teu contador com um numero ímpar superior a 2, pode ser 3, 5, ou até 101, desde que seja ímpar.
E, porque não simplesmente usares um marcador em booleano? É tão mais simples de controlar e implementar

Basta associar o 0 ao Jogador 1 e o 1 ao Jogador 2.
So precisas de alterar a "polaridade" cada vez que um joga:

- Quando é a vez do Jogador 1 mete o valor em 1;
- Quando é a vez do Jogador 2 mete o valor em 0;

- Se Valor == 0 'Vez do Jogador 1';
- Se Valor == 1 'Vez do Jogador 2';

Epah, até dá para simplificar o sistema se compreenderes que 0 indica um 'Não' e 1 um 'Sim':

- Se Valor 'Vez do Jogador 2';
- Se Não Valor (em C é !Valor, acho que em VB é o mesmo) 'Vez do Jogador 1';

São praticas muito mais "nucleares" que te vão criar um programa muito mais limpo, simples e eficiente.
Epah, até podias muito bem nem usar contadores, bastava usares recursividade aplicando apenas uma função que estava desenvolvida para se ir chamando a si própria alterando apenas certos dados.

Mas já pedias ao teu professor para vos ensinar os benefícios de uma traçagem...
Olhei para a tua função de controle e encontrei logo o erro, nem tive que ler o resto do programa.

Mas deves estar no 9º/10º e ainda vais no primeiro Período... é compreensível.


a tua teoria da inicialização de inicializar a um numero impar maior q dois não funcionou, até tentei com 101 e mesmo assim não funcionou, continua com o mesmo problema...


e sim temos poucos conhecimentos ainda de VB, estamos no 11º ano, o primeiro ano de VB ainda temos muito poucas aulas e muito pouca experiencia.
 
também podes declarar a variável jog como boolean e metê-la a true/false, conforme o jogador que é a jogar. Depois fica assim:

Código:
if jog then
'é o jogador 1 a jogar
else
'é o 2º jogador a jogar
end if
@Moralez: 1 Mod 2 = 1
 
queria evitar utilizar valores booleanos, embora ja tenha percebido como fazer para valores booleanos, mas eu perciso de fazer com contador para outras funçoes do programa, resta saber como, não percebo porque não funciona bem, se a matemática não me falha devia resultar como tenho.
 
Back
Topo