diff --git a/snake.py b/snake.py index 80e16a6..a2ea30f 100644 --- a/snake.py +++ b/snake.py @@ -1,67 +1,76 @@ -import curses -import random - import numpy as np +import curses +import time +import random 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 = 40, 80 # Board dimensions - board = np.zeros((h, w), dtype=int) - snake = [(h // 2, w // 2)] - board[h // 2, w // 2] = 1 + curses.curs_set(0) # Hide the cursor for a cleaner look + stdscr.nodelay(True) # Non-blocking input to keep the game flowing + h, w = 20, 40 # Dimensions of the game board + board = np.zeros((h, w), dtype=int) # Game board initialization + snake = [(h // 2, w // 2)] # Starting position of the snake + board[h // 2, w // 2] = 1 # Mark the snake's start on the board food = (random.randint(0, h - 1), random.randint(0, w - 1)) - board[food] = 2 # Food position - direction = (0, 1) # Initial direction (right) + board[food] = 2 # Place initial food + direction = (0, 1) # Initial movement direction + last_update_time = time.time() + move_interval = 0.1 # Base move interval in seconds + vertical_adjustment = 2 # Vertical moves occur every this number of base intervals while True: - # Input handling key = stdscr.getch() - if key in [ord("q"), ord("Q")]: + if key in [ord("Q"), ord("q")]: break - elif key in [ord("a"), ord("A")] and direction != (0, 1): + if key in [ord("a"), ord("A")] and direction != (0, 1): direction = (0, -1) - elif key in [ord("d"), ord("D")] and direction != (0, -1): + if key in [ord("d"), ord("D")] and direction != (0, -1): direction = (0, 1) - elif key in [ord("w"), ord("W")] and direction != (1, 0): + if key in [ord("w"), ord("W")] and direction != (1, 0): direction = (-1, 0) - elif key in [ord("s"), ord("S")] and direction != (-1, 0): + if 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 + current_time = time.time() + time_elapsed = current_time - last_update_time - if head in snake: # Check self-collision - break + # Adjust move interval based on direction + current_interval = move_interval * ( + vertical_adjustment if direction in [(-1, 0), (1, 0)] else 1 + ) - 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: + if time_elapsed >= current_interval: + new_head = (snake[0][0] + direction[0], snake[0][1] + direction[1]) + new_head = (new_head[0] % h, new_head[1] % w) # Toroidal field logic + + if new_head in snake: + break # Collision detection + + snake.insert(0, new_head) + if new_head == food: food = (random.randint(0, h - 1), random.randint(0, w - 1)) - else: - tail = snake.pop() - board[tail] = 0 + 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 + board[new_head] = 1 + board[food] = 2 + last_update_time = current_time # Reset the timer - # 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() + # Clear and redraw the board + stdscr.clear() + for i in range(h): + for j in range(w): + if board[i, j] == 1: + stdscr.addch(i, j, "X") + elif board[i, j] == 2: + stdscr.addch(i, j, "O") + else: + stdscr.addch(i, j, " ") + + stdscr.refresh() curses.wrapper(main)