-
-
Save Rapptz/dbfd8cd945a9245e5504a54c2b9eda03 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
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
It keeps sending this error what do I do?