Search code examples
pythonpython-3.xpython-idletextmatecurses

Tried to apply what I've learned to build snake game python but it doesn't work


I've been trying to apply what I've learned so far following this video but it doesn't seem to work, why?

This's the video's link. https://www.youtube.com/watch?v=rbasThWVb-c&t=8s

And this is the code I wrote to run it.

import random
import curses





s = curses.initscr()
curses.curs_set(0)
sh, sw = s.getmaxyx()
w = curses.newwin(sh,sw, 0,0)
w.keypad(1)
w.timeout(100)

snk_x = sw/4
snk_y =sh/2

snake = [
    [snk_y, snk_x],
    [snk_y,snk_x-1],
    [snk_y,snk_x-2]
]

food = [sh/2,sw/2]

w.addch(food[0], food[1], curses.ACS_PI)

key = curses.KEY_RIGHT


while True:
    next_key = w.getch()
    key = key if next_key == -1 else next_key

    if snake[0][0] in [0,sh] or snake[0][1] in [0,sw] or snake[0] in snake[1:]:
        curses.endwin()
        quit()

    new_head = [snake[0][0], snake[0][1]]


    if key == curses.KEY_DOWN:
        new_head[0]+=1
    if key == curses.KEY_UP:
        new_head[0]-=1
    if key == curses.KEY_LEFT:
        new_head[1]-=1
    if key == curses.KEY_RIGHT:
        new_head[1]+=1

    snake.insert(0, new_head)

    if snake[0] == food:
        food = None
        while food is None
            nf = [
                random.randint(1,sh-1)
                random.randint(1,sw-1)
            ]

            food = nf if nf not in snake else None
        w.addch(food[0],food[1], curses.ACS_PI)
     else:
         tail = snake.pop()
         w.addch(tail[0],tail[1,],' ')
     w.addch(snake[0][0],snake[0][1], curses.ACS_CKBOARD)

By the way, I'm using TextMate 3 editor on Mac OS and trying to run it on IDLE as you see below in the picture.enter image description here


Solution

  • One of your lines is missing a colon :. You were also missing commas , between your nf list variables.

       if snake[0] == food:
            food = None
            while food is None:
    #Here                     ^
                nf = [
                    random.randint(1,sh-1),
    #                                     ^
                    random.randint(1,sw-1),
    #                                     ^
                ]
    

    Additionally, your final else: block was not correctly indented You had an extra space on all lines.

    else:
            tail = snake.pop()
            w.addch(tail[0],tail[1,],' ')
        w.addch(snake[0][0],snake[0][1], curses.ACS_CKBOARD)
    

    Indents (spaces / tabs) are critical in python so that the Python interpreter understands your code blocks and so that it executes correctly