From f7f288f81d33a41d61fc77c3c14c61aa2122ff2a Mon Sep 17 00:00:00 2001 From: NikolajDanger Date: Sat, 1 Aug 2020 12:12:22 +0200 Subject: [PATCH] :sparkles: Four in a row "AI" --- Gwendolyn.py | 139 ++++++++++++++++++++++++-------------- funcs/games/__init__.py | 2 +- funcs/games/fourInARow.py | 37 ++++++---- 3 files changed, 110 insertions(+), 68 deletions(-) diff --git a/Gwendolyn.py b/Gwendolyn.py index 9e2dc52..56befd8 100644 --- a/Gwendolyn.py +++ b/Gwendolyn.py @@ -21,6 +21,83 @@ blackjackDecks = 4 # Variable for reacting to messages meanWords = ["stupid", "bitch", "fuck", "dumb", "idiot"] +# Runs Four in a Row +async def fiar(channel,command,user): + response, showImage, deleteImage, gameDone, gwendoTurn = parseFourInARow(command,str(channel),user) + await channel.send(response) + logThis(response,str(channel)) + if showImage: + if deleteImage: + oldImage = await deleteMessage("fourInARow"+str(channel),channel) + oldImage = await channel.send(file = discord.File("resources/games/4InARowBoards/board"+str(channel)+".png")) + if gameDone == False: + if gwendoTurn: + await asyncio.sleep(2) + response, showImage, deleteImage, gameDone, gwendoTurn = fourInARowAI(str(channel)) + await channel.send(response) + logThis(response,str(channel)) + if showImage: + if deleteImage: + await oldImage.delete() + oldImage = await channel.send(file = discord.File("resources/games/4InARowBoards/board"+str(channel)+".png")) + if gameDone == False: + with open("resources/games/oldImages/fourInARow"+str(channel), "w") as f: + f.write(str(oldImage.id)) + try: + await oldImage.add_reaction("1️⃣") + await oldImage.add_reaction("2️⃣") + await oldImage.add_reaction("3️⃣") + await oldImage.add_reaction("4️⃣") + await oldImage.add_reaction("5️⃣") + await oldImage.add_reaction("6️⃣") + await oldImage.add_reaction("7️⃣") + except: + logThis("Image deleted before I could react to all of them") + + else: + with open("resources/games/oldImages/fourInARow"+str(channel), "w") as f: + f.write(str(oldImage.id)) + try: + await oldImage.add_reaction("1️⃣") + await oldImage.add_reaction("2️⃣") + await oldImage.add_reaction("3️⃣") + await oldImage.add_reaction("4️⃣") + await oldImage.add_reaction("5️⃣") + await oldImage.add_reaction("6️⃣") + await oldImage.add_reaction("7️⃣") + except: + logThis("Image deleted before I could react to all of them") + + if gameDone: + with open("resources/games/games.json", "r") as f: + data = json.load(f) + + winner = data["4 in a row games"][str(channel)]["winner"] + if winner != 0: + with open("resources/games/games.json","w") as f: + json.dump(data,f,indent=4) + addMoney(data["4 in a row games"][str(channel)]["players"][winner-1].lower(),20) + with open("resources/games/games.json", "r") as f: + data = json.load(f) + + del data["4 in a row games"][str(channel)] + + with open("resources/games/games.json","w") as f: + json.dump(data,f,indent=4) + +# Deletes a message +async def deleteMessage(imageLocation,channel): + try: + logThis("Finding old image") + with open("resources/games/oldImages/"+imageLocation, "r") as f: + oldImage = await channel.fetch_message(int(f.read())) + logThis("Deleting old image") + await oldImage.delete() + except: + oldImage = "" + + return oldImage + # Loop of game rounds async def blackjackLoop(channel,gameRound,gameID): logThis("Loop "+str(gameRound),str(channel)) @@ -418,7 +495,7 @@ async def parseCommands(message,content): cardsLeft = 0 if os.path.exists("resources/games/blackjackCards/"+str(message.channel)+".txt"): with open("resources/games/blackjackCards/"+str(message.channel)+".txt","r") as f: - for line in f: + for _ in f: cardsLeft += 1 # Shuffles if not enough cards @@ -581,7 +658,7 @@ async def parseCommands(message,content): cardsLeft = 0 if os.path.exists("resources/games/blackjackCards/"+str(message.channel)+".txt"): with open("resources/games/blackjackCards/"+str(message.channel)+".txt","r") as f: - for line in f: + for _ in f: cardsLeft += 1 decksLeft = round(cardsLeft/52,1) @@ -602,49 +679,6 @@ async def parseCommands(message,content): logThis("That's not a command (error code 001)",str(message.channel)) await message.channel.send("That's not a command (error code 001)") -async def fiar(channel,command,user): - response, showImage, deleteImage, gameDone = parseFourInARow(command,str(channel),user) - await channel.send(response) - logThis(response,str(channel)) - if showImage: - if deleteImage: - try: - logThis("Finding old image") - with open("resources/games/oldImages/fourInARow"+str(channel), "r") as f: - oldImage = await channel.fetch_message(int(f.read())) - logThis("Deleting old image") - await oldImage.delete() - except: - oldImage = "" - oldImage = await channel.send(file = discord.File("resources/games/4InARowBoards/board"+str(channel)+".png")) - if gameDone == False: - await oldImage.add_reaction("1️⃣") - await oldImage.add_reaction("2️⃣") - await oldImage.add_reaction("3️⃣") - await oldImage.add_reaction("4️⃣") - await oldImage.add_reaction("5️⃣") - await oldImage.add_reaction("6️⃣") - await oldImage.add_reaction("7️⃣") - with open("resources/games/oldImages/fourInARow"+str(channel), "w") as f: - f.write(str(oldImage.id)) - - if gameDone: - with open("resources/games/games.json", "r") as f: - data = json.load(f) - - winner = data["4 in a row games"][str(channel)]["winner"] - if winner != 0: - with open("resources/games/games.json","w") as f: - json.dump(data,f,indent=4) - addMoney(data["4 in a row games"][str(channel)]["players"][winner-1].lower(),20) - with open("resources/games/games.json", "r") as f: - data = json.load(f) - - del data["4 in a row games"][str(channel)] - - with open("resources/games/games.json","w") as f: - json.dump(data,f,indent=4) - # Makes files if they don't exist yet makeFiles() @@ -682,14 +716,15 @@ async def on_message(message): @client.event async def on_reaction_add(reaction,user): - message = reaction.message - channel = message.channel - logThis(user.display_name+" reacted to a message",str(channel)) - fourInARowTheirTurn, piece = fiarReactionTest(channel,message,user.display_name) + if user.bot == False: + message = reaction.message + channel = message.channel + logThis(user.display_name+" reacted to a message",str(channel)) + fourInARowTheirTurn, piece = fiarReactionTest(channel,message,user.display_name) - if fourInARowTheirTurn: - place = emojiToNumber(reaction.emoji) - await fiar(channel," place "+str(piece)+" "+str(place),user.display_name) + if fourInARowTheirTurn: + place = emojiToNumber(reaction.emoji) + await fiar(channel," place "+str(piece)+" "+str(place),user.display_name) # Runs the whole shabang client.run(token) diff --git a/funcs/games/__init__.py b/funcs/games/__init__.py index f7efbde..76ab117 100644 --- a/funcs/games/__init__.py +++ b/funcs/games/__init__.py @@ -1,4 +1,4 @@ from .money import checkBalance, giveMoney, addMoney from .trivia import triviaCountPoints, triviaStart, triviaAnswer from .blackjack import blackjackShuffle, blackjackStart, blackjackPlayerDrawHand, blackjackContinue, blackjackFinish, blackjackHit, blackjackStand, blackjackDouble, blackjackSplit -from .fourInARow import parseFourInARow \ No newline at end of file +from .fourInARow import parseFourInARow, fourInARowAI \ No newline at end of file diff --git a/funcs/games/fourInARow.py b/funcs/games/fourInARow.py index 791de0a..72a2288 100644 --- a/funcs/games/fourInARow.py +++ b/funcs/games/fourInARow.py @@ -12,7 +12,7 @@ def fourInARowStart(channel, user, opponent): if user.lower() != opponent.lower(): if channel not in data["4 in a row games"]: - if opponent.lower() == "gwendolyn": + if opponent.lower() in ["gwendolyn",""," "]: opponent = "Gwendolyn" board = [ [ 0 for i in range(7) ] for j in range(6) ] @@ -25,11 +25,11 @@ def fourInARowStart(channel, user, opponent): fourInARowDraw.drawImage(channel) - return "Started game. It's "+user+"'s turn", True, False, False + return "Started game against "+opponent+". It's "+user+"'s turn", True, False, False, False else: - return "There's already a 4 in a row game going on in this channel", False, False, False + return "There's already a 4 in a row game going on in this channel", False, False, False, False else: - return "You can't play against yourself", False, False, False + return "You can't play against yourself", False, False, False, False # Places a piece at the lowest available point in a specific column def placePiece(channel : str,player : int,column : int): @@ -63,7 +63,9 @@ def placePiece(channel : str,player : int,column : int): data["4 in a row games"][channel]["win direction"] = winDirection data["4 in a row games"][channel]["win coordinates"] = winCoordinates - message = data["4 in a row games"][channel]["players"][won-1]+" won. Adding 20 GwendoBucks to their account." + message = data["4 in a row games"][channel]["players"][won-1]+" won." + if data["4 in a row games"][channel]["players"][won-1] != "Gwendolyn": + message += " Adding 20 GwendoBucks to their account." elif 0 not in board[0]: gameWon = True message = "It's a draw!" @@ -73,23 +75,29 @@ def placePiece(channel : str,player : int,column : int): with open("resources/games/games.json", "w") as f: json.dump(data,f,indent=4) + + gwendoTurn = False + + if data["4 in a row games"][channel]["players"][turn] == "Gwendolyn": + logThis("It's Gwendolyn's turn") + gwendoTurn = True fourInARowDraw.drawImage(channel) - return message, True, True, gameWon + return message, True, True, gameWon, gwendoTurn else: - return "There isn't any room in that column", True, True, False + return "There isn't any room in that column", True, True, False, False else: - return "There's no game in this channel", False, False, False + return "There's no game in this channel", False, False, False, False # Parses command def parseFourInARow(command, channel, user): if command == "" or command == " ": - return "I didn't get that. \"Use !fourinarow start [opponent]\" to start a game.", False, False, False + return "I didn't get that. \"Use !fourinarow start [opponent]\" to start a game.", False, False, False, False - elif command.startswith(" start "): - command = command.replace(" start ","") + elif command.startswith(" start ") or command == (" start"): + command = command.replace(" start ","").replace(" start","") return fourInARowStart(channel,user,command) elif command.startswith(" stop"): @@ -97,9 +105,9 @@ def parseFourInARow(command, channel, user): data = json.load(f) if user in data["4 in a row games"][channel]["players"]: - return "Ending game.", False, False, True + return "Ending game.", False, False, True, False else: - return "You can't end a game where you're not a player.", False, False, False + return "You can't end a game where you're not a player.", False, False, False, False elif command.startswith(" place"): commands = command.split(" ") #try: @@ -107,7 +115,7 @@ def parseFourInARow(command, channel, user): #except: # return "I didn't quite get that", False, False, False else: - return "I didn't get that", False, False, False + return "I didn't get that", False, False, False, False def isWon(channel): logThis("Checking for win",channel) @@ -161,7 +169,6 @@ def isWon(channel): # Checks left diagonal if line <= 6-4 and place >= 3: pieces = [game[line+1][place-1],game[line+2][place-2],game[line+3][place-3]] - print(pieces) else: pieces = [0]