File size: 3,052 Bytes
27798b9
 
42d5b4f
 
 
27798b9
d29f19d
 
 
 
 
982e84c
d29f19d
27798b9
42d5b4f
 
 
982e84c
71c2520
 
27798b9
 
71c2520
27798b9
d29f19d
 
27798b9
d29f19d
 
27798b9
 
 
 
 
 
 
d29f19d
 
 
 
 
 
27798b9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71c2520
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
# Code Destiny and Density is equal to one hundred.

st.Markdown("TODO: A code density slider bar shows and adjusts the size of lines.  ')
st.Markdown('Any ๐ŸŽฒDice๐ŸŽฒ way to compress the lines yet make it readable as optimal list of sets will do.  Match language from good math books.')
            
            
import streamlit as st
import numpy as np
import pandas as pd
import plotly.express as px

st.title('Random Dice Game')

dice_types = [{'name': 'Six-sided Dice', 'sides': 6, 'emoji': '๐ŸŽฒ'},
              {'name': 'Twenty-sided Dice', 'sides': 20, 'emoji': '๐Ÿ'},
              {'name': 'Thirty-sided Dice', 'sides': 30, 'emoji': '๐Ÿฅ'},
              {'name': 'One Hundred-sided Dice', 'sides': 100, 'emoji': '๐Ÿง‡'}]

if 'name' not in st.session_state:
    st.session_state.name = ''
if 'dice_roll_history' not in st.session_state:
    st.session_state.dice_roll_history = pd.DataFrame()

dice_type = st.selectbox('Choose a type of dice', dice_types, format_func=lambda d: f"{d['name']} {d['emoji']}")
num_rolls = st.slider('How many times do you want to roll the dice?', 1, 1000000, 1000)

rolls = np.random.randint(1, dice_type['sides'] + 1, num_rolls, dtype=np.uint64)
roll_counts = pd.Series(rolls).value_counts().sort_index()

fig = px.sunburst(names=[f'Roll {i}' for i in roll_counts.index],
                  parents=['Dice Rolls'] * dice_type['sides'],
                  values=roll_counts.values,
                  color=[f'Roll {i}' for i in roll_counts.index],
                  color_discrete_sequence=px.colors.qualitative.Dark24,
                  maxdepth=2)
fig.update_layout(title='Dice Roll Distribution', margin=dict(l=20, r=20, t=40, b=20), width=800, height=600)

show_labels = st.checkbox('Show Labels', value=True)
if not show_labels:
    fig.update_traces(textinfo='none')
fig.show()

bonus_match = False
for dice in dice_types:
    if rolls[0] == dice['sides']:
        bonus_match = True
        bonus_dice_type = dice['name']
        bonus_dice_emoji = dice['emoji']
        break

dice_roll_history = st.session_state.dice_roll_history
new_roll_data = pd.DataFrame({'Roll': rolls,
                              'Count': np.ones(num_rolls, dtype=np.uint64),
                              'DiceNumberOfSides': [dice_type['sides']] * num_rolls,
                              'DiceRollerName': [st.session_state.name] * num_rolls})
if bonus_match:
    new_roll_data['BonusMatchToDiceName'] = [bonus_dice_type] * num_rolls
    new_roll_data['BonusMatchToDiceEmoji'] = [bonus_dice_emoji] * num_rolls
dice_roll_history = dice_roll_history.append(new_roll_data, ignore_index=True)
st.session_state.dice_roll_history = dice_roll_history

if st.button('Download Results'):
    filename = f'dice_roll_history_{st.session_state.name}.csv'
    st.download_button(label='Download CSV', data=dice_roll_history.to_csv(index=False), file_name=filename, mime='text/csv')

if st.session_state.dice_roll_history.shape[0] > 0:
    st.markdown('### Dice Roll History')
    st.dataframe(st.session_state.dice_roll_history)