使用pygame模块编写贪吃蛇

python ### 刚学了python不久,发现了一个好玩的库pygame

使用pygame模块 利用面向对象的思想编写贪吃蛇,主要用到pygame.sprite:


游戏主类

import pygame,sys
from snake_sprite import Game_sprite,Snake,Food
SCREEN_RECT=pygame.Rect(0,0,828,600)


IMG_URL="./image/bg.jpg"
#主类
class Snakegame(object):
    def __init__(self):
        self.screen=pygame.display.set_mode(SCREEN_RECT.size)
        self.clock=pygame.time.Clock()
        self.__create_sprites()


    def __create_sprites(self):
        bg=Game_sprite(IMG_URL)
        self.snake=Snake()
        for pos in self.snake.snake_point:
            self.screen.blit(self.snake.image,pos)
        food=Food()
        self.bg_group=pygame.sprite.Group(bg)
        self.snake_group=pygame.sprite.Group(self.snake)
        self.food_group = pygame.sprite.Group(food)
    def start_game(self):
        while True:
            #1.时钟设置
            self.clock.tick(30)
            #2.事件监听
            self.__event_handler()
            #3.碰撞检测
            self.__check_collide()
            #4.精灵更新
            self.__update_sprites()
            #5.屏幕更新
            pygame.display.update()
    def __event_handler(self):
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                Snakegame.__game_over()
            elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT and \
                    self.snake.direction !='L':
                self.snake.speedy = 0
                self.snake.speedx = 1
                self.snake.direction = 'R'
            elif event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT and \
                    self.snake.direction !='R':
                self.snake.speedy = 0
                self.snake.speedx = -1
                self.snake.direction = 'L'
            elif event.type == pygame.KEYDOWN and event.key == pygame.K_UP and \
                    self.snake.direction !='D':
                self.snake.speedx = 0
                self.snake.speedy = -1
                self.snake.direction = 'U'
            elif event.type == pygame.KEYDOWN and event.key == pygame.K_DOWN and \
                    self.snake.direction !='U':
                self.snake.speedx=0
                self.snake.speedy=1
                self.snake.direction='D'
    def __check_collide(self):
        pass
    def __update_sprites(self):
        self.bg_group.update()
        self.bg_group.draw(self.screen)
        self.snake_group.update()
        self.snake_group.draw(self.screen)
        self.food_group.update()
        self.food_group.draw(self.screen)

    @staticmethod
    def __game_over():
        pygame.quit()
        exit()



#游戏启动
if __name__ == '__main__':
    snake=Snakegame()
    snake.start_game()

工具类

import pygame
import random
SNAKE_IMG="./image/snake.png"
FOOD_IMG="./image/food.jpg"
class Game_sprite(pygame.sprite.Sprite):
    def __init__(self,img_name,speedx=1,speedy=0):
        #调用父类的初始化方法
        super(Game_sprite, self).__init__()
        #属性
        self.image=pygame.image.load(img_name)
        self.rect=self.image.get_rect()
        self.speedx=speedx
        self.speedy=speedy

    def update(self):
        pass

#蛇实物
class Snake(Game_sprite):
    def __init__(self,direction='R',snakelist=[[40,40],[80,40]]):
        self.direction=direction
        self.snake_point=snakelist
        super().__init__(SNAKE_IMG)
        self.rect.x=self.snake_point[1][0]
        self.rect.y=self.snake_point[1][1]
    def update(self):
        self.rect.x += self.speedx
        self.rect.y += self.speedy

class Food(Game_sprite):
    def __init__(self):
        super(Food, self).__init__(FOOD_IMG)
        self.rect.x = random.randint(50, 828)
        self.rect.y = random.randint(38, 600)
    def update(self):
        pass

关于这次demo

我发现自己并没有弄懂pygame的具体画面更新机制,以及精灵的控制,对于贪吃蛇头部及身体的画面更新并没有做出来,还有对身体和头的数据结构如何构建 并不是很了解。毕竟第一次,希望有大佬看到这篇博客能够指点下。

附上函数式编程的代码

import pygame
import time
import random

x = pygame.init()

white = (255,255,255)
black = (0,0,0)
red = (255,0,0)
green = (0,155,0)

display_width = 800
display_height = 600

gameDisplay = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption('Slither')
gameDisplay.fill(white)
pygame.display.update()

block_size = 20
applethickness = 30
FPS = 10

icon = pygame.image.load('appleimage.jpg')
pygame.display.set_icon(icon)

img = pygame.image.load('snakeimage.jpg')
appleimage = pygame.image.load('appleimage.jpg')

clock = pygame.time.Clock()

smallfont = pygame.font.SysFont(None,30)
midfont = pygame.font.SysFont(None,50)
largefont = pygame.font.SysFont("comicsansms",80)

direction = "right"

def pause():
    paused = True
    message_to_screen("暂停",black,-100,"large")
    message_to_screen("空格暂停Q退出",black, 30)
    pygame.display.update()

    while paused:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    paused = False
                elif event.key == pygame.K_q:
                    pygame.quit()
                    quit()

        #gameDisplay.fill(white)

    clock.tick(5)


def score(score):
    text1 = smallfont.render("Score : " + str(score), True, black)
    gameDisplay.blit(text1,(0,0))

def randApplegen():
    randAppleX = round(random.randrange(0,display_width-applethickness))#/10.0)*10.0
    randAppleY = round(random.randrange(0,display_height-applethickness))#/10.0)*10.0
    return randAppleX, randAppleY


def intro():
    intro = True
    message_to_screen("按c开始游戏",red,150)
    pygame.display.update()

    while intro:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_c:
                    intro = False
                if event.key == pygame.K_q:
                    pygame.quit()
                    quit()

        clock.tick(15)

def snake(snakelist):
    for xny in snakelist[:-1]:
        pygame.draw.rect(gameDisplay,green,[xny[0],xny[1],block_size,block_size])

    if(direction == "right"):
        head = pygame.transform.rotate(img,270)
    elif(direction == "left"):
        head = pygame.transform.rotate(img,90)
    elif(direction == "up"):
        head = img
    elif(direction == "down"):
        head = pygame.transform.rotate(img,180)

    gameDisplay.blit(head,(snakelist[-1][0],snakelist[-1][1]))

def text_objects(text,color,size):
    if(size == "small"):
        textsurface = smallfont.render(text,True,color)
    elif(size == "middle"):
        textsurface = midfont.render(text,True,color)
    elif(size == "large"):
        textsurface = largefont.render(text,True,color)

    return textsurface, textsurface.get_rect()

def message_to_screen(msg,color,y_displace=0,size="small"):

    textsurf, textsurf_rect = text_objects(msg,color,size)
    textsurf_rect.center = (display_width/2), (display_height/2) + y_displace
    gameDisplay.blit(textsurf,textsurf_rect)



def gameLoop():
    global direction
    direction = "right"

    gameExit = False
    gameOver = False

    lead_x = display_width/2
    lead_y = display_height/2
    lead_x_change = 10
    lead_y_change = 0

    randAppleX, randAppleY = randApplegen()

    snakelist = []
    snakelength = 1

    while not gameExit:

        if gameOver == True:
            message_to_screen("Game Over",red,-50,"large")
            message_to_screen("Press C to play again or Q to quit the game",black,50,"small")
            pygame.display.update()

        while gameOver == True:
            #gameDisplay.fill(white)
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        gameExit = True
                        gameOver = False
                    if event.key == pygame.K_c:
                        gameLoop()
                        pygame.quit()
                        quit()
                if event.type == pygame.QUIT:
                    gameExit = True 
                    gameOver = False
                    # pygame.quit()
                    # quit()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                gameExit = True 
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT and direction != "right":
                    direction = "left"
                    lead_x_change = -block_size
                    lead_y_change = 0
                elif event.key == pygame.K_RIGHT and direction != "left":
                    direction = "right"
                    lead_x_change = block_size
                    lead_y_change = 0
                elif event.key == pygame.K_UP and direction != "down":
                    direction = "up"
                    lead_y_change = -block_size
                    lead_x_change = 0
                elif event.key == pygame.K_DOWN and direction != "up":
                    direction = "down"
                    lead_y_change = block_size
                    lead_x_change = 0
                elif event.key == pygame.K_SPACE:
                    pause()

        if lead_x + block_size/2 >= display_width or lead_x < 0 or lead_y + block_size/2 >= display_height or lead_y < 0:
            gameOver = True

        lead_x += lead_x_change
        lead_y += lead_y_change

        gameDisplay.fill(white)
        gameDisplay.blit(appleimage,(randAppleX,randAppleY))
        #pygame.draw.rect(gameDisplay,red,[350,350,100,10])
        # gameDisplay.fill(red, rect=[200,200,50,50])       #good method

        snakehead = []
        snakehead.append(lead_x)
        snakehead.append(lead_y)
        snakelist.append(snakehead)

        if len(snakelist) > snakelength:
            del snakelist[0]

        for each in snakelist[:-1]:
            if each == snakehead:
                gameOver = True

        snake(snakelist)
        score(snakelength-1)

        pygame.display.update()

        if lead_x >= randAppleX and lead_x <= randAppleX + applethickness or lead_x + block_size >= randAppleX and lead_x + block_size <= randAppleX + applethickness:
            if lead_y >= randAppleY and lead_y <= randAppleY + applethickness or lead_y + block_size >= randAppleY and lead_y + block_size <= randAppleY + applethickness:
                randAppleX, randAppleY = randApplegen()
                snakelength += 1;               

        clock.tick(FPS)

intro()
gameLoop()


pygame.quit()
quit()

你可能感兴趣的:(使用pygame模块编写贪吃蛇)