Snake

Stato
Discussione chiusa ad ulteriori risposte.

HackLife

Utente Silver
26 Maggio 2008
57
11
0
73
Ciao ragazzi
Un piccolo esperimento con le pygames. Ho anche deciso di adottare uno stile nella scrittura delle funzioni diverso dal mio solito uso "monolitico" più orientato a splittare il codice in funzioni più piccole e (spero) più leggibili. Ditemi voi cosa vi sembra meglio ;)
Per averlo funzionante dovete scaricare tutto il pacchetto e avere le pygame installate.
Link: http://myfreefilehosting.com/f/8ec171659b_0.1MB

Oppure potete solo leggere il codice:
Codice:
	#----- SNAKE -----#
	# Title:	[Snake Origins]
	# Descr:	[Famouse 'Snake' Game. The snake is a python.]
	# Version:	[1.0]
	#-----------------#

import pygame, sys, random, time

PNG_IMG = 4     #Dimension of .png pictures
FOOD_POINTS = 1

class SnakeBodySquare(pygame.sprite.Sprite):
    def __init__(self,speed=[5,0]):
        pygame.sprite.Sprite.__init__(self)
        self.pic = pygame.image.load('snake_body.png')
        self.rect = self.pic.get_rect()
        self.speed = speed

class SnakeBody:
    def __init__(self):
        self.snake_body=[]
        self.speed = [5,0]
        
        self.add_body(5)

    def add_body(self,parts):
        for part in range(parts):
            try:
                n_part = SnakeBodySquare(speed=self.snake_body[-1].speed)
                p_part = self.snake_body[-1]
                p_part_x = p_part.rect.left
                p_part_y = p_part.rect.top
                n_part.rect = n_part.rect.move(
                    [p_part.rect.left-p_part.speed[0],
                     p_part.rect.top-p_part.speed[1]])
            except IndexError:
                n_part = SnakeBodySquare()
                n_part.rect = n_part.rect.move([20,20])
            self.snake_body.append(n_part)

    def show(self):
        location = [10,24]
        for part in self.snake_body:
            part.rect = part.rect.move(location)
   
    def move(self,display_cords):
        o_speeds = [part.speed for part in self.snake_body]
        o_speeds[-1] = self.speed
        for part in self.snake_body:
            part.speed = o_speeds\
                        [self.snake_body.index(part)-1]
        for part in self.snake_body:
            part.rect = part.rect.move(part.speed)
            if self.collide_check(part):
                return False
            if self.borders_check(part,display_cords):
                self.borders_move(part,display_cords)
        return True

    def borders_check(self,part,display_cords):
        if part.rect.top < 0 or\
           part.rect.left < 0 or\
           part.rect.left > display_cords[0] or\
           part.rect.top > display_cords[1]:
            return True
        else:
            return False

    def borders_move(self,part,display_cords):
        if part.rect.top < 0:
            part.rect = part.rect.move(0,display_cords[1])
        elif part.rect.left < 0:
            part.rect = part.rect.move(display_cords[0],0)
        elif part.rect.left > display_cords[0]:
            part.rect = part.rect.move(-display_cords[0],0)
        elif part.rect.top > display_cords[1]:
            part.rect = part.rect.move(0,-display_cords[1])
           

    def collide_check(self,part):
        for o_part in self.snake_body:
            if part != o_part and \
                    part.rect.colliderect(o_part.rect):
                return True
            else:
                return False

    def food_check(self,food):                            
        for part in self.snake_body:
            if part.rect.colliderect(food.rect):
                self.add_body(1)
                return True


class SnakeFood(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.pic = pygame.image.load('snake_food.png')
        self.rect = self.pic.get_rect()

    def random_show(self,(width,height)):
        self.position = [random.randrange(width/PNG_IMG)*PNG_IMG,
                         random.randrange(height/PNG_IMG)*PNG_IMG]
        self.rect = self.rect.move(self.position)


class Game:
    def __init__(self):
        pygame.init()
        self.width, self.height = (150,150)
        self.black = 0,0,0
        self.white = 255,255,255
        self.screen = pygame.display.set_mode((self.width,self.height))
        self.points = 0
        self.font = pygame.font.Font(None,20)

        while True:
            if not self._main():
                print "You Lost"
                print "Points: %d" %self.points
                raw_input("Press [ENTER] for a new game")

    def _main(self):
        print "New Game"
        snake = SnakeBody()
        snake.show()
        food = SnakeFood()
        food.random_show((self.width,self.height))
        
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()
                elif event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_DOWN:
                        if snake.speed[1] != -5:
                            snake.speed = [0,5]
                    elif event.key == pygame.K_UP:
                        if snake.speed[1] != 5:
                            snake.speed = [0,-5]
                    elif event.key == pygame.K_RIGHT:
                        if snake.speed[0] != -5:
                            snake.speed = [5,0]
                    elif event.key == pygame.K_LEFT:
                        if snake.speed[0] != 5:
                            snake.speed = [-5,0]
            
            if snake.food_check(food):
                print "+%d Points" % FOOD_POINTS
                self.points += FOOD_POINTS
                
                food = SnakeFood()
                food.random_show((self.width,self.height))

            if not snake.move((self.width,self.height)):
                return False

            text = self.font.render(str(self.points),
                               1, self.white)
            self.screen.fill(self.black)
            for part in snake.snake_body:
                self.screen.blit(part.pic,part.rect)
            self.screen.blit(food.pic,food.rect)
            self.screen.blit(text,(self.width-20,self.height-20))
            pygame.display.flip()
            time.sleep(0.2)

Game()
 
In realtà pensavo di produrre un altro paio di giochini così e poi postare in propri programmi tutto il pack. Non vorrei che la sezione si trasformasse in un accozzaglia di programmi "stupidi" come questo da 100 righe.
 
Don't worry ora ^^''
Grazie Robertof. Pensavo di rilasciare tutto un pack di giochini retrò. Metterci tipo brick, tetris o space invaders... Tu cosa consigli?
 
Stato
Discussione chiusa ad ulteriori risposte.