From af276e268b363e818ffc78663572b20ba936bbbd Mon Sep 17 00:00:00 2001 From: jona605a Date: Thu, 6 Aug 2020 20:45:07 +0200 Subject: [PATCH] :sparkles: Hexdraw almost done --- boardHexTest.png | Bin 16034 -> 0 bytes funcs/games/hex.py | 16 ++--- funcs/games/hexDraw.py | 135 ++++++++++++++++++++--------------------- 3 files changed, 71 insertions(+), 80 deletions(-) delete mode 100644 boardHexTest.png diff --git a/boardHexTest.png b/boardHexTest.png deleted file mode 100644 index 128fd0fda95f88c299acbddfadaf4e2ec620867a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16034 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 (|6O*iW@|BW~pE-tSZbi)$pzgA# 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 Sr~z*rIdwuyHRm{<_`d+19^erG diff --git a/funcs/games/hex.py b/funcs/games/hex.py index 5962855..cf13955 100644 --- a/funcs/games/hex.py +++ b/funcs/games/hex.py @@ -93,16 +93,12 @@ def hexStart(channel, user, opponent): json.dump(data,f,indent=4) # draw the board - #fourInARowDraw.drawImage(channel) - # hexDraw() # something something + hexDraw.drawBoard(channel) # something something + showImage = True - gwendoTurn = False - - if players[0] == "Gwendolyn": - # in case she has the first move - gwendoTurn = True - - return "Started game against "+getName(opponent)+ diffText+". It's "+getName(players[0])+"'s turn", True, False, False, gwendoTurn + gwendoTurn = True if players[0] == "Gwendolyn" else False + + return "Started Hex game against "+getName(opponent)+ diffText+". It's "+getName(players[0])+"'s turn", showImage, False, False, gwendoTurn else: return "There's already a hex game going on in this channel", False, False, False, False @@ -157,7 +153,7 @@ def placeHex(channel : str,player : int,position : str): # Update the board drawHexPlacement(channel,player,position) - + return message, True, True, gameWon, gwendoTurn else: # Invalid move. "board" is the error message diff --git a/funcs/games/hexDraw.py b/funcs/games/hexDraw.py index e41243f..3d57b6f 100644 --- a/funcs/games/hexDraw.py +++ b/funcs/games/hexDraw.py @@ -5,73 +5,77 @@ import os from PIL import Image, ImageDraw, ImageFont #from funcs import logThis, getName -def drawHex(channel): +def drawBoard(channel): #logThis("Drawing Hex board") # Defining all the variables - CANVAS_WIDTH = 800 - CANVAS_HEIGHT = 600 - SIDELENGTH = 25 + CANVAS_WIDTH = 2400 + CANVAS_HEIGHT = 1800 + SIDELENGTH = 75 X_OFFSET = CANVAS_WIDTH/2 - 8*math.sqrt(3)*SIDELENGTH # The offsets centers the board in the picture Y_OFFSET = CANVAS_HEIGHT/2 - 8*SIDELENGTH # The offsets are the coordinates of the upperleft point in the upperleftmost hexagon hexagonwidth = math.sqrt(3) * SIDELENGTH # the whole width hexagonheight = 1.5 * SIDELENGTH # not really the entire height, but the height difference between two layers - pieceColor = {1:(200,0,0),2:(0,0,200)} # player1 is red, player2 is blue - pieceDiameter = 30 - - fontsize = 15 + fontsize = 45 textcolor = (0,0,0) fnt = ImageFont.truetype('resources/futura-bold.ttf', fontsize) + hexThickness = 6 + xThickness = hexThickness * math.cos(math.pi/6) + yThickness = hexThickness * math.sin(math.pi/6) # Creates the empty image im = Image.new('RGB', size=(CANVAS_WIDTH, CANVAS_HEIGHT),color='lightgrey') # 'd' is a shortcut to drawing on the image d = ImageDraw.Draw(im,"RGBA") - # Creates the hexagons - hexList = _scale_coordinates(generate_unit_hexagons, X_OFFSET, Y_OFFSET) # these two functions are defined below - for hexagon in hexList: - d.polygon(hexagon, fill = 'white',outline='black') + # These are the coordinates for the upperleft corner of every hex + boardCoordinates = [ [(X_OFFSET + hexagonwidth*(column + row/2),Y_OFFSET + hexagonheight*row) for column in range(11)] for row in range(11)] + # The board is indexed with [row][column] + for column in boardCoordinates: + for startingPoint in column: + x = startingPoint[0] + y = startingPoint[1] + h = SIDELENGTH * math.sqrt(3)/2 # which is also sin(pi/3) + d.polygon([ + (x, y), + (x+h, y-0.5*SIDELENGTH), + (x+2*h, y), + (x+2*h, y+SIDELENGTH), + (x+h, y+1.5*SIDELENGTH), + (x, y+SIDELENGTH), + ],fill="black") + d.polygon([ + (x+xThickness, y + yThickness), + (x+h, y-0.5*SIDELENGTH + hexThickness), + (x+2*h-xThickness, y + yThickness), + (x+2*h-xThickness, y+SIDELENGTH - yThickness), + (x+h, y+1.5*SIDELENGTH - hexThickness), + (x+xThickness, y+SIDELENGTH - yThickness), + ],fill="white") + + # Draw color on the outside of the board + for point in boardCoordinates[0] + - # TESTING BOARD - board = [ [ 0 for i in range(11) ] for j in range(11) ] - board[0][0] = 1 - board[1][0] = 1 - board[2][1] = 1 - board[3][6] = 2 - board[2][5] = 2 - - # Draws the pieces from the board - for row in range(11): - for column in range(11): - if board[row][column] != 0: - x = X_OFFSET + hexagonwidth*(column + row/2 + 1/2) - pieceDiameter/2 - y = Y_OFFSET + hexagonheight*row + hexagonheight/2 - pieceDiameter/math.sqrt(2) - d.ellipse([(x,y),(x + pieceDiameter,y + pieceDiameter)], fill = pieceColor[board[row][column]]) - # Writes "abc..", "123.." on the columns and rows for i in range(11): # Top letters - d.text( (X_OFFSET + hexagonwidth*i, Y_OFFSET-22) , "ABCDEFGHIJK"[i], font=fnt, fill=textcolor) + d.text( (X_OFFSET + hexagonwidth*i, Y_OFFSET-66) , "ABCDEFGHIJK"[i], font=fnt, fill=textcolor) # Bottom letters - d.text( (X_OFFSET + hexagonwidth*(i+11.5/2), Y_OFFSET - 5 + 11*hexagonheight) , "ABCDEFGHIJK"[i], font=fnt, fill=textcolor) + d.text( (X_OFFSET + hexagonwidth*(i+11.5/2), Y_OFFSET - 15 + 11*hexagonheight) , "ABCDEFGHIJK"[i], font=fnt, fill=textcolor) # Left numbers - d.multiline_text( (X_OFFSET + hexagonwidth*i/2 - 24 -4*(i>8), Y_OFFSET + 6 + i*hexagonheight) , str(i+1), font=fnt, fill=textcolor, align="right") + d.multiline_text( (X_OFFSET + hexagonwidth*i/2 - 72 -4*(i>8), Y_OFFSET + 18 + i*hexagonheight) , str(i+1), font=fnt, fill=textcolor, align="right") # Right numbers - d.text( (X_OFFSET + hexagonwidth*(i/2+11) + 10 , Y_OFFSET + 6 + i*hexagonheight) , str(i+1), font=fnt, fill=textcolor) + d.text( (X_OFFSET + hexagonwidth*(i/2+11) + 30 , Y_OFFSET + 6 + i*hexagonheight) , str(i+1), font=fnt, fill=textcolor) im.save("board"+channel+".png") - #im.save(filename="resources/games/hexBoards/board"+channel+".png") + #im.save("resources/games/hexBoards/board"+channel+".png") + + + def drawHexPlacement(channel,player,position): - # Opens the image - try: - im = loadsomethingsomething("board"+channel+".png") - except: - logThis("Error loading board-image (error code 1541") - # 'd' is a shortcut to drawing on the image - d = ImageDraw.Draw(im,"RGBA") - + # Same variables as above CANVAS_WIDTH = 800 CANVAS_HEIGHT = 600 SIDELENGTH = 25 @@ -83,44 +87,35 @@ def drawHexPlacement(channel,player,position): pieceDiameter = 30 # Translates position - # We don't need to check, because the position is already checked in placeOnHexBoard() + # We don't need to error-check, because the position is already checked in placeOnHexBoard() position = position.lower() column = ord(position[0])-97 # ord() translates from letter to number - row = int(position[1]) + row = int(position[1])-1 - # Draws the piece + # Find the coordinates for the piece-drawing x = X_OFFSET + hexagonwidth*(column + row/2 + 1/2) - pieceDiameter/2 y = Y_OFFSET + hexagonheight*row + hexagonheight/2 - pieceDiameter/math.sqrt(2) - d.ellipse([(x,y),(x + pieceDiameter,y + pieceDiameter)], fill = pieceColor[player]) - - + # Opens the image + #logThis("Finding and opening the board-image at hex"+channel+".png") + try: + with Image.open("board"+channel+".png") as im: + d = ImageDraw.Draw(im,"RGBA") + # Draws the piece + + d.ellipse([(x,y),(x + pieceDiameter,y + pieceDiameter)], fill = pieceColor[player]) + # Draw some fancy connection thing + #something something -def generate_unit_hexagons(): - h = math.sqrt(3)/2 # Half the width of the hexagon - for y in range(11): - for x in [i*2+y for i in range(11)]: - x_ = x*h - y_ = y*1.5 - - yield [ - (x_, y_), - (x_+h, y_-0.5), - (x_+2*h, y_), - (x_+2*h, y_+1), - (x_+h, y_+1.5), - (x_, y_+1), - ] - -def _scale_coordinates(generator, x_offset, y_offset, side_length=25): - for coords in generator(): - yield [(x * side_length + x_offset, y * side_length + y_offset) for (x, y) in coords] - - + # Save + im.save("board"+channel+".png") + except: + #logThis("Error loading board-image (error code 1541") + print("Oh no, error error") if __name__ == '__main__': - drawHex("HexTest") - + drawBoard("HexTest2") + #drawHexPlacement("HexTest",1,"f7") """ with open("resources/games/hexGames.json", "r") as f: