diff options
| author | 2021-05-31 19:22:27 +0530 | |
|---|---|---|
| committer | 2021-05-31 19:22:27 +0530 | |
| commit | 8e8de36ca18f2c830adb30aef970467c740b0b49 (patch) | |
| tree | 9641926c1e3bd91a23cee6f1d28f392cc429cfc5 | |
| parent | Merge pull request #757 from python-discord/block-some-status-dog-codes (diff) | |
adeed rps command
| -rw-r--r-- | bot/exts/evergreen/rps.py | 98 | 
1 files changed, 98 insertions, 0 deletions
| diff --git a/bot/exts/evergreen/rps.py b/bot/exts/evergreen/rps.py new file mode 100644 index 00000000..3bb69871 --- /dev/null +++ b/bot/exts/evergreen/rps.py @@ -0,0 +1,98 @@ +import random +from bot.bot import Bot +import discord +from discord.ext import commands +from discord.ext.commands import guild_only + +choices = ['rock', 'paper', 'scissor'] +short_choices = ['r', 'p', 's'] +""" +Instead of putting bunch of conditions to check winner, +We can just manage this dictionary +""" +winner = { +    'r': { +        'r': 0, +        'p': -1, +        's': 1, +    }, +    'p': { +        'r': 1, +        'p': 0, +        's': -1, +    }, +    's': { +        'r': -1, +        'p': 1, +        's': 0, +    } +} + + +class Game: +    """A Rock Paper Scissors Game.""" +    def __init__( +        self, +        channel: discord.TextChannel, +    ) -> None: +        self.channel = channel + +    @staticmethod +    def get_winner(action_one, action_two): +        return winner[action_one][action_two] + +    @staticmethod +    def make_move() -> str: +        """Return move""" +        return random.choice(choices) + +    async def game_start(self, player, action) -> None: +        if not action: +            return await self.channel.send("Please make a move.") +        action = action.lower() +        if action not in choices and action not in short_choices: +            return await self.channel.send(f"Invalid move. Please make from options: {' '.join(choices)}") +        bot_move = self.make_move() +        player_result = self.get_winner(action[0], bot_move[0]) +        if player_result == 0: +            message_string = f"{player.mention} You and Sir Lancebot played {bot_move.upper()}, It's a tie." +            return await self.channel.send(message_string) +        elif player_result == 1: +            return await self.channel.send(f"Sir Lancebot played {bot_move.upper()}! {player.mention} Won!") +        else: +            return await self.channel.send(f"Sir Lancebot played {bot_move.upper()}! {player.mention} Lost!") + + +class RPS(commands.Cog): +    """Rock Paper Scissor. The Classic Game!""" +    """ +    def __init__(self, bot: Bot) -> None: +        self.bot = bot +    """ +    async def _play_game( +        self, +        ctx: commands.Context, +        move: str +    ) -> None: +        """Helper for playing RPS.""" +        game = Game(ctx.channel) +        await game.game_start(ctx.author, move) + +    @guild_only() +    @commands.group( +        invoke_without_command=True, +        case_insensitive=True +    ) +    async def rps( +        self, +        ctx: commands.Context, +        arg +    ) -> None: +        """ +        Play the classic game of Rock Paper Scisorr with your own sir lancebot! +        """ +        await self._play_game(ctx, arg) + + +def setup(bot: Bot) -> None: +    bot.add_cog(RPS(bot)) | 
