File size: 3,439 Bytes
b7e93cf
 
d6abb83
 
 
b7e93cf
 
 
 
 
 
 
d6abb83
b7e93cf
 
 
d6abb83
b7e93cf
d6abb83
 
b7e93cf
 
d6abb83
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b7e93cf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d6abb83
b7e93cf
 
d6abb83
 
 
b7e93cf
d6abb83
b7e93cf
d6abb83
 
 
 
 
b7e93cf
d6abb83
 
b7e93cf
 
 
 
 
d6abb83
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import random
import streamlit as st
from PIL import Image, ImageDraw
import requests
from io import BytesIO

def roll_dice():
    """Simulates rolling a six-sided dice."""
    return random.randint(1, 6)

def update_player_position(player_pos, dice, board):
    """Updates player position based on the dice roll and board."""
    original_pos = player_pos
    player_pos += dice
    if player_pos in board:
        player_pos = board[player_pos]
        if player_pos > original_pos:
            st.write("Yay! You climbed a ladder.")
        elif player_pos < original_pos:
             st.write("Oops! You encountered a snake")
    return player_pos

def calculate_player_coordinates(position):
  """Calculates approximate x, y coordinates for the player position."""
  row = (position - 1) // 10
  col = (position - 1) % 10

  # Adjust for snake and ladder board layout
  if row % 2 == 1:
      col = 9 - col

  x = 50 + col * 50 # Adjust these values as necessary
  y = 450 - row * 50 # Adjust these values as necessary

  return x, y


def display_game_board(player_position):
    board_image_url = "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/Snakes_and_ladders_board_simple.svg/1920px-Snakes_and_ladders_board_simple.svg.png"

    try:
        response = requests.get(board_image_url, stream=True)
        response.raise_for_status()
        board_image = Image.open(BytesIO(response.content)).convert("RGBA")

        # Calculate player position coordinates
        player_x, player_y = calculate_player_coordinates(player_position)

        # Create a drawing context
        draw = ImageDraw.Draw(board_image)

        # Draw a circle to represent the player at their position
        radius = 15
        draw.ellipse((player_x - radius, player_y - radius, player_x + radius, player_y + radius), fill='red')

        st.image(board_image, caption="Snake and Ladder Board", width=500)
    except requests.exceptions.RequestException as e:
            st.write(f"Could not load the game board image. Please check your internet connection or try again later. {e}")
    except Exception as e:
        st.write(f"An error occurred: {e}")



def snake_and_ladder():
    st.title("Snake and Ladder Game")

    board = {
        1: 1, 4: 25, 8: 13, 11: 6, 14: 30,
        16: 10, 19: 3, 22: 37, 24: 16,
        26: 12, 28: 43, 33: 2, 35: 17,
        39: 50, 41: 20, 46: 5, 48: 63,
        52: 81, 55: 18, 57: 59, 60: 32,
        62: 65, 64: 45, 67: 71, 73: 69,
        76: 44, 78: 54, 80: 99, 82: 89,
        84: 21, 87: 100, 91: 68, 93: 70,
        95: 23, 98: 79
    }

    if 'player_pos' not in st.session_state:
        st.session_state.player_pos = 1

    player_pos = st.session_state.player_pos

    display_game_board(player_pos)

    if player_pos < 100:
        if st.button("Roll Dice"):
            dice = roll_dice()
            st.write(f"You rolled a {dice}")

            player_pos = update_player_position(player_pos, dice, board)

            if player_pos > 100:
                player_pos -= dice
                st.write("You need to get to 100 to win, Try Again!")
            else:
                st.write(f"Your position is {player_pos}")

            st.session_state.player_pos = player_pos
            st.rerun()
    else:
        st.success("Congratulations! You won!")
        if st.button("Play Again"):
            st.session_state.player_pos = 1
            st.rerun()
snake_and_ladder()