Advertisement
vovkakorben

snake_game

Jan 24th, 2022
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.53 KB | None | 0 0
  1. import pygame,pygame.freetype,pygame.gfxdraw
  2. import os, sys, traceback, random
  3. from pygame.locals import K_UP,K_LEFT,K_DOWN,K_RIGHT,K_ESCAPE,K_SPACE
  4.  
  5. def sign(v:int):
  6.     return (0 if v==0 else (v // abs(v)))
  7.  
  8. scriptpath = os.path.dirname(os.path.realpath(__file__))
  9. clock = pygame.time.Clock()
  10.  
  11.  
  12. CLR_BG = (0x14,0x1E,0x27)
  13. CLR_FNT = (0xc0,0xdf,0x15)
  14. CLR_GRID = (0x17,0x23,0x2e)
  15. CLR_BODY = (0x60,0x8c,0x55)
  16. CLR_HEAD = (0xad,0xb1,0x8b)
  17. CLR_APPLE = (0xff,0x48,0x3d)
  18.  
  19.  
  20. # game field size
  21. SQUARE = 20
  22. FW = 30
  23. FH = 20
  24.  
  25. # game speed
  26. FPS = 60
  27. running = True
  28. step_delay = 10 # game speed
  29. step_rest = step_delay # step clock
  30.  
  31. dir = 1 # initial direction
  32. dirs = [(0,-1),(1,0),(0,1),(-1,0)]
  33.  
  34. # create snake
  35. bodylen = 5
  36. body = [(2,FH//2)]
  37. for i in range(1,bodylen):
  38.     body.append((body[0][0]+i,body[0][1]));
  39. body.reverse()
  40.  
  41.  
  42. def point_in_body(p):
  43.     for i in body:
  44.         if (i==p):
  45.             return True
  46.     return False
  47.  
  48. def create_apple():
  49.     while True:
  50.         a = (random.randint(0, FW-1), random.randint(0, FH-1))
  51.         if not point_in_body(a):
  52.             return a
  53.  
  54. apple = create_apple()
  55.  
  56. try:
  57.     try:
  58.         pygame.init()
  59.         pygame.display.set_caption("Snake")
  60.         surf_act = pygame.display.set_mode((FW*SQUARE, FH*SQUARE))
  61.         #fnt = pygame.freetype.Font(os.path.join(scriptpath, 'app.ttf'), 10)
  62.  
  63.         while running:
  64.            
  65.             ###############################################################################
  66.             #
  67.             #   KEYS
  68.             #
  69.             ###############################################################################
  70.             for event in pygame.event.get():
  71.                 if event.type == pygame.QUIT: sys.exit()
  72.                
  73.                 # keys handler                      
  74.                 if event.type == pygame.KEYDOWN:
  75.                     try:
  76.                         key_index=[K_UP,K_RIGHT,K_DOWN,K_LEFT,K_ESCAPE,K_SPACE].index(event.key)
  77.                         if (key_index<4): # check if new direction allowed
  78.                             if ((key_index & 1) != (dir & 1)):
  79.                                 dir = key_index
  80.  
  81.                         if (key_index==4): running = False
  82.                        
  83.                     except ValueError: pass
  84.                     else: pass
  85.            
  86.             ###############################################################################
  87.             #
  88.             #   STEP
  89.             #
  90.             ###############################################################################
  91.             if (step_rest == 0):
  92.                 step_rest = step_delay
  93.                 next = (body[0][0] + dirs[dir][0], body[0][1] + dirs[dir][1]) #next head pos
  94.                
  95.                
  96.                 if point_in_body(next): # check eat itself
  97.                    break
  98.                 if ( (next[0]<0) or (next[1]<0) or (next[0]>=FW) or (next[1]>=FH) ): # check gamefield exit
  99.                     break
  100.  
  101.                 body.insert(0, next )
  102.                 if (next==apple):
  103.                     bodylen += 1
  104.                     apple = create_apple()
  105.                 else:                    
  106.                     body.pop(bodylen)
  107.             step_rest -= 1    
  108.  
  109.  
  110.             ###############################################################################
  111.             #
  112.             #   DRAW
  113.             #
  114.             ###############################################################################
  115.  
  116.             # BG
  117.             surf_act.fill(CLR_BG)
  118.             # grid
  119.             for x in range(FW): pygame.draw.line(surf_act, CLR_GRID, (SQUARE*x,0 ), (SQUARE*x, SQUARE*FH), 1)
  120.             for y in range(FH): pygame.draw.line(surf_act, CLR_GRID, (0, SQUARE*y ), (SQUARE*FW, SQUARE*y), 1)
  121.             # snake body
  122.             c = 0
  123.             for i in body:
  124.                 surf_act.fill(CLR_HEAD if c==0 else CLR_BODY,[i[0]*SQUARE+1,i[1]*SQUARE+1,SQUARE-1,SQUARE-1])
  125.                 c += 1
  126.             # apple
  127.             surf_act.fill(CLR_APPLE,[apple[0]*SQUARE+1,apple[1]*SQUARE+1,SQUARE-1,SQUARE-1])
  128.             # fps
  129.             #fnt.render_to(surf_act, (10,10), str(step_rest), CLR_FNT)
  130.  
  131.             pygame.display.flip()
  132.             clock.tick(FPS)
  133.     finally:
  134.         pygame.quit()
  135.        
  136.  
  137. except Exception as e:
  138.     print()
  139.     print("\n=-=-=- ERROR =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n")
  140.     e = sys.exc_info()[1]
  141.     print(e.args[0])
  142.     traceback.print_exc()
  143.     print("\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n")
  144.  
  145.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement