Jogo Snake

213 views
Skip to first unread message

guilherme

unread,
Aug 27, 2008, 1:41:54 PM8/27/08
to python-gamedev-brasil
Ola galera, beleza?

Alguem já fez aquele joguinho de celular Snake no pygame?

Eu to querendo fazer um, mas como sou meio iniciante ta meio
complicado.

eu andei olhando os codigos dos jogos snake que tem no pygame.org
mas ta complicado de enteder

alguem teria um código ou um jogo que fez, que seja de facil
compreensão


desde já agradeço, abs.

Roberto Fagá

unread,
Aug 27, 2008, 6:21:30 PM8/27/08
to python-gam...@googlegroups.com
Guilherme,

Nunca fiz mas não é muito complicado. Pensando numa forma fácil de implementar:

Usar uma matriz grande (pode ser lista dentro de lista mesmo) em que
cada ponto pode ser parede, item a pegar ou parte da cobra. Cada valor
da matriz dessa forma é um valor numérico, por exemplo, e o número
remete ao código da imagem e o objeto correspondente. Ex: de 1 a 3 é a
cobra (cabeça, corpo ou calda), 5 é a maçã, 8 é parede, algo assim.
Faça sempre com constantes nesse caso. Para o movimento da cobra aqui
é bem simples, vc simplesmente armazena a direção em uma variável +1 a
-1 na horizontal e na vertical. Dessa forma, se o usuário pressionar
"direita" por exemplo, essas variáveis assumem valor horizontal +1 e
vertical 0. A cada refresh de tela a posição da cobra é então
incrementada, fazendo com que cada casa dela desloque para a casa que
estava a parte anterior da cobra e a cabeça na direção nova. Vc pode
armazenar em um vetor a cobra, sendo que cada casa do vetor é a
posição atual da matriz, assim pode ficar mais fácil de dar o refresh.
O teste de colisão é muito simples, é só testar se no refresh, a
cabeça foi para uma casa já ocupada ou não.
Você pode até fazer efeito de animação, colocando o incremento de
-0.25 a +0.25 por exemplo, e só aceitando o controle e testando
colisão de 4 em 4 quadros. A maçã faz crescer a cobra, é só aumentar o
vetor da cobra, apagar a maçã e randomizar uma nova em algum lugar do
mapa desocupado (pode ser por tentativa e erro mesmo).
Depois esses mapas, sem a cobra e a maçã, podem ser armazenados em
arquivos com cPickle mesmo, que armazena variáveis Python. Aí vc só lê
a matriz do mapa e coloca a cobra e a maçã.


Bom, só uma idéia. É assim que eu fiz um jogo mínimo para MMORPG, que
aliás vou ver se mês que vem agora eu refaço o tutorial e deixo online
(construindo um cliente MMORPG com pygame em 6h, acreditem, consegui
dar esse minicurso para alunos que nunca tinha visto python e no final
eles programaram td certinho :))

[]'s

2008/8/27 guilherme <guilhe...@gmail.com>:

Kao Cardoso Felix

unread,
Aug 27, 2008, 6:24:04 PM8/27/08
to python-gam...@googlegroups.com
2008/8/27 guilherme <guilhe...@gmail.com>:
> Ola galera, beleza?

Olá, Guilherme,

> Alguem já fez aquele joguinho de celular Snake no pygame?
> Eu to querendo fazer um, mas como sou meio iniciante ta meio
> complicado.

Olha, eu nunca cheguei a fazer um desses, mas acho que não deve ser
muito complicado. O quão iniciante tu é? Sabendo mais ou menos qual a
tua experiência, tanto com programação em geral quanto de jogos, fica
mais fácil saber que tipo de material poderíamos indicar.

> eu andei olhando os codigos dos jogos snake que tem no pygame.org
> mas ta complicado de enteder

Bom, eu não te culpo por não entender :)
Acabei de dar uma olhada e procurei por "snake" no site da pygame[1] e
me parece que há uma competição interna pra fazer o menor código
possível XD
Esse tipo de código não costuma ser muito amigável não...

(Bom, o meu gmail acabou de avisar que veio uma resposta e parece que
o Roberto Fagá te mandou umas idéias de como implementar. Dê uma
olhada nas dicas dele e entre em contato em caso de dificuldades)

[]'s

[1] http://www.pygame.org/tags/snake
--
Kao Cardoso Félix

Página pessoal: http://www.inf.ufrgs.br/~kcfelix
Blog: http://kaofelix.blogspot.com

Joao S. O. Bueno

unread,
Aug 27, 2008, 8:52:45 PM8/27/08
to python-gam...@googlegroups.com
On Wednesday 27 August 2008, Kao Cardoso Felix wrote:
> 2008/8/27 guilherme <guilhe...@gmail.com>:
> > Ola galera, beleza?
>
> Olá, Guilherme,
>
> > Alguem já fez aquele joguinho de celular Snake no pygame?
> > Eu to querendo fazer um, mas como sou meio iniciante ta meio
> > complicado.
>
> Olha, eu nunca cheguei a fazer um desses, mas acho que não deve ser
> muito complicado. O quão iniciante tu é? Sabendo mais ou menos qual
> a tua experiência, tanto com programação em geral quanto de jogos,
> fica mais fácil saber que tipo de material poderíamos indicar.
>
> > eu andei olhando os codigos dos jogos snake que tem no pygame.org
> > mas ta complicado de enteder
>
> Bom, eu não te culpo por não entender :)
> Acabei de dar uma olhada e procurei por "snake" no site da
> pygame[1] e me parece que há uma competição interna pra fazer o
> menor código possível XD
> Esse tipo de código não costuma ser muito amigável não...
>
> (Bom, o meu gmail acabou de avisar que veio uma resposta e parece
> que o Roberto Fagá te mandou umas idéias de como implementar. Dê
> uma olhada nas dicas dele e entre em contato em caso de
> dificuldades)


È ..o Snake tem a seguinte característica:
é um tipo de jogo que __era__ fácil programar, em comparação com
outros conceitos de jogos, justamente por que o jeito de armazenar
as coordenadas de cada parte do corpo da cobra, podia ser otimizado
em função de como o computador organiza os dados na memória quando se
programa em nível amis baixo.

Ai, o jogo aproveitava inclusive recursos de hardware (em
implementações bem anteriores até à clássica versão em QBasic que
acompanhava as ultimas versões do DOS e o Windows 3.1, em 1990!! )

Por exemplo: como o Roberto Fagá explicou, as coordenadas da cobra
ficavam num vetor mapeado direto na memoria - e você tinha um
ponteiro para um endereço desse vetor onde escrevia as coordenadas da
cabeça da cobra, e ao fazer isso:
- colocava um espaço (isso mesmo, um espaço em branco - essas
implementações eram em modo texto), na coordenada que estava no lugar
da cabeça anteriormente - que passa a ser o ponto imediatamente
depois da cauda
- colocava um asterisco nas coordenadas da nova cabeça. esse
asterisco ficava na tela e só era substituido por um espaço em branco
quando a cauda o alcançava.
(no conjunto ASCII, asterisco ("*") é caracter que cobre a maior
área visivel, sendo o "ideal" para representar elementos de jogo em
modo texto nessa epoca)
E em geral, em vez da "matriz Grande" que o Roberto coloca, a própria
memória de video texto servia como "mapa" - ou seja, o byte que era
testado para saber se havia ocorrido uma colisão era um byte
armazenado direto na memoria de vídeo. (isso é bem mais simples do
que pode parecer, pra turma da geração pós modo-gráfico, em que o
vídeo sempre fica bastante abstraido)


Para fazer o jogo em python, hoje, o jeito mais limpo seria esquecer
tudo isso - ter uma cobra que seja um objeto sequência, em que o
iotem[0] seja sempre a coodenada da cabeça - e cada frame, toda a
cobra é desenhada numa pintura vazia do mapa.

Mesmo ao emular o comportamento da cobra " de baixo nível", o ideal,
claro, 'eimplementar tanto mapa quanto cobra como objetos - que
tenham métodos para se mover, se desenhar na tela física (o mapa
matriz de hoje é necessariamente uma abstração que será consultada
para saber quais objetos de imagem serão copiados nas regiões
correspondentes da janela do objeto que representa a imagem
rasterizada - isso é, em pixels. (Em pygame, um objeto Surface))
Alias, eu recomendaria mesmo a criação de niveis de classes
diferentes:
um nível lógico, onde você emula as informaçoes do mapa e da cobra
como era feito antigamente - isso é como o Roberto explicou - e cira
uma sub-classe das mesmas que se tornam "a par" das
representaçóes "fisicas" necessárias - isso é , implementam métodos
para se desenhar na tela usando um framework de jogos, tocar som,
etc...)

Em suma: fazer o jogo da cobrinha hoje é mais difícil do que na decada
de 80. Mesmo quando estamos com python com vários framework
pythonicos multimidia a disposicao, e competindo com C ou Basic lá
atrás - isso por conta da complexidade e camadas de abstração que
estão presentes nos sistemas operacionais - incluindo a interface -
hoje.

js
-><-


>
> []'s
>
> [1] http://www.pygame.org/tags/snake


guilherme

unread,
Aug 28, 2008, 7:37:58 AM8/28/08
to python-gamedev-brasil
beleza galera valeu mesmo, as dicas que vcs me deram ja deu pra ter
uma luz!!!


Kao, beleza cara?
Então eu sou programador Abap, aprendi python mais para me divertir,
porque Abap é meio chatinho.
Já cheguei a fazer um jogo de aviãozinho em pygame, mas coisa bem
basica.

O problema que só tenho tempo de estudar quando to sem fazer nada no
trampo, ai fica complicado.


Vo tentar fazer aqui, depois posto o joguinho beleza.

Falou galera, abraço e valeu!

Joao S. O. Bueno

unread,
Aug 29, 2008, 5:37:38 PM8/29/08
to python-gam...@googlegroups.com
On Wednesday 27 August 2008, guilherme wrote:
> Ola galera, beleza?
>
> Alguem já fez aquele joguinho de celular Snake no pygame?

Olha só - fiz uma implementação que vou usar amanhã na palestra em SP.
acabei de colocar no repositório da lista.

Se alguém for fazer alterações, peço para registrar no arquivo
ChangeLog.

http://python-gamedev-brasil.googlecode.com/svn/trunk/snakes/

>
> Eu to querendo fazer um, mas como sou meio iniciante ta meio
> complicado.
>
> eu andei olhando os codigos dos jogos snake que tem no pygame.org
> mas ta complicado de enteder
>
> alguem teria um código ou um jogo que fez, que seja de facil
> compreensão
>
>
> desde já agradeço, abs.
>

js
-><-

Kao Cardoso Felix

unread,
Aug 31, 2008, 3:35:43 PM8/31/08
to python-gam...@googlegroups.com
2008/8/29 Joao S. O. Bueno <gwi...@mpc.com.br>:

> Olha só - fiz uma implementação que vou usar amanhã na palestra em SP.
> acabei de colocar no repositório da lista.

João, acabei de baixar e dar uma olhada no teu código. Parabéns, está
muito legal! Gostei como as coisas estão claras e a representação dos
conceitos é bem direta (bem diferente daqueles códigos de 12 linhas do
site da pygame, hehehehe).

Reply all
Reply to author
Forward
0 new messages