0

I am making a snake game in Python by the help of google , but I found some errors which i dont understand why its so happening...my code is

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)

While running this code I got two errors, i.e.,

Traceback (most recent call last):
File "snakegame.py", line 20, in <module>
w.addch(food[0], food[1], curses.ACS_PI)
TypeError: integer argument expected, got float
8
  • 1
    What did you think dividing would get you? Commented Jun 24, 2018 at 5:55
  • Have you tried w.addch(int(food[0]), int(food[1]), curses.ACS_PI) ? Commented Jun 24, 2018 at 6:04
  • while food is None: will never stop. You need to indent food = nf if nf not in snake else None, I suppose. Commented Jun 24, 2018 at 6:16
  • @mehrdad-pedramfar yup, I tried this too... but nothing changed in error .. I am having same problem.. Commented Jun 25, 2018 at 7:55
  • @mehrdad-pedramfar now there is "TypeError: int() takes at most 2 arguments (3 given) Commented Jun 25, 2018 at 8:00

6 Answers 6

2

In Python 3 / results in floating point results. To get integer results, use integer division //.

food = [sh // 2, sw // 2]

In addition, your snake is initialized with floating point numbers. Again, in order to make sure that snake contains only integers, do this:

snk_x = sw // 4
snk_y = sh // 2

After that, you will see a different crash due to new_head exceeding sw or sh (if you leave the snake move by itself without pressing any keys) but this is unrelated to the original issue.

Sign up to request clarification or add additional context in comments.

1 Comment

@user726763 It is due to the same issue but with different variables: snk_x and snk_y. See my updated answer.
0

Modified a bit, no error, but food not coming second time.

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(int(food[0]), int(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(int(food[0]), int(food[1]), curses.ACS_PI)
else:
    tail = snake.pop()
    w.addch(int(tail[0]), int(tail[1]), ' ')

w.addch(int(snake[0][0]), int(snake[0][1]), curses.ACS_CKBOARD)

enter image description here

2 Comments

Please explain your solution.
The addch function is asking for integer parameter, so i did typecasting by int(parameter). And it worked.
0

This is a bit modified and works fine for me.

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)

Comments

0

This should work fine

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 = int(sw/4)
snk_y = int(sh/2)
snake = [
    [snk_y, snk_x],
    [snk_y, snk_x-1],
    [snk_y, snk_x-2]
]

food = [sh/2, sw/2]
w.addch(int(food[0]), int(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(int(tail[0]), int(tail[1]), ' ')

    w.addch(int(snake[0][0]), int(snake[0][1]), curses.ACS_CKBOARD)

Comments

0

Other solutions are over-using int() in more places than needed. You only need to use // integer division in the places I've shown.

Also a bit more fun. Diamond back snake.

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 # use integer division here
snk_y = sh//2 # use integer division here
snake = [
    [snk_y, snk_x],
    [snk_y, snk_x-1],
    [snk_y, snk_x-2]
]

food = [sh//2, sw//2] # use integer division here
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

    w.addch(snake[0][0], snake[0][1], curses.ACS_DIAMOND)
    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)

Comments

0

use // not / because interpret see your parameter in flote values while you want to insert integer values

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]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.