From 267fffa9b0b2166e566ffe627be4b92354eaf9b4 Mon Sep 17 00:00:00 2001 From: kdang Date: Fri, 9 Jan 2026 09:49:15 -0500 Subject: [PATCH] @chris My fruit offset does not work --- __pycache__/catcher.cpython-311.pyc | Bin 3193 -> 3651 bytes __pycache__/fruit.cpython-311.pyc | Bin 4433 -> 3601 bytes __pycache__/manager.cpython-311.pyc | Bin 0 -> 1384 bytes catcher.py | 9 +++- fruit.py | 73 +++++++++++++--------------- game.py | 16 +++--- manager.py | 17 +++++++ nav.py | 2 +- poetry.lock | 6 +-- 9 files changed, 69 insertions(+), 54 deletions(-) create mode 100644 __pycache__/manager.cpython-311.pyc create mode 100644 manager.py diff --git a/__pycache__/catcher.cpython-311.pyc b/__pycache__/catcher.cpython-311.pyc index a8fe93a269b90eaf13c8f2e56d9efdfe2058a7ca..978f128b709d1488c7d7105aa6fbb3f8e8f1737e 100644 GIT binary patch delta 1494 zcmZWp&2QX96rZuz-Z<-Qy-h!o5W1^ElNgB&L5-@S5D5WINyUN)7Z!wBY_oB*AK}?i zva7&GC=wicAeuu!LMW$JB}g1Na;e0HV^UQjvcw-yaamL@^u&APWNFCQ^Ygr!H^28W zZ~V{DucO&J0|WgG+Yh-)kk_}eL!E0VZ8MK~yvFLh%sEro9P^Y-=Bc+8#&)qMt*pqE z6s~ChTTwlIf!XPYq-gUv4V8u$G$QwKr~L3k;n77LY%`ygxyQ=lO~p9vshg~L$Vt@3xWLoDt_&wP?ej9D>9@%A|DbW)w>&nfZ zv?NDxex2VWUfDcl4WHpe=-|gw+XIZbs;kV9#1>??Q>9q@1XhA5))w3*_z%gRor-f+ zKXNKnzY#efx12_$?#E`sUv-w7VGsq)24qk#*21U~`L+s3&EixQ)nE{ZA^A}#6d+6U zMrXNJX*tmfG}`B0twipk4{ry)>lb_T25l-KY_J3C%EtNU`>9d{gFBU z&GdJ(_cQih#y&8uTk~J9?wNUfADH=_seSX=MB0~gIPR*LaOxZq=wokX-1nQNev zJ;qIOwR1<@y~GZQ-_)x-_p_3^%!h%T0kRhxH(r0wdFPF}>+jkcWW-zAm1%i~#**I( zBWN!9(nQSHV%~yD+M+M|L3J?-DN;OJYLFGbXp?+Y{Hg8ooY>YMUy$CXWqH6jZPV~J zReebTn)oR_JWqxsJ515&MbhFytR)drUL|=_JurcC`|MF*$C5E2PWNq~UD3BWC+(_9 zSsH$01uGG=CSAY?rOBQ(xJq_kLI~;LrM09OisD1#8UBL!!YCo{zOlv)G2cHrCihdx zCw|Z3DAxS?a@2Z~LEP%k^J(#8|5PU_yevFLdqxSKCXk6tdqGGCB%OojX+BTTt53L0 zA_Wdbf>#I%1Vo#7dXYv1bj89i5jJ|yfhj)7oZ@FhEmM=8NW~IfYn^^=%{ox6CzUUG z3MBTpANS4Fo8C&zpM}?Of&K{LrwCn@bAG@^_Kv^Zl)>?~oP@t<&iebmm2)dK~cwnNw!rIXE%qKttPts)jtVdzW9nrj=@rsX7qbqJd< z@VQ=4eDP6{;giq8z<*-o!S}sY^u;}S&yC&uxFNrrd(JPv^O2J;g`X3d_v!SA#8-1~ z*<026nTeHa{PbFqrK;pgJCaM@$&$3o?|40lJu>$w|9FV2K9nr2KBVGKejmOU`fnzM zyT8{Y2D3;=RQ8sfR%%v)T~R8fG-rO0Aj>x}5tJdIMo?xim6=hAXj21(n5VFPrIXdU z|5lW^-*S2sKw~TF!gaJk5&^3VF#S>~*2O@Zqc@ze-lQ;R+n(=*ww*z)0L-8+v*)QX z_EoJColR@S%PDS*)P~che`-ZWmj|`Ob?`THL&YOgjs@CPlKu2iyF^YMZ~^H6ONorT zHy_&%?o@9-vNSN*VWLtH^2QqN1tE0SD4ana*@#FFX4yS`f|%^7eu3oKD}9$_*>du5 z3oEpAF!%-qq-)^#4GObpz}`g(r`x5z8ySx4+D?P|p_KrPB;?^7KAlG*@glA3(K-zh z{8$nz?$sneZ{~-U)qy%8wFOlUrr2j=nSh#VAFOt>~+mB<1$ugOF6$AbPhl0qL diff --git a/__pycache__/fruit.cpython-311.pyc b/__pycache__/fruit.cpython-311.pyc index 49fc690c8448e616b5ee29a48c51a5fe586dbca9..f71363c79a476737a55132e25b2159ecd27b54fb 100644 GIT binary patch literal 3601 zcmcIn&1)M+6rWw~t|V(E%aQWs#E#QAbycTv9QOskOHcg|dY6nK%R-<~dT>t)=_#kaH*2kATcs4*(dudT&CJ{P z=Kc0JPd`MXeFWNSJX`o8NXTz^({9pk=h-#r+$WS!VTmjY89^Xa%nNx!1K$aGF(ZoP zGNIC!gvt*@LLR}_YncEaQD7vvZ$zS@Ig$$R;KY>R23fX93q|Xp$Z$0mDT$#6DRD>e zRlCD7*E9U#A_pD6;cRTrMnK#rI>`u>WJD@t0#wXMG?0XHb1&c|A8d zu~sZtQxhx9xS{7PEuV#D^XTsRl?^wffr|x8(@Kd>2Z-8b7d*J!TQ0> zL&D`?h~OBCeOEpkwJ=Fn2_gkFM?-U-cP zI;BjI%9#*VGGQ8o1ozPp$OsLCRB0c`D2+hMRafTwwS(#4_?dNOzN-wKXJK>zq1SGR zGoJM8(78|cCcQua0&UC@J1|W?AKH{`QbX$pnk`yNN4fW<5XjwOgb<6s3_w3-&{eK4 z8M#H%RdYEuGsgxkUd%Tpp(T09=(g~(_FjUT)J44WO<++@}bT^pGTDb+CahRuMH)5@^qE=j6 zz79GLFqP@c#!X$z=Jlclc(DLw?m%9*JdJjJgA+wc@t`(>#)Vt1u)$u!u3FUBwKm(C zh;5ED4`^-}$wI?tmij%o`HEqfYPui*Z;}3HVUaBco2@=)HGtPgg#u ztUCSi>ZLpDm31ecd>lW$9Y0+gZN$f#@v(Y*40QMUw%(}6&%o7;pQ)`j;xBo34X%U! zuY<#n2QO?7Uij&FWALr!;9J$8Gjh5%SzG<~wXITBbrPp)Z#2(LZ6~Jci76*}>~Zq! zcJgeEHj?AbFV*U<~r>3bhn;nO-!)UyzT z_a68dgjjthslpAs2c+{JaI6OqUA!l6DpuD@J7CL*I9sxJk+%<(K|2W6e9o~st^w0s zHemT~vx9qA!-2k!cNo4ZuEJT-bi-LnJvgL79T>1vFo(T@;ylh4ja%^DU?`tt@)(8zXLqqlU<)y$U1$c^2ML&b~KCwX6Zk^Y7 zA1VFvcXa*$mOg4PCqOx*LpeN+!lr18K6$;~{j}b6V;`Wg?lm_MK)n4kp>?mTbsaiw z3qX7OsVx9Uo9I)U1Yiqv;@PFP|1*YzbO#5i=0mtmcWe}5NCnvl{IC=VHw=d%R83H# za8hG0i}+$#mWNx!7qJ+Q9u!_# zims&L1Xb{_im}WPmF~dYhaX&>(WYl+ucWVByYfkT&MSnu-+N30 I4Dc}j0=>inJpcdz literal 4433 zcmcgv&2JmW6`%d$hqx4_kQNnL)|aKabf7Otf!wqX>O_)dH)RsoKmj7bg5j=6S`tak zuBw=!5Ebx&F$|P86iAl<3{bcg+ycJz9-#jKDG(5`fPer+f%-;6KKa!5cF7f&D;I4K zo#j5x&YO8N^XC2LH}glozl%V6{KE(71rH&A$B$Oxo0-$Qkl80Jxk+U5fXK{KmXK%g znki;#SkQ1C8pdeDgGT7ku(In8iMSIjBlyoWKTZcBvriNfV`LIzWhTbSY>bz=2P7uQ zJhT(^u4THF);>uq3FS5OOFfXJijtAC87ZBS)5&bY8XcIzJO}S-$go>r3PggOnPhT@ z95T^EM)%~hYFbNYGl#6stIGN+^+FXDTaS#qUYbs2HiP`C`Oj?_p&e7~WC80^lI5bmCV4nARjIA3U4ERI3m@ ze(DFYOX~e2MgEb$2+t`LkZ8n(jWb|PlJqV~+Q`aV>zEfMX>%*S-qd&#sW^=%G==Iy zBDCP6fD~mftZ$bt7~Xk-&R?eJ7Ajze|JAZm zH@1VQCKQ9bxss+2&?)(DqZ7;fhKIVbI_7MB;cW3e{S17zPYUE7e3(hSP$1=2=(Y-t z{{r(A%AZ*}h7_24)(m7O?;=EI*NhVSJFtm880j-8+hKRO0w;4#eYn7s(GQMPAf3Hn zNJDLOm?O!&z4i`YV4)Ww4>ecW9ibo;__J{|`@UM>%P>}FdJ09)tYVyB8GY_Zo%M_n z3IIcE##n-H#1*Ce(EbJ5c!4?H^~rktzCvH1A0r;!l|#_0x<5gcxTZ+WPoK6$Gg4-2 z;|qlvz|}>nY-E3{Nb#hS(e&P=qM2Fgi~9zQbhq+lZXHmob4o^zxTp_%;}Neq^QF$* z*WHP@mPi4T#Eh~nwYCQpT`^)LBbIb;4hAS;|M`F!QC7iQP*wdK2mo{-_~tmh__o_Tcg&nQ>i_?k5lP1G7x5Tapu;d# zU7)~SiY{!YWi4e8fbNRtauEEwH!jOfptw>>I+@a%c%VOlmh=jWpP~&WtqUgNI#57I zK;0y@DH}A$K%rJZm>AgkhA%S3*?M0;@SE?Xx38q_<*U78wcfD?;k>3O-Z%*jm6`I5 z?}hT_LB1NgS_@q*E&*~L{i=zbt*SUtgTNFKPrr{oj2^sO6-R60XvO%MhQF%zUas|C zb{cNt;(svQaJL3&0>TPDm?46}0K@|*-6tA+w$fRUc5M8A2Kul_p;a6IpTcX~TssMZ z*eq=@siQ)uX~Aa=>gIgDTi zdQ}{(iGvk!(9RIwE+2gQ`1ZrEi(j9-ktO~SzIYs-JPJ?#DOC+G)WQoT-oX;{f4F`W zoT&t7kQ6?8^3mhyUbGZF`F9NQb{j)PBYxTgGoZaFkN_#piq3-2-Evw*ax^w18pQGt z3OtU{cTkL=xQ5~ainCK|7(Y?q4y{?G<^zSa!{oT9E_3q&A&ALATxwDfjZ$HGk zx`o*WvBXH10Go~_`u(VN3UeqpfCRi&YQg^$gRA4%3s<6!Yl~uz z!kLIe8qz&+749|Jw5+0|0Bh!19^)q8*Y4RV>i~8Gbn53IfP8#`W8c`3Z>&5I=b)-@ zzUG^65Y{_(5+3|6S&skZ!t>t4x2r>QwV}D^pH?m{RKwS5;cLZ}Cck`V;}>9=h5(HX z3(lhv4_z9oiCY6OfwgA18ZvA5et}toS_F^3O~0l835_ER#k*95HC=%IvfW{>LqUGn zHgBh!m$4N_E$k?PzS8Ewcr`Fw3k;XvISNcxJd?)I;d0rD*`GlZ6Oq_WCm4T@Whiif z>H>&1Fd_sSJcp>VL>D7W;bpQ@n5aTaQCMp9m=O|&?T$`gdwyZwdEciWLOt}TS_IMH u7=~%EJOj5?r+A5Fug(P(SgybKK1DPCgPt8)~_RQ?6(rGDW6 diff --git a/__pycache__/manager.cpython-311.pyc b/__pycache__/manager.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..783fdfe413cf4100b06ac2df013b760d671a85f1 GIT binary patch literal 1384 zcmZt_O-~zFaNd3x8!g}{q7sozEg*+22&-x(E)+yXAROveB8tRbR$IS^aq;fDZ=Xv* zPJ}8BRWHenkzX-tpQs{zl&0IW2<`^hYQU;$m#Mc~+NLefEzTp^(*UP4#a1sPGSO;nx0X0uG zfHQnM;0)2kCfGygQna<$T;tV}i0^GaUit2kyZUHtBfs%vs63sHnO$U)hgSm9n?*iYgBdKI!k^eD6Gk5u+_6htSsa)J)4t|7%UXwWdxM8rE#n znyq*7^4-`}8%S#AhA8FCTPyRLHmvEUHC^w+wvM`&mzR-+-hUpSfH$8m>VJ|&ePDV+ zc&VoM6EepjdeZ@1+Zqw_?ixgQu~8nJYc0PuZP2c>0XQ{VJ0HdS za~a(>xHRUbBr;^2@+j?0($@KiJeJB_{(+HH&1SQFOrFR}4<-g0-9K!p6Mc!~5ZAFaKh;lGe-7Uq@e68_7&FnW=a20_`AgC*q{5mdSPF zVb}FTS}il=E!X|A>Xqf1p)^EGksL8kqmfGM58&gHS9vBSCyA^vT0nBxd;S}}f4JT@ z3=`+vBbH`Pw&6DE_>`XVc2YH@(>v9+1or|O`l^w!#hKvYJmWm%k@^u-0{j8m-eh)_ xTLc&EG|T`1 literal 0 HcmV?d00001 diff --git a/catcher.py b/catcher.py index 165f4ed..a93dedd 100644 --- a/catcher.py +++ b/catcher.py @@ -1,11 +1,18 @@ +from random import randint + class CatcherPiece: character = "-" color = "white_on_indigo" def __init__(self, position): self.position = position + def play_turn(self, game): + fruit = game.get_agent_by_name("fruit") + if new_position == fruit.position: + game.state['Score'] += 1 + class Catcher: - width = 7 + width = 6 display = False pieces = [] name = "catcher" diff --git a/fruit.py b/fruit.py index 59ca2dc..2c76f43 100644 --- a/fruit.py +++ b/fruit.py @@ -1,71 +1,66 @@ +from random import randint + +SHAPE_DEFINITIONS = [ + [(0,0)], + [(0, 0), (1, 0), (0, 1), (1, 1)], +] + class FruitPiece: character = "@" color = "green_on_indigo" + display = True def __init__(self, position): self.position = position class Fruit: width = 2 - height = 2 + height = 1 display = False pieces = [] + name = "fruit" character = "@" color = "green_on_indigo" - def __init__(self, position): + def __init__(self, position, game, shape_offsets): self.position = position + self.blocks = {} + for shape in shape_offsets: + self.create_shape(game, offset) def play_turn(self, game): - if not self.pieces: - self.create_pieces(game) - if game.turn_number % 2 == 0: + if game.turn_number % 3 == 0: x, y = self.position - if y == 24: + if y == 29: game.remove_agent(self) + game.state['Score'] -= 3 else: - catcher = game.get_agent_by_name("Player") + catcher = game.get_agent_by_name("catcher") new_position = (x, y + 1) if new_position == catcher.position: - catcher.explode() - game.end() + game.remove_agent(self) + game.state['Score'] += 1 else: self.position = new_position - def create_pieces(self, game): + def create_shape(self, game, offset): x, y = self.position - self.pieces = [] - for i in range(self.width): - piece = FruitPiece((x + i, y)) - self.pieces.append(piece) - game.add_agent(piece) - for i in range(self.height): - piece = FruitPiece((x, y + i)) - self.pieces.append(piece) - game.add_agent(piece) + ox, oy = offset + fruit = Fruit((x + ox, y + oy)) + self.fruits[offset] = fruit + game.add_agent(fruit) def update_piece_positions(self): - if game.turn_number % 2 == 0: + if game.turn_number % 3 == 0: self.set_color() x, y = self.position - if y == HEIGHT - 1: + if y == 29: game.remove_agent(self) + game.state['Score'] -= 3 else: - ship = game.get_agent_by_name("Player") - new_position = (x, y - 1) - if new_position == ship.position: - ship.explode() - game.end() + catcher = game.get_agent_by_name("catcher") + new_position = (x, y + 1) + if new_position == catcher.position: + game.remove_agent(self) + game.state['Score'] += 1 else: - self.position = new_position - - -class FruitSpawner: - display = False - - def play_turn(self, game): - if self.should_spawn_fruit(game.turn_number): - asteroid = Fruit((randint(0, WIDTH - 1), 0)) - game.add_agent(fruit) - - def should_spawn_fruit(self, turn_number): - return randint(0, 1000) < turn_number \ No newline at end of file + self.position = new_position \ No newline at end of file diff --git a/game.py b/game.py index 7b47540..1de0f9c 100644 --- a/game.py +++ b/game.py @@ -1,20 +1,16 @@ from random import randint from retro.game import Game -from retro.graph import Graph from catcher import Catcher -from fruit import Fruit +from manager import FruitManager -g = Graph() -g.get_or_create_edge(26, 10, 26, 22) -agents = g.get_agents() -for agent in agents: - agent.color = "white_on_indigo" +WIDTH = 27 +HEIGHT = 30 agents = [ - Catcher((14, 24)), - Fruit((14, 2)), + Catcher((11, 29)), + FruitManager(), ] state = {'Score': 0} -game = Game(agents, state, board_size=(35, 25), framerate=24, color="white_on_indigo") +game = Game(agents, state, board_size=(WIDTH, HEIGHT), framerate=24, color="white_on_indigo") game.play() \ No newline at end of file diff --git a/manager.py b/manager.py new file mode 100644 index 0000000..a69fe37 --- /dev/null +++ b/manager.py @@ -0,0 +1,17 @@ +from fruit import Fruit, SHAPE_DEFINITIONS +from random import choice +from retro.errors import AgentNotFoundByName + +class FruitManager: + + display = False + + def play_turn(self, game): + try: + game.get_agent_by_name("fruit") + except AgentNotFoundByName: + self.create_piece(game) + + def create_piece(self, game): + fruit = Fruit((14, 1), game, choice(SHAPE_DEFINITIONS)) + game.add_agent(fruit) \ No newline at end of file diff --git a/nav.py b/nav.py index 518baf9..07e55ef 100644 --- a/nav.py +++ b/nav.py @@ -2,7 +2,7 @@ from random import randint from retro.game import Game HEIGHT = 25 -WIDTH = 2 +WIDTH = 4 class Spaceship: """A player-controlled agent which moves left and right, dodging asteroids. diff --git a/poetry.lock b/poetry.lock index d8610e3..4ef7f79 100644 --- a/poetry.lock +++ b/poetry.lock @@ -50,14 +50,14 @@ ansicon = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "retro-games" -version = "1.1.1" +version = "1.1.3" description = "A simple framework for Terminal-based games" optional = false python-versions = "<4.0,>=3.10" groups = ["main"] files = [ - {file = "retro_games-1.1.1-py3-none-any.whl", hash = "sha256:2b2eac8c2667c69f1dd90c083a0f58b948e6fdecb184720133b819fa78f8a57f"}, - {file = "retro_games-1.1.1.tar.gz", hash = "sha256:67ce475191f78d13148028de17b97de099226c4c581d5cf811cd9dfc7f5bb420"}, + {file = "retro_games-1.1.3-py3-none-any.whl", hash = "sha256:4bdd27241b5cb3ee72e69a042d301ff58df2a2ade7e3c29400a538fa54e30148"}, + {file = "retro_games-1.1.3.tar.gz", hash = "sha256:4f91ff725e551820aa4e30c12c0264e2da41967ed34252122b7136bc2a8ed311"}, ] [package.dependencies]