10
respostas

Jogo da cobrinha usando apenas while e if/else

Olá ! Minha dúvida é com relação ao snake game (link abaixo). Esse é um exercício programa da USP e quando eu estava na graduação, tentei resolve-lo, e eu não consegui. Para resolver esse exercício só podia utilizar os comandos While e If/Else (os quais eu já vi nos cursos de introdução a lógica, introdução python e introdução Java), construindo as funções como descrito no link abaixo. Eu consigo fazer o tabuleiro, consigo movimentar a cobra, mas não consigo criar o corpo da cobra e movimenta-lo. (Ou seja, a mecânica básica do jogo).

PS: Eu já sou formado e estou ciente do plágio acadêmico. Eu sei que seria ilícito eu copiar e divulgar a resolução desse problema. PS2: Na época tentei tirar dúvidas com professor e monitor. Eu sabia como funcionava todos os comandos, mas eles não podiam me responder, porque se não resolvia o problema. Então, sinto que se eu não resolver esse exercício, que é "básico", não posso avançar aqui nos cursos da Alura.

https://www.ime.usp.br/~mac2166/python/ep1/

10 respostas

Oi Diego tudo bem?

Tá brincando que isso é básico né rsrsrs. É muito dificíl resolver esse problema sem usar vetores. É como sei lá programar em assemble se eu tenho c++ entende. É complicado rsrsrs.É mow trampo rsrsrs. Eu trabalho na área e iria levar vários dias para programar isso.

Posso sugerir uma abordagem diferente?

Eu tenho uma página que ensina a fazer o jogo da cobrinha usando HTML5 e o Canvas, quer dar uma olhadinha nela?

http://thecodeplayer.com/walkthrough/html5-game-tutorial-make-a-snake-game-using-html5-canvas-jquery

Ao entrar na página cliquem em Play Walktrough demora um pouquinho para carregar .

Nessa página o cara vai programando e vai mostrando o código e o resultado na hora. Muito bom.

Olá André !

Eu falei que esse problema era "básico" porque fazia parte da disciplina Introdução a Computação à Ciências Exatas, e é uma disciplina dos calouros (optativa na época para mim). Eu já havia visto outras soluções, mas todas utilizavam-se de outros recursos. Obrigado por responder, irei acessar o link e se alguém quiser continuar discutindo a solução do problema, eu continuarei tentando resolve-lo.

Posta seu código até onde você chegou, vamos ver o que dá pra ser feito.

O código original do enunciado é muito grande pra postar aqui (eu tentei não consegui). Esse é o que eu estou desenvolvendo sozinho. Mas segue a mesma lógica. Eu só consigo mover horizontalmente a cobrinha. Verticalmente não.

def jogar():

    print("Bem vindo ao jogo da Cobrinha")

    nlinhas  = int((input("Digite o número de linhas: ")))
    ncolunas = int((input("Digite o número de colunas: ")))
    x0       = int((input("Digite a posicao x inicial: ")))
    y0       = int((input("Digite a posicao y inicial: ")))
    x        = x0 + 1
    y        = y0
    borda    = 2

    tabuleiro(nlinhas, ncolunas, x0, y0, x, y)
    mover_direita  = False
    mover_esquerda = False
    mover_cima     = False
    mover_baixo    = False

    while x < (ncolunas + borda) and y < (nlinhas + borda):

        mover = int(input("Digite os números para mover a cobra: 1 para cima, 2 para baixo, 3 para esquerda ou 4 para direita: "))

        if(mover == 1):
            mover_direita  = False
            mover_esquerda = False
            mover_cima     = True
            mover_baixo    = False
        if(mover == 2):
            mover_direita  = False
            mover_esquerda = False
            mover_cima     = False
            mover_baixo    = True
        if(mover == 3):
            mover_direita  = False
            mover_esquerda = True
            mover_cima     = False
            mover_baixo    = False
        if(mover == 4):
            mover_direita  = True
            mover_esquerda = False
            mover_cima     = False
            mover_baixo    = False

        if mover_direita:
            x  = x + 1

            tabuleiro(nlinhas, ncolunas, x0, y0, x, y)

        if mover_esquerda:
            x  = x - 1
            if x0 == y or x0 == x:
                print("Fim do Jogo")
            else:
                tabuleiro(nlinhas, ncolunas, x0, y0, x, y)

        if mover_baixo:
            y = y + 1

            tabuleiro(nlinhas, ncolunas, x0, y0, x, y)

        if mover_cima:
            y = y - 1

            tabuleiro(nlinhas, ncolunas, x0, y0, x, y)


        if(x == ncolunas + borda - 1) or (y == nlinhas + borda - 1) or x == 1 or y == 1:
            print("Fim do jogo")


def tabuleiro(nlinhas, ncolunas, x0, y0, x, y):

    borda     = 2

    contador_y = 1
    contador_x = 1
    contador = 1

#Borda

    while contador_x < (ncolunas + borda):
        contador_x = contador_x + 1
        print(" # ", end="")

        if contador_x == (ncolunas + borda):
            print(" # ")


#Tabuleiro

    contador_x = 1

    while contador_y <= (nlinhas + borda):
        contador_y = contador_y + 1
        contador_x = 1

        while contador_x <= (ncolunas + borda):
            contador_x = contador_x + 1

            if contador_x == 2:
                print(" # ", end="")
                contador_x = contador_x + 1

            if x0 == contador_x and y0 == contador_y:
                while x > contador_x:
                    print(" x ", end="")
                    contador_x = contador_x + 1

            if (x == contador_x and (y) == contador_y):
                print(" C ", end="")
                contador_x = contador_x + 1 

            print(" . ", end="")

            if contador_x == ncolunas + borda:
                print(" # ")
                contador_x = contador_x + 1        

#Borda

    contador_x = 1

    while contador_x < (ncolunas + borda):
       contador_x = contador_x + 1
       print(" # ", end="")

       if contador_x == (ncolunas + borda):
           print(" # ")


jogar()

Vou dar uma olhada, você pode por o código no github se não couber aqui.

Mas me diga o que quer, que eu te dê a solução ou aponte para você o caminho?

Você pode me apontar o caminho primeiro. Em comparação com o que eu estou fazendo sozinho, o "original" possui uma variável chamada direçao (d). E essa variável foi a única que eu não consegui manipular e ela é relacionada com a variável tamanho (t). E precisa dessas duas variáveis para fazer o "corpo" da cobrinha e movimenta-la. Se você conseguir me explicar como essa variável funciona. Abaixo tem o link com o código "original". No meu código, eu não botei essas variáveis, e talvez seja por isso que eu não esteja conseguindo progredir.

https://www.ime.usp.br/~mac2166/python/ep1/esqueleto_ep1.py

Hum, esse d parece ser meio chatinho. Vamos ver o que sabemos sobre ele:

Inicia a variável d 

indicando nela que t-1 partes do corpo
            da cobrinha estão inicialmente alinhadas à esquerda da cabeça.
            Exemplos:
               se t = 4, então devemos fazer d = 222
               se t = 7, então devemos fazer d = 222222
d = 0
        i = 1
        while i <= t-1: 
            d = d * 10 + 2
            i = i + 1
- d: sequência de deslocamentos que levam a posição da cauda da cobra
         até a cabeça; o dígito menos significativo é a direção na cabeça

Tem o t também

    t       = int(input('Tamanho da cobrinha           : '))

O d junto com o t faz o papel de vetor da cobrinha.

Acho que o passo agora é fazer uma string com o papel de vetor para guardar as posições da cobrinha. Porque o jeito dos caras usando d e t é meio chato rsrsrsrs. O que acha?

Ok, obrigado ! Amanhã tentarei fazer isso que você falou e respondo o que eu consegui fazer. Obrigado mais uma vez !

Dinada tamo aí para isso!