一,说明
本程序是基于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()