From 4b0d06fc6538ac86e691e64e22f8e715e91bd894 Mon Sep 17 00:00:00 2001 From: Michael Pilosov Date: Thu, 9 May 2024 17:18:44 -0600 Subject: [PATCH] throw in snake --- snake.py | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 snake.py diff --git a/snake.py b/snake.py new file mode 100644 index 0000000..63a9c57 --- /dev/null +++ b/snake.py @@ -0,0 +1,67 @@ +import curses +import random + +import numpy as np + + +def main(stdscr): + curses.curs_set(0) # Hide cursor + stdscr.nodelay(True) # Don't block I/O calls + stdscr.timeout(100) # Refresh rate + + # Initialize the board + h, w = 20, 40 # Board dimensions + board = np.zeros((h, w), dtype=int) + snake = [(h // 2, w // 2)] + board[h // 2, w // 2] = 1 + food = (random.randint(0, h - 1), random.randint(0, w - 1)) + board[food] = 2 # Food position + direction = (0, 1) # Initial direction (right) + + while True: + # Input handling + key = stdscr.getch() + if key in [ord("q"), ord("Q")]: + break + elif key in [ord("a"), ord("A")] and direction != (0, 1): + direction = (0, -1) + elif key in [ord("d"), ord("D")] and direction != (0, -1): + direction = (0, 1) + elif key in [ord("w"), ord("W")] and direction != (1, 0): + direction = (-1, 0) + elif key in [ord("s"), ord("S")] and direction != (-1, 0): + direction = (1, 0) + elif key == ord(" "): # Pause + stdscr.nodelay(False) + stdscr.getch() + stdscr.nodelay(True) + + # Update snake position + head = (snake[0][0] + direction[0], snake[0][1] + direction[1]) + head = (head[0] % h, head[1] % w) # Torus wrapping + + if head in snake: # Check self-collision + break + + snake.insert(0, head) # Move head + if head == food: # Check food collision + food = (random.randint(0, h - 1), random.randint(0, w - 1)) + while food in snake: + food = (random.randint(0, h - 1), random.randint(0, w - 1)) + else: + tail = snake.pop() + board[tail] = 0 + + board[head] = 1 + board[food] = 2 + + # Draw the board + stdscr.clear() + for i in range(h): + for j in range(w): + char = " " if board[i, j] == 0 else "*" if board[i, j] == 1 else "O" + stdscr.addch(i, j, char) + stdscr.refresh() + + +curses.wrapper(main)