title: main() missing 1 required positional argument: 'self'
body: <p>Here is my code. I am following a tutorial for making a snake game in python.</p>
  <pre class="lang-python prettyprint-override"><code>import math, random, pygame
  
  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():
          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 
                  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] &lt;= 0: c.pos = (c.rows-1, c.pos[1]) 
                  elif c.dirnx == 1 and c.pos[0] &gt;= c.rows-1: c.pos = (0,c.pos[1]) 
                  elif c.dirny == 1 and c.pos[1] &gt;= c.rows-1: c.pos = (c.pos[0], 0) 
                  elif c.dirny == -1 and c.pos[1] &lt;= 0: c.pos = (c.pos[0],c.rows-1)
                  else: c.move(c.dirnx, c.dirny)
  
      def reset(self, pos):
          pass
  
      def addCube(self):
          tail = self.body[-1] #-1 is the last element in that list
          dx, dy = tail.dirnx, tail.dirny #dx and dy is direction of x and direction of y
  
          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 width, rows, s, snack #ADD snack to this line  
          surface.fill((0,0,0))
          s.draw(surface)
          snack.draw(surface) #NEW
          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))) &gt; 0:
                  continue
              else:
                  break
              return (x.y)
  
      def message_box(subject, content):
          pass
  
      def main(self):
          global width, rows, s, snack
          self.move = move
          width = 500 
          height = 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] == snake.pos: #Checks if the head collides with the snack
                  s.addCube() #Adds a new cube to the snake
                  snack = cube(randomSnack(rows, s), color=(0,255,0)) #Creates a new snack object
  
              redrawWindow(win) 
  
  main()
  </code></pre>
  <p>But then I keep getting this error which I can't seem to fix:</p>
  <pre><code>Traceback (most recent call last):
  File &quot;C:\Users\Ammar Khan\AppData\Local\Programs\Python\Python37\Snake Game Tutorial #4.py&quot;, line 186, in &lt;module&gt; main()
  TypeError: main() missing 1 required positional argument: 'self'
  </code></pre>