如何给tictactoe discord BOT添加结束功能(discord.py)
How to add end function to tictactoe discord BOT (discord.py)
我的 tictactoe BOT 只有在玩家获胜后才能结束游戏。我需要向 BOT 添加一个功能,以便在命令为 运行 时结束游戏。
如何将结束功能添加到此 BOT?
例如:游戏正在进行中,我想在中间结束游戏。当我运行一个命令,在这个例子中是-end,我需要BOT来停止游戏。
import discord
from discord.ext import commands
import random
import urllib.request
import re
import youtube_dl
import os
import requests
client = commands.Bot(command_prefix= "-")
@client.event
async def on_ready():
print("READY TO PLAY TICTACTOE!!")
player1 = ""
player2 = ""
turn = ""
gameOver = True
board = []
winningConditions = [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8],
[0, 3, 6],
[1, 4, 7],
[2, 5, 8],
[0, 4, 8],
[2, 4, 6]
]
@client.command()
async def tictactoe(ctx, p1: discord.Member, p2: discord.Member):
global count
global player1
global player2
global turn
global gameOver
if gameOver:
global board
board = [":white_large_square:", ":white_large_square:", ":white_large_square:",
":white_large_square:", ":white_large_square:", ":white_large_square:",
":white_large_square:", ":white_large_square:", ":white_large_square:"]
turn = ""
gameOver = False
count = 0
player1 = p1
player2 = p2
# print the board
line = ""
for x in range(len(board)):
if x == 2 or x == 5 or x == 8:
line += " " + board[x]
await ctx.send(line)
line = ""
else:
line += " " + board[x]
# determine who goes first
num = random.randint(1, 2)
if num == 1:
turn = player1
myEmbed = discord.Embed(title= "GAME IN PROGRESS",description="IT IS <@" + str(player1.id) + ">'s TURN.",color=0xe74c3c)
await ctx.send(embed=myEmbed)
elif num == 2:
turn = player2
myEmbed = discord.Embed(title= "GAME IN PROGRESS",description="IT IS <@" + str(player2.id) + ">'s TURN.",color=0xe74c3c)
await ctx.send(embed=myEmbed)
else:
myEmbed = discord.Embed(title= "GAME IN PROGRESS",description="A GAME IS STILL IN PROGRESS. FINISH IT BEFORE STARTING A NEW ONE",color=0xe74c3c)
await ctx.send(embed=myEmbed)
@client.command()
async def place(ctx, pos: int):
global turn
global player1
global player2
global board
global count
global gameOver
if not gameOver:
mark = ""
if turn == ctx.author:
if turn == player1:
mark = ":regional_indicator_x:"
elif turn == player2:
mark = ":o2:"
if 0 < pos < 10 and board[pos - 1] == ":white_large_square:" :
board[pos - 1] = mark
count += 1
# print the board
line = ""
for x in range(len(board)):
if x == 2 or x == 5 or x == 8:
line += " " + board[x]
await ctx.send(line)
line = ""
else:
line += " " + board[x]
checkWinner(winningConditions, mark)
print(count)
if gameOver == True:
myEmbed = discord.Embed(title= "WINNER!",description=mark + " :crown: ",color=0xf1c40f)
await ctx.send(embed=myEmbed)
elif count >= 9:
gameOver = True
myEmbed = discord.Embed(title= "TIE",description="IT'S A TIE :handshake:",color=0xf1c40f)
await ctx.send(embed=myEmbed)
# switch turns
if turn == player1:
turn = player2
elif turn == player2:
turn = player1
else:
myEmbed = discord.Embed(title= "PLACE ERROR!",description="BE SURE TO CHOOSE AN INTEGER BETWEEN 1 AND 9 (INCLUSIVE) AND AN UNMARKED TILE. ",color=0xe74c3c)
await ctx.send(embed=myEmbed)
else:
myEmbed = discord.Embed(title= "TURN ERROR!",description="IT'S NOT YOUR TURN",color=0xe74c3c)
await ctx.send(embed=myEmbed)
else:
myEmbed = discord.Embed(title= "START GAME",description="TO START A NEW GAME, USE -tictactoe COMMAND",color=0x2ecc71)
await ctx.send(embed=myEmbed)
def checkWinner(winningConditions, mark):
global gameOver
for condition in winningConditions:
if board[condition[0]] == mark and board[condition[1]] == mark and board[condition[2]] == mark:
gameOver = True
@tictactoe.error
async def tictactoe_error(ctx, error):
print(error)
if isinstance(error, commands.MissingRequiredArgument):
myEmbed = discord.Embed(title= "MENTION ERROR!",description="PLEASE MENTION 2 USERS",color=0xe74c3c)
await ctx.send(embed=myEmbed)
elif isinstance(error, commands.BadArgument):
myEmbed = discord.Embed(title= "ERROR!",description="PLEASE MAKE SURE TO MENTION/PING PLAYERS (ie. <@688534433879556134>)",color=0xe74c3c)
await ctx.send(embed=myEmbed)
@place.error
async def place_error(ctx, error):
if isinstance(error, commands.MissingRequiredArgument):
myEmbed = discord.Embed(title= "NO POSITION",description="PLEASE ENTER A POSITION TO MARK",color=0xe74c3c)
await ctx.send(embed=myEmbed)
elif isinstance(error, commands.BadArgument):
myEmbed = discord.Embed(title= "INTEGER ERROR!",description="PLEASE MAKE SURE IT'S AN INTEGER",color=0xe74c3c)
await ctx.send(embed=myEmbed)
client.run("")
我强烈建议您不要使用 global 变量,因为它们非常危险并且只能以只读方式使用,您可以简单地将这些变量作为参数传递到您的函数。
无论哪种方式,如果您想重置游戏,根据您当前的代码判断,最简单的方法是使用一个函数将这些 global 变量放回它们的位置原始值,像这样:
@client.command()
async def end(ctx):
# We need to declare them as global first
global count
global player1
global player2
global turn
global gameOver
# Assign their initial value
count = 0
player1 = ""
player2 = ""
turn = ""
gameOver = True
# Now print your message or whatever you want
myEmbed = discord.Embed(title= "RESET GAME",description="TO START A NEW GAME, USE -tictactoe COMMAND",color=0x2ecc71)
await ctx.send(embed=myEmbed)
我有更好的解决方案
@client.command()
async def tictactoe(ctx, p1: discord.Member, p2: discord.Member):
global count
global player1
global player2
global turn
global gameOver
global p1_id
global p2_id
if gameOver:
global board
board = [":white_large_square:", ":white_large_square:", ":white_large_square:",
":white_large_square:", ":white_large_square:", ":white_large_square:",
":white_large_square:", ":white_large_square:", ":white_large_square:"]
turn = ""
gameOver = False
count = 0
p1_id = p1.id
p2_id = p2.id
player1 = p1
player2 = p2
你首先要得到玩家1和2的id,然后将他们添加到全局
然后在 end function
中使用一个简单的 if else 语句
结束函数:
@client.command()
async def end(ctx):
global count
global player1
global player2
global turn
global gameOver
global p1_id
global p2_id
if ctx.message.author.id == p1_id or ctx.message.author.id == p2_id:
count = 0
player1 = ""
player2 = ""
turn = ""
gameOver = True
myEmbed = discord.Embed(title= "Game Reset",description="To start a new game, USE $tictactoe command",color=0x2ecc71)
await ctx.send(embed=myEmbed)
else:
await ctx.send('Only those who started the game can end this game')
在@Shunya 的代码中,任何人都可以结束游戏,但在我的代码中,只有开始游戏的那两个人才能结束游戏
希望对您有所帮助:)
我的 tictactoe BOT 只有在玩家获胜后才能结束游戏。我需要向 BOT 添加一个功能,以便在命令为 运行 时结束游戏。 如何将结束功能添加到此 BOT? 例如:游戏正在进行中,我想在中间结束游戏。当我运行一个命令,在这个例子中是-end,我需要BOT来停止游戏。
import discord
from discord.ext import commands
import random
import urllib.request
import re
import youtube_dl
import os
import requests
client = commands.Bot(command_prefix= "-")
@client.event
async def on_ready():
print("READY TO PLAY TICTACTOE!!")
player1 = ""
player2 = ""
turn = ""
gameOver = True
board = []
winningConditions = [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8],
[0, 3, 6],
[1, 4, 7],
[2, 5, 8],
[0, 4, 8],
[2, 4, 6]
]
@client.command()
async def tictactoe(ctx, p1: discord.Member, p2: discord.Member):
global count
global player1
global player2
global turn
global gameOver
if gameOver:
global board
board = [":white_large_square:", ":white_large_square:", ":white_large_square:",
":white_large_square:", ":white_large_square:", ":white_large_square:",
":white_large_square:", ":white_large_square:", ":white_large_square:"]
turn = ""
gameOver = False
count = 0
player1 = p1
player2 = p2
# print the board
line = ""
for x in range(len(board)):
if x == 2 or x == 5 or x == 8:
line += " " + board[x]
await ctx.send(line)
line = ""
else:
line += " " + board[x]
# determine who goes first
num = random.randint(1, 2)
if num == 1:
turn = player1
myEmbed = discord.Embed(title= "GAME IN PROGRESS",description="IT IS <@" + str(player1.id) + ">'s TURN.",color=0xe74c3c)
await ctx.send(embed=myEmbed)
elif num == 2:
turn = player2
myEmbed = discord.Embed(title= "GAME IN PROGRESS",description="IT IS <@" + str(player2.id) + ">'s TURN.",color=0xe74c3c)
await ctx.send(embed=myEmbed)
else:
myEmbed = discord.Embed(title= "GAME IN PROGRESS",description="A GAME IS STILL IN PROGRESS. FINISH IT BEFORE STARTING A NEW ONE",color=0xe74c3c)
await ctx.send(embed=myEmbed)
@client.command()
async def place(ctx, pos: int):
global turn
global player1
global player2
global board
global count
global gameOver
if not gameOver:
mark = ""
if turn == ctx.author:
if turn == player1:
mark = ":regional_indicator_x:"
elif turn == player2:
mark = ":o2:"
if 0 < pos < 10 and board[pos - 1] == ":white_large_square:" :
board[pos - 1] = mark
count += 1
# print the board
line = ""
for x in range(len(board)):
if x == 2 or x == 5 or x == 8:
line += " " + board[x]
await ctx.send(line)
line = ""
else:
line += " " + board[x]
checkWinner(winningConditions, mark)
print(count)
if gameOver == True:
myEmbed = discord.Embed(title= "WINNER!",description=mark + " :crown: ",color=0xf1c40f)
await ctx.send(embed=myEmbed)
elif count >= 9:
gameOver = True
myEmbed = discord.Embed(title= "TIE",description="IT'S A TIE :handshake:",color=0xf1c40f)
await ctx.send(embed=myEmbed)
# switch turns
if turn == player1:
turn = player2
elif turn == player2:
turn = player1
else:
myEmbed = discord.Embed(title= "PLACE ERROR!",description="BE SURE TO CHOOSE AN INTEGER BETWEEN 1 AND 9 (INCLUSIVE) AND AN UNMARKED TILE. ",color=0xe74c3c)
await ctx.send(embed=myEmbed)
else:
myEmbed = discord.Embed(title= "TURN ERROR!",description="IT'S NOT YOUR TURN",color=0xe74c3c)
await ctx.send(embed=myEmbed)
else:
myEmbed = discord.Embed(title= "START GAME",description="TO START A NEW GAME, USE -tictactoe COMMAND",color=0x2ecc71)
await ctx.send(embed=myEmbed)
def checkWinner(winningConditions, mark):
global gameOver
for condition in winningConditions:
if board[condition[0]] == mark and board[condition[1]] == mark and board[condition[2]] == mark:
gameOver = True
@tictactoe.error
async def tictactoe_error(ctx, error):
print(error)
if isinstance(error, commands.MissingRequiredArgument):
myEmbed = discord.Embed(title= "MENTION ERROR!",description="PLEASE MENTION 2 USERS",color=0xe74c3c)
await ctx.send(embed=myEmbed)
elif isinstance(error, commands.BadArgument):
myEmbed = discord.Embed(title= "ERROR!",description="PLEASE MAKE SURE TO MENTION/PING PLAYERS (ie. <@688534433879556134>)",color=0xe74c3c)
await ctx.send(embed=myEmbed)
@place.error
async def place_error(ctx, error):
if isinstance(error, commands.MissingRequiredArgument):
myEmbed = discord.Embed(title= "NO POSITION",description="PLEASE ENTER A POSITION TO MARK",color=0xe74c3c)
await ctx.send(embed=myEmbed)
elif isinstance(error, commands.BadArgument):
myEmbed = discord.Embed(title= "INTEGER ERROR!",description="PLEASE MAKE SURE IT'S AN INTEGER",color=0xe74c3c)
await ctx.send(embed=myEmbed)
client.run("")
我强烈建议您不要使用 global 变量,因为它们非常危险并且只能以只读方式使用,您可以简单地将这些变量作为参数传递到您的函数。
无论哪种方式,如果您想重置游戏,根据您当前的代码判断,最简单的方法是使用一个函数将这些 global 变量放回它们的位置原始值,像这样:
@client.command()
async def end(ctx):
# We need to declare them as global first
global count
global player1
global player2
global turn
global gameOver
# Assign their initial value
count = 0
player1 = ""
player2 = ""
turn = ""
gameOver = True
# Now print your message or whatever you want
myEmbed = discord.Embed(title= "RESET GAME",description="TO START A NEW GAME, USE -tictactoe COMMAND",color=0x2ecc71)
await ctx.send(embed=myEmbed)
我有更好的解决方案
@client.command()
async def tictactoe(ctx, p1: discord.Member, p2: discord.Member):
global count
global player1
global player2
global turn
global gameOver
global p1_id
global p2_id
if gameOver:
global board
board = [":white_large_square:", ":white_large_square:", ":white_large_square:",
":white_large_square:", ":white_large_square:", ":white_large_square:",
":white_large_square:", ":white_large_square:", ":white_large_square:"]
turn = ""
gameOver = False
count = 0
p1_id = p1.id
p2_id = p2.id
player1 = p1
player2 = p2
你首先要得到玩家1和2的id,然后将他们添加到全局 然后在 end function
中使用一个简单的 if else 语句结束函数:
@client.command()
async def end(ctx):
global count
global player1
global player2
global turn
global gameOver
global p1_id
global p2_id
if ctx.message.author.id == p1_id or ctx.message.author.id == p2_id:
count = 0
player1 = ""
player2 = ""
turn = ""
gameOver = True
myEmbed = discord.Embed(title= "Game Reset",description="To start a new game, USE $tictactoe command",color=0x2ecc71)
await ctx.send(embed=myEmbed)
else:
await ctx.send('Only those who started the game can end this game')
在@Shunya 的代码中,任何人都可以结束游戏,但在我的代码中,只有开始游戏的那两个人才能结束游戏
希望对您有所帮助:)