Ajuda com Jogo da Velha

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

Ajuda com Jogo da Velha

Felipe Mazur
Olà galera, eu sou um Newbie com Lua faz cerca de 4 dias que comecei a pesquisar na net, pois fiquei interessado nela.
E estou tentando fazer um jogo da velha en o Player e a CPU, mas não consigo implementar no código uma maneira de fazer com que se a jogada for repetida, peça novamente a entrada de dados. E não consigui pensar em uma maneira, tentei usar for,if, for com if,etc.
Aqui em baixo disponibilizo o código:

a = {1,2,3}
a[1] = {1,2,3}
a[2] = {4,5,6}
a[3] = {7,8,9}
jogp= {nil,nil,nil,nil,nil,nil,nil,nil,nil}
jp,jogpr, jogpc = 0,0,0
k=0
win_a,fim = 0,true

function jogada(joga)
    k= k + 1
    jogp[k] = joga
    repeat
        if jogpr == 1 then
            print("Jogada Invalida")
            joga=io.read()
        end
        for i = 1,3 do
            l = 1
            for j = 1,3 do
                if tonumber(joga) == a[i][j] and tonumber(joga)~= jogp[l] then
                    a[i][j] = "X"
                    jogpr = 0
                end
                l = l + 1
            end
        end
        for i = 1,3 do
            for k = 1,3 do
                if a[i][j] ~= jogp[k] then
                    jogpr = 0
                else
                    jopr = 1
                end
                k = k + 1
            end
        end



    until jogpr == 0
    j = 0
    for i = 1,3 do
        print(a[i][j+1] .."|" ..a[i][j+2] .."|" ..a[i][j+3])
    end
end

function win()
    if a[1][1] == a[1][2] and a[1][2] == a[1][3] then
        win_a = 1
        fim = false
    elseif a[1][1] == a[2][1] and a[2][1] == a[3][1] then
        win_a = 1
        fim = false
    elseif a[1][1] == a[2][2] and a[2][2] == a[3][3] then
        win_a = 1
        fim = false
    elseif a[1][2] == a[2][2] and a[2][2] == a[3][2] then
        win_a = 1
        fim = false
    elseif a[1][3] == a[2][3] and a[2][3] == a[3][3] then
        win_a = 1
        fim = false
    elseif a[1][3] == a[2][2] and a[2][2] == a[3][1] then
        win_a = 1
        fim = false
    elseif a[2][1] == a[2][2] and a[2][2] == a[2][3] then
        win_a = 1
        fim = false
    elseif a[3][1] == a[3][2] and a[3][2] == a[3][3] then
        win_a, fim = 1,false
    else
        local k,l = 1,0
        for i = 1,3 do
            for j = 1,3 do
                if a[i][j] ~= k then
                    l = l + 1
                    k = k + 1
                end
            end
            if l == 9 then
                win_a = 2
                fim = false
            end
        end
    end
end

function joga_c()
    local joga = math.random(1,9)
    for i = 1,3 do
        for j = 1,3 do
            if tonumber(joga) == a[i][j] then
                a[i][j] = "O"
            end
        end
    end
    j = 0
    for i = 1,3 do
        print(a[i][j+1] .."|" ..a[i][j+2] .."|" ..a[i][j+3])
    end
end

function jogo()
    repeat
        jogad = io.read()
        sys.clear()
        jogada(jogad)
        win()
        if fim == true then
            print("CPU:")
            sys.sleep(2000)
            sys.clear()
            joga_c()
            win()
        end
    until fim == false
    if win_a == 1 then
        print("Ganhou")
    elseif win_a == 2 then
        print("Deu velha")
    end
end

j = 0
for i = 1,3 do
    print(a[i][j+1] .."|" ..a[i][j+2] .."|" ..a[i][j+3])
end
jogo()

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Visite este grupo em https://groups.google.com/group/lua-br.
Para obter mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Ajuda com Jogo da Velha

Eric Chiesse
Falta vc fazer a CPU ler o tabuleiro e verificar se o lugar que ela está tentando jogar já está ocupado ou não.

Detalhes que vão te ajudar no futuro (bem próximo):
1 - O que significam a, jp, jogpr, jogpc, win_a e fim ?
2 - Não está claro para mim qual o papel de jogada e joga_c. joga_c parece ser a jogada da CPU, mas o nome poderia ser mais claro.

Tente pensar numa jogada como sendo algo separado do jogador. Então tente implementar uma função que realize a jogada independente de quem seja o jogador. Dessa maneira tanto faz se é a CPU ou um humano jogando. E no futuro se vc quiser criar uma IA para ser sua CPU não precisa reescrever o código da jogada, apenas do jogador. Você poderá inclusive ter várias versões de jogador. Talvez ate botar duas CPUs para jogar entre si.

---
Eric

2017-10-18 2:30 GMT-02:00 Felipe Mazur <[hidden email]>:
Olà galera, eu sou um Newbie com Lua faz cerca de 4 dias que comecei a pesquisar na net, pois fiquei interessado nela.
E estou tentando fazer um jogo da velha en o Player e a CPU, mas não consigo implementar no código uma maneira de fazer com que se a jogada for repetida, peça novamente a entrada de dados. E não consigui pensar em uma maneira, tentei usar for,if, for com if,etc.
Aqui em baixo disponibilizo o código:

a = {1,2,3}
a[1] = {1,2,3}
a[2] = {4,5,6}
a[3] = {7,8,9}
jogp= {nil,nil,nil,nil,nil,nil,nil,nil,nil}
jp,jogpr, jogpc = 0,0,0
k=0
win_a,fim = 0,true

function jogada(joga)
    k= k + 1
    jogp[k] = joga
    repeat
        if jogpr == 1 then
            print("Jogada Invalida")
            joga=io.read()
        end
        for i = 1,3 do
            l = 1
            for j = 1,3 do
                if tonumber(joga) == a[i][j] and tonumber(joga)~= jogp[l] then
                    a[i][j] = "X"
                    jogpr = 0
                end
                l = l + 1
            end
        end
        for i = 1,3 do
            for k = 1,3 do
                if a[i][j] ~= jogp[k] then
                    jogpr = 0
                else
                    jopr = 1
                end
                k = k + 1
            end
        end



    until jogpr == 0
    j = 0
    for i = 1,3 do
        print(a[i][j+1] .."|" ..a[i][j+2] .."|" ..a[i][j+3])
    end
end

function win()
    if a[1][1] == a[1][2] and a[1][2] == a[1][3] then
        win_a = 1
        fim = false
    elseif a[1][1] == a[2][1] and a[2][1] == a[3][1] then
        win_a = 1
        fim = false
    elseif a[1][1] == a[2][2] and a[2][2] == a[3][3] then
        win_a = 1
        fim = false
    elseif a[1][2] == a[2][2] and a[2][2] == a[3][2] then
        win_a = 1
        fim = false
    elseif a[1][3] == a[2][3] and a[2][3] == a[3][3] then
        win_a = 1
        fim = false
    elseif a[1][3] == a[2][2] and a[2][2] == a[3][1] then
        win_a = 1
        fim = false
    elseif a[2][1] == a[2][2] and a[2][2] == a[2][3] then
        win_a = 1
        fim = false
    elseif a[3][1] == a[3][2] and a[3][2] == a[3][3] then
        win_a, fim = 1,false
    else
        local k,l = 1,0
        for i = 1,3 do
            for j = 1,3 do
                if a[i][j] ~= k then
                    l = l + 1
                    k = k + 1
                end
            end
            if l == 9 then
                win_a = 2
                fim = false
            end
        end
    end
end

function joga_c()
    local joga = math.random(1,9)
    for i = 1,3 do
        for j = 1,3 do
            if tonumber(joga) == a[i][j] then
                a[i][j] = "O"
            end
        end
    end
    j = 0
    for i = 1,3 do
        print(a[i][j+1] .."|" ..a[i][j+2] .."|" ..a[i][j+3])
    end
end

function jogo()
    repeat
        jogad = io.read()
        sys.clear()
        jogada(jogad)
        win()
        if fim == true then
            print("CPU:")
            sys.sleep(2000)
            sys.clear()
            joga_c()
            win()
        end
    until fim == false
    if win_a == 1 then
        print("Ganhou")
    elseif win_a == 2 then
        print("Deu velha")
    end
end

j = 0
for i = 1,3 do
    print(a[i][j+1] .."|" ..a[i][j+2] .."|" ..a[i][j+3])
end
jogo()

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Visite este grupo em https://groups.google.com/group/lua-br.
Para obter mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Ajuda com Jogo da Velha

Felipe Mazur
1. a é a variável do tabuleiro
   jp era uma variável que tentei utilizar para controlar a condição se a jogada ja foi realizada
   Jogp é para receber o valor da jogada, para que seja comparada se já não foi jogada.
   jogpr controla o repeat da jogada para somente parar quando o numero for diferente de algum já digitado
   jogpc é para a mesma coisa mas ainda não implementei
   wim_a controla a condição da jogada, somente fiz para o jogador tenho que colocar uma forma de aceitar para a CPU tbm.
   fim controla o repeat do jogo() para que somente acabe quando der velha, jogador vencer ou CPU vencer
2.jogada(joga) se refere a jogada do jogador e o outro como disse.



Ainda estou aprendendo a usar o lua e queria fazer o jogo utilizando funções algo quem nunca utilizei para tal jogo em outras linguagens, por isso tive problemas. Agradeço se puder me ajudar a implementar a johada separada do johador ou me fornecer uma explicação de como posso implementar essa função no jogo, eu ficaria muito feliz

Falou, Abraço 👍👍

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Visite este grupo em https://groups.google.com/group/lua-br.
Para obter mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Ajuda com Jogo da Velha

Eric Chiesse
Então. Pq vc não começa renomeando suas variáveis para que expressem melhor o que vc quer fazer com elas?

Ex:
a -> board (= tabuleiro)
jp -> alreadyPlayed (= jaJogada)
jogp -> currentMove (= jogadaAtual)
e assim por diante.

Quanto a jogar em um lugar que esteja livre vc tem que verificar se a[i][j] contem 'O' ou 'X' e caso tenha repetir a jogada.
Pode usar um if dentro de um for ou mesmo um while direto

Ex:
while a[i][j] == "O" or a[i][j] == "X"
    -- Gerar uma nova opção aleatória ou pedir novo input do usuário.

Vc também pode manter uma lista de disponíveis livres e fazer o random escolher somente entre elas. Assim o jogador CPU nunca iria escolher um lugar ocupado.




---
Eric

2017-10-18 12:20 GMT-02:00 Felipe Mazur <[hidden email]>:
1. a é a variável do tabuleiro
   jp era uma variável que tentei utilizar para controlar a condição se a jogada ja foi realizada
   Jogp é para receber o valor da jogada, para que seja comparada se já não foi jogada.
   jogpr controla o repeat da jogada para somente parar quando o numero for diferente de algum já digitado
   jogpc é para a mesma coisa mas ainda não implementei
   wim_a controla a condição da jogada, somente fiz para o jogador tenho que colocar uma forma de aceitar para a CPU tbm.
   fim controla o repeat do jogo() para que somente acabe quando der velha, jogador vencer ou CPU vencer
2.jogada(joga) se refere a jogada do jogador e o outro como disse.



Ainda estou aprendendo a usar o lua e queria fazer o jogo utilizando funções algo quem nunca utilizei para tal jogo em outras linguagens, por isso tive problemas. Agradeço se puder me ajudar a implementar a johada separada do johador ou me fornecer uma explicação de como posso implementar essa função no jogo, eu ficaria muito feliz

Falou, Abraço 👍👍

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Visite este grupo em https://groups.google.com/group/lua-br.
Para obter mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Ajuda com Jogo da Velha

Felipe Mazur
Tentei implementar uma lista mas não tinha funcionado direito :(
Sabe como poderia?

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Visite este grupo em https://groups.google.com/group/lua-br.
Para obter mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Ajuda com Jogo da Velha

Eric Chiesse
Fiz a minha versão com base no teu código. (bom... na verdade alterei bastante :D)

Vê se consegue entender as idéias:

https://gist.github.com/echiesse/354f10a1fa0db46e2aae0a01abed7e7b

---
Eric

2017-10-18 13:54 GMT-02:00 Felipe Mazur <[hidden email]>:
Tentei implementar uma lista mas não tinha funcionado direito :(
Sabe como poderia?

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Visite este grupo em https://groups.google.com/group/lua-br.
Para obter mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Ajuda com Jogo da Velha

Eric Chiesse
Para a sua dúvida específica acompanha o uso de "getFreePositions"

---
Eric

2017-10-18 16:45 GMT-02:00 Eric Chiesse <[hidden email]>:
Fiz a minha versão com base no teu código. (bom... na verdade alterei bastante :D)

Vê se consegue entender as idéias:

https://gist.github.com/echiesse/354f10a1fa0db46e2aae0a01abed7e7b

---
Eric

2017-10-18 13:54 GMT-02:00 Felipe Mazur <[hidden email]>:
Tentei implementar uma lista mas não tinha funcionado direito :(
Sabe como poderia?

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Visite este grupo em https://groups.google.com/group/lua-br.
Para obter mais opções, acesse https://groups.google.com/d/optout.


--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.