Not much to say, all the code will be given at the end, or you can start from hereFork, the text;
List of functions currently implemented:

# The background of the game and the background used to display the text at the bottom
def draw_background():
 # white background
 screen.fill(COLORS['white'])
 pygame.draw.rect(screen,COLORS['black'],(-100,GAME_SIZE[1],3000,200),0)
# Draw walls
def draw_wall():for xy in wall_list:
  pygame.draw.rect(screen,COLORS['darkgray'],(xy[0]-WALL_WIDTH/2,xy[1]-WALL_WIDTH/2,WALL_WIDTH,WALL_HEIGHT),0)
# Draw snake, including head and body
def draw_snake():
 head = snake_list[0]
 pygame.draw.circle(screen,COLORS['darkred'],(head[0],head[1]),int(SNAKE_WIDTH/2),0)for xy in snake_list[1:]:
  pygame.draw.rect(screen,COLORS['darkred'],(xy[0]-SNAKE_WIDTH/2,xy[1]-SNAKE_WIDTH/2,SNAKE_WIDTH,SNAKE_HEIGHT),2)
# Draw food
def draw_food():for xyz in food_list:
  pygame.draw.rect(screen,FOOD_COLORS[xyz[2]-1],(xyz[0]-FOOD_WIDTH/2,xyz[1]-FOOD_WIDTH/2,FOOD_WIDTH,FOOD_HEIGHT),0)
# Draw the body length record below
def draw_context():
 txt = FONT_M.render('Snake length: '+str(len(snake_list)-1),True,COLORS['lightblue'])
 x,y =10,GAME_SIZE[1]+(int((SIZE[1]-GAME_SIZE[1])/2))
 y =int(y-FONT_M.size('Count')[1]/2)
 screen.blit(txt,(x,y))
# Draw pause interface
def draw_pause():
 s = pygame.Surface(SIZE, pygame.SRCALPHA)
 s.fill((255,255,255,220))
 screen.blit(s,(0,0))
 txt = FONT_M.render('PAUSE',True,COLORS['darkgray'])
 x,y = SIZE[0]/2,SIZE[1]/2
 x,y =int(x-FONT_M.size('PAUSE')[0]/2),int(y-FONT_M.size('PAUSE')[1]/2)
 screen.blit(txt,(x,y))
# Draw death interface
def draw_dead():
 s = pygame.Surface(SIZE, pygame.SRCALPHA)
 s.fill((255,255,255,240))
 screen.blit(s,(0,0))
 txt = FONT_M.render('YOU DEAD',True,COLORS['black'])
 x,y = SIZE[0]/2,SIZE[1]/2
 x,y =int(x-FONT_M.size('YOU DEAD')[0]/2),int(y-FONT_M.size('YOU DEAD')[1]/2)
 screen.blit(txt,(x,y))
# Rectangular coverage check is used as collision detection. The idea is to take the reverse, that is, take the reverse of all the situations that will not be covered.
def rect_cover(rect1,rect2):
 left1 =int(rect1[0])
 right1 =int(rect1[0]+rect1[2])
 up1 =int(rect1[1])
 down1 =int(rect1[1]+rect1[3])
 left2 =int(rect2[0])
 right2 =int(rect2[0]+rect2[2])
 up2 =int(rect2[1])
 down2 =int(rect2[1]+rect2[3])ifnot(right2<=left1 or left2>=right1 or down2<=up1 or up2>=down1):return True
 return False
# Check if you touch food
def check_food():
 # Head and food
 first = snake_list[0]
 snake_head_rect =(first[0]-SNAKE_WIDTH/2,first[1]-SNAKE_WIDTH/2,SNAKE_WIDTH,SNAKE_HEIGHT)for i inrange(len(food_list)):
  xyz = food_list[i]
  food_rect =(xyz[0]-FOOD_WIDTH/2,xyz[1]-FOOD_WIDTH/2,FOOD_WIDTH,FOOD_HEIGHT)ifrect_cover(snake_head_rect,food_rect):add_body(xyz[2])
   del food_list[i]return True
 return False
# Check if you touch the edge, wall or your body
def check_dead():
 first = snake_list[0]
 snake_head_rect =(first[0]-SNAKE_WIDTH/2,first[1]-SNAKE_WIDTH/2,SNAKE_WIDTH,SNAKE_HEIGHT)
 # Head and edge
 if first[0]<0 or first[0]> GAME_SIZE[0] or first[1]<0 or first[1]> GAME_SIZE[1]:return True
 # Head and wall
 for xy in wall_list:
  wall_rect =(xy[0]-WALL_WIDTH/2,xy[1]-WALL_WIDTH/2,WALL_WIDTH,WALL_HEIGHT)ifrect_cover(snake_head_rect,wall_rect):return True
 # Head and self
 for xy in snake_list[1:]:
  body_rect =(xy[0]-SNAKE_WIDTH/2,xy[1]-SNAKE_WIDTH/2,SNAKE_WIDTH,SNAKE_HEIGHT)ifrect_cover(snake_head_rect,body_rect):return True
 return False
def add_food():while(True):
  xyz =[random.choice(X_LIST),random.choice(Y_LIST),random.choice([1,2,3,4])]if xyz not in wall_list:
   food_list.append(xyz)break
def add_body(length=1):for c inrange(length):
  # Tail plus one section
  last2,last1 = snake_list[-2],snake_list[-1]if last2[0]==last1[0]: #Two vertical paragraphs
   if last2[1]>last1[1]: #Face down
    snake_list.append([last1[0],last1[1]-SNAKE_WIDTH])else:
    snake_list.append([last1[0],last1[1]+SNAKE_WIDTH])else: #Two horizontal sections
   if last2[0]>last1[0]: #To the right
    snake_list.append([last1[0]-SNAKE_WIDTH,last1[1]])else:
    snake_list.append([last1[0]+SNAKE_WIDTH,last1[1]])
# Determine the current direction of the snake by pressing the button
if event.key == K_LEFT:if head in['up','down']:
  head ='left'
elif event.key == K_RIGHT:if head in['up','down']:
  head ='right'
elif event.key == K_UP:if head in['left','right']:
  head ='up'
elif event.key == K_DOWN:if head in['left','right']:
  head ='down'
# Judge the snake’s next position by heading
first = snake_list[0]
snake_list[1:]= snake_list[:-1]if head =='up':
 snake_list[0]=[first[0],first[1]-SNAKE_WIDTH]
elif head =='down':
 snake_list[0]=[first[0],first[1]+SNAKE_WIDTH]
elif head =='left':
 snake_list[0]=[first[0]-SNAKE_WIDTH,first[1]]
elif head =='right':
 snake_list[0]=[first[0]+SNAKE_WIDTH,first[1]]
import sys,random
import pygame
from pygame.color import THECOLORS as COLORS
from pygame.locals import*
def draw_background():
 # white background
 screen.fill(COLORS['white'])
 pygame.draw.rect(screen,COLORS['black'],(-100,GAME_SIZE[1],3000,200),0)
def draw_wall():for xy in wall_list:
  pygame.draw.rect(screen,COLORS['darkgray'],(xy[0]-WALL_WIDTH/2,xy[1]-WALL_WIDTH/2,WALL_WIDTH,WALL_HEIGHT),0)
def draw_snake():
 head = snake_list[0]
 pygame.draw.circle(screen,COLORS['darkred'],(head[0],head[1]),int(SNAKE_WIDTH/2),0)for xy in snake_list[1:]:
  pygame.draw.rect(screen,COLORS['darkred'],(xy[0]-SNAKE_WIDTH/2,xy[1]-SNAKE_WIDTH/2,SNAKE_WIDTH,SNAKE_HEIGHT),2)
def draw_food():for xyz in food_list:
  pygame.draw.rect(screen,FOOD_COLORS[xyz[2]-1],(xyz[0]-FOOD_WIDTH/2,xyz[1]-FOOD_WIDTH/2,FOOD_WIDTH,FOOD_HEIGHT),0)
def draw_context():
 txt = FONT_M.render('Snake length: '+str(len(snake_list)-1),True,COLORS['lightblue'])
 x,y =10,GAME_SIZE[1]+(int((SIZE[1]-GAME_SIZE[1])/2))
 y =int(y-FONT_M.size('Count')[1]/2)
 screen.blit(txt,(x,y))
def draw_pause():
 s = pygame.Surface(SIZE, pygame.SRCALPHA)
 s.fill((255,255,255,220))
 screen.blit(s,(0,0))
 txt = FONT_M.render('PAUSE',True,COLORS['darkgray'])
 x,y = SIZE[0]/2,SIZE[1]/2
 x,y =int(x-FONT_M.size('PAUSE')[0]/2),int(y-FONT_M.size('PAUSE')[1]/2)
 screen.blit(txt,(x,y))
def draw_dead():
 s = pygame.Surface(SIZE, pygame.SRCALPHA)
 s.fill((255,255,255,240))
 screen.blit(s,(0,0))
 txt = FONT_M.render('YOU DEAD',True,COLORS['black'])
 x,y = SIZE[0]/2,SIZE[1]/2
 x,y =int(x-FONT_M.size('YOU DEAD')[0]/2),int(y-FONT_M.size('YOU DEAD')[1]/2)
 screen.blit(txt,(x,y))
def rect_cover(rect1,rect2):
 left1 =int(rect1[0])
 right1 =int(rect1[0]+rect1[2])
 up1 =int(rect1[1])
 down1 =int(rect1[1]+rect1[3])
 left2 =int(rect2[0])
 right2 =int(rect2[0]+rect2[2])
 up2 =int(rect2[1])
 down2 =int(rect2[1]+rect2[3])ifnot(right2<=left1 or left2>=right1 or down2<=up1 or up2>=down1):return True
 return False
def add_food():while(True):
  xyz =[random.choice(X_LIST),random.choice(Y_LIST),random.choice([1,2,3,4])]if xyz not in wall_list:
   food_list.append(xyz)break
def add_body(length=1):for c inrange(length):
  # Tail plus one section
  last2,last1 = snake_list[-2],snake_list[-1]if last2[0]==last1[0]: #Two vertical paragraphs
   if last2[1]>last1[1]: #Face down
    snake_list.append([last1[0],last1[1]-SNAKE_WIDTH])else:
    snake_list.append([last1[0],last1[1]+SNAKE_WIDTH])else: #Two horizontal sections
   if last2[0]>last1[0]: #To the right
    snake_list.append([last1[0]-SNAKE_WIDTH,last1[1]])else:
    snake_list.append([last1[0]+SNAKE_WIDTH,last1[1]])
def check_food():
 # Head and food
 first = snake_list[0]
 snake_head_rect =(first[0]-SNAKE_WIDTH/2,first[1]-SNAKE_WIDTH/2,SNAKE_WIDTH,SNAKE_HEIGHT)for i inrange(len(food_list)):
  xyz = food_list[i]
  food_rect =(xyz[0]-FOOD_WIDTH/2,xyz[1]-FOOD_WIDTH/2,FOOD_WIDTH,FOOD_HEIGHT)ifrect_cover(snake_head_rect,food_rect):add_body(xyz[2])
   del food_list[i]return True
 return False
def check_dead():
 first = snake_list[0]
 snake_head_rect =(first[0]-SNAKE_WIDTH/2,first[1]-SNAKE_WIDTH/2,SNAKE_WIDTH,SNAKE_HEIGHT)
 # Head and edge
 if first[0]<0 or first[0]> GAME_SIZE[0] or first[1]<0 or first[1]> GAME_SIZE[1]:return True
 # Head and wall
 for xy in wall_list:
  wall_rect =(xy[0]-WALL_WIDTH/2,xy[1]-WALL_WIDTH/2,WALL_WIDTH,WALL_HEIGHT)ifrect_cover(snake_head_rect,wall_rect):return True
 # Head and self
 for xy in snake_list[1:]:
  body_rect =(xy[0]-SNAKE_WIDTH/2,xy[1]-SNAKE_WIDTH/2,SNAKE_WIDTH,SNAKE_HEIGHT)ifrect_cover(snake_head_rect,body_rect):return True
 return False
if __name__ =="__main__":
 # init pygame
 pygame.init()
    
 # contant
 GAME_SIZE =[900,900]
 SIZE =[GAME_SIZE[0],GAME_SIZE[1]+100]
 FONT_S = pygame.font.SysFont('Times',50)
 FONT_M = pygame.font.SysFont('Times',90)
 DIRECTION =['up','right','down','left']
 X_LIST =[x for x inrange(GAME_SIZE[0])]
 Y_LIST =[y for y inrange(GAME_SIZE[1])]
 FOOD_COLORS =((46,139,87),(199,21,133),(25,25,112),(255,215,0))
 # wall
 wall_list =[[100,200],[600,500],[350,200],[500,800]]
 WALL_WIDTH,WALL_HEIGHT =30,30
 # food
 food_list =[(150,200,1),(300,500,1),(740,542,1),(300,600,1),(700,600,1)]
 FOOD_WIDTH,FOOD_HEIGHT =14,14
    
 # create screen 500*500
 screen = pygame.display.set_mode(SIZE)
    
 # variable parameter
 snake_list =[[100+12*4,100],[100+12*3,100],[100+12*2,100],[100+12*1,100],[100,100]]
 SNAKE_WIDTH,SNAKE_HEIGHT =12,12
 snake_v =0
 count_time =0
 # level
 frame =0.05
 level =1
    
 # main loop
 running = True
 pause = False
 dead = False
 head ='right'while running:for event in pygame.event.get():if event.type == pygame.QUIT:
    running = False
    break
   elif event.type == pygame.MOUSEBUTTONDOWN:
    pause = not pause
   elif event.type == pygame.KEYUP:if event.key == K_LEFT:if head in['up','down']:
      head ='left'
    elif event.key == K_RIGHT:if head in['up','down']:
      head ='right'
    elif event.key == K_UP:if head in['left','right']:
      head ='up'
    elif event.key == K_DOWN:if head in['left','right']:
      head ='down'
  # update data
  if not pause and not dead:
   count_time += frame*level
   first = snake_list[0]
   snake_list[1:]= snake_list[:-1]if head =='up':
    snake_list[0]=[first[0],first[1]-SNAKE_WIDTH]
   elif head =='down':
    snake_list[0]=[first[0],first[1]+SNAKE_WIDTH]
   elif head =='left':
    snake_list[0]=[first[0]-SNAKE_WIDTH,first[1]]
   elif head =='right':
    snake_list[0]=[first[0]+SNAKE_WIDTH,first[1]]
  # background
  draw_background()
  # tunnel
  draw_wall()
  # choose item
  draw_snake()
  # food
  draw_food()
  # point
  draw_context()
  # pause
  if not dead and pause:draw_pause()
  # dead
  if dead:draw_dead()
  # flip
  pygame.display.flip()
  # pause 20ms
  pygame.time.delay(int(frame/level*1000))
  # check win or not
  dead =check_dead()ifcheck_food():add_food()
    
 pygame.quit()
        Recommended Posts