Grandediw's picture
Update app.py
dc0fd01 verified
raw
history blame
18.8 kB
import gradio as gr
import pandas as pd
import numpy as np
from xgboost import Booster, DMatrix
# Generating the complete `card_images` dictionary
card_numbers = {
"Archers": 1, "Archer Queen": 2, "Baby Dragon": 3, "Balloon": 4, "Bandit": 5, "Barbarians": 6,
"Bats": 7, "Battle Healer": 8, "Battle Ram": 9, "Bomber": 10, "Bowler": 11, "Bush Goblins": 12,
"Cannon Cart": 13, "Cursed Hog": 14, "Dark Prince": 15, "Dart Goblin": 16, "Electro Dragon": 17,
"Electro Giant": 18, "Electro Spirit": 19, "Electro Wizard": 20, "Elite Barbarians": 21,
"Elixir Blob": 22, "Elixir Golem": 23, "Elixir Golemite": 24, "Executioner": 25, "Firecracker": 26,
"Fire Spirit": 27, "Fisherman": 28, "Flying Machine": 29, "Giant": 30, "Giant Skeleton": 31,
"Goblin Brawler": 32, "Goblin Gang": 33, "Goblin Demolisher": 34, "Goblin Giant": 35,
"Goblin Machine": 36, "Goblins": 37, "Goblinstein": 38, "Golden Knight": 39, "Golem": 40,
"Golemite": 41, "Guardienne": 42, "Guards": 43, "Hog Rider": 44, "Hunter": 45, "Heal Spirit": 46,
"Ice Golem": 47, "Ice Spirit": 48, "Ice Wizard": 49, "Inferno Dragon": 50, "Knight": 51,
"Lava Hound": 52, "Lava Pup": 53, "Little Prince": 54, "Lumberjack": 55, "Magic Archer": 56,
"Mega Knight": 57, "Mega Minion": 58, "Mighty Miner": 59, "Miner": 60, "Mini P.E.K.K.A.": 61,
"Minion Horde": 62, "Minions": 63, "Monk": 64, "Mother Witch": 65, "Monster": 66, "Musketeer": 67,
"Night Witch": 68, "P.E.K.K.A.": 69, "Phoenix": 70, "Reborn Phoenix": 71, "Prince": 72,
"Princess": 73, "Ram Rider": 74, "Rascal Boy": 75, "Rascal Girl": 76, "Royal Ghost": 77,
"Royal Giant": 78, "Royal Hogs": 79, "Royal Recruits": 80, "Skeleton Army": 81,
"Skeleton Barrel": 82, "Skeleton Dragons": 83, "Skeleton King": 84, "Skeletons": 85, "Sparky": 86,
"Spear Goblins": 87, "Suspicious Bush": 88, "Three Musketeers": 89, "Valkyrie": 90,
"Wall Breakers": 91, "Witch": 92, "Wizard": 93, "Zappies": 94, "Bomb Tower": 95, "Cannon": 96,
"Cannon Cart (broken)": 97, "Inferno Tower": 98, "Mortar": 99, "Tesla": 100, "X-Bow": 101,
"Barbarian Hut": 102, "Elixir Collector": 103, "Furnace": 104, "Goblin Cage": 105,
"Goblin Drill": 106, "Goblin Hut": 107, "Phoenix Egg": 108, "Tombstone": 109, "Arrows": 110,
"Barbarian Barrel": 111, "Earthquake": 112, "Fireball": 113, "Freeze": 114, "Giant Snowball": 115,
"Goblin Curse": 116, "Lightning": 117, "Poison": 118, "Rage": 119, "Rocket": 120,
"Royal Delivery": 121, "The Log": 122, "Tornado": 123, "Void": 124, "Zap": 125#,
#"Archers/Evolution": 155, "Barbarians/Evolution": 156, "Battle Ram/Evolution": 157,
#"Bats/Evolution": 158, "Bomber/Evolution": 159, "Cannon/Evolution": 160,
#"Electro Dragon/Evolution": 161, "Firecracker/Evolution": 162, "Giant Snowball/Evolution": 163,
#"Goblin Barrel/Evolution": 164, "Goblin Cage/Evolution": 165, "Goblin Drill/Evolution": 166,
#"Goblin Giant/Evolution": 167, "Ice Spirit/Evolution": 168, "Knight/Evolution": 169,
#"Mega Knight/Evolution": 170, "Mortar/Evolution": 171, "Musketeer/Evolution": 172,
#"P.E.K.K.A/Evolution": 173, "Royal Giant/Evolution": 174, "Royal Recruits/Evolution": 175,
#"Skeletons/Evolution": 176, "Tesla/Evolution": 177, "Valkyrie/Evolution": 178,
#"Wall Breakers/Evolution": 179, "Wizard/Evolution": 180, "Zap/Evolution": 181
}
# Normalize card names and generate the full URLs
card_images = {"Archers": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/archers.png",
"Archer Queen": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/archer-queen.png",
"Baby Dragon": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/baby-dragon.png",
"Balloon": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/balloon.png",
"Bandit": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/bandit.png",
"Barbarians": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/barbarians.png",
"Bats": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/bats.png",
"Battle Healer": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/battle-healer.png",
"Battle Ram": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/battle-ram.png",
"Bomber": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/bomber.png",
"Bowler": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/bowler.png",
"Bush Goblins": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/bush-goblins.png",
"Cannon Cart": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/cannon-cart.png",
"Cursed Hog": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/cursed-hog.png",
"Dark Prince": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/dark-prince.png",
"Dart Goblin": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/dart-goblin.png",
"Electro Dragon": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/electro-dragon.png",
"Electro Giant": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/electro-giant.png",
"Electro Spirit": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/electro-spirit.png",
"Electro Wizard": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/electro-wizard.png",
"Elite Barbarians": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/elite-barbarians.png",
"Elixir Blob": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/elixir-blob.png",
"Elixir Golem": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/elixir-golem.png",
"Elixir Golemite": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/elixir-golemite.png",
"Executioner": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/executioner.png",
"Firecracker": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/firecracker.png",
"Fire Spirit": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/fire-spirit.png",
"Fisherman": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/fisherman.png",
"Flying Machine": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/flying-machine.png",
"Giant": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/giant.png",
"Giant Skeleton": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/giant-skeleton.png",
"Goblin Brawler": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/goblin-brawler.png",
"Goblin Gang": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/goblin-gang.png",
"Goblin Demolisher": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/goblin-demolisher.png",
"Goblin Giant": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/goblin-giant.png",
"Goblin Machine": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/goblin-machine.png",
"Goblins": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/goblins.png",
"Goblinstein": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/goblinstein.png",
"Golden Knight": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/golden-knight.png",
"Golem": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/golem.png",
"Golemite": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/golemite.png",
"Guardienne": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/guardienne.png",
"Guards": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/guards.png",
"Hog Rider": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/hog-rider.png",
"Hunter": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/hunter.png",
"Heal Spirit": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/heal-spirit.png",
"Ice Golem": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/ice-golem.png",
"Ice Spirit": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/ice-spirit.png",
"Ice Wizard": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/ice-wizard.png",
"Inferno Dragon": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/inferno-dragon.png",
"Knight": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/knight.png",
"Lava Hound": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/lava-hound.png",
"Lava Pup": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/lava-pup.png",
"Little Prince": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/little-prince.png",
"Lumberjack": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/lumberjack.png",
"Magic Archer": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/magic-archer.png",
"Mega Knight": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/mega-knight.png",
"Mega Minion": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/mega-minion.png",
"Mighty Miner": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/mighty-miner.png",
"Miner": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/miner.png",
"Mini P.E.K.K.A.": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/mini-pekka.png",
"Minion Horde": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/minion-horde.png",
"Minions": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/minions.png",
"Monk": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/monk.png",
"Mother Witch": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/mother-witch.png",
"Monster": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/monster.png",
"Musketeer": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/musketeer.png",
"Night Witch": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/night-witch.png",
"P.E.K.K.A.": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/pekka.png",
"Phoenix": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/phoenix.png",
"Reborn Phoenix": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/reborn-phoenix.png",
"Prince": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/prince.png",
"Princess": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/princess.png",
"Ram Rider": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/ram-rider.png",
"Rascal Boy": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/rascal-boy.png",
"Rascal Girl": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/rascal-girl.png",
"Royal Ghost": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/royal-ghost.png",
"Royal Giant": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/royal-giant.png",
"Royal Hogs": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/royal-hogs.png",
"Royal Recruits": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/royal-recruits.png",
"Skeleton Army": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/skeleton-army.png",
"Skeleton Barrel": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/skeleton-barrel.png",
"Skeleton Dragons": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/skeleton-dragons.png",
"Skeleton King": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/skeleton-king.png",
"Skeletons": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/skeletons.png",
"Sparky": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/sparky.png",
"Spear Goblins": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/spear-goblins.png",
"Suspicious Bush": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/suspicious-bush.png",
"Three Musketeers": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/three-musketeers.png",
"Valkyrie": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/valkyrie.png",
"Wall Breakers": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/wall-breakers.png",
"Witch": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/witch.png",
"Wizard": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/wizard.png",
"Zappies": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/zappies.png",
"Bomb Tower": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/bomb-tower.png",
"Cannon": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/cannon.png",
"Cannon Cart (broken)": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/cannon-cart-(broken).png",
"Inferno Tower": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/inferno-tower.png",
"Mortar": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/mortar.png",
"Tesla": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/tesla.png",
"X-Bow": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/x-bow.png",
"Barbarian Hut": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/barbarian-hut.png",
"Elixir Collector": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/elixir-collector.png",
"Furnace": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/furnace.png",
"Goblin Cage": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/goblin-cage.png",
"Goblin Drill": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/goblin-drill.png",
"Goblin Hut": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/goblin-hut.png",
"Phoenix Egg": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/phoenix-egg.png",
"Tombstone": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/tombstone.png",
"Arrows": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/arrows.png",
"Barbarian Barrel": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/barbarian-barrel.png",
"Earthquake": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/earthquake.png",
"Fireball": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/fireball.png",
"Freeze": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/freeze.png",
"Giant Snowball": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/giant-snowball.png",
"Goblin Curse": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/goblin-curse.png",
"Lightning": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/lightning.png",
"Poison": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/poison.png",
"Rage": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/rage.png",
"Rocket": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/rocket.png",
"Royal Delivery": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/royal-delivery.png",
"The Log": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/the-log.png",
"Tornado": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/tornado.png",
"Void": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/void.png",
"Zap": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/zap.png",
"Goblin Barrel": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/goblin-barrel.png",
"Graveyard": "https://raw.githubusercontent.com/RoyaleAPI/cr-api-assets/master/cards/graveyard.png"
}
MODEL_PATH = "model.json"
def load_model(model_path):
"""Load the saved XGBoost model."""
model = Booster()
model.load_model(model_path)
return model
def deck_to_ids(deck, mapping):
"""Convert card names to IDs based on the mapping."""
return [mapping.get(card, 0) - 1 for card in deck]
def preprocess_deck(deck):
"""Prepare the selected deck for the model."""
deck_ids = deck_to_ids(deck, card_numbers)
num_choices = len(card_numbers)
one_hot = np.zeros(num_choices, dtype=int)
one_hot[np.array(deck_ids)] = 1
features = np.concatenate(([0, 0], one_hot))
return pd.DataFrame([features])
def predict_outcome(opponent_deck):
"""Make a prediction based on the opponent's deck."""
deck_data = preprocess_deck(opponent_deck)
dmatrix = DMatrix(deck_data)
prediction = model.predict(dmatrix)
return f"Probability of Winning: {prediction[0] * 100:.2f}%"
# Load the model
model = load_model(MODEL_PATH)
# Create Gradio Interface
with gr.Blocks() as interface:
gr.Markdown("## Clash Royale Prediction")
gr.Markdown("Select 8 cards from the opponent's deck to predict the probability of winning!")
selected_deck = gr.State([]) # To store selected cards
card_buttons = []
with gr.Row():
for card_name, image_url in card_images.items():
def select_card(card_name):
def toggle(state):
if card_name in state:
state.remove(card_name)
else:
state.append(card_name)
return state
return toggle
button = gr.Image(
value=image_url,
label=card_name,
interactive=True,
)
button.change(select_card(card_name), inputs=[selected_deck], outputs=[selected_deck])
card_buttons.append(button)
result = gr.Textbox(label="Prediction Result:", interactive=False)
def validate_and_predict(deck):
if len(deck) != 8:
return "Error: Select exactly 8 cards."
return predict_outcome(deck)
predict_button = gr.Button("Make Prediction")
predict_button.click(validate_and_predict, inputs=[selected_deck], outputs=[result])
interface.launch()