1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
from random import choice
from discord import Member, TextChannel
from discord.ext import commands
from discord.ext.commands import guild_only
from bot.bot import Bot
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_DICT = {
'r': {
'r': 0,
'p': -1,
's': 1,
},
'p': {
'r': 1,
'p': 0,
's': -1,
},
's': {
'r': -1,
'p': 1,
's': 0,
}
}
class RPS(commands.Cog):
"""Rock Paper Scissor. The Classic Game!"""
@staticmethod
def get_winner(action_one: str, action_two: str) -> int:
"""Returns result of match from (-1, 0, 1) as (lost, tied, won)."""
return WINNER_DICT[action_one][action_two]
@staticmethod
def make_move() -> str:
"""Returns random move for bot from CHOICES."""
return choice(CHOICES)
async def game_start(self, player: Member, channel: TextChannel, action: str) -> None:
"""
Check action of player, draw a move and return result.
After checking if action of player is valid, make a random move.
And based on the move, compare moves of both player and bot and send approprite result.
"""
if not action:
await channel.send("Please make a move.")
return
action = action.lower()
if action not in CHOICES and action not in SHORT_CHOICES:
await channel.send(f"Invalid move. Please make move from options: {' '.join(CHOICES)}")
return
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."
await channel.send(message_string)
elif player_result == 1:
await channel.send(f"Sir Lancebot played {bot_move.upper()}! {player.mention} Won!")
else:
await channel.send(f"Sir Lancebot played {bot_move.upper()}! {player.mention} Lost!")
@guild_only()
@commands.command(
invoke_without_command=True,
case_insensitive=True
)
async def rps(self, ctx: commands.Context, move: str) -> None:
"""Play the classic game of Rock Paper Scissor with your own sir-lancebot!"""
await self.game_start(ctx.author, ctx.channel, move)
def setup(bot: Bot) -> None:
"""Load RPS Cog."""
bot.add_cog(RPS(bot))
|