Files
2025-09-16 15:00:16 +02:00

77 lines
2.2 KiB
Python
Executable File

import random
import math
import matplotlib.pyplot as plt
def calculate_xp_needed_for_next_level(level: int) -> int:
return int(
35 * (level**2) + 35 * level
)
def get_level_from_xp(total_xp: int) -> int:
level = 0
while True:
xp_needed = calculate_xp_needed_for_next_level(level)
if total_xp < xp_needed:
break
level += 1
return level
def simulate_xp(num_messages=1000):
total_xp = 0
xp_per_message = []
xp_progression = []
level_ups = []
current_level = 0
for i in range(num_messages):
# Simulate a message length between 5 and 120 characters
msg_length = random.randint(5, 120)
base = random.randint(2, 5)
length_bonus = min(msg_length, 100) // 20 # +1 XP per 20 chars, max +5
extra_xp = base + length_bonus
extra_xp = min(extra_xp, 8) # cap at 8 XP per message
xp_per_message.append(extra_xp)
total_xp += extra_xp
xp_progression.append(total_xp)
# Check for level up
next_level_xp = calculate_xp_needed_for_next_level(current_level)
if total_xp >= next_level_xp:
current_level += 1
level_ups.append(i + 1) # Message number where level up occurred
avg_xp = total_xp / num_messages
level = get_level_from_xp(total_xp)
print(f"Simulated {num_messages} messages.")
print(f"Total XP: {total_xp}")
print(f"Average XP per message: {avg_xp:.2f}")
print(f"Min XP in a message: {min(xp_per_message)}")
print(f"Max XP in a message: {max(xp_per_message)}")
print(f"Level reached: {level}")
# Plot XP progression and level-ups
plt.figure(figsize=(10, 6))
plt.plot(range(1, num_messages + 1), xp_progression, label="Total XP")
if level_ups:
plt.scatter(
level_ups,
[xp_progression[i - 1] for i in level_ups],
color="red",
label="Level Up",
zorder=5,
)
plt.xlabel("Message Number")
plt.ylabel("Cumulative XP")
plt.title("XP Progression Over Messages")
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()
if __name__ == "__main__":
simulate_xp(1000000)