From 081a8a948a6918bb142bceafee5056e721b04d7f Mon Sep 17 00:00:00 2001 From: Hannah-Dagemark Date: Mon, 27 May 2024 14:31:11 +0200 Subject: [PATCH] Commit 27/05-24 Computer functionality! 6 players can now start a round, one is the human player and 5 are computer players. They can't really play, they just randomly select tiles and claim them. --- Main.py | 81 ++++++++++++++++-- Map/MapManager.py | 38 ++++++-- Map/__pycache__/MapManager.cpython-312.pyc | Bin 14903 -> 16464 bytes Realms/RealmManager.py | 19 ++-- .../__pycache__/RealmManager.cpython-312.pyc | Bin 2532 -> 3126 bytes Realms/valid_border_colours.txt | 8 ++ 6 files changed, 127 insertions(+), 19 deletions(-) create mode 100644 Realms/valid_border_colours.txt diff --git a/Main.py b/Main.py index 4dddbed..3c8dc32 100644 --- a/Main.py +++ b/Main.py @@ -1,5 +1,6 @@ import pygame import sys +import random from threading import Thread sys.path.append('./Map') @@ -242,11 +243,72 @@ class uButtons: class uCommunicate: - def claimState(): - if GameMap.paintedTile: - ip = GameRealms.getPlayer("p1") - pt = GameMap.paintedTile - print(f"Claiming {pt.Id} for {ip.name}") + def __init__(self): + self.globalGameState = 0 #0 = preround, 1 = active + self.turnHolder = 0 + + def startGame(self): + GameRealms.load(map) + self.globalGameState = 1 + t2 = Thread(target=uCommunicator.gameLoop) + t2.start() + + def gameLoop(self): + while self.globalGameState == 1: + for x in range(GameRealms.amount): + if self.turnHolder != 0: + self.turnHolder = GameRealms.players[x].id + print(f"Turn being played by: {self.turnHolder}/{GameRealms.players[x].name}") + self.expand_cccs(self.turnHolder) + else: + while self.turnHolder == 0: + y = 1 + + def claimState(self): + if GameMap.paintedTile and self.turnHolder == 0: + if not GameMap.tIsClaimed(GameMap.paintedTile.Id): + ip = GameRealms.getPlayer(f"p1") + pt = GameMap.paintedTile + print(f"Claiming {pt.Id} for {ip.name}") + GameMap.claimTileFor(pt.Id,ip) + self.turnHolder += 1 + + def expand_cccs(self, ccc): + print(f"Using ccc = {ccc}") + expandTile = None + curPlayer = GameRealms.getPlayer(f"{ccc}") + if len(curPlayer.heldTiles) == 0: + while expandTile == None: + tryTile = GameMap.findTileAt((random.randint(0,800),random.randint(0,550))) + if tryTile != None: + if not GameMap.tIsClaimed(tryTile): + expandTile = tryTile + GameMap.claimTileFor(expandTile,GameRealms.getPlayer(f"{ccc}"),map) + curPlayer.heldTiles.append(expandTile) + else: + while expandTile == None: + trytile = int(curPlayer.heldTiles[random.randint(0,len(curPlayer.heldTiles)-1)]) + daPos = GameMap.getTileInfo(trytile)["position"] + ranX = random.randint(0,3) + if ranX == 0: + if GameMap.getTileInfo(trytile+1)["owner"] == "Unclaimed": + expandTile = trytile+1 + elif ranX == 1: + if GameMap.getTileInfo(trytile-1)["owner"] == "Unclaimed": + expandTile = trytile-1 + elif ranX == 2: + daPos = (daPos[0],daPos[1]+1) + if GameMap.findTileAtRel(daPos) != None: + if GameMap.getTileInfo(GameMap.findTileAtRel(daPos))["owner"] == "Unclaimed": + expandTile = GameMap.findTileAtRel(daPos) + elif ranX == 3: + daPos = (daPos[0],daPos[1]-1) + if GameMap.findTileAtRel(daPos) != None: + if GameMap.getTileInfo(GameMap.findTileAtRel(daPos))["owner"] == "Unclaimed": + expandTile = GameMap.findTileAtRel(daPos) + + GameMap.claimTileFor(expandTile,GameRealms.getPlayer(f"{ccc}"),map) + curPlayer.heldTiles.append(expandTile) @@ -256,8 +318,8 @@ uCommunicator = uCommunicate() def prerenderGraphics(): uTexter.write("State",(1000,0)) - uButtoner.addButton("Start Game", 850, 500, 200, 50, "darkgray", "gray", "GameRealms.load(map)", True) - uButtoner.addButton("Claim",850,600,110,40,"darkgray","gray","uCommunicate.claimState()") + uButtoner.addButton("Start Game", 850, 500, 200, 50, "darkgray", "gray", "uCommunicator.startGame()", True) + uButtoner.addButton("Claim",850,600,110,40,"darkgray","gray","uCommunicator.claimState()") uButtoner.addButton("ReRender", 1000, 600, 180, 50, "gray", "blue","GameMap.re_load()") prerenderGraphics() @@ -270,8 +332,8 @@ GameMap = MapManager.MapManager() GameMap.load(map) -t = Thread(target=GameMap.populate, args=(map,)) -t.start() +t1 = Thread(target=GameMap.populate, args=(map,)) +t1.start() time2 = pygame.time.get_ticks() @@ -323,4 +385,5 @@ while running: if timeY % 1000 == 0: print(f"{timeY-timeX}ms per tick\n{1000/(timeY-timeX)} Ticks per second") timeX = pygame.time.get_ticks() +uCommunicator.globalGameState = 0 pygame.quit() \ No newline at end of file diff --git a/Map/MapManager.py b/Map/MapManager.py index f9d9aa8..6ba997b 100644 --- a/Map/MapManager.py +++ b/Map/MapManager.py @@ -159,6 +159,12 @@ class MapManager: def re_load(self): print("To Be Implomented") + + def tIsClaimed(self,id): + if self.tiles[f"{id}"].owner == "Unclaimed": + return False + else: + return True def findTileAt(self, pos): for x in self.tiles.keys(): @@ -173,13 +179,24 @@ class MapManager: print(f"Could not find tile at position: {pos[0]},{pos[1]}") return None + def findTileAtRel(self, pos): + for x in self.tiles.keys(): + tile = self.tiles[f"{x}"] + if tile.Position == pos: + print(f"x declared as {x} for {pos} in FindTileAtRel") + return x + return None + + def getTileInfo(self, id): info = {} thistile = self.tiles[f"{id}"] info["id"] = id + info["position"] = thistile.Position info["pixels"] = thistile.getPixels() info["terrain"] = thistile.getTerrain() info["border"] = thistile.getBorderPixels() + info["owner"] = thistile.owner info["gameplay"] = thistile.getGameplayInfo() return info @@ -196,7 +213,16 @@ class MapManager: self.paintedTile = None print("Cleared previous tile") - def claimTileFor(self, tileID): + def claimTileFor(self, tileID, Claimant, mapObject=None): + tile = self.tiles[f"{tileID}"] + tile.owner = Claimant.name + tile.empireBorderPixels += tile.borderPixels + tile.colour = Claimant.borderColour + tile.pop += 1 + if Claimant.id != 0: + tile.borderPainted = True + tile.paint_border_pixels(mapObject) + class Tile: @@ -205,7 +231,7 @@ class Tile: self.Id = Id self.Position = Pos self.pixels = [] - self.colour = (random.randint(0,255),random.randint(0,255),random.randint(0,255)) + self.colour = (0,0,0) self.terrain = "" self.resources = {} self.buildings = [] @@ -213,6 +239,7 @@ class Tile: self.owner = "Unclaimed" self.pop = 0 self.borderPixels = [] + self.empireBorderPixels = [] self.borderPainted = False def getId(self): @@ -249,10 +276,11 @@ class Tile: map.set_at((pixel[0],pixel[1]), (255,255,255,255)) self.borderPainted = True else: - print(f"Clearing border for tile {self.Id}") + print(f"Clearing border for tile {self.Id} using colour arguments {self.colour}. Default would be {(0,0,0,255)}") for pixel in self.borderPixels: - map.set_at((pixel[0],pixel[1]), (0,0,0,255)) - + map.set_at((pixel[0],pixel[1]), (self.colour[0], self.colour[1], self.colour[2],255)) + self.borderPainted = False + def findBorder(self, map): for pixel in self.pixels: #check above diff --git a/Map/__pycache__/MapManager.cpython-312.pyc b/Map/__pycache__/MapManager.cpython-312.pyc index 47a22283a93ce741da65648ac87c7bb948a15a78..a231d2aa0ad3728eefe9f1a3c75538537667ab84 100644 GIT binary patch delta 2651 zcmaJ@eN0=|6@T}An1{dk1{(u@#^%F73<;ztB#T1BXz2tB4INq<;<&sAF)=n=n z^3)9>+fw9GSfgNB(c*(@6em*@T8XwX))zgQ4T+ca2d4T1;lQ{?eS6*S0xjwSc$rI^ z3YNMSyH<-=#gwUL%j8K}OrG1O2d4IPiS2Po#oa1rA5Xr|#$0#u?}++@bd1?*kCQuW zxORj2ocZ7-4Xtchl%*bSq?2Qv|H5`NK z6T*ar5v9_e;MF|6gFnrA&?q%UxsL zF#=)F)IUq^v*r5F$Q*mE!9^16{RV|RWE%~KD@Ji!a}C9;3tC|x9z;RsOJV{w4Ifq@ z`g7^PCB(~wohUACN{AD3E_m-5w{YAj@5hn!21Dq3QzZHgyL~XkgcXzJ_zrznSU@k# z(e|Dyf3XvG&aMgx(Vw5|Pl&9o9P}ydsc$x`I*JRUxa1+PDVuX*7`8dPF2j?*`Wr4;h3h<`8jZVrED%6Vj$FH_dC)UIRgNa2DQc)DvNK&?vsK=lDsKjk2{=pg8}f4Z zqUGCi+ElW1bn)n_>w(FUc0n#|nrqVL!Y#8WW%jIn?UA|liNu+!XcbINM*+N6_Ibk* z&v~>b5h4h2gl`}u5Ec`zTT!yn)^dY-wOD}{7_&V}RbG-ez^Dnl1;Ae-H!B1BZt|REB%?LR&6AHwF zkuW64e>2#(e2wH1`^abK31Rnrzsjzkr_*e$^)N3Hw$<8SjGs+c0d}rSSoTwG^;m+> zwSA9FGwEPIZzgQ$;Glk&{S=DVZ);UK!AqxpWN~8CJeRgt zZ`qqt_NEL+EMtVZI_yVEKXI%(elWOR^OMqFIPN(%2Jh7*2VdA4JewLkn;bcp8uTa6 zk0#sHM}^uG0izzf>KA$*nQQKz>?jtTdP?AdWS51xMlr)E+!h>tkHtFc`6_bvtUR?pjR*aQ$_1@@OyZPb^*M~ zWkieQ&eRa8B4Z$u1EDHoVDBEWOGc^TQyaT?q^|Nm$N7hRY%-$GgtX)I{p(%!nzI6F V`!k35*Asbtg!GUMr$6+m{|#bW_zu~ zf5;ad|06VePnFQU%#8}AoScLf*3_OP$E<$}j-h4zSIktlBt461-9wK=m}M!)G+kxc zk^~luSEmI7*x|AVwKAGOSB(j5N)g?B|okHd{*;>vT?*L|t)iW}&6a8~vJP$iB*Ol*`-fbNUk% z`MO5-vgT{+*vs<0qv_0%`6CPQi@FuZrjMTacw}+pYTwm;E1f&P2z(X37G8dOV0mz8 z<&oj#+Gl}w^}yw>zRnSrP$YB~KkqrLKp0%K0qq3CA@g7|C40x@T)&iu=I&^BNulj= zy+TGsRasHo)GD0oj`>ivNazISU9VD5bzfOESe*19pvf2ODHS{ZU$QjH>}Ap@X@y;!^()})=5}X>t-F_YPwATVD~a^a9NgOc ztx@|Xo{qyOTm1ZO4u07ZwV{umWDxmc&n6(^Z{vUEAmhJ4#=#MY^1pGA2s{N!uZe`= zTHqEKdj@KZYQXgM2M*n6@2z2W6X?y2Plp{#et`9!^uz^{};FPX=skj&YW6IqE?~5$%Zm zh!|oN;Y2hb+RC`W{$zU@j&TKjrQj|&iQp(0h|q{|77XzDj(Wi)gw|?7-La93o_e@$ r>pN^cPHGm@{H`N}ta8>>uKKRNPe(j=ION@kVGkj@NP*K{TJ669&(mn^ diff --git a/Realms/RealmManager.py b/Realms/RealmManager.py index f3900c0..075c0ae 100644 --- a/Realms/RealmManager.py +++ b/Realms/RealmManager.py @@ -11,10 +11,15 @@ class RealmManager: print (self.compnames) self.compnames = self.compnames.split("\n") temptext.close() + temptext = open("./Realms/valid_border_colours.txt", "r") + self.colournames = temptext.read() + print (self.colournames) + self.colournames = self.colournames.split("\n") + temptext.close() for x in range(self.amount): if x == 0: - self.players[0] = Player("p1") - self.players[x] = Player("c", x, self.compnames) + self.players[0] = Player("p1", self.colournames) + self.players[x] = Player("c", self.colournames, x, self.compnames) for x in self.players: p = self.players[x] print(f"Player {p.id}/{p.name} with colour {p.borderColour}") @@ -23,14 +28,18 @@ class RealmManager: if detail == "p1": return self.players[0] else: - print("oopsie") + return self.players[int(detail)] class Player: - def __init__(self, controller, id=0, names=None): + def __init__(self, controller, colour, id=0, names=None,): self.id = id self.controller = controller - self.borderColour = (random.randint(10,240),random.randint(10,240),random.randint(10,240)) + self.heldTiles = [] + colour = colour[random.randint(0,len(colour)-1)] + colour = colour.split(",") + print (colour) + self.borderColour = (int(colour[0]),int(colour[1]),int(colour[2])) if controller == "c": self.name = names[random.randint(0,len(names)-1)] \ No newline at end of file diff --git a/Realms/__pycache__/RealmManager.cpython-312.pyc b/Realms/__pycache__/RealmManager.cpython-312.pyc index d26163c19f0795ac5e5f4c5cc4cfb886e5a01acc..222a88706d57279e61f872c590329f4e1b4755df 100644 GIT binary patch delta 1572 zcmaJ>O-vg{6rR~#uh-bvxCRW^fD5Q$`Ew~!NmF8qQdJd7outr8Nu(f$-4N(vH?td5 z$P!v52PcXYtf>T1km9O65IG0ZLq*g|iF)XvJrviGupACK^paZ|Dn-hv^VV5Nld4bh z_h#Pr=FPr0@A=Qb4|U$(Dl01xlMBBeK6PBoc)#aH`P)D9*zE)>h~l6E?hZ=j9YO}S zS07`2hCN z7JhH*-0MBjkJW@Wtw(1P+N3geGDQ@XjE$$X)LEkU7+)Cl7~hV)^a3CAxXb2bVp`Sd zJ^n5?is@Iv$%R00qwd}HkwRc7EfqtpH}+rKe|<15+?VRMq{_6h>1)pWn(s@IVyJmD z)R_-;ZiagEq29H&La5(zD@s*Yy_dXjz+by)ES<}oEBITVAl`Kdr-zEZs>PwpGg~d~ ztJSN+Yl&Hv%+*@;{wR@5OsJ%1g1#wAVu<n!^8OCfIkrni&hXGm5il7Rh4V>W)WH!e_Ya z5mbS|jk256GF7S=PbCeK(lnKnT&Gn{8J*Nry(E%EQb|phoS<1t4VQRLO%h0-K#fTY zKpjAkf$Xq4jzrnIB$kJ>9N%Hhs16Sv0U=E^D>W@Z_vkAOzC^{>s?)+1XR)D;DPOTZ z#FV$_53Yzeyw|+hGq(b(pXNeqM{YJ2>iYBky=jq=OW{m-dA#6nNsBPqGgrJ@jgf5a zD*mSa`iWZy*2J|lw_UmTPkrk%_Y!wze~fK}hhf0$i|(4`z#r7-+OrU0*RxT9lEh_! zyumct1Hk?#5qTRx28aMyEe_2~03drEn(rd|TW~pIWglQNH;z3)46N|~09^e;^Z)<= delta 1147 zcma)6O-vI(6rSCk?G|XMwI~EzKtODRLIU`kQUm@ZA}JDyCI(vzTasdF$!syftib~Z zBp9i40Ao}VFC`odYUDZ{~e7J8#~%`?h4= zQTV}X%_m?_{T+RaG+Fpc>=x(WNrGVKk3^5_EFpKPPF4Aqn-Er#a3B{=HO&e9i|DGA zy)gP?UeT#e`i(seVh-jc;5*Ga#RU`R`Ji;M#H`ExML9+;c)}N?W86d?LIE$OC;1R{ z3s(M&`uGN26n_vtEBEkgCfn)ev6dCvp2?Q++iR8XRMCqglXS|Gv`lvVrk(C1bWY@TF z#Zf%vO?qd93-0`$~iSRoIoP00+=PN9Ag&(%>tfKvjU8gEozh7gsn;{ zJ7MjB`P2yBq`w!rSyLb|3ba5uQ$!ba63pg^F2HD~OlYB;P4t_x(QmH`syK&bf$hc| z$)x{>`Y*Fjg2UvFt_!MUD6UqQc6;5<9yEa+K(i7(*EUt=_I$@ku99JFqshO4y4=_V zV0j2w(FR_DM`8QGt>*W}V+j_IM#F5?#6mGOKCr5wkHB;>GNfoY#;~UzYBZhIL7Z7E z$3g>PO~WcGz?e(L1?FHd5{o2)!8^9g(a><1)nzBJzgi3cl(DyHj7}&krPbhUYp$y2 zfyaSVYf4MI8sA)4@Xz~~8kTy~O>G~KfAYQeEnn|mzHu{sDYWeD;a3Y9MsO=oA=cxE zgB=3TY7h=1G$OzU{HLT)EDQk!rlC+q$#*KtzKrZJQFT7 kt7lC>#EaCN0Gsgt5Iz&@HZ2yMUkSi=lOp)O5ddTRU;otE3IG5A diff --git a/Realms/valid_border_colours.txt b/Realms/valid_border_colours.txt new file mode 100644 index 0000000..4dcefaf --- /dev/null +++ b/Realms/valid_border_colours.txt @@ -0,0 +1,8 @@ +255,0,0 +255,255,0 +255,0,255 +0,0,0 +160,160,160 +0,100,0 +255,100,255 +180,0,180 \ No newline at end of file