Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pygame, sys
- import random
- import asyncio
- pygame.init()
- class GameState:
- def __init__(self):
- # Set resolution and title
- self.resolution = (500,500)
- self.screen = pygame.display.set_mode(self.resolution)
- pygame.display.set_caption('Snake but from memory')
- # Starting position of Player
- self.x = 200
- self.y = 200
- # Starting position of Fruit (will change when randomized)
- self.fx = 0
- self.fy = 0
- self.lastkey = [(50,0)] # Stores keypresses and plays them out in order in every update
- self.followers = 0 # The snake's body
- self.pastkeys = [] # Previous locations of the player, used for the body
- self.body = [] # The actual body rectangles, in a list for collision purposes
- self.reset()
- self.generate_fruit()
- def reset(self):
- self.x = 200
- self.y = 200
- self.followers = 0
- self.lastkey = [(50,0)]
- self.pastkeys = []
- self.body = []
- def generate_fruit(self):
- self.fx = random.randint(0,9) * 50 # Wanted for it to be a 500x500 window with 10 "pixels"
- self.fy = random.randint(0,9) * 50
- if self.fx == self.x and self.fy == self.y:
- print('Cant spawn there, snake head is occupying the space!')
- self.generate_fruit()
- else:
- for rect in self.body:
- if rect.x == self.fx and rect.y == self.fy:
- print('Cant spawn there, snake body is occupying the space!')
- self.generate_fruit()
- break
- self.fx = self.fx + 2
- self.fy = self.fy + 2
- async def main():
- gamestate = GameState()
- player = pygame.draw.rect(gamestate.screen,(255,255,255),(1000,1000,50,50)) # Initialization of the head and fruit. The body doesn't need one
- fruit = pygame.draw.rect(gamestate.screen,(255,0,0),(1000,1000,25,25)) # since it doesn't appear at the start
- while True:
- for event in pygame.event.get():
- if event.type == pygame.QUIT: sys.exit()
- if event.type==pygame.KEYDOWN:
- if event.key==pygame.K_RIGHT:
- gamestate.lastkey.append((50,0))
- elif event.key==pygame.K_LEFT:
- gamestate.lastkey.append((-50,0))
- elif event.key==pygame.K_UP:
- gamestate.lastkey.append((0,-50))
- elif event.key==pygame.K_DOWN:
- gamestate.lastkey.append((0,50))
- '''
- elif event.key==pygame.K_r:
- gamestate.generate_fruit()
- ''' # for debug purposes
- gamestate.x = gamestate.x + gamestate.lastkey[0][0] # To prevent creating more useless variables, I just tell it directly how much to move.
- gamestate.y = gamestate.y + gamestate.lastkey[0][1]
- if len(gamestate.lastkey) > 1:
- gamestate.lastkey.remove(gamestate.lastkey[0]) # If the player hasn't pressed any more buttons after the last one, keep going the same direction
- # ---Boundries stuff---
- if gamestate.x >= gamestate.resolution[0]:
- gamestate.x = 0
- elif gamestate.x < 0:
- gamestate.x = gamestate.resolution[0] - 50
- if gamestate.y >= gamestate.resolution[1]:
- gamestate.y = 0
- elif gamestate.y < 0:
- gamestate.y = gamestate.resolution[1] - 50
- # --------------------
- gamestate.pastkeys.insert(0,(gamestate.x, gamestate.y)) # Previous coords of the player
- fruit = pygame.draw.rect(gamestate.screen,(255,0,0),(gamestate.fx,gamestate.fy,25,25)) # Update the location of the fruit and the player.
- player = pygame.draw.rect(gamestate.screen,(100,255,100),(gamestate.x,gamestate.y,30,30))
- for _ in range(gamestate.followers): # Create the snake's body
- if _ == 0:
- continue
- gamestate.body.append(pygame.draw.rect(gamestate.screen,(150,255,150),(gamestate.pastkeys[_][0],gamestate.pastkeys[_][1],30,30)))
- while len(gamestate.body) > gamestate.followers - 1:
- gamestate.body.remove(gamestate.body[0])
- # --- Collisions ---
- if pygame.Rect.colliderect(player,fruit): # Fruit yummy
- gamestate.generate_fruit()
- if gamestate.followers == 0:
- gamestate.followers = gamestate.followers + 2
- else:
- gamestate.followers = gamestate.followers + 1
- if pygame.Rect.collidelist(player,gamestate.body) > -1: # Body not yummy
- pygame.time.wait(4000) # Look at what you've done. Be ashamed.
- gamestate.reset()
- # -------------------
- pygame.display.update() # update the screen
- gamestate.screen.fill((0,0,0))
- await sleep(200) # game speed NOT WORKING RN
- if __name__ == "__main__":
- loop = asyncio.get_event_loop()
- loop.create_task(main())
- loop.run_until_complete()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement