I'm new to python and pygame, and tried to copy a program while tweaking it a bit. However, I only get a blank screen when running.
I have tried running it as python 2.7 using the PyCharm interpreter. Since there seemed to be problems with Movaja OSX och python 3.
import pygame
import random
import time
import numpy as np
def display_snake(snake_pos, display):
for position in snake_pos:
pygame.draw.rect(display, (255,255,0), pygame.Rect(position[0], position[1], 10, 10))
def display_apple(apple_pos, display):
pygame.draw.rect(display, (0,255,0), pygame.Rect(apple_pos[0],apple_pos[1],10,10))
def starting_pos():
snake_head = [100,100]
snake_pos = [[100,100], [90,100], [80,100]]
apple_pos = [random.randrange(1, 50) * 10, random.randrange(1, 50) * 10]
score = 3
return snake_head, snake_pos, apple_pos, score
def collision_apple(apple_pos, score):
apple_pos = [random.randrange(1,50)*10,random.randrange(1,50)*10]
score += 1
return apple_pos, score
def collision_boundaries(snake_head):
if snake_head[0]>=500 or snake_head[0]<0 or snake_head[1]>=500 or snake_head[1]<0:
return 1
else:
return 0
def collision_self(snake_pos):
snake_head = snake_pos[0]
if snake_head in snake_pos[1:]:
return 1
else:
return 0
def is_dir_blocked(snake_pos, current_dir_vector):
next_step = snake_pos[0] + current_dir_vector
snake_head = snake_pos[0]
if collision_boundaries(snake_head) == 1 or collision_self(snake_pos) == 1:
return 1
else:
return 0
def gen_snake(snake_head, snake_pos, apple_pos, button_dir, score):
if button_dir == 1:
snake_head[0] += 10
elif button_dir == 0:
snake_head[0] -= 10
elif button_dir == 2:
snake_head[1] += 10
elif button_dir == 3:
snake_head[1] -= 10
else:
pass
if snake_head == apple_pos:
apple_pos, score = collision_apple(apple_pos, score)
snake_pos.insert(0,list(snake_head))
else:
snake_pos.insert(0,list(snake_head))
snake_pos.pop()
return snake_pos, apple_pos, score
def play_game(snake_head, snake_pos, apple_pos, button_dir, score):
crashed = False
prev_button_dir = button_dir
button_dir = button_dir
current_dir_vector = np.array(snake_pos[0])-np.array(snake_pos[1])
while crashed is not True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
crashed = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT and prev_button_dir != 1:
button_dir = 0
elif event.key == pygame.K_RIGHT and prev_button_dir != 0:
button_dir = 1
elif event.key == pygame.K_UP and prev_button_dir != 2:
button_dir = 3
elif event.key == pygame.K_DOWN and prev_button_dir != 3:
button_dir = 2
else:
button_dir = button_dir
display.fill(window_color)
display_snake(snake_pos,display)
display_apple(apple_pos,display)
snake_pos, apple_pos, score = gen_snake(snake_head, snake_pos, apple_pos, button_dir, score)
pygame.display.set_caption("Snake game"+" "+"SCORE:"+str(score))
pygame.display.update()
prev_button_dir = button_dir
if is_dir_blocked(snake_pos, current_dir_vector) == 1:
crashed = True
clock.tick(15)
return score
def display_final_score(display_text):
largeText = pygame.font.Font('freesansbold.ttf',35)
TextSurf = largeText.render(display_text, True, (0,0,0))
TextRect = TextSurf.get_rect()
TextRect.center = ((display_width/2), (display_height/2))
display.blit(TextSurf, TextRect)
pygame.display.update()
time.sleep(2)
if __name__ == "__main__":
display_width = 500
window_color = (200,0,0)
display_height = 500
clock = pygame.time.Clock()
snake_head = [250, 250]
snake_pos = [[250, 250], [240, 250], [230, 250]]
apple_pos = [random.randrange(1,50)*10,random.randrange(1,50)*10]
score = 0
pygame.init() # initialize pygame modules
#### display game window #####
display = pygame.display.set_mode((display_width, display_height))
display.fill(window_color)
pygame.display.update()
final_score = play_game(snake_head, snake_pos, apple_pos, 1, score)
display = pygame.display.set_mode((display_width, display_height))
display.fill(window_color)
pygame.display.update()
display_text = 'Your Score is: ' + str(final_score)
display_final_score(display_text)
pygame.quit()
This should be a simple snake game, however I only see a blank screen. Which disappears after some seconds. I tried 'moving' around the snake and this increased the lifetime of my program. Therefore, I guess that the program works but just doesn't show on the screen.