Advertisement
Guest User

Untitled

a guest
Jul 17th, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.41 KB | None | 0 0
  1. from discord.ext import commands
  2. import discord
  3.  
  4. c4_diagonal_data = [
  5.     [(3,0),(2,1),(1,2),(0,3)],
  6.     [(4,0),(3,1),(2,2),(1,3)],
  7.     [(3,1),(2,2),(1,3),(0,4)],
  8.     [(5,0),(4,1),(3,2),(2,3)],
  9.     [(4,1),(3,2),(2,3),(1,4)],
  10.     [(3,2),(2,3),(1,4),(0,5)],
  11.     [(5,1),(4,2),(3,3),(2,4)],
  12.     [(4,2),(3,3),(2,4),(1,5)],
  13.     [(3,3),(2,4),(1,5),(0,6)],
  14.     [(5,2),(4,3),(3,4),(2,5)],
  15.     [(4,3),(3,4),(2,5),(1,6)],
  16.     [(5,3),(4,4),(3,5),(2,6)],
  17.     [(3,6),(2,5),(1,4),(0,3)],
  18.     [(4,6),(3,5),(2,4),(1,3)],
  19.     [(3,5),(2,4),(1,3),(0,2)],
  20.     [(5,6),(4,5),(3,4),(2,3)],
  21.     [(4,5),(3,4),(2,3),(1,2)],
  22.     [(3,4),(2,3),(1,2),(0,1)],
  23.     [(5,5),(4,4),(3,3),(2,2)],
  24.     [(4,4),(3,3),(2,2),(1,1)],
  25.     [(3,3),(2,2),(1,1),(0,0)],
  26.     [(5,4),(4,3),(3,2),(2,1)],
  27.     [(4,3),(3,2),(2,1),(1,0)],
  28.     [(5,3),(4,2),(3,1),(2,0)]
  29. ]
  30.  
  31. class connect4():
  32.  
  33.     def __init__(self, p1, p2, ctx):
  34.         self.player_one = p1
  35.         self.player_two = p2
  36.         self.ctx = ctx
  37.         self.red = "\N{LARGE RED CIRCLE}"
  38.         self.blue = "\N{LARGE BLUE CIRCLE}"
  39.         self.filler = "\N{BLACK LARGE SQUARE}"
  40.         self.emojis = [str(i)+"\u20e3" for i in [1,2,3,4,5,6,7]]
  41.         self.board = self.create_board()
  42.         self.is_running = True
  43.         self.message = None
  44.         self.current_player = p1
  45.         self.is_first_run = True
  46.         self.last_play = None
  47.  
  48.     def phrase_board(self):
  49.         return "\n".join(map(''.join, self.board)) + "\n" + ''.join(self.emojis)
  50.  
  51.     def create_board(self):
  52.         return [[self.filler] * 7 for _ in range(6)]
  53.  
  54.     def make_embed(self, *, inverse = False):
  55.         embed = discord.Embed(
  56.             description = self.phrase_board()
  57.         )
  58.         embed.add_field(name="Players:", value=f"{self.red}: {self.player_one.mention}\n{self.blue}: {self.player_two.mention}")
  59.         if not self.is_first_run:
  60.             if not inverse:
  61.                 embed.add_field(name="Last move:", value=f"{self.current_player.mention}: {self.last_play+1}", inline=False)
  62.             else:
  63.                 if self.current_player == self.player_two:
  64.                     dex = self.player_one.mention
  65.                 else:
  66.                     dex = self.player_two.mention
  67.                 embed.add_field(name="Last move:", value=f"{dex}: {self.last_play+1}", inline=False)
  68.         if self.is_running:
  69.             if self.is_first_run:
  70.                 embed.add_field(name="Current turn:", value=self.player_one.mention, inline=False)
  71.             elif self.current_player == self.player_one and not inverse:
  72.                 embed.add_field(name="Current turn:", value=self.player_two.mention, inline=False)
  73.             elif self.current_player == self.player_two and not inverse:
  74.                 embed.add_field(name="Current turn:", value=self.player_one.mention, inline=False)
  75.             else:
  76.                 embed.add_field(name="Current turn:", value=self.current_player.mention, inline=False)
  77.         else:
  78.             embed.add_field(name="Winner:", value=self.current_player.mention, inline=False)
  79.         return embed
  80.  
  81.     async def add_reactions(self):
  82.         for r in self.emojis:
  83.             await self.message.add_reaction(r)
  84.         await self.message.add_reaction("\N{BLACK DOWN-POINTING DOUBLE TRIANGLE}")
  85.  
  86.     async def find_free(self, num):
  87.         for i in range(6)[::-1]:
  88.             if self.board[i][num] == self.filler:
  89.                 return i
  90.  
  91.     async def phrase_reaction(self, reaction):
  92.         num = self.emojis.index(reaction)
  93.         next = await self.find_free(num)
  94.         if next is None:
  95.             return
  96.         self.board[next][num] = self.red if self.current_player == self.player_one else self.blue
  97.         await self.check_wins()
  98.         self.is_first_run = False
  99.         self.last_play = num
  100.         await self.message.edit(embed=self.make_embed())
  101.         self.current_player = self.player_two if self.current_player == self.player_one else self.player_one
  102.  
  103.     async def check_wins(self):
  104.         def check_slice(s):
  105.             if s[0]==s[1]==s[2]==s[3] and s[0] != self.filler:
  106.                 return True
  107.             else:
  108.                 return False
  109.         for row in self.board:
  110.             for i in range(4):
  111.                 if check_slice(row[i:i+4]):
  112.                     self.is_running = False
  113.                     return
  114.         collums = []
  115.         for i in range(7):
  116.             collums.append([self.board[q][i] for q in range(6)])
  117.         for c in collums:
  118.             for i in range(3):
  119.                 if check_slice(c[i:i+4]):
  120.                     self.is_running = False
  121.                     return
  122.         diagonals = []
  123.         for c4_d in c4_diagonal_data:
  124.             diagonals.append([self.board[i[0]][i[1]] for i in c4_d])
  125.         for d in diagonals:
  126.             if check_slice(d):
  127.                 self.is_running = False
  128.                 return
  129.  
  130.     async def do_game(self):
  131.         self.message = await self.ctx.send(embed=self.make_embed())
  132.         await self.add_reactions()
  133.         while self.is_running:
  134.             try:
  135.                 reaction, user = await self.ctx.bot.wait_for(
  136.                     "reaction_add",
  137.                     check=lambda r, u: r.message.id == self.message.id and u == self.current_player and str(r) in self.emojis + ["\N{BLACK DOWN-POINTING DOUBLE TRIANGLE}"],
  138.                     timeout=300
  139.                 )
  140.             except:
  141.                 await self.message.edit(content="Timed out due to inactivity")
  142.                 break
  143.             try:
  144.                 await reaction.remove(user)
  145.             except:
  146.                 pass
  147.             if str(reaction) == "\N{BLACK DOWN-POINTING DOUBLE TRIANGLE}":
  148.                 await self.message.delete()
  149.                 self.message = await self.ctx.send(embed=self.make_embed(inverse=True))
  150.                 await self.add_reactions()
  151.             else:
  152.                 await self.phrase_reaction(str(reaction))
  153.         try:
  154.             await self.message.clear_reactions()
  155.         except:
  156.             pass
  157.  
  158. class games(commands.Cog):
  159.  
  160.     @commands.command()
  161.     async def c4(self, ctx, member: discord.Member):
  162.         """
  163.        Play connect4 with another member
  164.        """
  165.         if member == ctx.author or member.bot:
  166.             return await ctx.send("You cannot play against yourself or a bot")
  167.         board = connect4(ctx.author, member, ctx)
  168.         await board.do_game()
  169.  
  170. def setup(bot):
  171.     bot.add_cog(games())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement