Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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!