From 64e6844e5bb3a96ba5b361b431d9e503be0573cb Mon Sep 17 00:00:00 2001 From: Skullheadx <94652084+Skullheadx@users.noreply.github.com> Date: Wed, 23 Nov 2022 16:47:09 -0500 Subject: [PATCH] Line Connector --- Main/__pycache__/board.cpython-310.pyc | Bin 1703 -> 3317 bytes Main/__pycache__/effects.cpython-310.pyc | Bin 0 -> 1891 bytes Main/__pycache__/game.cpython-310.pyc | Bin 2959 -> 2596 bytes Main/__pycache__/setup.cpython-310.pyc | Bin 2029 -> 2133 bytes Main/__pycache__/tile.cpython-310.pyc | Bin 2114 -> 2403 bytes Main/board.py | 77 +++++++++++++++++++---- Main/effects.py | 67 ++++++++++++++++++++ Main/game.py | 60 +++++++++++------- Main/setup.py | 8 ++- Main/tile.py | 28 ++++++--- 10 files changed, 197 insertions(+), 43 deletions(-) create mode 100644 Main/__pycache__/effects.cpython-310.pyc create mode 100644 Main/effects.py diff --git a/Main/__pycache__/board.cpython-310.pyc b/Main/__pycache__/board.cpython-310.pyc index cace1e7226fa001f64ee123752b7e1bf23440967..66e22b6db405d927f5ed1921c9df9f2bbd5c3cff 100644 GIT binary patch delta 2079 zcmZ3^`&E)JpO=@5fq{YH$E3PsJAsLOGK?k@wN*vj8B$nN*jgA;*qWK5SW?)788kU2 zhJ~}RxEEz^+%%1moh>6ZGd-hZvL91{I3EK80~-Sqlf*wUMyCG)OdS8Jbli(FCwnu? zP5!{-CBVe@kAsQj9~($Q5hAg(o|)q>8!I0pAEN{#(|<0eDqi=Z%oM%&_{_Y_lKA*! zW{{(xm3=%L1kv#u}C^ z<{GAj%(bj}oKO*lEJm1E4QmQxHgl1!W({)jJhEriF|t z%#sYn_D~DhYFTPn7O*d5U}PvXO<@43tzn+LmnBe?tw?}@f#DWwN@`9?;w`r1{G9yK zqRG;%s#;)~qF$ytpFmf=mF)}p>Fo8ta7+DyrxIsaY%^Ihp$-ux+ z#0n<_K`dvxi#hAhn#gxjN#j=1kg)xO`AyX7v3Ud^D3QH763TqT+3R?<$3qurF3P%cO z3qurl3Renu3qur73Qr1e3qurd3STgTCjTu~r~JgClq%`8{JawV;LM!*?Be92)YLrP zpw#rzoWvr%l9IHSA`A=+FZn@)B#7VuIS=GBnA<>Xb_QrvZU9GR4MRKwC<+%ar7(fQ zd^W>erWEE9<}8+l%ry-0tTjv}Y+39g3^hzCED{VQY*`#44B`wm4E6DxHOx>cW>l#x z)&*P(8M3%R%Hp|8coy*1FfL>S(+pXhDXh{U3%Nn`LM91Nl=7AE*Dz%9fmEb0)-b^I zFJuyDs9~yMu3>2gB@%%YhF}IwHoqc91_p*-_3XjP`9-N#3L!5+{Fh7&3=Eorx7Z5u zGxJJ{Z*i8SR+Pkp0_zrAQEFaFYSAq=XK)g^#p>ka=9Wf-NHI2gGYS^je|vi(xGuQ;`&2vj5^Vo{S361S)xtS_=-U|{eDMI=bM2%`X~pkZYB z3yV5f(n$uTOqef0i42syz`m>i$J_#jg$%V!C5%~2S}yaM)-x1=3dvh6pzLvrJs>eBwWK8V7GFV8W^Q6pWqff)VoIvfE$-Bm z^i-(vw*-n)lk@XZ;L;|yc%b$}ECeOPTP#UAnI%P_!?YfpdWqNXipLfTFqxlzEFlNxO&*6#Ye@szActfPsMlgo}k37#KJh z_!wE3SQuFtIhZ(jI5>FNia>IHnyj~2i&INV3yQ!M4%kPaTwP=^S)WaOavvK%4=DX} MFz_()F$-w}0P|F;;s5{u delta 439 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 aKczG$)ee+xig~~;;oxKf6+%3WLd*d6gp>sU literal 2959 zcmd1j<>g{vU|@Ltxh7eIkAdMah=Yuo85kHG7#J9etr!>>QW#Pga~PsPG*b>^2#99R zVajEWVrB%fS#nr%S)*7P8Qd9CSX0?v%qYPVPIfLWr$)-VTfW%WzJ$*z?#CC!nBYniUrPNUdR;1 z2IsLXWQt->VU6NQVTEnzERuVGDLlVn)H zvXG&fsTpco4QmR!Bm+o)2}ccU3I|9&g>xYz*i6n8t{R3c&N7A~PY}I;D}`$zBO^lz zH;C8F$jA`Rkix*iz{1eX%*c?(VaQM%QO?N70D_SWj0`0_CA=kk3;0twN(8b5MHm(` zN`PHm!;r<;%u>S;F9b3_Ubu!KOJsp)4MUc23U`TEmUxL+mc&AkykrSSGstaHDQqY8UdUX-5HDN9kR`W3G=&#QOg@Dnm_d`zPm}2-C^;1I zFfcGAGa>~wDA-vU7#M;z>v;R!w}0}%UHs&fU$&WA>%}*LZ)Dbl?ej!8_( z&CiQ*$xklLP0cGQj&aW{@hDA-DbFuT(ak8$D~a(<%*=~PPs~l#E2zB1Ws{RxT#}rh zTVN*yaudjbVhmM^paiBDAD@|*SrQ+wXOokkoS0K=r-x8|i?QeyBUcf~b1%UJNars` zgMiEn#DZJQnRz9*n2S?OZgGO#9uIQoEw-Z6-2AfCTdV~| znRz8epg_LGmYkYbl3H|&t)LR*t6S`0smUezMMg!Sa^Mzsab`+td`@a!dP&AD)+A8Y zy~P4D@D>Xw`+!W$O9AP2&dK^-aW`M@)i$Bd3;J{aY0UE z)t)YQCNYz6t5c_qcSI7?D1O5(vL@j-;(3b{%$OL9^na;#vsCL2h1PFj>uW^O@# zQAuh_d|GBsYJ6T|Zt5*Im>bJ8Q%W*!F{a((1xqI9=aqmW5**JELYRSp;T8uhc0gIX zSPhhi895lG7)}nG0HGXFjn!R#4Som017cs zX#g$>&M`1B)G)9xWHEqp&jO|z#)XXL3``913?K~Z1i z$iTp$4$7?{CyOx(Fp4qqG0HH?FtRbTG4e2RFmi$7nyHE#9MceApu{sMuW~amFo5Iv z0Jy|oz)-@N#RQ5eQ0!*0)-aYZX0eqpFJP}>$l}Q2%mT$5w*)9HfOwz~=3T(IkRgj7 zEXFOtkOqn$?i5B5h#G+s!7QN?!7O2M1`!5v1`rFP5~>2KTO6WV1e@wKriCCgMN^o1 zSs1~o4(cwk!QrkNhAi ztjTzbHz~g;CABENC^03ov{;j=$P<*ltU*;jsOHgRECMB+B2WVfoDVb^Z*e8%mz3n^ z=A@>TXv*DUNz2U1xy2rk2rj5^@f8$h<|Y`pF0Q($z9 zB`7tyqzIgYI12KMGfOh_^KLO#++xkl1C{2Cl|`VeaEk+!lZsN4OK!1cq-LgPloWxQ zYv4k=NQ;4iAxgM7wIH!55u_bdrj{h;C8rjF{BesrH6=Y2>cLwA#i_~pc`0xg8rWl74(EGaSq1p>(9w|Ik{LD??e!xdD*7g>NLG(owK36lF*ic5>q&~uzW0|Nud zdBuDT3=BMsGZ^PE@-QheDlr-`R&j!J87M$B8T~Z*ZgIqe3-tK-TU_z+x%nxjIjQmS zw|L^?3riDoKt+9gJU9@+8UGfGTYg>%q`)u-IVBWCM1qKD5Mc)*K>580xF!Xw c!)C=T4jYI+K#fC&Vo<@!!N9=;s$GPb0d1kn>i_@% diff --git a/Main/__pycache__/setup.cpython-310.pyc b/Main/__pycache__/setup.cpython-310.pyc index 4a854b823fc75af541887c63614ba826a555739f..da7e2e200e6ebbdafcd87c1d62dfb2c840312fb9 100644 GIT binary patch delta 693 zcmaFMe^r1lpO=@5fq{YHQd3>B6z4=f8OA3QwUz5r7*ZH>SfW@`SyPx&n46jUd861; z85XdovMpqc;s|F*VPs)oVQ6M%WXR(%WGL1wXJljm!AJ&1hE%2noC_Hk8B$ncn4-9% zxKo)H@T793axY|x;)SqNSfv?Kxk2PYrYOEtrY!yi0;#;IOj&{pnWBVJnX(-D7YL`Y zEo1~4mL;-4bRk2OSPFZTcq(I-M3iJYLkh$Au4bkvX?KPc?i8LD zh7_J=rYM=sY>b|aj0Tefm~=U!xKp@-88o>kH!_*ag*p^*GB7ZJ2~FnbAipy>q&gIV zLZOIj@*8XxImH)Aki$4<&$+-q?A%wQdv`(Q`u74Q#n()QaMt&Q+ZPPQu$MP zQw355)A^%>CcCjHGYU`6VlihFpS*}gEf8d`CiBZH3=9k}=YfbU1_lOA<|1Jb+Y@BJ z97I4BBw!9A*uVlWdqHe{5D^O&C{hBc)|@QKDx(KhECiCXg~;iF*sLG|#PZV=F5&^H z<^>Uao0D0Y7}cZLiZc>ZQj3c~9z!AoKxzaT7#Orcp4FJ#!lo$5!pOzM#mL3T@vjIZ zqbWOi9h(?m6kAbZUP^v$6iaSmNyg+eY!{3{vPfoujRqNbi^C>2KczG$)s7KtDmY*{ Q7&(|Y7$=`)muKVw08E#MRsaA1 delta 583 zcmcaA@Rpx1pO=@5fq{X6_gzi$arTLPGK_a7YAe^LvZOGjFgG*x^G30zGAv+AWnIV^ z#U9R(!pOqF!qCjj$dJcj$WW|W&dA6Bf{_f245>^DI2JN6GNiD?Fhy}jaiuaX;7;XC zx|_Ox9&_pFE94nNe`^E*5h}(aE1! z)B7q$o`kM5IG%?I#v*&2X?hk5h&h@xItQYHg9HSVw5j}xE~|}X7Pbo{2=Wh z&nQg3!=}i|!B_+qk(tcLF2-?-ttc@sB|mqv5&H#0kT^CYZgJS;=BJeAq}qYPt5^*j PC>)F&Op{GHk@K}g1pO=@5fq{V`wy7?8D%V85Ova>%75WxY+$o$XTrCVyJSp5MJS_}SyeYgX zd@T%7d@1}X0xb+t{3(JdLM;qY0x7~NA}tJ2f+?cG44PsSZ#(j8FfcHrgUn=LU~!nN zz$nEyX|gq=VSNc#7IzIpJWo194MRL{3113x3QIGS3q!1OEi)2Nx|XGeA&Ykbe+@$x zQwhTY#v0}thAe>^hAcsG1`&oDkSv_HkV%|jAtNJ0p;n=C3PUi1Caa%Y$jkr#|Nno< z#K6FyDRhgipfWu%H}w|#QM!pQWW<$o1#NM=r| zUVMCJUS>&rd@>8f&tMY724QEA5q^_-nH^8rGdN_J{M5rmJ~l1oeS)6$CcLBhDaTcpOo zzyQ(+^{F4D5mS{oI5I)uker{BlUbaZp9c<+vRG;u7O*aaMo}*dBSRh^ zC`Dy4*D#i_XK|p*BFS;W<+wl*n8Mi0%E(Z|xPZHcA&Uouvsfog6 zQ_@r8ixN{ZON)y@2^1rX8e)hT-(pQltxCWHa^HWN5Qtd!_4ji2v3>-{COaPY$Hf;a^ delta 1118 zcmaDXbVz_NpO=@5fq{V`=6_A{XZDGFnT&B0EA&lLI9nK^xKp@NxLX*acv5&$cv~2v zcvJXN_*)pF_)-K?1X~!Q_)~;Zgj*P*1X4tT88k&F-gjgXVPIgGtjj3H*frUM(Xc+9 zp@t!ztAsm+IfbQ}$%P?Sxt1A;Ctb@@!;rZWR0b>nw4MP@h4MP^6ID-g7 z4M-NwTgW8Nu#l0Fp-`<*K7}EeL6g0 zohG|8I|`;S2Qz50_!TiSFffGNV$kHAyp%cEM3cElih+UQ7HdjsPDx^sC<6mSku02$ z14*%!7NjJWq)LK};$UE4Fq&+|qUQh#>J-KrhIj_B519PiG#QKd7#J8YK=o>~%Ll$uG}*vzE7AhF1?)5)kW<-` zOH1<8(u#1ovq+hNfk74IL^e=p7%@)Xz~<^x!ji>W!?1vDAwvyA7JCX~FAF0>9$yJ# z7E=~;4PyyQ76-a4k{l;ojtiuFvLm}NBirOq_RPt4Owy)B+8}3fr>3N*#up`~WR@1+ z5-3hh&d*CpEUJtz&PYs2HMqrJl3G-f2^TP#{EuDQ6Xb00Q;HJH{WJw9Cvm9OgG?(j0|k~2h%g2bpp*p( zMFEf_S={pTN{T=!rAQqltqCGP&Ibn?*e)dd!SN4Dr$wMN4@ywQpajjqz`_WFd`uk7 y99$f19LyZd%skAK1vu4pz}gT5$befMHo5sJr8%i~pafFP#=yY9!N9>J!~_7;yx$1` diff --git a/Main/board.py b/Main/board.py index b3a0473..c8578d4 100644 --- a/Main/board.py +++ b/Main/board.py @@ -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 index 0000000..96a37f9 --- /dev/null +++ b/Main/effects.py @@ -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])))) + diff --git a/Main/game.py b/Main/game.py index b2a8423..a048a2b 100644 --- a/Main/game.py +++ b/Main/game.py @@ -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)) diff --git a/Main/setup.py b/Main/setup.py index 64e9c3e..ce10e43 100644 --- a/Main/setup.py +++ b/Main/setup.py @@ -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] diff --git a/Main/tile.py b/Main/tile.py index 4d3ca4f..e65568d 100644 --- a/Main/tile.py +++ b/Main/tile.py @@ -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))) -- 2.54.0