Snake

Snake

Notapor Nathaniel » Lun Jun 15, 2009 4:18 pm

Me he basado en un juego de Pygame.org acerca del Snake y me he propuesto hacer uno parecido, aquí está el resultado:

Aun está un poco soso sin imágenes ni nada, tengo que añadirlo esto además de que imprima un mensaje cuando pierdas, musica, etc.


Código: Seleccionar todo
import pygame
from pygame.locals import *
from random import randrange
pygame.init()

Anchura, Altura = 350,350
Screen = pygame.display.set_mode((Anchura,Altura))
pygame.display.set_caption("Nath Snake")

class Snake(pygame.sprite.Sprite):
   def __init__(self):
      pygame.sprite.Sprite.__init__(self)
      self.Posicion = [160,304]
      self.Body = []
      self.Direccion = 0
      #0 es arriba, 1 derecha, 2 abajo, 3 izquierda.
      self.Length = 3
   def Update(self):
      self.Body.insert(0,list(self.Posicion))
      self.Body = self.Body[0:self.Length]
      
      if self.Direccion == 0:
         self.Posicion[1] -= 16
      elif self.Direccion == 1:
         self.Posicion[0] += 16
      elif self.Direccion == 2:
         self.Posicion[1] += 16
      elif self.Direccion == 3:
         self.Posicion[0] -= 16
         
      if self.Posicion[0] not in range(349):
         exit()
      if self.Posicion[1] not in range(349):
         exit()
         
      for b in self.Body:
         if self.Posicion == b:
            exit()
            
      Screen.fill((0, 0, 255), (self.Posicion[0], self.Posicion[1], 19, 19))
      for b in self.Body:
         Screen.fill((0, 0, 255), (b[0], b[1], 19, 19))

class Food(pygame.sprite.Sprite):
   def __init__(self):
      self.Position()
   def Position(self):
      self.Posicion = [randrange(1,18)*16,randrange(1,18)*16]
   def Update(self):
      Screen.fill((255, 0, 0), (self.Posicion[0], self.Posicion[1], 16, 16))

Snake = Snake()
SnakeGroup = pygame.sprite.Group()
SnakeGroup.add(Snake)

Food = Food()

Fuente = pygame.font.SysFont("Arial", 30)

Running = True

while Running:
   for event in pygame.event.get():
      if event.type == QUIT:
         Running = False
      elif event.type == KEYDOWN:
         if event.key == K_UP:
            Snake.Direccion = 0
         elif event.key == K_RIGHT:
            Snake.Direccion = 1
         elif event.key == K_DOWN:
            Snake.Direccion = 2
         elif event.key == K_LEFT:
            Snake.Direccion = 3
   if Food.Posicion == Snake.Posicion:
      Food.Position()
      Snake.Length += 1
   Screen.fill((255,255,255))
   Snake.Update()
   Food.Update()   
   Render = Fuente.render("Score: %d" % (Snake.Length-3), 1, (0,0,0))
   Screen.blit(Render,(5,5))
   pygame.display.update()
   pygame.time.wait(100)
Nathaniel
 
Mensajes: 8
Registrado: Sab Feb 14, 2009 8:00 pm

Notapor Dokan » Mié Jun 17, 2009 10:52 am

¡Vaya!
Viendo como te ha quedado me doy cuenta de que me complico demasiado la vida en tonterías... voy a tener que aprender a simplificar.
Gracias por publicarlo.
Avatar de Usuario
Dokan
 
Mensajes: 143
Registrado: Lun Dic 03, 2007 10:40 pm

Una duda...

Notapor Dokan » Jue Jun 18, 2009 10:03 pm

He estado haciendo algunas pruebas con tu código para entenderlo pero hay cosas que se me escapan:

Código: Seleccionar todo
self.Body.insert(0,list(self.Posicion))


En la linea 30 más o menos (he añadido algunas y quitado otras) tienes este código que me trae loco porque no consigo saber que hace exactamente. Deduzco que añade valores (self.Posicion?) a la lista «Body», pero si «self.Posicion» ya es una lista, ¿Por qué utilizas «list(self.Posicion)»?
Pregunto ésto porque probando cosas me ha dado por cambiar ésto:

Código: Seleccionar todo
if self.Direccion == 0:
         self.Posicion[1] -= 16


y darle valor 20, pero el resultado es que la serpiente ya no colisiona con las manzanas, las atraviesa, también ocurre cuando cambio la posición inicial de la serpiente en:

Código: Seleccionar todo
self.Posicion = [160,304]


¿Por qué pasa eso? Tengo la impresión de que tiene que ver con lo que preguntaba al principio...
Avatar de Usuario
Dokan
 
Mensajes: 143
Registrado: Lun Dic 03, 2007 10:40 pm

Notapor Juanxo » Vie Jun 19, 2009 11:54 am

Buenas a los dos:
A mi también me ha parecido bastante facil la manera de hacerlo, asi que bien hecho jaja

Dokan:
A mi también me parecio que lo de self.posición era una tupla, pero no. La verdad es que no entiendo porque una lista.

Pero creo haber visto como funciona:
Creas la inicial y tal, y en el update lo que haces es crear un nuevo "nodo" o parte del cuerpo de la serpiente, y con lo de self.body = self.body[0:self.length] eliminas el ultimo nodo. Vamos, que en realidad no se mueve, sino que creo por un lado y destruyo por otro.
¿Es así?

Por otro lado, el tema de que al cambiar la cantidad de pixels que se desplaza la posicion cada pulsación de tecla, es lógico que ya no choque siempre con la comida: if Food.Posicion == Snake.Posicion:
tienen que ser las mismas, y esto solo se consigue moviendo un número de pixels igual al tamaño de cada casilla, no se si me explico.

Buen trabajo Nathaniel.

Haber si nos aclaras esta dudilla xD
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor Dokan » Jue Jun 25, 2009 9:21 am

Juanxo escribió:Dokan:
A mi también me parecio que lo de self.posición era una tupla, pero no. La verdad es que no entiendo porque una lista.

Pero creo haber visto como funciona:
Creas la inicial y tal, y en el update lo que haces es crear un nuevo "nodo" o parte del cuerpo de la serpiente, y con lo de self.body = self.body[0:self.length] eliminas el ultimo nodo. Vamos, que en realidad no se mueve, sino que creo por un lado y destruyo por otro.
¿Es así?

Si, básicamente esa es la apariencia de movimiento.

Juanxo escribió:Por otro lado, el tema de que al cambiar la cantidad de pixels que se desplaza la posicion cada pulsación de tecla, es lógico que ya no choque siempre con la comida: if Food.Posicion == Snake.Posicion:
tienen que ser las mismas, y esto solo se consigue moviendo un número de pixels igual al tamaño de cada casilla, no se si me explico.

Entiendo lo que dices y parece lógico, tendré que espabilar bastante...

Gracias por la ayuda.
Avatar de Usuario
Dokan
 
Mensajes: 143
Registrado: Lun Dic 03, 2007 10:40 pm


Volver a Videojuegos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron