Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import math
- import random
- import pygame
- import tkinter as tk
- from tkinter import messagebox
- class cube(object):
- rows = 20
- w = 500
- def __init__(self,start,dirnx=1,dirny=0,color=(255,0,0)):
- self.pos = start
- self.dirnx = 1
- self.dirny = 0
- self.color = color
- def move(self, dirnx, dirny):
- self.dirnx = dirnx
- self.dirny = dirny
- self.pos = (self.pos[0] + self.dirnx, self.pos[1] + self.dirny)
- def draw(self, surface, eyes=False):
- dis = self.w // self.rows
- i = self.pos[0]
- j = self.pos[1]
- pygame.draw.rect(surface, self.color, (i*dis+1,j*dis+1, dis-2, dis-2))
- if eyes:
- centre = dis//2
- radius = 3
- circleMiddle = (i*dis+centre-radius,j*dis+8)
- circleMiddle2 = (i*dis + dis -radius*2, j*dis+8)
- pygame.draw.circle(surface, (0,0,0), circleMiddle, radius)
- pygame.draw.circle(surface, (0,0,0), circleMiddle2, radius)
- class snake(object):
- body = []
- turns = {}
- def __init__(self, color, pos):
- self.color = color
- self.head = cube(pos)
- self.body.append(self.head)
- self.dirnx = 0
- self.dirny = 1
- def move(self):
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- pygame.quit()
- keys = pygame.key.get_pressed()
- for key in keys:
- if keys[pygame.K_LEFT]:
- self.dirnx = -1
- self.dirny = 0
- self.turns[self.head.pos[:]] = [self.dirnx, self.dirny]
- elif keys[pygame.K_RIGHT]:
- self.dirnx = 1
- self.dirny = 0
- self.turns[self.head.pos[:]] = [self.dirnx, self.dirny]
- elif keys[pygame.K_UP]:
- self.dirnx = 0
- self.dirny = -1
- self.turns[self.head.pos[:]] = [self.dirnx, self.dirny]
- elif keys[pygame.K_DOWN]:
- self.dirnx = 0
- self.dirny = 1
- self.turns[self.head.pos[:]] = [self.dirnx, self.dirny]
- for i, c in enumerate(self.body):
- p = c.pos[:]
- if p in self.turns:
- turn = self.turns[p]
- c.move(turn[0],turn[1])
- if i == len(self.body)-1:
- self.turns.pop(p)
- else:
- if c.dirnx == -1 and c.pos[0] <= 0: c.pos = (c.rows-1, c.pos[1])
- elif c.dirnx == 1 and c.pos[0] >= c.rows-1: c.pos = (0,c.pos[1])
- elif c.dirny == 1 and c.pos[1] >= c.rows-1: c.pos = (c.pos[0], 0)
- elif c.dirny == -1 and c.pos[1] <= 0: c.pos = (c.pos[0],c.rows-1)
- else: c.move(c.dirnx,c.dirny)
- def reset(self, pos):
- self.head = cube(pos)
- self.body = []
- self.body.append(self.head)
- self.turns = {}
- self.dirnx = 0
- self.dirny = 1
- def addCube(self):
- tail = self.body[-1]
- dx, dy = tail.dirnx, tail.dirny
- if dx == 1 and dy == 0:
- self.body.append(cube((tail.pos[0]-1,tail.pos[1])))
- elif dx == -1 and dy == 0:
- self.body.append(cube((tail.pos[0]+1,tail.pos[1])))
- elif dx == 0 and dy == 1:
- self.body.append(cube((tail.pos[0],tail.pos[1]-1)))
- elif dx == 0 and dy == -1:
- self.body.append(cube((tail.pos[0],tail.pos[1]+1)))
- self.body[-1].dirnx = dx
- self.body[-1].dirny = dy
- def draw(self, surface):
- for i, c in enumerate(self.body):
- if i ==0:
- c.draw(surface, True)
- else:
- c.draw(surface)
- def drawGrid(w, rows, surface):
- sizeBtwn = w // rows
- x = 0
- y = 0
- for l in range(rows):
- x = x + sizeBtwn
- y = y + sizeBtwn
- pygame.draw.line(surface, (255,255,255), (x,0),(x,w))
- pygame.draw.line(surface, (255,255,255), (0,y),(w,y))
- def redrawWindow(surface):
- global rows, width, s, snack
- surface.fill((0,0,0))
- s.draw(surface)
- snack.draw(surface)
- drawGrid(width,rows, surface)
- pygame.display.update()
- def randomSnack(rows, item):
- positions = item.body
- while True:
- x = random.randrange(rows)
- y = random.randrange(rows)
- if len(list(filter(lambda z:z.pos == (x,y), positions))) > 0:
- continue
- else:
- break
- return (x,y)
- def message_box(subject, content):
- root = tk.Tk()
- root.attributes("-topmost", True)
- root.withdraw()
- messagebox.showinfo(subject, content)
- try:
- root.destroy()
- except:
- pass
- def main():
- global width, rows, s, snack
- width = 500
- rows = 20
- win = pygame.display.set_mode((width, width))
- s = snake((255,0,0), (10,10))
- snack = cube(randomSnack(rows, s), color=(0,255,0))
- flag = True
- clock = pygame.time.Clock()
- while flag:
- pygame.time.delay(50)
- clock.tick(10)
- s.move()
- if s.body[0].pos == snack.pos:
- s.addCube()
- snack = cube(randomSnack(rows, s), color=(0,255,0))
- for x in range(len(s.body)):
- if s.body[x].pos in list(map(lambda z:z.pos,s.body[x+1:])):
- print(\'Score: \', len(s.body))
- message_box(\'You Lost!\', \'Play again...\')
- s.reset((10,10))
- break
- redrawWindow(win)
- pass
- main()
- PS C:\Users\17041758\Desktop\Python> & C:/Python/Python38-32/python.exe c:/Users/17041758/Desktop/Python/snake.py
- & : The term 'C:/Python/Python38-32/python.exe' is not recognized as the name of a cmdlet, function, script file, or operable
- program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
- At line:1 char:3
- + & C:/Python/Python38-32/python.exe c:/Users/17041758/Desktop/Python/s ...
- + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- + CategoryInfo : ObjectNotFound: (C:/Python/Python38-32/python.exe:String) [], CommandNotFoundException
- + FullyQualifiedErrorId : CommandNotFoundException
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement