Last active
January 2, 2017 21:24
-
-
Save joetechem/0737f81db42b975018e9d6f2d6883d1d to your computer and use it in GitHub Desktop.
basic snake game using pygame, boundary event now working
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# BASIC SNAKE GAME | |
# python 2.7 | |
import pygame | |
import time | |
import random | |
pygame.init() | |
black = (0, 0, 0) | |
white = (255, 255, 255) | |
red = (255, 0, 0) | |
green = (0, 180, 0) | |
display_width = 800 | |
display_height = 600 | |
gameDisplay = pygame.display.set_mode((display_width, display_height)) | |
pygame.display.set_caption('Slither') | |
# icon | |
icon = pygame.image.load('apple.jpg') | |
pygame.display.set_icon(icon) # best size for an icon is 32x32 | |
img = pygame.image.load('pygame_logo.jpg') | |
appleimg = pygame.image.load('apple.jpg') | |
clock = pygame.time.Clock() | |
AppleThickness = 30 | |
block_size = 20 | |
FPS = 20 | |
direction = "right" | |
smallfont = pygame.font.SysFont("comicsansms", 25) | |
medfont = pygame.font.SysFont("comicsansms", 50) | |
largefont = pygame.font.SysFont("comicsansms", 80) | |
# adding pause function | |
def pause(): | |
paused = True | |
while paused: | |
for event in pygame.event.get(): | |
if event.type == pygame.QUIT: | |
pygame.quit() | |
quit() | |
if event.type == pygame.KEYDOWN: | |
if event.key == pygame.K_c: | |
paused = False | |
elif event.key == pygame.K_q: | |
pygame.quit() | |
quit() | |
gameDisplay.fill(white) | |
message_to_screen("Paused", | |
black, | |
-100, | |
size = "large") | |
message_to_screen("Press C to continue or Q to quit.", | |
black, | |
25) | |
pygame.display.update() | |
clock.tick(5) | |
def score(score): | |
text = smallfont.render("Score: " + str(score), True, black) | |
gameDisplay.blit(text, [0,0]) | |
def randAppleGen(): | |
randAppleX = round(random.randrange(0, display_width - AppleThickness))#/10.0)*10.0 | |
randAppleY = round(random.randrange(0, display_height - AppleThickness))#/10.0)*10.0 | |
return randAppleX, randAppleY | |
def game_intro(): | |
intro = True | |
while intro: | |
# getting "c" and "q" to actually work | |
for event in pygame.event.get(): | |
if event.type == pygame.QUIT: | |
pygame.quit() | |
quit() | |
if event.type == pygame.KEYDOWN: | |
if event.key == pygame.K_c: | |
intro = False | |
if event.key == pygame.K_q: | |
pygame.quit() | |
quit() | |
gameDisplay.fill(white) | |
message_to_screen("Welcome to Slither", | |
green, | |
-100, | |
"large") | |
message_to_screen("The objective of the game is to eat red apples", | |
black, | |
-30, | |
"small") | |
message_to_screen("The more apples you eat, the longer you get", | |
black, | |
10, | |
"small") | |
message_to_screen("If you run into yourself or the edges, you lose!", | |
black, | |
50, | |
"small") | |
message_to_screen("Press C to play, P to pause, or Q to quit.", | |
black, | |
180, | |
"small") | |
pygame.display.update() | |
clock.tick(15) | |
def snake(block_size, snakeList): | |
if direction == "right": | |
head = pygame.transform.rotate(img, 270) | |
if direction == "left": | |
head = pygame.transform.rotate(img, 90) | |
if direction == "up": | |
head = img | |
if direction == "down": | |
head = pygame.transform.rotate(img, 180) | |
gameDisplay.blit(head, (snakeList[-1][0], snakeList[-1][1])) | |
for XnY in snakeList[:-1]: | |
pygame.draw.rect(gameDisplay, green, [XnY[0], XnY[1], block_size, block_size]) | |
def text_objects(text, color, size): | |
if size == "small": | |
textSurface = smallfont.render(text, True, color) | |
elif size == "medium": | |
textSurface = medfont.render(text, True, color) | |
elif size == "large": | |
textSurface = largefont.render(text, True, color) | |
return textSurface, textSurface.get_rect() | |
def message_to_screen(msg, color, y_displace = 0, size = "small"): | |
textSurf, textRect = text_objects(msg, color, size) | |
textRect.center = (display_width/2), (display_height/2) + y_displace | |
gameDisplay.blit(textSurf, textRect) | |
def gameLoop(): | |
global direction | |
direction = 'right' | |
gameEXIT = False | |
gameOver = False | |
lead_x = display_width/2 | |
lead_y = display_height/2 | |
lead_x_change = 10 | |
lead_y_change = 0 | |
snakeList = [] | |
snakeLength = 1 | |
randAppleX, randAppleY = randAppleGen() | |
while not gameEXIT: | |
while gameOver == True: | |
gameDisplay.fill(white) | |
message_to_screen("Game over", | |
red, | |
y_displace = -50, | |
size = "large") | |
message_to_screen("press C to play again or Q to quit", | |
black, | |
50, | |
size = "medium") | |
pygame.display.update() | |
for event in pygame.event.get(): | |
if event.type == pygame.QUIT: | |
gameExit = True | |
gameOver = False | |
if event.type == pygame.KEYDOWN: | |
if event.key == pygame.K_q: | |
gameExit = True | |
gameOver = False | |
if event.key == pygame.K_c: | |
gameLoop() | |
for event in pygame.event.get(): | |
if event.type == pygame.QUIT: | |
gameEXIT = True | |
if event.type == pygame.KEYDOWN: | |
if event.key == pygame.K_LEFT: | |
direction = "left" | |
lead_x_change = -block_size | |
lead_y_change = 0 | |
elif event.key == pygame.K_RIGHT: | |
direction = "right" | |
lead_x_change = block_size | |
lead_y_change = 0 | |
elif event.key == pygame.K_UP: | |
direction = "up" | |
lead_y_change = -block_size | |
lead_x_change = 0 | |
elif event.key == pygame.K_DOWN: | |
direction = "down" | |
lead_y_change = block_size | |
lead_x_change = 0 | |
elif event.key == pygame.K_p: | |
pause() | |
# BOUNDARIES | |
if lead_x >= display_width or lead_x < 0 or lead_y >= display_height or lead_y < 0: | |
gameOver = True | |
# LOGIC LOOP: | |
lead_x += lead_x_change | |
lead_y += lead_y_change | |
gameDisplay.fill(white) | |
#AppleThickness = 30 | |
#pygame.draw.rect(gameDisplay, red, [randAppleX, randAppleY, AppleThickness, AppleThickness]) | |
# 1st blit | |
gameDisplay.blit(appleimg, (randAppleX, randAppleY)) | |
# snake growth | |
snakeHead = [] | |
snakeHead.append(lead_x) | |
snakeHead.append(lead_y) | |
snakeList.append(snakeHead) | |
if len(snakeList) > snakeLength: | |
del snakeList[0] | |
for eachSegment in snakeList[:-1]: | |
if eachSegment == snakeHead: | |
gameOver = True | |
# 2nd blit | |
snake(block_size, snakeList) | |
# 3rd blit | |
score(snakeLength-1) | |
# 4th blit | |
pygame.display.update() | |
if lead_x > randAppleX and lead_x < randAppleX + AppleThickness or lead_x + block_size > randAppleX and lead_x + block_size < randAppleX + AppleThickness: | |
if lead_y > randAppleY and lead_y < randAppleY + AppleThickness: | |
randAppleX, randAppleY = randAppleGen() | |
snakeLength += 1 | |
elif lead_y + block_size > randAppleY and lead_y + block_size < randAppleY + AppleThickness: | |
randAppleX, randAppleY = randAppleGen() | |
snakeLength += 1 | |
clock.tick(FPS) | |
pygame.quit() | |
quit() | |
game_intro() | |
gameLoop() | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment