Skip to content

Instantly share code, notes, and snippets.

@Rapptz
Last active January 26, 2022 19:31
Show Gist options
  • Star 18 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save Rapptz/dbfd8cd945a9245e5504a54c2b9eda03 to your computer and use it in GitHub Desktop.
Save Rapptz/dbfd8cd945a9245e5504a54c2b9eda03 to your computer and use it in GitHub Desktop.
from discord.ext import commands
import discord
class TicTacToeButton(discord.ui.Button['TicTacToe']):
def __init__(self, x: int, y: int):
super().__init__(style=discord.ButtonStyle.secondary, label='\u200b', row=y)
self.x = x
self.y = y
async def callback(self, interaction: discord.Interaction):
assert self.view is not None
view: TicTacToe = self.view
state = view.board[self.y][self.x]
if state in (view.X, view.O):
return
if view.current_player == view.X:
self.style = discord.ButtonStyle.danger
self.label = 'X'
self.disabled = True
view.board[self.y][self.x] = view.X
view.current_player = view.O
content = "It is now O's turn"
else:
self.style = discord.ButtonStyle.success
self.label = 'O'
self.disabled = True
view.board[self.y][self.x] = view.O
view.current_player = view.X
content = "It is now X's turn"
winner = view.check_board_winner()
if winner is not None:
if winner == view.X:
content = 'X won!'
elif winner == view.O:
content = 'O won!'
else:
content = "It's a tie!"
for child in view.children:
assert isinstance(child, discord.ui.Button) # just to shut up the linter
child.disabled = True
view.stop()
await interaction.response.edit_message(content=content, view=view)
class TicTacToe(discord.ui.View):
X = -1
O = 1
Tie = 2
def __init__(self):
super().__init__()
self.current_player = self.X
self.board = [
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
]
for x in range(3):
for y in range(3):
self.add_item(TicTacToeButton(x, y))
def check_board_winner(self):
for across in self.board:
value = sum(across)
if value == 3:
return self.O
elif value == -3:
return self.X
# Check vertical
for line in range(3):
value = self.board[0][line] + self.board[1][line] + self.board[2][line]
if value == 3:
return self.O
elif value == -3:
return self.X
# Check diagonals
diag = self.board[0][2] + self.board[1][1] + self.board[2][0]
if diag == 3:
return self.O
elif diag == -3:
return self.X
diag = self.board[0][0] + self.board[1][1] + self.board[2][2]
if diag == 3:
return self.O
elif diag == -3:
return self.X
# If we're here, we need to check if a tie was made
if all(i != 0 for row in self.board for i in row):
return self.Tie
return None
bot = commands.Bot(command_prefix=commands.when_mentioned_or('$'))
@bot.command()
async def tic(ctx: commands.Context):
await ctx.send('Tic Tac Toe: X goes first', view=TicTacToe())
bot.run(token)
@ubeydtalha
Copy link

ubeydtalha commented Nov 2, 2021

Thanks for example ^^

But, weirdly when I try ctx.send("d",view=ViewClass()) it raises TypeError: send() got an unexpected keyword argument 'view' although I use discord.py 2.0.0a. (Edit: view parameter is in source codes)
I solved with sending message firstly and edit its ,by giving view parameter.

msg = await ctx.send("d")
await message.edit(view=ViewClass()) 

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment