From a94781aaa66215ca9f0a379e1a4470571c7f91e7 Mon Sep 17 00:00:00 2001 From: Cory Date: Mon, 8 Apr 2024 10:58:40 -0400 Subject: [PATCH] Completed the retro lab, making changes so it'd work. In asteroid.py line 14, I changed HEIGHT to game.board_size[1] In asteroid.py line 15 I changed game.remove_agent_by_name(self.name) to game.remove_agent(self) Was the code given on the page supposed to work as is? It read like it should have just been a copy+ paste+run, but I had to make the above changes to do so. For example, I don't think asteroid objects have names, so you can't remove them by name? And nowhere was HEIGHT defined. --- __pycache__/asteroid.cpython-312.pyc | Bin 0 -> 1153 bytes __pycache__/asteroid_spawner.cpython-312.pyc | Bin 0 -> 1375 bytes __pycache__/spaceship.cpython-312.pyc | Bin 0 -> 1224 bytes asteroid.py | 18 +++++++++++++++ asteroid_spawner.py | 22 +++++++++++++++---- nav_game.py | 9 ++++++++ spaceship.py | 20 +++++++++++++++++ try.py | 10 +++++++++ 8 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 __pycache__/asteroid.cpython-312.pyc create mode 100644 __pycache__/asteroid_spawner.cpython-312.pyc create mode 100644 __pycache__/spaceship.cpython-312.pyc create mode 100644 try.py diff --git a/__pycache__/asteroid.cpython-312.pyc b/__pycache__/asteroid.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e505dc768a2207355db0cb837371bea89c49028c GIT binary patch literal 1153 zcmZuw%}X0m5Pxq!(wIb&n3Py7H39n(L1SpWH3cD{EmTjvgu-K!-6X5YZhX7ZCTze% z4)#!p2Z_gcs>MI0r&x+%PeM=L#2f@qowwPDl@9DMGw=6i-pp_I=j5ahf!v7EVuwTM z4|B#MxW;fAj4tBPDw0tf$@mnIOme8fCHcb08ENb~!>3?$k%DqqMmbK#IbP=4C@07~ zXt5zAMccb#mGo(**tv1DJO}AEkv9HrWz=T*OS=x)^tNPRb5MRwqPig zBK5$j!S2T6x2vg7hC+>0p-`@CrBqfiwoJX2s!Cg`RwBEqStbQtR#Mg7LONB~RP%MJ zBIOBHOsc0O_g#y%hV3Opg=0dR;qh}9$008(I00%84W{G!!nesGIOv~VSRYO=Q5a1Z zS$LB{9*B&a@OYWqdW8_(vC!uIX}H+W5NmNQ-r^z0n3{WeWc~?wGT#J3ojg;3dvp)r znie{BNy0Eoz_11$h%AgTEy3a}9Ch|Koh ze9s(b<^L=yZ4OVD0e3#oSUSd-(C{F$z4V><3fgd%(IuLUe7h919|9-$c!e#6m) lXY3Yxhm+*i`*u|R9i4?3qtswCzv3~*H@+}VUn5Y?g})bq|GEGG literal 0 HcmV?d00001 diff --git a/__pycache__/asteroid_spawner.cpython-312.pyc b/__pycache__/asteroid_spawner.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac2444335fc632e377e088d2ea558172659c909a GIT binary patch literal 1375 zcmZux%}*0i5P$FOF05^#5)|+&79u8%NHr$lff!Bj<5UmEOJnk~^eyc|y9@7a1)7p@ z-~cDQ!O?>UjsJj0?_O-sP&az=qBlbiCZ3#m?HX;Iq_ea0W`1wxH?w^=FpwZ1pR7}h z!;Fxx_!5iRHQLv}*e8MrS|L?hpcHLZVO67GP{PQ4B8+V!%-4W`QZP5HY~Ob@U(u*v zI==AyFiRu*jtX5Fc%q1BvCyv3o&aN?xTHV@DKJ3`hG5%(hUf)Ln4tR*IZDSkk5-&D z-<9`@-J3NM+6MgE=QUn~J^{}r+cX-iLAVYS@!%A;Du#g41}Aj zt`)E6YQ7iV$W@#LF5OTDIj746SDhB7S2iM>a}UBeuaEUKI31t#!{uri)D~%tP3#Wr zSUXQ!=Q2CyM|-RdZt@Qk7_FK30LDIP&?OA%5kc44Iy(bi!RiBmU=-OLyfw%Y=Jp6+ z#C!4A$?NV66ONx2nzFq37YxH zQpG^J-?0LTqtEt(D|A9PI<3k_}p{(FsQg?vz|u zS3_dSky&!8Ze+*V3ORx4%RwE!QgJpo;?>Xej_l7-5+c9y$@EcjvYDKGE{-nGG%wG5NX~v9z4&7E<<#+Q3H$SE>{jf;traTE3{4;!PN)JB+#y$z-&kR0e!D7-IbQw5%M6yO+ zljnVd6p3kBru&y8U@PRc+p|0kc73w9+y7EMgt@0cZIRFEk!Pz1mk!expI>RFufDgh z>WcF)Em(UWIOaS`a9#~Wt%7!n^VOPD>7MipPa&Z)4QTQ#Dy-ub(I|Qt5;spP>|9~p z+oUx(ymkNBWY+kxZCaD<6t$*1DHxs4T2UYVJq6Xy4&YbNSqTl6!B-?!U+~MG>r{73 ePJj>jR9M6hgHrm1oc%&B{4@vY^f3XY(|!X(Mm8t_ literal 0 HcmV?d00001 diff --git a/__pycache__/spaceship.cpython-312.pyc b/__pycache__/spaceship.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76c8e571e75b6b2acc71cc5e881691f33f2891f3 GIT binary patch literal 1224 zcmaJ=%}*0S6rb4-*wSK=5(T2MC;W=2KfL_ug;jeeCDf))oYEj5_8t z8KED-Xoyl*s-2)zkc1|Xh1QXU52czXjf#>kn~iw!#C4;Z1f_x~N@EM9B@3rzOG+!2 zypGbUr2sY+RlSKvUKR|Kx*5B`6@jPtjag?8ncz-H{Hu3DJ|EA3w=9)qA2>^(`@ma* z8s;P)kuXI-5$W>OPeJrk+(^eRw>=_|J7Wq7P+ zWT-u#@m$e`B*^Jx>Xl2Gn=;MJvNN9=qi)vA7g9MRYdiB~#r879%v&^-TQLVy%Z}~c zOD!6+gi(*>Q*NWofkKgMgxKIGq||;^{y^hh1kQ7B0<58+ci>3t*@$k>1YNxc_^3-i z82;3A)c@d1=kSK|zO@Qb$Q12q$XUBi;7tYjXrbZx;~BP4E-OA>5FNT87JiFZ`X4?i zdmAC9LDOZ?bYGd1%Bs^G+Q3t@eQ80xKq`FdVSPDRA4D|&H$wB(zsCs~qA?fbux?`* zxcKSHlrC}Y>G*5%Z2ZwQj|lC>>)()Xe1JG3_n7HB?Im)%XL&9-$&2|aR6}%#s zsblF)OnewTlBGo#2AHK>nHLH89mho;bLa|bY?Rvskzz%XNp?vjwPg&)TBPJGx72+; z=Zn5p$Z$OXn0Gv}Ro*ObDjRrXFo=CWn^b$|Jt|2K+t=4du;dl_m0lWpza7 z*nQRp2T$qEVkJdC2;nV+V=%+?C}VN3*>!-ADC7x? zXJQ3I5If*r0a!;t^zzzR(3V(xe4K&EV1?HOsCp#?INS>7C6N6 UxZ=oT8DspbC4q08Ab>F8H#1-$rvLx| literal 0 HcmV?d00001 diff --git a/asteroid.py b/asteroid.py index 257354b..0f83eac 100644 --- a/asteroid.py +++ b/asteroid.py @@ -2,3 +2,21 @@ # ------------ # By MWC Contributors # This module defines an asteroid agent class. +class Asteroid: + character = 'O' + + def __init__(self, position): + self.position = position + + def play_turn(self, game): + if game.turn_number % 2 == 0: + x, y = self.position + if y == game.board_size[1] - 1: + game.remove_agent(self) + else: + ship = game.get_agent_by_name('ship') + new_position = (x, y + 1) + if new_position == ship.position: + game.end() + else: + self.position = new_position \ No newline at end of file diff --git a/asteroid_spawner.py b/asteroid_spawner.py index 92e542d..06289a8 100644 --- a/asteroid_spawner.py +++ b/asteroid_spawner.py @@ -1,4 +1,18 @@ -# asteroid_spawner.py -# ------------------- -# By MWC Contributors -# This module defines an AsteroidSpawner agent class. +from random import randint +from asteroid import Asteroid + +class AsteroidSpawner: + display = False + + def __init__(self, board_size): + width, height = board_size + self.board_width = width + + def play_turn(self, game): + game.state['score'] += 1 + if self.should_spawn_asteroid(game.turn_number): + asteroid = Asteroid((randint(0, self.board_width - 1),0)) + game.add_agent(asteroid) + + def should_spawn_asteroid(self, turn_number): + return randint(0, 1000) < turn_number \ No newline at end of file diff --git a/nav_game.py b/nav_game.py index 191d83d..287c0b9 100644 --- a/nav_game.py +++ b/nav_game.py @@ -2,3 +2,12 @@ # ------------ # By MWC Contributors # This class implements a simple game where a spaceship avoids asteroids. +from retro.game import Game +from spaceship import Spaceship +from asteroid_spawner import AsteroidSpawner + +board_size = (25, 25) +ship = Spaceship(board_size) +spawner = AsteroidSpawner(board_size) +game = Game([ship, spawner], {"score": 0}, board_size=board_size) +game.play() \ No newline at end of file diff --git a/spaceship.py b/spaceship.py index 9f3552a..3802f1c 100644 --- a/spaceship.py +++ b/spaceship.py @@ -2,3 +2,23 @@ # ------------ # By MWC Contributors # This module defines a spaceship agent class. +class Spaceship: + name = "ship" + character = '^' + + def __init__(self, board_size): + board_width, board_height = board_size + self.position = (board_width // 2, board_height - 1) + + def handle_keystroke(self, keystroke, game): + x, y = self.position + if keystroke.name in ("KEY_LEFT", "KEY_RIGHT"): + if keystroke.name == "KEY_LEFT": + new_position = (x - 1, y) + else: + new_position = (x + 1, y) + if game.on_board(new_position): + if game.is_empty(new_position): + self.position = new_position + else: + game.end() \ No newline at end of file diff --git a/try.py b/try.py new file mode 100644 index 0000000..bdfbffd --- /dev/null +++ b/try.py @@ -0,0 +1,10 @@ +# Was supposed to try this per the introduction to retro, but this doesn't +# actually seem to work? I keep getting an error... + +from retro.game import Game +from retro.agent import ArrowKeyAgent + +agent = ArrowKeyAgent() +state = {} +game = Game([agent], state) +game.play() \ No newline at end of file