From 8e54c5fe12308c436cbef7f8d59f5296d4bb3435 Mon Sep 17 00:00:00 2001 From: Cory Date: Sun, 19 May 2024 02:33:51 -0400 Subject: [PATCH] Okay... I don't know why it doesn't work when the mines can be hidden, so I have a janky workaround. You might have to try moving the cursor multiple times but at least now it actually works. Next step, add flagging!!!! --- __pycache__/cursor.cpython-312.pyc | Bin 1407 -> 1858 bytes __pycache__/free_space.cpython-312.pyc | Bin 12693 -> 12977 bytes __pycache__/mine.cpython-312.pyc | Bin 1640 -> 1929 bytes __pycache__/spawner.cpython-312.pyc | Bin 2883 -> 3134 bytes cursor.py | 4 +++ free_space.py | 37 +++++++++++++------------ mine.py | 18 ++++++++---- minesweeper_game.py | 3 +- spawner.py | 24 ++++++++-------- 9 files changed, 50 insertions(+), 36 deletions(-) diff --git a/__pycache__/cursor.cpython-312.pyc b/__pycache__/cursor.cpython-312.pyc index d2a1cc8a045c029c6b4d25569a486e035f21f83a..4f75f8d7c2af82dcf00d788e6c0b5379747a6c14 100644 GIT binary patch delta 803 zcmZ`%&rcIU6rS1Lw%eArG_(i_C0kIj2blpCkdMPHy95lURsNRteSY`R^ecx2c6fgi5`5L{W3qk_q{joy|w{PNM6`S&%yq-4F`J5`4l1?%cR4#pC z?k4Un^8cV;V6(VaTE!HxXZR2+;|;vQbRmpa*#qH*Vt61BSi-S|t<`ySa}=R@`J^F=AShejIxRhcUb+Omtna&`OzkqgqEi3cO^UKl_ zUh4Vk4y^Po_mx9K9~hQO_qGFrpF>@1r=MKgM>tr-kMM3=$8-6yyw>_sd~tTmz8)&~ z3{=7cZ%5w+cA~LLG*%v;*iKHCZ)d8>Y-K!KjplZu)0OCS^}G00C%XFR1*Ep8BM%9PwCT81PjOaScyhyWZ0fV}EKD9l(Kq0h%x@|>cF0T I#G$V98$r{+*Z=?k delta 349 zcmX@a_n(XJG%qg~0}#kmd8W-^p2+9Js4_8Hm8FtRlYL^BgQO;-pC;oij)MH+%#zIf zJWZxsEXAogX+`W4A5Z3H1L|W2;?FgVlN%Xrn2P34KFGL}(Q$G$lOm)3hRO#n4HR{$|y9sn@v&` zr7e_?3%4*fT96K>pxHoKMwbmUom=KGA*7=h`50fP3^oM2 zH(jzswi7cFULZawF=kup!;CL}EQ`r}uvVnjy^xp~<4dVN81%vaxuvB*DR2q@-h0pQ z_y7K%b3g2UpcXu_Sd0iR>)h#{75PEI&)8VQBXk!{;eJF{j5ZSCjQo#Og=x=>I< zr}dIJgM*i*sNe0NuSq%ymQTU5L|@@bD@;rqy8`^DICXatbv}#GvcorQNA_zrKOkun=qcnd)D5@@*6 zMvs(BcX*>RwolK}+)&E5>nQbCg)r(sxBk4wcc2Np{&X|-y8`|4Cy4ucOXnVu= z2g__+80;HT1xm>t@>L%}?dZ`RC?3k_bE6@GOow%a)z>5oi4;5FebsmVCx;?UuSb=0%gV)wa&bwyv?>BA!GorR899pYw%=}_7k;u=Gsm)wj41#*->V*%XOEbPtgZ0L5kv%54`mLKlkwLsgH>*<|(7JxZ3{zLT+y$gh0^S(WR z&Dq~u0C{S#OE}r-O^xC%;baqX*8>ncc72|3vS|71kp*>VL>tsNt&@(lGIg+4S$`%m9({?u*Aoh8AWT-@xkH1 Y)hlWXIYmbsYzMAk+>4V)`_W+k1Bi&2bpQYW delta 2669 zcmcImT}&KR6ux(Umf2sRv)k>GS(xQVSvE=mlS<1%(S<|=9w;%vSaD?smX^QX-If-Y zP~%e*lhWRp@+M78n#Koccrmu7t?h$}PaDwUrY}YlpETPwMpHHM+*y8R%PwG|v&osc z_k8EvZ@)Qr&b_65H01c&Znq$~e)! zPsJ|~3H}*7=!8U3Om!UI{KbZ+NeJ*W~*3K>bqN&9-Do z?YwoN`?05d;k{K)AcMqG-+cRHZ{=dks`qdP2`=9PPIJ7+x2~v|Vp| zbIGQTheKca9tuE+M@nB(>H9|Me?jJnzYEbyH?MO%v9t61%E_x_%A&D** zov@@NqMg&iV_JktlHw`@_>7|yG(N#Jela>4(W+^)^k!W(ct{PH7^_5;*w~n5H^O7l z$?4jaFQk+Bd71gy3n5j^u<(?5LK_{4zB@@`H#uTu(+X|3)Z+j>V_CrmXpOZQH>?a= z&)6ytFmEk0Zas1+8YbbPxJLZ^W@N_QjbB=6JM@zvo_E0RqH3vIh~PL+-*=R=9pz+| zzFGAcMYseS4OGIG!1UluQ4R&wwQoIy~`UNmnvR?Y5 z>@*uuPC8XC(0dhT`nGHmr+3AP0`GzHY==#DTov^_kUyaa<$69Rs@RhkNyQk9s=lnr@JsoJ>Nb_8nHV_8f!40nxE}ilMuBb>1=^&1Vmn4O|kaE z5qqh-lX$Mi`y#$2^zPJ+3T8LdUet{dc{K+>!3r)+-4Inka|2?Znj0eaqqzaTqpoik zEEYr5mgaNMynF)&sKaQO%c*cv?3Kb1K;0OT)!atA0#;4zow4-kEoXFMMC~Uc>}}Ev z#&1pWW0NEL_ukMr^d4}Of!MKxKw3nOG1I~fqeT2*VsK_c>PB1g(2oPIngKTb8{~(R zfMmNYU6SUNPx!^qjh^d0t7>Div~f*pTDcoAnO+XEG_Gps4Vp+yiB{uxpg{#CUCeWo2;lcF! vv3@5VY(}4E{q(8SGCmnOJEpagP8hOA8)JPm&0~yzcbvsIiZe*R=|TShV{}wS diff --git a/__pycache__/mine.cpython-312.pyc b/__pycache__/mine.cpython-312.pyc index 9f03dad34c4740302399dcc2cb1dae19a292cdec..354f038160fa360bb15ca80a38c4295994db353b 100644 GIT binary patch delta 869 zcmZuvO-vI(6rS1HZMSr{yV#;qiYyJN1yU|R@Bmzhinb&s9Q+AsDy>kUEtxHtk|uEA zATb8(!~lr~k2ckeKYUd{i&>Ko{y?p zhhQx~8@abeik=7_F5VexNYt&M+e+RYQYbKynyKSf-p@W@;P5&s3P=4Xkgp;v}5KXLNv&};WHXJC?Sl1?P4FWmt7T_ zM=Zz0JTbqDVk^Cwu5{^L)h6S?@S{jo ztzR2o9pC8L8rU4DsG(|83r~Y9o{pL;m~D%#q=ZWBAqlFDptdj7BxUxFWO0Cn#Y;{a zfE;aPRP57R_|^v7RxS|K?0Pd)Ozw-peu;iP_#a~531V$V(VWWOUv$~y@ooFD&e4#{ zGSX061JC+7oa122xAEP14)BvA8epHKfU5_#E8xi~_FMAGqGaqTSW=nOaRJ8ZcARYu X1A*Vu)Btt~#`uq7V08}x*tYxyw*|+! delta 601 zcmeC=f5F3dnwOW00SMj|d8S=sn#kwFXg4w1p0|=qllvBnZ)RTVEynnXYp!y!0o5=A z@#k}syBQT&!)utbm?xiO)R;VhnUmET$YYNl~81UsX|6(i9(`6F3=W*#1e&HjCz`Ew^;HLb5n0|WERJ#<`$Gx z7O?|0-eS(lPrt=nTv9Z7Hd91QAW*1*;Rd%zzg?%@jO>ftS~rBnr`t}nT_CbtcA@MQ zVf`BdBGWl0a$Jzq-NL-VWxMZ2-^&J07bTqz1YeZ&xFX;Qm7mJ>ft5kT-~%%Qk9H9^ z(9~qciR+~lQW$F(;(4 j#0IcSC~5&!f?~9oA4q&)W@Kdi&LhRh`-uTafSm^b*Y=O2 diff --git a/__pycache__/spawner.cpython-312.pyc b/__pycache__/spawner.cpython-312.pyc index 816efc026143b5ba1f55752efd9eb66e202fdf26..c9c381d5ae6fbdf6940448ddc3f756ec47713b07 100644 GIT binary patch delta 1461 zcmcgrPi!Jp7=Ode@V7uI1qKF6DT^yb*0O9H&Du5H&~?{ruqHL8hla3aK!`v)GibVj zbPpcZ1Y?_bDD_XuCLSPvxJz`b2v{c; zp97$z5a|vAfT-$P39<+>YPdprjHfXzyh8?PvPfq1$ZIAk(FlJhy*5)fvj0VUhM+{5 z;pdc^75|ScXNj^{Br=vhhpr_WyB1<)ZL_*Wsm=6F1fTMC7+<1P@GsI7ws)iY-y+#n zkU$ESFH)edZd)^4F^acFz~b9&d3)j`xAr8pDvI2T$W0->Pts0Nq>{Z}2}Ic@vRw|v zQ@#>iq&vOvDgRYTFZQttDfp1I6Lx5)-If>y%B%myA1=`rqDNPY=&oS8q6>aZ`%Q=( z)}|{(f`m=lZ#+R0B=%)I(5QUzG0cnVcQ6Df3n=${D7UXyRcGE9s;$!Z%CU)(5^3|K z4k){639yP@zbg6%9%@LbJZrKh$#a~r9AD!6W?3f|_*^Vk$ll<1ndalU6vtC&E024^ zBEY2J$eh>WboRAX(fvT~`w3wd6^ zw`~;utvcsSDgd|ze$^S9I#$xLm6e8W^f!y6avm-`f)CWMtT{%ugImEGbx;4Pe$O#= zz`8#DBt&d~+@?&Bf~pPMYHyv&s7C8x1zS9%&6T zo7Xq4SFN9swVAuhJFdOqXAfz>y8B1(JEjhmz+~A}Z>T>qSLU}DwiZ4dsgFaO#@l+~#<@Lg*fLaa?lb2fYS4*?B+7L>2n(9(Q9+PTmS zN2G9McSQ9 z?d69M%B#^5^=o7$nxsTN+nFNV&CXCgjV(M9ydN#_Pwg3P2pM=b1s8Pc7`>P99s#tp GkNXFPq+4PWR6cA3OPt9NJ*Ov)}>C3c`<2c{v!w8M~)CakndWl;%^69+<8#Fh74Ov*dFKi}_r z-|u_B-@6n3yI;I7id_JYU*@J}g$=QnrvHT~PAB~5O@`oP)IbTM$M9e<55N-r2F?*Y zF@069fi?#Cdjfi_LV=@@z;-@G9ns> zlGyRdmiqBa2PBpI2CJL<17Q+CKfypK>L%{2SlWpnFotVX>0l?|?l2m|0zvc}=Q)bW zF5X!qc&kD(yKkldzU4>v*;rtAe^uN*p#xkm<#Z;v;B+SLs_o0x6~H~(uc|`yBbO3h zq4*@?`ZT$t{?`a$my(WKnGXyS6RvP)HHX~2TYS<5QtiX>&I1;~B1rL>|HvP)g;`zG zjCm!mp__c1PD$u7-}eRimb#ZrEFtj~rL5)3n#~xdZVQU4=9Gd~F?C2NJ{>xlND;DN1R&~RM zb469tIjorCbRQ9h1)@n6ZK`B<5wkhRtscTbgAmb%=NL7B9(h9FjyI!6tmu(O-#cvp z#o=Y@VdT)7*^G@?v5`h(v<;ZR@N)WL{O$Ghy0ZRmBR;x3y)7MTO0p%%^~=AH-B`GJ z!Wx>mow%j^DO*DyZc6EGDZH9l$<*K9l8!y&u|SK#(z`y;A6+|+F0=tJCUK%r^jZON z!X(`zp+AJ=)T2;zb!la(e(u-o&)Ln;7?x>DNlQxB)ux=bw~H>JHiLo1sm3Z%# z)SQ^MCZ_M5wI(tT4u9H+p4sx9ZH=Ojz1dT}xH#W~?e5@rpR^&(e(=9%fSsXq0_z?; zWm1C8=}JYdmYp6tCEaUjig29PbNR1yqpG7P-oer17$u*^h~cTlP!#pt2dL-{=-UBr R?SRM&7^h~aHXyT;<|To(CLjO+ diff --git a/cursor.py b/cursor.py index 47ec299..c5f11f0 100644 --- a/cursor.py +++ b/cursor.py @@ -26,4 +26,8 @@ class Cursor: if game.is_empty(new_position): self.position = new_position game.log("The cursor is at " + str(self.position)) + for i in range(10): + game.log("mine"+str(i) + " is located at " + str(game.get_agent_by_name("mine"+str(i)).position)) + def hide(self): + pass \ No newline at end of file diff --git a/free_space.py b/free_space.py index 8eecd14..bc3d7cd 100644 --- a/free_space.py +++ b/free_space.py @@ -17,21 +17,25 @@ class FreeSpace: def handle_keystroke(self, keystroke, game): if keystroke.name in ("KEY_ENTER"): if not game.is_empty(self.position): - board_width,board_height = game.board_size - for i in range(board_width): - for j in range(board_height): - try: - game.get_agent_by_name("freespace"+str(i)+str(j)).show() - except: - pass - self.reveal(game) - for i in range(board_width): - for j in range(board_height): - try: - game.get_agent_by_name("freespace"+str(i)+str(j)).hide() - except: - pass - + if self.revealed == False: + board_width,board_height = game.board_size + for i in range(10): + game.get_agent_by_name("mine"+str(i)).show() + for i in range(board_width): + for j in range(board_height): + try: + game.get_agent_by_name("freespace"+str(i)+str(j)).show() + except: + pass + self.reveal(game) + for i in range(board_width): + for j in range(board_height): + try: + game.get_agent_by_name("freespace"+str(i)+str(j)).hide() + except: + pass + for i in range(10): + game.get_agent_by_name("mine"+str(i)).hide() def hide(self): if self.revealed == False: @@ -87,7 +91,6 @@ class FreeSpace: self.character = str(self.neighbors) def reveal(self,game): - game.log("Revealing " + str(self.position)) self.revealed = True if self.neighbors == 0: if game.on_board((self.width + 1,self.height)): @@ -121,4 +124,4 @@ class FreeSpace: if game.on_board((self.width - 1,self.height - 1)): if len(game.get_agents_by_position()[(self.width - 1,self.height - 1)]) != 0: if not game.get_agents_by_position()[(self.width - 1,self.height - 1)][0].revealed: - game.get_agents_by_position()[(self.width - 1,self.height - 1)][0].reveal(game) + game.get_agents_by_position()[(self.width - 1,self.height - 1)][0].reveal(game) \ No newline at end of file diff --git a/mine.py b/mine.py index 5c00940..086e5b4 100644 --- a/mine.py +++ b/mine.py @@ -4,7 +4,7 @@ # This module defines a mine agent class. It ends the game if enter is pressed while the cursor is over it. class Mine: - character = '_' + character = '' revealed = True def __init__(self, position): @@ -12,12 +12,18 @@ class Mine: def handle_keystroke(self, keystroke, game): if keystroke.name in ("KEY_ENTER"): - if not game.is_empty(self.position): - game.log("You hit a mine at " + str(self.position) + ".") + if game.get_agent_by_name("cursor").position == self.position: + game.log("You hit a mine! Game over.") game.end() + def play_turn(self, game): + if (not game.is_empty(self.position)): + self.display = False + elif game.is_empty(self.position): + self.display = True + def hide(self): - self.display = False + pass def name_me(self, named): self.name = named @@ -25,8 +31,8 @@ class Mine: def check_neighbors(self,game): pass - def reveal(): + def reveal(self): pass - def show(): + def show(self): pass \ No newline at end of file diff --git a/minesweeper_game.py b/minesweeper_game.py index 20ffe74..d895b6b 100644 --- a/minesweeper_game.py +++ b/minesweeper_game.py @@ -4,10 +4,9 @@ # This class implements a simple minesweeper game on a 9x9 grid. from retro.game import Game -from spawner import Spawner +from spawner import Spawner board_size = (9, 9) spawner = Spawner(board_size) -# spawner = AsteroidSpawner(board_size) game = Game([spawner], {"score": 0}, board_size=board_size,debug=True) game.play() \ No newline at end of file diff --git a/spawner.py b/spawner.py index d1175da..af0f797 100644 --- a/spawner.py +++ b/spawner.py @@ -18,21 +18,22 @@ class Spawner: def play_turn(self, game): # On the first turn we will spawn everything. if game.turn_number == 1: - # First spawn free spaces everywhere - for i in range(self.board_width): - for j in range(self.board_height): - free_space = FreeSpace((i,j)) - free_space.name_me("freespace"+str(i)+str(j)) - game.add_agent(free_space) - # Then spawn 10 mines + # First spawn 10 mines for i in range(10): mine = Mine(((randint(0, self.board_width - 1)),(randint(0, self.board_height - 1)))) mine.name_me("mine"+str(i)) + while not game.is_empty(mine.position): + mine = Mine(((randint(0, self.board_width - 1)),(randint(0, self.board_height - 1)))) + mine.name_me("mine"+str(i)) game.log(str(mine.name) + " is located at " + str(mine.position)) - # If there is a free space where a mine is going to be, remove the free space and then add the mine. - if not game.is_empty(mine.position): - game.remove_agent(game.get_agents_by_position()[mine.position][0]) game.add_agent(mine) + # Then spawn free spaces everywhere + for i in range(self.board_width): + for j in range(self.board_height): + if game.is_empty((i,j)): + free_space = FreeSpace((i,j)) + free_space.name_me("freespace"+str(i)+str(j)) + game.add_agent(free_space) # Now ask all free spaces to keep track of their neighbors that are mines # and all of the mines and free spaces to hide themselves. for i in range(self.board_width): @@ -41,4 +42,5 @@ class Spawner: game.get_agents_by_position()[(i,j)][0].check_neighbors(game) game.get_agents_by_position()[(i,j)][0].hide() # Now create a cursor. - game.add_agent(Cursor((self.board_width - 1, self.board_height - 1))) + cursor = Cursor((self.board_width - 1, self.board_height - 1)) + game.add_agent(cursor)