pygame做的贪吃蛇

某天无聊,在阅览室一上午做的。
唉,对做2d小游戏还是挺有兴趣的,可惜数学实在不好,只能偶尔做做简单的小玩意~
一口气写的,没写注释…
你控制的蛇是s,周围都是b,撞上就lost了

pygame做的贪吃蛇
看代码~贴到文件里就可以用。

#!/usr/bin/env python2

# -*- coding: utf-8 -*-

'''

Created on 2011-11-25

author: shiweifu

  mail: [email protected]

'''

import struct

import sys

import os

import pygame

from random import randint





import pygame.sprite as Sprite

from pygame.locals import *



debug = True



FONT_NAME = "Arial"

FONT_SIZE = 25



SCREENRECT = Rect(0, 0, 640, 480)

RECT_LEN = 15



class Box:

    def __init__(self, x, y, f):

        self.x = x

        self.y = y

        self.flag = f

        if self.flag:

            self.surface = get_font_surface("b")

        else:

            self.surface = pygame.Surface((15,15))



    def __str__(self):

        return "x:%s y:%s" % (str(self.x),str(self.y))





class Link(object):

    

    def __init__(self, x, y, surface):

        self.x = x

        self.y = y

        self.surface = surface

    

    def __str__(self):

        return "x:%s y:%s" % (str(self.x),str(self.y))

        

class Player:

    def __init__(self,x,y):

        self.snake_body = []

        self.append(x,y)



    def append(self,x,y):

        l = Link(x,y,get_font_surface("s",(255,0,0)))        

        self.snake_body.append(l)



    def abc(self):

        print("test")

    

    def move_left(self):

        i = len(self.snake_body) - 1



        while i >= 1:

#            debug_output("i:"+str(i))

            self.snake_body[i].x = self.snake_body[i-1].x

            self.snake_body[i].y = self.snake_body[i-1].y

            i -= 1

        self.snake_body[0].x -= 1        





    def move_right(self):

        i = len(self.snake_body) - 1



        while i >= 1:

#            debug_output("i:"+str(i))

            self.snake_body[i].x = self.snake_body[i-1].x

            self.snake_body[i].y = self.snake_body[i-1].y

            i -= 1

        self.snake_body[0].x += 1



    def move_up(self):

        i = len(self.snake_body) - 1



        while i >= 1:

            self.snake_body[i].x = self.snake_body[i-1].x

            self.snake_body[i].y = self.snake_body[i-1].y

            i -= 1

        self.snake_body[0].y -= 1

    

    def move_down(self):

        i = len(self.snake_body) - 1



        while i >= 1:

            self.snake_body[i].x = self.snake_body[i-1].x

            self.snake_body[i].y = self.snake_body[i-1].y

            i -= 1

        self.snake_body[0].y += 1



    def move(self,target):

        if target == "up":

            self.move_up()

        if target == "down":

            self.move_down()

        if target == "left":

            self.move_left()

        if target == "right":

            self.move_right() 

                

def get_font_surface(s,color = (0,255,0),font_size=25):

    font = pygame.font.SysFont(FONT_NAME,font_size)

    #color = (0,255,0)

    backcolor = (0,0,0)

    r = font.render(s,True,color,backcolor)

    return r



def create_map(width,height,rect_len):

    y = 0

    map_pos = []

    snake_map = []

    flag =True

    while y < height:

        x = 0        

        flag = False

        while x < width:        

            if x < rect_len or x+rect_len >= width:

                flag = True

            elif y < rect_len or y+rect_len >= height:

                flag = True

            else:

                flag = False



            snake_map.append(Box(x/rect_len,y/rect_len,flag))

            x += 15

        y += 15



    return snake_map



def debug_output(s, f=sys.stdout):

    if debug == True:

        f.write("debug info: " + s + "\n")

        f.flush()



class Game:

    

    WIDTH = 640

    HEIGHT = 480

    BOX_SIZE = 15

    

    def __init__(self, caption="CooooolSnake"):

    

        pygame.init()

        pygame.display.set_caption(caption)

        self.screen = pygame.display.set_mode(SCREENRECT.size, 0, 32)    

        pygame.mouse.set_visible(0)

        self.background = pygame.Surface(SCREENRECT.size)

        

        self.map_size = (Game.WIDTH/15-1,Game.HEIGHT/15-1)

        

        self.snake_map = create_map(Game.WIDTH,Game.HEIGHT,self.BOX_SIZE)

        

        self.stages = []

        

        self.__crate_player__()



    def get_new_pos(self):

        done = False

        pos = None

        while not done:

            x = randint(2,self.map_size[0]-1)

            y = randint(2,self.map_size[1]-2)



            for link in self.player.snake_body:

                if x == link.x and y == link.y:

                    continue

            pos = (x,y)

            done = True



        return pos

               



    def __crate_player__(self):

        x = randint(2,self.map_size[0]-1)

        y = randint(2,self.map_size[1]-2)

        self.player = Player(x,y)



    def is_over(self):

        head = self.player.snake_body[0]

        i = 0

        

        for link in self.player.snake_body[1:]:

            if head.x == link.x and head.y == link.y:

                return True 

        

        for box in self.snake_map:

            if box.flag:

                if head.x == box.x and head.y == box.y:

                    return True

        return False

        

    def update_snake(self):

        

        for link in self.player.snake_body:

            self.background.blit(link.surface,(link.x*Game.BOX_SIZE,link.y*Game.BOX_SIZE))

            

    def update_map(self):

        for box in self.snake_map:

            self.background.blit(box.surface,(box.x*Game.BOX_SIZE,box.y*Game.BOX_SIZE))



    def add_stage(self):

        x,y = self.get_new_pos()

        s = get_font_surface("s",(255,0,0))

        l = Link(x,y,s)

        self.stages.append(l)

    

    def update_stage(self):

        head = self.player.snake_body[0]

        for stage in self.stages:

            if stage.x == head.x and stage.y == head.y:

                self.player.append(stage.x,stage.y)

                self.stages.remove(stage)

                

        for stage in self.stages:

            self.background.blit(stage.surface,(stage.x*Game.BOX_SIZE,stage.y*Game.BOX_SIZE))



    def refresh_background(self):

        self.background.fill((0,0,0))

        self.update_map()

        self.update_snake()

        

        self.update_stage()

        

        self.screen.blit(self.background, (0, 0))

        

    def over(self):        

        logo = get_font_surface("YOU ARE LOST!",(0,0,255),60)

        self.background.blit(logo,(100,200))



        clock = pygame.time.Clock()

        done = False



        count = 0



        while not done:

            clock.tick(10)

            count += 1

            if count == 5:

                done = True         

            self.screen.blit(self.background, (0, 0))

            pygame.display.flip()

    

    def loop(self):

        pygame.display.update()

        clock = pygame.time.Clock()

        target = ["up","down","left","right"][randint(0,3)]

        

        count = 0

        stage_time = randint(0,50)



        

        done = False

        while not done:

            for e in pygame.event.get():

                if e.type == pygame.KEYDOWN:

                    keystate = pygame.key.get_pressed()

                    if keystate[K_UP]:

                        if target != "down":                        

                            target = "up"



                    elif keystate[K_DOWN]:

                        if target != "up":                        

                            target = "down"



                    elif keystate[K_LEFT]:

                        if target != "right":                        

                            target = "left"



                    elif keystate[K_RIGHT]:

                        if target != "left":                        

                            target = "right"

                            

                if e.type == QUIT:

                    done = True

            self.player.move(target)

            if count == stage_time:

                self.add_stage()

                stage_time = randint(0,50)

                count = 0

 

            if self.is_over():

                done = True

                

            clock.tick(10)

            

            count += 1

            

            self.refresh_background()

            

            if done:

                self.over()

            

            pygame.display.flip()



if __name__ == '__main__':

    game = Game()

    game.loop()

    pass

 

你可能感兴趣的:(game)