]> Skullheadx's Git Forge - word-hunt.git/commitdiff
Line Connector
authorSkullheadx <94652084+Skullheadx@users.noreply.github.com>
Wed, 23 Nov 2022 21:47:09 +0000 (16:47 -0500)
committerSkullheadx <94652084+Skullheadx@users.noreply.github.com>
Wed, 23 Nov 2022 21:47:09 +0000 (16:47 -0500)
Main/__pycache__/board.cpython-310.pyc
Main/__pycache__/effects.cpython-310.pyc [new file with mode: 0644]
Main/__pycache__/game.cpython-310.pyc
Main/__pycache__/setup.cpython-310.pyc
Main/__pycache__/tile.cpython-310.pyc
Main/board.py
Main/effects.py [new file with mode: 0644]
Main/game.py
Main/setup.py
Main/tile.py

index cace1e7226fa001f64ee123752b7e1bf23440967..66e22b6db405d927f5ed1921c9df9f2bbd5c3cff 100644 (file)
Binary files a/Main/__pycache__/board.cpython-310.pyc and b/Main/__pycache__/board.cpython-310.pyc differ
diff --git a/Main/__pycache__/effects.cpython-310.pyc b/Main/__pycache__/effects.cpython-310.pyc
new file mode 100644 (file)
index 0000000..a2370f3
Binary files /dev/null and b/Main/__pycache__/effects.cpython-310.pyc differ
index 0a852c987a4f882f6307625949e7c7f73dc7a4dc..e5e35fe1aca44bb307a817afcd67d6ef00bd5415 100644 (file)
Binary files a/Main/__pycache__/game.cpython-310.pyc and b/Main/__pycache__/game.cpython-310.pyc differ
index 4a854b823fc75af541887c63614ba826a555739f..da7e2e200e6ebbdafcd87c1d62dfb2c840312fb9 100644 (file)
Binary files a/Main/__pycache__/setup.cpython-310.pyc and b/Main/__pycache__/setup.cpython-310.pyc differ
index f9ad3d25f3a7aa82613119e36c17887c5edce4ef..4524937525081e782100adf2b4caeaae06919073 100644 (file)
Binary files a/Main/__pycache__/tile.cpython-310.pyc and b/Main/__pycache__/tile.cpython-310.pyc differ
index b3a0473f36950d430c96fcef759b9dc3d2f12a6a..c8578d4cf27124e80d8bdfaebbac82c58cdc03e3 100644 (file)
@@ -2,28 +2,30 @@ from setup import *
 from tile import Tile
 
 
-class Board:
+class Grid:
 
-    def __init__(self, position, length, width, letters):
+    def __init__(self, position, length, height, letters):
         self.position = pygame.Vector2(position)
         self.length = length
-        self.width = width
-        self.board = [[Tile((self.position.x + col * (Tile.side_length+Tile.separation_distance), self.position.y + row * (Tile.side_length+Tile.separation_distance)),
-                            letters[row * self.width + col]) for col in range(self.width)][:] for row in range(self.length)]
+        self.height = height
+        self.board = [[Tile((self.position.x + col * (Tile.side_length + Tile.separation_distance),
+                             self.position.y + row * (Tile.side_length + Tile.separation_distance)),
+                            letters[row * self.height + col]) for col in range(self.height)][:] for row in
+                      range(self.length)]
 
         self.tiles = []
         for i in range(self.length):
-            for j in range(self.width):
+            for j in range(self.height):
                 self.tiles.append(self.board[i][j])
         self.last_selected = None
 
-    def update(self, delta):
+    def update(self, delta, colour):
         letter = ""
         for tile in self.tiles:
             if self.last_selected is None:
-                l = tile.update(delta, tile.neighbors)
+                l = tile.update(delta, tile.neighbors, colour)
             else:
-                l = tile.update(delta, self.last_selected.neighbors)
+                l = tile.update(delta, self.last_selected.neighbors, colour)
             if l != "":
                 letter += l
                 self.last_selected = tile
@@ -32,15 +34,66 @@ class Board:
             for tile in self.tiles:
                 tile.reset()
             self.last_selected = None
-
         return letter
 
     def draw(self, surf):
-        # pygame.draw.rect(surf, Colour.BLACK, pygame.Rect(self.position - pygame.Vector2(Tile.bezel / 2), (
-        #     self.length * Tile.side_length + Tile.bezel, self.width * Tile.side_length + Tile.bezel)))
         for tile in self.tiles:
             tile.draw(surf)
         # debug
         # if self.last_selected is not None:
         #     for i in self.last_selected.neighbors:
         #         pygame.draw.rect(surf,Colour.BLUE,pygame.Rect(i,(Tile.side_length,Tile.side_length)),3)
+
+
+class Board:
+    text_font = pygame.font.Font("font/Silkscreen-Regular.ttf", 20)
+
+    inset = 15
+    edge_radius = 25
+    border_width = 8
+
+    def __init__(self, position, length, height, letters):
+        self.points = 0
+        self.points_display = self.text_font.render(f"Score: {self.points}", True, Colour.BLACK)
+        # position is the center of the grid then calculated to find topleft
+        self.length = length * Tile.side_length + (length - 1) * Tile.separation_distance
+        self.height = height * Tile.side_length + (
+                    height - 1) * Tile.separation_distance + self.points_display.get_rect().height
+        self.position = pygame.Vector2(position) - pygame.Vector2(self.length / 2, self.height / 2)
+
+        self.grid = Grid(self.position + pygame.Vector2(0, self.points_display.get_rect().height), length,
+                         height, letters)
+
+    def update(self, delta, colour, points):
+        letter = self.grid.update(delta, colour)
+
+        self.points = points
+        self.points_display = self.text_font.render(f"Score: {self.points}", True, Colour.BLACK)
+
+        return letter
+
+    def get_rect(self):
+        return pygame.Rect(round(self.position.x - self.inset),
+                           round(self.position.y - self.inset),
+                           round(self.inset * 2 + self.length),
+                           round(self.inset * 2 + self.height))
+
+    def draw(self, surf):
+        r = self.get_rect()
+
+        pygame.draw.rect(surf, Palette.primary_shade2, r, border_radius=self.edge_radius)
+        pygame.draw.rect(surf, Palette.secondary_shade4, r, border_radius=self.edge_radius, width=self.border_width)
+
+        self.grid.draw(surf)
+
+        surf.blit(self.points_display, self.points_display.get_rect(
+            bottomleft=self.grid.position + pygame.Vector2(0, -Tile.separation_distance)))
+
+        # print(self.position+pygame.Vector2(2 * Tile.side_length + Tile.separation_distance * 3/ 2), center)
+        #
+        # pygame.draw.circle(surf, Colour.RED, self.grid.position, 3)
+        # pygame.draw.circle(surf, Colour.RED,
+        #                    self.grid.position + pygame.Vector2(2 * Tile.side_length + Tile.separation_distance * 3 / 2),
+        #                    3)
+        # pygame.draw.circle(surf, Colour.BLUE, self.get_rect().topleft, 4)
+        # pygame.draw.circle(surf, Colour.BLUE, self.get_rect().center, 4)
diff --git a/Main/effects.py b/Main/effects.py
new file mode 100644 (file)
index 0000000..96a37f9
--- /dev/null
@@ -0,0 +1,67 @@
+import pygame
+
+from setup import *
+from tile import Tile
+
+class WordConnector:
+    edge_radius= 4
+    thickness = 15
+
+    # hl = pygame.Rect(0,0,Tile.separation_distance + Tile.side_length,thickness)
+    # surface = pygame.Surface(hl.size)
+    # pygame.draw.rect(surface,Colour.RED,hl,border_radius=edge_radius)
+    # horizontal_line = surface.copy()
+    #
+    # vl= pygame.Rect(0,0,thickness,Tile.separation_distance + Tile.side_length)
+    # surface = pygame.Surface(vl.size)
+    # pygame.draw.rect(surface,Colour.RED,vl,border_radius=edge_radius)
+    # vertical_line = surface.copy()
+    #
+    # dl = pygame.Rect(0,0,math.sqrt(2 * (Tile.separation_distance + Tile.side_length) ** 2),thickness)
+    # surface = pygame.Surface(dl.size)
+    # pygame.draw.rect(surface,Colour.RED,dl,border_radius=edge_radius)
+    # diagonal_line = pygame.transform.rotate(surface,45)
+
+
+    def __init__(self):
+        self.order = []
+        self.colour = Colour.RED
+
+    def reset(self):
+        self.order = []
+        self.colour = Colour.RED
+    def update(self, tile, status):
+        if tile is not None and tile.position + pygame.Vector2(tile.side_length/2) not in self.order:
+            self.order.append(tile.position + pygame.Vector2(tile.side_length/2))
+        if status:
+            self.colour = Palette.primary_shade3
+        else:
+            self.colour = Colour.GRAY
+
+    def draw(self, surf):
+        for i,pos in enumerate(self.order):
+            if i == len(self.order) - 1:
+                break
+
+            difference = pygame.Vector2(self.order[i+1])- pygame.Vector2(pos)
+            # difference.x /= Tile.side_length
+            # difference.y /= Tile.side_length
+
+            if difference.y == 0:
+                l = Tile.separation_distance + Tile.side_length + 2 * self.edge_radius
+                angle= 0
+            elif difference.x == 0:
+                l = Tile.separation_distance + Tile.side_length+ 2 * self.edge_radius
+                angle= 90
+            else:
+                l=math.sqrt(2 * (Tile.separation_distance + Tile.side_length) ** 2)+ 2 * self.edge_radius
+                angle = math.degrees(math.atan(difference.y/difference.x)) + 90
+
+            line = pygame.Rect(0,0,l,self.thickness)
+            surface = pygame.Surface(line.size).convert_alpha()
+            surface.fill((0,0,0,0))
+            pygame.draw.rect(surface,self.colour,line,border_radius=self.edge_radius)
+            line = pygame.transform.rotate(surface,angle)
+            line.set_alpha(150)
+            surf.blit(line,line.get_rect(center = pygame.Vector2(pos) - 0.5 * (pygame.Vector2(pos) - pygame.Vector2(self.order[i+1]))))
+
index b2a8423b2287a350dfce6302e783b7b6d16c18b6..a048a2b89d627e1c64173544a525d65810c2719a 100644 (file)
@@ -1,17 +1,23 @@
-import pygame
+import pygame.draw
 
 from setup import *
 from tile import Tile
 from board import Board
+from effects import WordConnector
 
 
 class Game:
     font = pygame.font.Font("font/Silkscreen-Regular.ttf", 40)
-    text_font = pygame.font.Font("font/Silkscreen-Regular.ttf", 20)
     title_font = pygame.font.Font("font/Silkscreen-Regular.ttf", 75)
-    inset = 15
-    edge_radius = 25
-    border_width = 8
+
+    correct_colour = Colour.GREEN
+    found_colour = Colour.YELLOW
+    wrong_colour = Colour.LIGHT_GRAY
+
+    colour_converter = {correct_colour: True,
+                        found_colour: False,
+                        wrong_colour: False}
+
     def __init__(self, imported_file_name=None):
         if imported_file_name is None:
             length, width = 4, 4
@@ -25,42 +31,52 @@ class Game:
                 if "" in self.word_list:
                     self.word_list.remove("")
                 print(self.word_list)
-
-        self.board = Board(center - pygame.Vector2(2 * Tile.side_length), length, width, self.letters)
-
-        self.word = ""
-        self.word_display = self.font.render(self.word, True, Colour.BLACK, Colour.LIGHT_GRAY)
         self.seen = set()
         self.points = 0
-        self.points_display = self.text_font.render(f"Score: {self.points}", True, Colour.BLACK)
         self.title = self.title_font.render("Word Hunt", True, Colour.BLACK)
+        self.board = Board(pygame.Vector2(SCREEN_WIDTH / 3, SCREEN_HEIGHT / 2), length, width, self.letters)
 
+        self.word = ""
+        self.word_display = self.font.render(self.word, True, Colour.BLACK, Colour.LIGHT_GRAY)
+
+        self.word_connector = WordConnector()
+        self.bg_colour = Colour.LIGHT_GRAY
 
     def update(self, delta):
-        self.word += self.board.update(delta)
+        self.word += self.board.update(delta, self.bg_colour, self.points)
+        self.word_connector.update(self.board.grid.last_selected, self.colour_converter[self.bg_colour])
         if not pygame.mouse.get_pressed(3)[0]:  # mouse not down
             if self.word in word_list and self.word not in self.seen:
                 self.seen.add(self.word)
-                self.points += 10 ** (len(self.word)-2)
-                self.points_display = self.text_font.render(f"Score: {self.points}", True, Colour.BLACK)
-
+                # self.points += 10 ** (len(self.word) - 2)
+                if len(self.word) == 3:
+                    self.points += 100
+                else:
+                    self.points += 100 * 2 ** (len(self.word) - 2)
+                # self.points_display = self.text_font.render(f"Score: {self.points}", True, Colour.BLACK)
 
             self.word = ""
-        bg_colour = Colour.LIGHT_GRAY
+            self.word_connector.reset()
+        self.bg_colour = self.wrong_colour
 
         if self.word in self.seen:
-            bg_colour = Colour.YELLOW
+            self.bg_colour = self.found_colour
         elif self.word in word_list:
-            bg_colour = Colour.GREEN
+            self.bg_colour = self.correct_colour
 
-        self.word_display = self.font.render(self.word, True, Colour.BLACK, bg_colour)
+        self.word_display = self.font.render(self.word, True, Colour.BLACK, self.bg_colour)
 
     def draw(self, surf):
         surf.fill(Palette.primary_shade1)
-        pygame.draw.rect(surf, Palette.primary_shade2, pygame.Rect((self.board.position.x - self.inset, self.board.position.y - self.points_display.get_rect().height - self.inset), (self.inset *2+ self.board.length * (Tile.side_length + Tile.separation_distance) - Tile.separation_distance, self.inset*2 +self.points_display.get_rect().height+ self.board.width * (Tile.side_length + Tile.separation_distance)- Tile.separation_distance)),border_radius=self.edge_radius)
-        pygame.draw.rect(surf, Palette.secondary_shade0, pygame.Rect((self.board.position.x - self.inset, self.board.position.y - self.points_display.get_rect().height - self.inset), (self.inset *2+ self.board.length * (Tile.side_length + Tile.separation_distance)- Tile.separation_distance, self.inset*2 +self.points_display.get_rect().height+ self.board.width * (Tile.side_length + Tile.separation_distance)- Tile.separation_distance)),border_radius=self.edge_radius, width=self.border_width)
 
         self.board.draw(surf)
         surf.blit(self.word_display, self.word_display.get_rect(center=(center.x, SCREEN_HEIGHT / 5)))
         surf.blit(self.title, self.title.get_rect(center=(center.x, SCREEN_HEIGHT / 10)))
-        surf.blit(self.points_display, self.points_display.get_rect(bottomleft=self.board.position + pygame.Vector2(0,-Tile.separation_distance)))
+
+        self.word_connector.draw(surf)
+
+        # pygame.draw.circle(surf, Colour.WHITE,r.center,5)
+        # pygame.draw.line(surf, Colour.BLACK, (0, SCREEN_HEIGHT / 2), (SCREEN_WIDTH, SCREEN_HEIGHT / 2))
+        # pygame.draw.line(surf, Colour.BLACK, (SCREEN_WIDTH / 2, 0), (SCREEN_WIDTH / 2, SCREEN_HEIGHT))
+        # for i, shade in enumerate(Palette.shades):
+        #     pygame.draw.rect(surf,shade,pygame.Rect(0,i*50,50,50))
index 64e9c3ee9994b45b3b15ddf992430df1be0f4fd7..ce10e43725c4c58d62deeafff6c76111e90f7f5d 100644 (file)
@@ -3,6 +3,7 @@ import string
 
 import pygame
 import random
+import math
 
 # word list from https://github.com/dwyl/english-words
 with open("pruned_words.json", 'r') as f:
@@ -30,12 +31,13 @@ weights = [8.464812190575197, 1.8290213382006486, 4.377463842181293, 3.238497204
 class Colour:
     WHITE = (255, 255, 255)
     GRAY = (255 / 2, 255 / 2, 255 / 2)
+    DARK_GRAY = (255 / 3, 255 / 3, 255 / 3)
     LIGHT_GRAY = (255 * 2 / 3, 255 * 2 / 3, 255 * 2 / 3)
     BLACK = (0, 0, 0)
     RED = (255, 0, 0)
     GREEN = (0, 255, 0)
     BLUE = (0, 0, 255)
-    YELLOW = (255 / 2, 255 / 2, 0)
+    YELLOW = (255,255,77)
 
 
 class Palette:
@@ -56,3 +58,7 @@ class Palette:
     tertiary_shade2 = (176, 88, 131)
     tertiary_shade3 = (106, 18, 61)
     tertiary_shade4 = (88, 5, 46)
+
+    shades = [primary_shade1,primary_shade2,primary_shade0,primary_shade3,primary_shade4,
+              secondary_shade1,secondary_shade2,secondary_shade0,secondary_shade3,secondary_shade4,
+              tertiary_shade1,tertiary_shade2,tertiary_shade0,tertiary_shade3,tertiary_shade4]
index 4d3ca4f7dd80903dc655b24351c46de207c35dad..e65568d14ef0f1dfeffc9a9493c1ef6152da7129 100644 (file)
@@ -9,7 +9,9 @@ class Tile:
     edge_radius = 15
     separation_distance = 7.5
 
-    font = pygame.font.Font("font/Silkscreen-Regular.ttf", 20)
+    font = pygame.font.Font("font/Silkscreen-Regular.ttf", 40)
+
+    shrink_amount =2.5
 
 
     def __init__(self, position, letter):
@@ -17,35 +19,45 @@ class Tile:
         self.selected = False
         self.letter = letter #random.choice(alphabet)
         self.text = self.font.render(self.letter,True, Colour.BLACK)
+        self.colour = Palette.secondary_shade2
         self.neighbors = []
         for i in range(-1,2):
             for j in range(-1,2):
                 self.neighbors.append(self.position + pygame.Vector2(i * (self.side_length + self.separation_distance), j * (self.side_length+ self.separation_distance)))
 
-    def update(self, delta, neighbors):
+    def update(self, delta, neighbors, colour):
         if not self.selected and pygame.mouse.get_pressed()[0] and self.get_collision_rect().collidepoint(pygame.mouse.get_pos()) and self.position in neighbors:
             self.selected = True
             return self.letter
+        if self.selected:
+            self.colour = colour
         return ""
 
     def reset(self):
         self.selected = False
+        self.colour = Palette.secondary_shade2
 
     def get_rect(self):
-        return pygame.Rect(self.position,(self.side_length, self.side_length))
+        if self.selected:
+            return pygame.Rect(self.position + pygame.Vector2(self.shrink_amount),(self.side_length - 2 * self.shrink_amount, self.side_length - 2 * self.shrink_amount))
+        else:
+            return pygame.Rect(self.position,(self.side_length, self.side_length))
 
     def get_collision_rect(self):
-        return pygame.Rect(self.position + pygame.Vector2(self.cutoff), pygame.Vector2(self.side_length) - pygame.Vector2(2 * self.cutoff))
+        if self.selected:
+            return pygame.Rect(self.position + pygame.Vector2(self.cutoff) + pygame.Vector2(self.shrink_amount), pygame.Vector2(self.side_length) - pygame.Vector2(2 * self.cutoff) - pygame.Vector2(2 * self.shrink_amount))
+        else:
+            return pygame.Rect(self.position + pygame.Vector2(self.cutoff), pygame.Vector2(self.side_length) - pygame.Vector2(2 * self.cutoff))
 
     def draw(self, surf):
         if self.selected:
-            pygame.draw.rect(surf, Palette.secondary_shade2, self.get_rect(),border_radius=self.edge_radius)
+            pygame.draw.rect(surf, self.colour, self.get_rect(),border_radius=self.edge_radius)
         else:
-            pygame.draw.rect(surf, Palette.secondary_shade0, self.get_rect(),border_radius=self.edge_radius)
-        pygame.draw.rect(surf,Palette.tertiary_shade4,self.get_rect(),self.bezel,border_radius=self.edge_radius)
+            pygame.draw.rect(surf, Palette.secondary_shade1, self.get_rect(),border_radius=self.edge_radius)
+        pygame.draw.rect(surf,Palette.secondary_shade3,self.get_rect(),self.bezel,border_radius=self.edge_radius)
 
         # debug
-        # pygame.draw.rect(surf, Colour.RED, self.get_collision_rect())
+        # pygame.draw.rect(surf, Colour.RED, self.get_collision_rect(), width=5)
 
         # letter
         surf.blit(self.text,self.text.get_rect(center = (self.position.x + self.side_length/2, self.position.y + self.side_length/2)))