diff options
author | 2021-05-31 19:22:27 +0530 | |
---|---|---|
committer | 2021-05-31 19:22:27 +0530 | |
commit | 8e8de36ca18f2c830adb30aef970467c740b0b49 (patch) | |
tree | 9641926c1e3bd91a23cee6f1d28f392cc429cfc5 /bot/exts/evergreen/rps.py | |
parent | Merge pull request #757 from python-discord/block-some-status-dog-codes (diff) |
adeed rps command
Diffstat (limited to 'bot/exts/evergreen/rps.py')
-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)) |