python之贪吃蛇游戏

一,说明

        本程序是基于pygame模块实现的

 

        目录如图

res里的资源

二,代码

        snake.py

import pygame
import random

WINDOW_WIDTH = 640
WINDOW_HEIGHT = 480
COLOR_WHITE = (0,0,0)
COLOR_GRAY = (255,180,255)
COLOR_BLUE = (0,0,255)
RECT_SIZE = 20
X_MAX=WINDOW_WIDTH/RECT_SIZE
Y_MAX=WINDOW_HEIGHT/RECT_SIZE
SNAKE_FOOD=[12,12]
GAME_FLAG = 0
FPS = 2


class snakeFood:
    def __init__(self,food_default_location=SNAKE_FOOD,food_color=COLOR_BLUE) -> None:
        self.__default_location = food_default_location
        self.__food_location = self.__default_location
        self.__food_color = food_color
                
    def showSnakeFood(self,food_color:tuple=COLOR_BLUE):
        pygame.draw.rect(window,food_color,(self.__food_location[0]*RECT_SIZE,self.__food_location[1]*RECT_SIZE,RECT_SIZE,RECT_SIZE),border_radius=3)
    
    def foodBeEaten(self):
        self.showSnakeFood(food_color=COLOR_WHITE)
    def foodGenerator(self,snakeBody):
        self.__food_location = [random.randint(0,32),random.randint(0,24)]
        if(self.__food_location in snakeBody):
            self.foodGenerator(self,snakeBody)
    def getFoodLocation(self):
        return self.__food_location    
    def getFoodColor(self):
        return self.__food_color
    
class snake:
    def __init__(self,snake_head:pygame.Surface) -> None:
        self.__per_body_size = RECT_SIZE
        self.__body_size = 3
        self.__direction = pygame.K_DOWN
        self.__snake_body = [(5,5),(5,4),(5,3)]
        self.__snake_head_const = pygame.transform.scale(snake_head,(self.__per_body_size,self.__per_body_size))
        self.__snake_head = pygame.transform.scale(snake_head,(self.__per_body_size,self.__per_body_size))
        self.__snake_speed_dict = {1:10,2:8,3:5,4:4,5:3,6:2}
        self.__snake_speed = self.__snake_speed_dict[1]
        
    def showBody(self,window:pygame.Surface):
        for i in self.__snake_body:
            if(i==self.__snake_body[0]):
                window.blit(self.__snake_head,dest=(i[0]*self.__per_body_size,i[1]*self.__per_body_size))
            else:
                pygame.draw.rect(window,COLOR_WHITE,(i[0]*self.__per_body_size,i[1]*self.__per_body_size,RECT_SIZE,RECT_SIZE),border_radius=3)
    
    def eatFood2Big(self,food_location:tuple):
        if(snakeBody[0][0]==food_location[0] and snakeBody[0][1]==food_location[1]):
            if(snake_direction==pygame.K_UP):
                snake.addSnakeBody((snakeBody[snake_body_size-1][0],snakeBody[snake_body_size-1][1]-1))
            elif(snake_direction==pygame.K_DOWN):
                snake.addSnakeBody((snakeBody[snake_body_size-1][0],snakeBody[snake_body_size-1][1]+1))
            elif(snake_direction==pygame.K_LEFT):
                snake.addSnakeBody((snakeBody[snake_body_size-1][0]-1,snakeBody[snake_body_size-1][1]))
            elif(snake_direction==pygame.K_RIGHT):
                snake.addSnakeBody((snakeBody[snake_body_size-1][0]+1,snakeBody[snake_body_size-1][1]))  
            self.__body_size = len(self.__snake_body)
            #吃食物增速
            if(self.__body_size<8):
                self.__snake_speed = self.__snake_speed_dict[1]
            elif(self.__body_size>=8 and self.__body_size<16):
                self.__snake_speed = self.__snake_speed_dict[2]
            elif(self.__body_size>=16 and self.__body_size<24):
                self.__snake_speed = self.__snake_speed_dict[3]
            elif(self.__body_size>=24 and self.__body_size<32):
                self.__snake_speed = self.__snake_speed_dict[4]
            elif(self.__body_size>=32):
                self.__snake_speed = self.__snake_speed_dict[5]
                
            snakeFood.foodBeEaten()
            snakeFood.foodGenerator(self.__snake_body)
            snakeFood.showSnakeFood()
    
    def getDirection(self):
        return self.__direction
    def getSnakeSpeed(self):
        return self.__snake_speed
    
    def setDirection(self,direction:pygame.KEYDOWN):
        if((self.__direction==pygame.K_UP and direction!=pygame.K_DOWN and direction!=pygame.K_UP)
           or(self.__direction==pygame.K_DOWN and direction!=pygame.K_UP and direction!=pygame.K_DOWN)
           or(self.__direction==pygame.K_RIGHT and direction!=pygame.K_LEFT and direction!=pygame.K_RIGHT)
           or(self.__direction==pygame.K_LEFT and direction!=pygame.K_RIGHT and direction!=pygame.K_LEFT)):
            self.__direction = direction
            if(self.__direction==pygame.K_UP):
                self.__snake_head = pygame.transform.rotate(self.__snake_head_const,180)
            elif(self.__direction==pygame.K_DOWN):
                self.__snake_head = pygame.transform.rotate(self.__snake_head_const,0)
            elif(self.__direction==pygame.K_LEFT):
                self.__snake_head = pygame.transform.rotate(self.__snake_head_const,270)
            elif(self.__direction==pygame.K_RIGHT):
                self.__snake_head = pygame.transform.rotate(self.__snake_head_const,90)
    def getSnakeBody(self):
        return self.__snake_body
    
    def addSnakeBody(self,newRect):
            self.__snake_body.append(newRect)
    def getBodySize(self):
        return self.__body_size
#初始化pygame
pygame.init()

#加载静态资源

bg = pygame.image.load("res/bg.png")
bg = pygame.transform.scale(bg,(640,480))
icon = pygame.image.load("res/icon.png")
pygame.display.set_icon(icon)
pygame.display.set_caption("快乐贪吃蛇1.0")
snake_head = pygame.image.load("res/head-red.png")


clk = pygame.time.Clock()

#创建窗口
window = pygame.display.set_mode(size=(WINDOW_WIDTH,WINDOW_HEIGHT))


snake = snake(snake_head)
snakeFood = snakeFood()
temp_count = 0
while True:
    snakeBody=snake.getSnakeBody()
    snake_speed = snake.getSnakeSpeed()
    food_location = snakeFood.getFoodLocation()
    foor_color = snakeFood.getFoodColor()
    snake_body_size = snake.getBodySize()
    event_list = pygame.event.get()
    snake_direction = snake.getDirection()

    #逻辑处理
    temp_count +=1
    if(temp_count>30):
        temp_count=0
    
    if(snakeBody[0] in snakeBody[1:]):
        GAME_FLAG = 0
    else:
        GAME_FLAG = 1
    #吃到食物后生长

    #控制蛇前进方向
    for i in event_list:
        if(i.type==pygame.KEYDOWN):
            if(i.key==pygame.K_UP):
                print("UP")
                snake.setDirection(pygame.K_UP)
            if(i.key==pygame.K_DOWN):
                print("down")
                snake.setDirection(pygame.K_DOWN)
            if(i.key==pygame.K_LEFT):
                print("left")
                snake.setDirection(pygame.K_LEFT)
            if(i.key==pygame.K_RIGHT):
                print("right")
                snake.setDirection(pygame.K_RIGHT)
        elif(i.type==pygame.QUIT):
            pygame.display.quit()
            exit(0)    
    #让蛇动起来
    if(GAME_FLAG!=1):
        print("吃到自己啦。游戏结束")
    elif(temp_count==snake_speed):
        if(snake.getDirection()==pygame.K_DOWN):
            if(snakeBody[0][1]<Y_MAX and snakeBody[0][1]>=0):
                snakeBody.insert(0,(snakeBody[0][0],snakeBody[0][1]+1))
            elif(snakeBody[0][1]>Y_MAX):
                snakeBody.insert(0,(snakeBody[0][0],snakeBody[0][1]+1-Y_MAX))
            elif(snakeBody[0][1]==Y_MAX):
                snakeBody.insert(0,(snakeBody[0][0],snakeBody[0][1]-Y_MAX))
        elif(snake.getDirection()==pygame.K_UP):
            if(snakeBody[0][1]<=Y_MAX and snakeBody[0][1]>0):
                snakeBody.insert(0,(snakeBody[0][0],snakeBody[0][1]-1))
            elif(snakeBody[0][1]<0):
                snakeBody.insert(0,(snakeBody[0][0],snakeBody[0][1]-1+Y_MAX))
            elif(snakeBody[0][1]==0):
                snakeBody.insert(0,(snakeBody[0][0],snakeBody[0][1]+Y_MAX))
        elif(snake.getDirection()==pygame.K_LEFT):
            if(snakeBody[0][0]<=X_MAX and snakeBody[0][0]>0):
                snakeBody.insert(0,(snakeBody[0][0]-1,snakeBody[0][1]))
            elif(snakeBody[0][0]<0):
                snakeBody.insert(0,(snakeBody[0][0]+X_MAX-1,snakeBody[0][1]))
            elif(snakeBody[0][0]==0):
                snakeBody.insert(0,(snakeBody[0][0]+X_MAX,snakeBody[0][1]))
        elif(snake.getDirection()==pygame.K_RIGHT):
            if(snakeBody[0][0]<X_MAX and snakeBody[0][0]>=0):
                snakeBody.insert(0,(snakeBody[0][0]+1,snakeBody[0][1]))
            elif(snakeBody[0][0]>X_MAX):
                snakeBody.insert(0,(snakeBody[0][0]-X_MAX+1,snakeBody[0][1]))
            elif(snakeBody[0][0]==X_MAX):
                snakeBody.insert(0,(snakeBody[0][0]-X_MAX,snakeBody[0][1]))
        snakeBody.pop()

    #场景渲染

    #画线
    window.blit(bg,dest=(0,0))
    for x in range(1,640,RECT_SIZE):
        pygame.draw.line(window,COLOR_GRAY,start_pos=(x,0),end_pos=(x,480))
    for y in range(1,480,RECT_SIZE):
        pygame.draw.line(window,COLOR_GRAY,start_pos=(0,y),end_pos=(640,y))    
    #画蛇身
    snake.showBody(window)   
    #画食物
    snakeFood.showSnakeFood()
    snake.eatFood2Big(food_location)
    print(food_location)    
    
    #控制fps
    clk.tick(40)
    
    #刷新界面
    pygame.display.flip()

三,效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值