You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Fox-V3/rpsls/rpsls.py

79 lines
2.3 KiB

import asyncio
import random
import discord
from redbot.core import commands
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
class RPSLS(Cog):
"""Play Rock Paper Scissors Lizard Spock."""
weaknesses = {
"rock": ["paper", "spock"],
"paper": ["scissors", "lizard"],
"scissors": ["spock", "rock"],
"lizard": ["scissors", "rock"],
"spock": ["paper", "lizard"],
}
def __init__(self, bot):
self.bot = bot
@commands.command()
async def rpsls(self, ctx: commands.Context, choice: str):
"""
Play Rock Paper Scissors Lizard Spock by Sam Kass in Discord!
Rules:
Scissors cuts Paper
Paper covers Rock
Rock crushes Lizard
Lizard poisons Spock
Spock smashes Scissors
Scissors decapitates Lizard
Lizard eats Paper
Paper disproves Spock
Spock vaporizes Rock
And as it has always Rock crushes Scissors
"""
player_choice = choice.lower()
player_emote = self.get_emote(player_choice)
if player_emote is None:
await ctx.maybe_send_embed("Invalid Choice")
return
bot_choice = random.choice(list(self.weaknesses.keys()))
bot_emote = self.get_emote(bot_choice)
message = "{} vs. {}, who will win?".format(player_emote, bot_emote)
em = discord.Embed(description=message, color=discord.Color.blue())
await ctx.send(embed=em)
await asyncio.sleep(2)
if player_choice in self.weaknesses[bot_choice]:
message = "You win! :sob:"
em_color = discord.Color.green()
elif bot_choice in self.weaknesses[player_choice]:
message = "I win! :smile:"
em_color = discord.Color.red()
else:
message = "It's a draw! :neutral_face:"
em_color = discord.Color.blue()
em = discord.Embed(description=message, color=em_color)
await ctx.send(embed=em)
def get_emote(self, choice):
if choice == "rock":
emote = ":moyai:"
elif choice == "spock":
emote = ":vulcan:"
elif choice == "paper":
emote = ":page_facing_up:"
elif choice in ["scissors", "lizard"]:
emote = ":{}:".format(choice)
else:
emote = None
return emote