diff --git a/game.py b/game.py new file mode 100644 index 000000000..73a292fe2 --- /dev/null +++ b/game.py @@ -0,0 +1,104 @@ +from raylibpy import * +import math + +# Grid setup +ROWS = 3 +COLS = 3 +TILE_SIZE = 120 +MARGIN = 20 +SWIPE_MIN_DISTANCE = 30.0 # Minimum distance to detect swipe + +# Board: 0 means empty tile, others are numbered +board = [] + +def init_board(): + global board + board = [i + 1 for i in range(ROWS * COLS - 1)] + [0] # 1..8 + 0 empty + +def idx_row(idx): + return idx // COLS + +def idx_col(idx): + return idx % COLS + +def draw_board(): + for i, value in enumerate(board): + r, c = idx_row(i), idx_col(i) + x = MARGIN + c * TILE_SIZE + y = MARGIN + r * TILE_SIZE + if value == 0: + draw_rectangle(x, y, TILE_SIZE - 4, TILE_SIZE - 4, DARKGRAY) + else: + draw_rectangle(x, y, TILE_SIZE - 4, TILE_SIZE - 4, LIGHTGRAY) + draw_text(str(value), x + TILE_SIZE // 2 - 10, y + TILE_SIZE // 2 - 12, 24, BLACK) + +def find_empty(): + return board.index(0) + +def move_empty(direction): + empty = find_empty() + er, ec = idx_row(empty), idx_col(empty) + tr, tc = er, ec + + if direction == 0: tr = er - 1 # up + elif direction == 1: tr = er + 1 # down + elif direction == 2: tc = ec - 1 # left + elif direction == 3: tc = ec + 1 # right + + if tr < 0 or tr >= ROWS or tc < 0 or tc >= COLS: + return # out of bounds + + target = tr * COLS + tc + board[empty], board[target] = board[target], board[empty] + +def main(): + screenW = MARGIN * 2 + COLS * TILE_SIZE + screenH = MARGIN * 2 + ROWS * TILE_SIZE + + init_window(screenW, screenH, b"Puzzle Swipe Test (Python)") + set_target_fps(60) + + init_board() + + # Swipe variables + touch_start = Vector2(0, 0) + touch_end = Vector2(0, 0) + touching = False + + while not window_should_close(): + # Detect touch or mouse drag + if is_mouse_button_pressed(MOUSE_LEFT_BUTTON): + touching = True + touch_start = get_mouse_position() + + if touching and is_mouse_button_released(MOUSE_LEFT_BUTTON): + touching = False + touch_end = get_mouse_position() + + dx = touch_end.x - touch_start.x + dy = touch_end.y - touch_start.y + dist = math.sqrt(dx * dx + dy * dy) + + if dist >= SWIPE_MIN_DISTANCE: + # Determine swipe direction + if abs(dx) > abs(dy): + if dx > 0: + move_empty(3) # right + else: + move_empty(2) # left + else: + if dy > 0: + move_empty(1) # down + else: + move_empty(0) # up + + begin_drawing() + clear_background(RAYWHITE) + draw_text(b"Swipe or drag to move empty tile", 10, 10, 18, DARKGRAY) + draw_board() + end_drawing() + + close_window() + +if __name__ == "__main__": + main()