import numpy as np import curses import time import random def main(stdscr): 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 # 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: key = stdscr.getch() if key in [ord("Q"), ord("q")]: break if key in [ord("a"), ord("A")] and direction != (0, 1): direction = (0, -1) if key in [ord("d"), ord("D")] and direction != (0, -1): direction = (0, 1) if key in [ord("w"), ord("W")] and direction != (1, 0): direction = (-1, 0) if key in [ord("s"), ord("S")] and direction != (-1, 0): direction = (1, 0) current_time = time.time() time_elapsed = current_time - last_update_time # Adjust move interval based on direction current_interval = move_interval * ( vertical_adjustment if direction in [(-1, 0), (1, 0)] else 1 ) 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)) while food in snake: food = (random.randint(0, h - 1), random.randint(0, w - 1)) else: tail = snake.pop() board[tail] = 0 board[new_head] = 1 board[food] = 2 last_update_time = current_time # Reset the timer # 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)