How to write a snake game with python and pygame (2020 tutorial)
# snake game import pygame, sys, random from pygame.locals import * SCREEN_WIDTH = 640 SCREEN_HEIGHT = 480 FPS = 5 TILE_SIZE = 20 # color set up BLACK = (0,0,0) WHITE = (255,255,255) GREEN = (0,255,0) RED = (255,0,0) def draw_grid(): # draw 25 horizontal lines for i in range(25): pygame.draw.line(screen, WHITE, (0,i * TILE_SIZE), (639,i * TILE_SIZE)) # draw 33 vertical lines for j in range(33): pygame.draw.line(screen, WHITE, (j * TILE_SIZE,0), (j * TILE_SIZE, 479)) def draw_snake(snake_list): for pos in snake_list: x, y = pos rect = pygame.Rect(x*TILE_SIZE,y*TILE_SIZE,TILE_SIZE, TILE_SIZE) pygame.draw.rect(screen, GREEN, rect) def moving_snake(direction): global snake_list if direction == 'E': for i in range(len(snake_list)-1, 0, -1): snake_list[i] = snake_list[i-1].copy() snake_list[0][0] += 1 elif direction == 'W': for i in range(len(snake_list)-1, 0, -1): snake_list[i] = snake_list[i-1].copy() snake_list[0][0] += -1 elif direction == 'N': for i in range(len(snake_list)-1, 0, -1): snake_list[i] = snake_list[i-1].copy() snake_list[0][1] += -1 elif direction == 'S': for i in range(len(snake_list)-1, 0, -1): snake_list[i] = snake_list[i-1].copy() snake_list[0][1] += 1 draw_snake(snake_list) def generate_apple(random_pos): global screen apple_rect = pygame.Rect(random_pos[0]*TILE_SIZE,random_pos[1]*TILE_SIZE,TILE_SIZE, TILE_SIZE) pygame.draw.rect(screen, RED, apple_rect) def get_random_pos_for_apple(): global snake_list random_pos = [random.randint(0,31), random.randint(0,23)] while random_pos in snake_list: random_pos = [random.randint(0,31), random.randint(0,23)] return random_pos def elongate_snake(moving_dir): global snake_list if moving_dir == 'N': new_head = [snake_list[0][0], snake_list[0][1]-1] snake_list.insert(0, new_head) elif moving_dir == 'S': new_head = [snake_list[0][0], snake_list[0][1]+1] snake_list.insert(0, new_head) elif moving_dir == 'E': new_head = [snake_list[0][0]+1, snake_list[0][1]] snake_list.insert(0, new_head) else: new_head = [snake_list[0][0]-1, snake_list[0][1]] snake_list.insert(0, new_head) def collide_with_border(snake_list): return not (0 <= snake_list[0][0] <= 31 and 0 <= snake_list[0][1] <= 23) def collide_with_body(snake_list): if snake_list[0] in snake_list[1:]: return True else: return False def show_game_over_text(): global screen text_font = pygame.font.SysFont('arial', 50) game_over_surf = text_font.render('Game Over!', True, WHITE) screen.blit(game_over_surf, (180, 150)) pygame.init() screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption('snake') # snake head start position (15,11) snake_head = pygame.Rect(15*TILE_SIZE,11*TILE_SIZE,TILE_SIZE, TILE_SIZE) # create a snake list to contain its head and body coordinates # at first, there is only the default head position snake_list = [[15,11]] # moving direction of the snake, east by default 'E' moving_dir = 'E' game_clock = pygame.time.Clock() apple_eaten = True game_over = False while True: # print(snake_list) for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == KEYDOWN: if event.key == K_UP and moving_dir != 'S': moving_dir = 'N' elif event.key == K_DOWN and moving_dir != 'N': moving_dir = 'S' elif event.key == K_LEFT and moving_dir != 'E': moving_dir = 'W' elif event.key == K_RIGHT and moving_dir != 'W': moving_dir = 'E' screen.fill(BLACK) draw_grid() if apple_eaten: apple_pos = get_random_pos_for_apple() apple_eaten = False generate_apple(apple_pos) moving_snake(moving_dir) if snake_list[0] == apple_pos: # if snake ate apple apple_eaten = True elongate_snake(moving_dir) if collide_with_border(snake_list):# head go out of borders show_game_over_text() game_over = True if collide_with_body(snake_list): show_game_over_text() game_over = True pygame.display.update() if game_over: break game_clock.tick(FPS)
Comments
Post a Comment