Compare commits
	
		
			2 Commits
		
	
	
		
			main
			...
			point_syst
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| f77dda2946 | |||
| 8aa0621395 | 
@ -1,6 +1,6 @@
 | 
				
			|||||||
# np-tetris
 | 
					# np-tetris
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`main.py`: tetris in pure python + `numpy`
 | 
					`main.py`: tetris in `numpy`
 | 
				
			||||||
`tetris.py`: tetris with `curses`
 | 
					`tetris.py`: tetris with `curses`
 | 
				
			||||||
`snake.py`: snake with `curses` and `numpy`
 | 
					`snake.py`: snake with `curses` and `numpy`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										21
									
								
								main.py
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								main.py
									
									
									
									
									
								
							@ -32,13 +32,14 @@ def attempt_rotate(piece, board, i, j):
 | 
				
			|||||||
    return piece
 | 
					    return piece
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def clear_rows(board):
 | 
					def clear_rows(board, score):
 | 
				
			||||||
    clear_indices = np.where(np.all(board == 1, axis=1))[0]
 | 
					    clear_indices = np.where(np.all(board == 1, axis=1))[0]
 | 
				
			||||||
    if clear_indices.size > 0:
 | 
					    if clear_indices.size > 0:
 | 
				
			||||||
        board = np.delete(board, clear_indices, axis=0)
 | 
					        board = np.delete(board, clear_indices, axis=0)
 | 
				
			||||||
        new_rows = np.zeros((len(clear_indices), board.shape[1]))
 | 
					        new_rows = np.zeros((len(clear_indices), board.shape[1]))
 | 
				
			||||||
        board = np.vstack([new_rows, board])
 | 
					        board = np.vstack([new_rows, board])
 | 
				
			||||||
    return board
 | 
					        score = update_score(score)
 | 
				
			||||||
 | 
					    return board, score
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def calculate_shadow(piece, board, i, j):
 | 
					def calculate_shadow(piece, board, i, j):
 | 
				
			||||||
@ -48,7 +49,7 @@ def calculate_shadow(piece, board, i, j):
 | 
				
			|||||||
    return i
 | 
					    return i
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def display_board(board, piece, i, j):
 | 
					def display_board(board, piece, i, j, score):
 | 
				
			||||||
    display = board.copy()
 | 
					    display = board.copy()
 | 
				
			||||||
    shadow_i = calculate_shadow(piece, board, i, j)
 | 
					    shadow_i = calculate_shadow(piece, board, i, j)
 | 
				
			||||||
    n, m = piece.shape
 | 
					    n, m = piece.shape
 | 
				
			||||||
@ -69,7 +70,7 @@ def display_board(board, piece, i, j):
 | 
				
			|||||||
            for row in display
 | 
					            for row in display
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    print()
 | 
					    print(f"Score: {score}\n")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def game_over(board):
 | 
					def game_over(board):
 | 
				
			||||||
@ -79,8 +80,12 @@ def game_over(board):
 | 
				
			|||||||
        board
 | 
					        board
 | 
				
			||||||
    )  # Clear the board and continue or call sys.exit() to end
 | 
					    )  # Clear the board and continue or call sys.exit() to end
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					def update_score(score):
 | 
				
			||||||
 | 
					    return score + 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def main():
 | 
					def main():
 | 
				
			||||||
 | 
					    score = 0
 | 
				
			||||||
    board = np.zeros((20, 10), dtype=int)
 | 
					    board = np.zeros((20, 10), dtype=int)
 | 
				
			||||||
    piece_types = list(PIECES.keys())
 | 
					    piece_types = list(PIECES.keys())
 | 
				
			||||||
    current_piece = PIECES[np.random.choice(piece_types)]
 | 
					    current_piece = PIECES[np.random.choice(piece_types)]
 | 
				
			||||||
@ -89,7 +94,7 @@ def main():
 | 
				
			|||||||
    auto_gravity = True  # Auto-gravity enabled by default
 | 
					    auto_gravity = True  # Auto-gravity enabled by default
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while True:
 | 
					    while True:
 | 
				
			||||||
        display_board(board, current_piece, i, j)
 | 
					        display_board(board, current_piece, i, j, score)
 | 
				
			||||||
        if not check_placement(current_piece, board, *START_POS):
 | 
					        if not check_placement(current_piece, board, *START_POS):
 | 
				
			||||||
            board = game_over(board)
 | 
					            board = game_over(board)
 | 
				
			||||||
            continue
 | 
					            continue
 | 
				
			||||||
@ -117,13 +122,13 @@ def main():
 | 
				
			|||||||
                i += 1
 | 
					                i += 1
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                board = place_piece(current_piece, board, i, j)
 | 
					                board = place_piece(current_piece, board, i, j)
 | 
				
			||||||
                board = clear_rows(board)
 | 
					                board, score = clear_rows(board, score)
 | 
				
			||||||
                current_piece = PIECES[np.random.choice(piece_types)]
 | 
					                current_piece = PIECES[np.random.choice(piece_types)]
 | 
				
			||||||
                i, j = 0, 4
 | 
					                i, j = 0, 4
 | 
				
			||||||
        elif command == "S":
 | 
					        elif command == "S":
 | 
				
			||||||
            i = calculate_shadow(current_piece, board, i, j)
 | 
					            i = calculate_shadow(current_piece, board, i, j)
 | 
				
			||||||
            board = place_piece(current_piece, board, i, j)
 | 
					            board = place_piece(current_piece, board, i, j)
 | 
				
			||||||
            board = clear_rows(board)
 | 
					            board, score = clear_rows(board, score)
 | 
				
			||||||
            current_piece = PIECES[np.random.choice(piece_types)]
 | 
					            current_piece = PIECES[np.random.choice(piece_types)]
 | 
				
			||||||
            i, j = START_POS
 | 
					            i, j = START_POS
 | 
				
			||||||
        elif command == "G":
 | 
					        elif command == "G":
 | 
				
			||||||
@ -134,7 +139,7 @@ def main():
 | 
				
			|||||||
                i += 1
 | 
					                i += 1
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                board = place_piece(current_piece, board, i, j)
 | 
					                board = place_piece(current_piece, board, i, j)
 | 
				
			||||||
                board = clear_rows(board)
 | 
					                board, score = clear_rows(board, score)
 | 
				
			||||||
                current_piece = PIECES[np.random.choice(piece_types)]
 | 
					                current_piece = PIECES[np.random.choice(piece_types)]
 | 
				
			||||||
                i, j = START_POS
 | 
					                i, j = START_POS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										77
									
								
								snake.py
									
									
									
									
									
								
							
							
						
						
									
										77
									
								
								snake.py
									
									
									
									
									
								
							@ -1,53 +1,50 @@
 | 
				
			|||||||
import numpy as np
 | 
					 | 
				
			||||||
import curses
 | 
					import curses
 | 
				
			||||||
import time
 | 
					 | 
				
			||||||
import random
 | 
					import random
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import numpy as np
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def main(stdscr):
 | 
					def main(stdscr):
 | 
				
			||||||
    curses.curs_set(0)  # Hide the cursor for a cleaner look
 | 
					    curses.curs_set(0)  # Hide cursor
 | 
				
			||||||
    stdscr.nodelay(True)  # Non-blocking input to keep the game flowing
 | 
					    stdscr.nodelay(True)  # Don't block I/O calls
 | 
				
			||||||
    h, w = 20, 40  # Dimensions of the game board
 | 
					    stdscr.timeout(100)  # Refresh rate
 | 
				
			||||||
    board = np.zeros((h, w), dtype=int)  # Game board initialization
 | 
					
 | 
				
			||||||
    snake = [(h // 2, w // 2)]  # Starting position of the snake
 | 
					    # Initialize the board
 | 
				
			||||||
    board[h // 2, w // 2] = 1  # Mark the snake's start on 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
 | 
				
			||||||
    food = (random.randint(0, h - 1), random.randint(0, w - 1))
 | 
					    food = (random.randint(0, h - 1), random.randint(0, w - 1))
 | 
				
			||||||
    board[food] = 2  # Place initial food
 | 
					    board[food] = 2  # Food position
 | 
				
			||||||
    direction = (0, 1)  # Initial movement direction
 | 
					    direction = (0, 1)  # Initial direction (right)
 | 
				
			||||||
    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:
 | 
					    while True:
 | 
				
			||||||
 | 
					        # Input handling
 | 
				
			||||||
        key = stdscr.getch()
 | 
					        key = stdscr.getch()
 | 
				
			||||||
        if key in [ord("Q"), ord("q")]:
 | 
					        if key in [ord("q"), ord("Q")]:
 | 
				
			||||||
            break
 | 
					            break
 | 
				
			||||||
        if key in [ord("a"), ord("A")] and direction != (0, 1):
 | 
					        elif key in [ord("a"), ord("A")] and direction != (0, 1):
 | 
				
			||||||
            direction = (0, -1)
 | 
					            direction = (0, -1)
 | 
				
			||||||
        if key in [ord("d"), ord("D")] and direction != (0, -1):
 | 
					        elif key in [ord("d"), ord("D")] and direction != (0, -1):
 | 
				
			||||||
            direction = (0, 1)
 | 
					            direction = (0, 1)
 | 
				
			||||||
        if key in [ord("w"), ord("W")] and direction != (1, 0):
 | 
					        elif key in [ord("w"), ord("W")] and direction != (1, 0):
 | 
				
			||||||
            direction = (-1, 0)
 | 
					            direction = (-1, 0)
 | 
				
			||||||
        if key in [ord("s"), ord("S")] and direction != (-1, 0):
 | 
					        elif key in [ord("s"), ord("S")] and direction != (-1, 0):
 | 
				
			||||||
            direction = (1, 0)
 | 
					            direction = (1, 0)
 | 
				
			||||||
 | 
					        elif key == ord(" "):  # Pause
 | 
				
			||||||
 | 
					            stdscr.nodelay(False)
 | 
				
			||||||
 | 
					            stdscr.getch()
 | 
				
			||||||
 | 
					            stdscr.nodelay(True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        current_time = time.time()
 | 
					        # Update snake position
 | 
				
			||||||
        time_elapsed = current_time - last_update_time
 | 
					        head = (snake[0][0] + direction[0], snake[0][1] + direction[1])
 | 
				
			||||||
 | 
					        head = (head[0] % h, head[1] % w)  # Torus wrapping
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Adjust move interval based on direction
 | 
					        if head in snake:  # Check self-collision
 | 
				
			||||||
        current_interval = move_interval * (
 | 
					            break
 | 
				
			||||||
            vertical_adjustment if direction in [(-1, 0), (1, 0)] else 1
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if time_elapsed >= current_interval:
 | 
					        snake.insert(0, head)  # Move head
 | 
				
			||||||
            new_head = (snake[0][0] + direction[0], snake[0][1] + direction[1])
 | 
					        if head == food:  # Check food collision
 | 
				
			||||||
            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))
 | 
					            food = (random.randint(0, h - 1), random.randint(0, w - 1))
 | 
				
			||||||
            while food in snake:
 | 
					            while food in snake:
 | 
				
			||||||
                food = (random.randint(0, h - 1), random.randint(0, w - 1))
 | 
					                food = (random.randint(0, h - 1), random.randint(0, w - 1))
 | 
				
			||||||
@ -55,21 +52,15 @@ def main(stdscr):
 | 
				
			|||||||
            tail = snake.pop()
 | 
					            tail = snake.pop()
 | 
				
			||||||
            board[tail] = 0
 | 
					            board[tail] = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            board[new_head] = 1
 | 
					        board[head] = 1
 | 
				
			||||||
        board[food] = 2
 | 
					        board[food] = 2
 | 
				
			||||||
            last_update_time = current_time  # Reset the timer
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # Clear and redraw the board
 | 
					        # Draw the board
 | 
				
			||||||
        stdscr.clear()
 | 
					        stdscr.clear()
 | 
				
			||||||
        for i in range(h):
 | 
					        for i in range(h):
 | 
				
			||||||
            for j in range(w):
 | 
					            for j in range(w):
 | 
				
			||||||
                    if board[i, j] == 1:
 | 
					                char = " " if board[i, j] == 0 else "*" if board[i, j] == 1 else "O"
 | 
				
			||||||
                        stdscr.addch(i, j, "X")
 | 
					                stdscr.addch(i, j, char)
 | 
				
			||||||
                    elif board[i, j] == 2:
 | 
					 | 
				
			||||||
                        stdscr.addch(i, j, "O")
 | 
					 | 
				
			||||||
                    else:
 | 
					 | 
				
			||||||
                        stdscr.addch(i, j, " ")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        stdscr.refresh()
 | 
					        stdscr.refresh()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user