# lesson4_compress_row_start.py
import random
# ===== Existing working functions =====
def add_random_tile(board: list[list[int]]) -> None:
empty_positions = [
(r, c)
for r in range(4)
for c in range(4)
if board[r][c] == 0
]
if not empty_positions:
return
r, c = random.choice(empty_positions)
board[r][c] = 4 if random.random() < 0.1 else 2
def create_initial_board() -> list[list[int]]:
board = [[0] * 4 for _ in range(4)]
add_random_tile(board)
add_random_tile(board)
return board
def render_board(board: list[list[int]]) -> str:
size = len(board)
cell_width = 5
line = "+" + ("-" * cell_width + "+") * size
lines = [line]
for r in range(size):
row_text = "|"
for c in range(size):
val = board[r][c]
text = "" if val == 0 else str(val)
row_text += text.rjust(cell_width) + "|"
lines.append(row_text)
lines.append(line)
return "\n".join(lines)
# ===== Lesson 4 target function =====
def compress_row(row: list[int]) -> list[int]:
"""
Slide non-zero tiles in the row to the LEFT, keeping their order,
and move zeros to the right. Do NOT merge tiles here.
Examples:
[2, 0, 2, 4] -> [2, 2, 4, 0]
[0, 0, 2, 0] -> [2, 0, 0, 0]
[0, 4, 0, 4] -> [4, 4, 0, 0]
"""
# TODO: implement in this lesson
raise NotImplementedError
# ===== Still stubs for future lessons =====
def merge_row(row: list[int]) -> tuple[list[int], int]:
raise NotImplementedError
def move_board(board: list[list[int]], direction: str) -> tuple[list[list[int]], int, bool]:
raise NotImplementedError
def check_game_state(board: list[list[int]], target: int = 2048) -> str:
raise NotImplementedError
def main():
board = create_initial_board()
score = 0
print("Initial board:")
print("Score:", score)
print(render_board(board))
# We'll add compress_row demos here later in the lesson.
if __name__ == "__main__":
main()