From 35ed9eb32877aa06e10d7c4543b697a7a1f2ed91 Mon Sep 17 00:00:00 2001 From: tsmith37 Date: Mon, 8 Dec 2025 20:30:45 -0500 Subject: [PATCH] add a alien target and a shooter to hit it I am actually really proud that i was able to figure out how to make the alien move in every direction randomly. --- .../__pycache__/asteroid.cpython-313.pyc | Bin 0 -> 1211 bytes .../asteroid_spawner.cpython-313.pyc | Bin 0 -> 1276 bytes .../__pycache__/shooter.cpython-313.pyc | Bin 0 -> 1851 bytes .../__pycache__/targets.cpython-313.pyc | Bin 1210 -> 1616 bytes proposal.md/asteroid.py | 19 +++++++ proposal.md/asteroid_spawner.py | 15 +++++ proposal.md/nav_game.py | 11 +++- proposal.md/shooter.py | 48 ++++++++++++++++ proposal.md/targets.py | 53 +++++++++++++----- 9 files changed, 130 insertions(+), 16 deletions(-) create mode 100644 proposal.md/__pycache__/asteroid.cpython-313.pyc create mode 100644 proposal.md/__pycache__/asteroid_spawner.cpython-313.pyc create mode 100644 proposal.md/__pycache__/shooter.cpython-313.pyc create mode 100644 proposal.md/asteroid.py create mode 100644 proposal.md/asteroid_spawner.py create mode 100644 proposal.md/shooter.py diff --git a/proposal.md/__pycache__/asteroid.cpython-313.pyc b/proposal.md/__pycache__/asteroid.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5ff054d044c6c313a70be26f17ba619b90133f1 GIT binary patch literal 1211 zcmZux%}X0W6rahL(Ig~(5z!W7t1UTbls1=A3xXCEYN?BmLt$8xG1)fRjk6Q2Uh1hR zrJ#qPJylPwe~w6TnUm0yH!+m<*!MOYv9=HLcptxc--mXH%{1hrOjTHKcwVxiUg4-f zJiRc$P!s>E$BuRH^NL#)BK~bSQpy`Sh|SC-J&Iu z_12YwQ39s@764Q&(88FZ+zdno+hd>EmRtK@b~j(An=kTjtgL6kY`JRry2m0eGPrPo zh6}_9Yz#J8GOFp2>R7gPQDC;Q$yG$wgvrcWWtj_i$to&%#aiP`FLG0=&LWphku7g9 z6V|Ex+$^NS0((;dT(AnR8wFWXp%OQWC8_8;MK=UgO;pt6>#TK5HXc#RBY~fZYOj{{ z4Td$SuIn4Pw&95FO<;HgcfQ0w$9H1eK_?PFiwvAZ1`hO-$l&3`X=K>xPVP_cP3}x@ zPdV|#!K=ObkMEsC&sk#VBr$Y2{5|pTJUMWd96d>nep@+BW_JTlYUptFD0{HE8+Ez| zzfK-ao_3ErJ$?JLd$aZV^WpLOi_2aT9T71|FR+k>bQmudM*tVw!C1vA)XFGF8C$LC zWzQ35Y{d|^EE^^_EpWHzOS;hW@I?yTp|}f7^)hBlT^f0&ODT-yn&dWP$E2ALXCv^q zU4}Ph<2XMMC(*q%cNL()p`W2>aH5Gu;6fVy5b(hWGPh`Vz~QIOGM|YD;BX_wLAdl& PN`Lvf=)@HP=05lXBeD)W literal 0 HcmV?d00001 diff --git a/proposal.md/__pycache__/asteroid_spawner.cpython-313.pyc b/proposal.md/__pycache__/asteroid_spawner.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e935cff4266d037111af880043af13589e39086 GIT binary patch literal 1276 zcmZt`O>Y}j@V))8H@1^)1!>ySsta`r7Q_ZYlB&>3mG~&F_&8fXa3MYEt(A+rk3s8@>A{6VXJt3jyR@FjqWX9{Q8jG1t_9rnp7!zXjAriaHWiG$PZgSub(b_HTrVhHpPP2EItDj}Av8-htV06q{;fR=h zu8QDAei$V+uB_`a2_O#rc4nAi%sYlr6`x)94Fm2n&|D6>tARnW!E_D81=oaPr%)>@ zJCEe{y{#yKBP#aG_N0JuxFTX5zoWkp?XniXJr*BFDSGrTqV9FiiHXavYF9NAIagbn zWlZW)dl$JDyG_C=z!-%o5wgpZ=H8pAybl;#o5}6g$~oogEe*5aGV&q1`X^fM9T^xM zE0~6sky|*dgP)qwRHkgl5FAlnpr&wGrS;eYU&!!>0M&_?1ZrMx#Az30G(O=?)}qQu z3XzD?-g*E)O#;nT&3L{qyiR~iG?gKP?j2=xydFl|3jJh56*hvfvymt(4A2re_Og?V(A^tXKCxSu}(~qUst@r#!9xf|0fO`L~ zn(24FyMpReXQqyz{z^r=mvm&?Y@mBaGtpuGBY;leKqk4`@N;@9i@Umv`^@*98RTsc_y^xlnO<;4Bw zPIK?_AC>A0lT|K{Fbz9)c{H=}~vbFrc@dxB;`F>mc3a+QhYI<|Lr|>zt0J+sP zIEfF~h$OAhao`jQ<`AjH>8Ag8lVmF2M6}JG+NU0D?o|)$3lHBP*h^2WB{+kMeb%g5 z$`T^NsSBY>LiA!k?GjxPVl(x+6OApzoe*Tw4Wl56QC;*yNu!1ZjFVM0F9aP{*cM)r zK)9YJffNGHkpX4P8lbfRA)1h+CVynZxi_}IdTE&E;@@-JtY_9_)5KdV(0@nV8($&J sqcA(lah&6^mGxOx{xztg9gSR)!wa2r{*0Y{#?Jp^lzIInLo`nEAEqcE5dZ)H literal 0 HcmV?d00001 diff --git a/proposal.md/__pycache__/shooter.cpython-313.pyc b/proposal.md/__pycache__/shooter.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f40f04a61772a1297cf1a0ad97f661accc76bbc3 GIT binary patch literal 1851 zcmaJ?%}*Og6o2bof1B7~Fkc~YN=dUR#UTYHLQT}DCTS$f!P}LPiZog5#kiQYGrMj| zOC(N}krIVSK_R!?LT)|w&j6u{?WhN&oVZa?)ob7E2N+cKN&d}yGjHC!eeXBpXK zpsf6StMWhs_`nTc(01gw2Zs&lfsa6eK2U`5fV)7U9FWDLYq%(Q#_>&5HeeR0pa2ah z0u_}2l@yT%6^VwFU?0%15<-k9VZ^8sp|NsQjY6j|(saNMs9xlr!bE>IRGiT9; zMfD$YdEH#JYW3XGlj3NuVN|Tob9Gw#UN2gttS#x>z(`tkWT}+%k{hWnvj`y-bS8wQ zybl=hXLtf;6k!$Yo=Z*XdD}4>P~_?R!gc3!wo%ytRZxV98364OfC>fQt7W|A>7{A( z2ozdlc`Hg_+$)$Nsv<958C0?0ceN!}1B+RooS9U_&yWpc0V9MF!z~V;s)qcC{^{BU zfSE^Cj}HKfbhZs;JQJG{oMu86tG-aFAMl*Ml_eG~Rm^%-TW0NL-6C39H!L!@Obo0s z<;7x=nnC7j8ZF6T%1O$ii~6!@(b}TUB;E?z&S!-mnXt?fhW>>39X5IHSyyPBJEayh zqg2(&X@nlXOXpX(zd4Vv3j6WSO>sBg|2F?_>fMx`?%qqwJ860A>TY_pnYWYawG}&+ z*-v-BzVq_VTE2PDzBur9^i5-PqB*snOuu-#_H=W0FL`|@dEL$qziP8D53WlaiNheI zK0R!Qq0#MlKg9|{@uYxggz)E3VGK)!RQUh)yKRL+YXl6y#cAu{%%CE8ZIx7^5OmjC zQI*cOwS<&a0%u!^d;fzH<6a;ms0ItXZRbRla^OD~NUKm9zP<`zgumluc0>&;q5|U{ zffb3^HC(JWB^?dp;5$9PLL9;B%MBOOK_&V{u-5mIHNP9W-A+QdIyJsWBy}1RQ z>MZCQ{2A~_nRQti<@_gBgBq;er{l>KKfrv3fILJlt-M&-Pjq;!T9cZB-P61I_|5qG zPtC+(2vVJA*w&wI=ATX3xMASR-oWjhf!n(S6WftKJ9BL>GrW@--kSaG=5FS0Gyb6~ z+noF}nOSdaE^dwOCU5-u)$hq$cB=DrHwk$UP6AH#C})fVTrsl`y2@biNx%;$?e@Hme90z^{-Ht@QaPz-QZ{Qr~l$k_06a_)}Cp0V!9RY%~;a`j! BkLCaX literal 0 HcmV?d00001 diff --git a/proposal.md/__pycache__/targets.cpython-313.pyc b/proposal.md/__pycache__/targets.cpython-313.pyc index 190cbfdd6b791c23087e31fe8ae8def84454ab30..cee5b3adbaf0647e4806bf0b3f2a1ff3b019923f 100644 GIT binary patch literal 1616 zcmZux&2Jk;6o32Swd0Sho6sZ*rCO&=#3CgIl~59qN#Yp?!oA)(u-uum- zWim;?HU80c`x6=9cfN@h?)`Ok71<6LUv=}&1u`27aW4_S^ z7N@3Du^q1*7y~MVn=s$IKm`M+Xb4m?L@FE7DA1T8BUOwTjaL;t&SLX5+j5S1DNL9z zhllxzxGdp!mPN7yrEJYtb5g|`mL3Q!(Wtw&XV)EFWU_13Rw=)&%Of?774k*bqHf-! zO^;e1VXt?^?b=>+e}*k5tWdi*GQWS({p~_Aai<}OdHCYIZ{QiSFIUOx2k zZG}8e=54`I^5Dda${;Kh0DMcQv@nUDPO|il&r^n2OuFKnI6DhqCIE`!>;OOoGcR5O zcuUe?Q3IT8F?G&MdgPT4y{=(wd^z?+skkkD^P)H%P8zel4v+#3eV+|oD`>02ZQd4t z8RG4}NG`^sNJE;$Nk!Ol(xs32QBDRsl#09`b3=~eoc?0}iiTDE_J7@)E#a*%VCBMc z=5cf+O^1Sp^_BK(;T?Q1#g_DhE*}4bi}ER;%*~wxNHD%?b<6fi$o8`WnyI$zZQ!* z)&|)OSc|3k!>+F*;w#oBOLJQkLI?3gS4E1))?7V(N2}=`l zr)kzgi%Q6@qPukJ>9u&vFTQ0Ks{@ z$&|kmpYR{1%Q5#U^s<9nZ=A|PEcd5!HKqsN+;K^lm=es>M^q3!#Z&k<@W+;TC8+rZ ceI5-Q^)AQgi6jWZuQ2+z@|>Wb0un#wU;JNYCjbBd delta 726 zcmYjO&2JJx6rb4-z81>I)_@`{G*rU@Q<8EqVuI0FNo*q<5)O?k4GV4pyEqFqa%oSd z#Dm>zNbw{+sTVzX^W>i(A%@MShhBSYXpC29pxyYAd3p1GzxR7@=Kb>ia4%f=d>(+! zdcQ6gD19Na6v4MXh=3I!fEz%7S&HBQAW)}LwEiL=bmg_SgjBhD265hkTl%*L(4|ke z`QR0DM-*j6Zi^ygJckJnjd|o;gp3|sNx|Z!CQjKVz_bGZfx24;pi%>%1d5FD6-H`h zL7>xk$QcmA04zG~Dmy5FESUyd9MlQNJ-_|$1?GyQILeQ(DhAgn#aZ6Ptxl+z@txug zFYPO}8uoy7td?Ro&q(5oh#>|$i_u=nt(3#^?5Gt~6*ajlSzNn=6jA9kcO-;dgylt2 zQ{9!sN?lUg#!vb>?LuzjgkIW1!5OYduf>+C$!%FxG*S}3G(@&yxm%6O8mH6D~U9qJzqaTOMY{T+-yjM>##$dw7sH{ei(Vy|DFe z&kQV10*O%|F--mr+&&FQC*kxcoc>%JhqH%_8BYvf9cKsKL$Ap%f65)_#{8PO7&+R| zH~NLs`btE9>nv0V3>YPHjl?xR~6m?`;ja85%A|572CnF8!)1^)o)Sf(rh diff --git a/proposal.md/asteroid.py b/proposal.md/asteroid.py new file mode 100644 index 0000000..add21a5 --- /dev/null +++ b/proposal.md/asteroid.py @@ -0,0 +1,19 @@ +class Asteroid: + character = 'O' + + def __init__(self, position): + self.position = position + + def play_turn(self, game): + width, height = game.board_size + if game.turn_number % 2 == 0: + x, y = self.position + if y == height - 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/proposal.md/asteroid_spawner.py b/proposal.md/asteroid_spawner.py new file mode 100644 index 0000000..ed92c70 --- /dev/null +++ b/proposal.md/asteroid_spawner.py @@ -0,0 +1,15 @@ +from random import randint +from asteroid import Asteroid + +class AsteroidSpawner: + display = False + + def play_turn(self, game): + width, height = game.board_size + game.state['score'] += 1 + if self.should_spawn_asteroid(game.turn_number): + asteroid = Asteroid((randint(0, 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/proposal.md/nav_game.py b/proposal.md/nav_game.py index f42aa38..003698d 100644 --- a/proposal.md/nav_game.py +++ b/proposal.md/nav_game.py @@ -1,9 +1,14 @@ from retro.game import Game from spaceship import Spaceship -from targets import Asteroid +# from asteroid_spawner import AsteroidSpawner +from targets import Alien +from shooter import Shooter +import random board_size = (100, 25) +width, height = board_size ship = Spaceship(board_size) -targets = Asteroid((board_size[0] // 2, 0)) -game = Game([ship, targets], {"score": 0}, board_size=board_size, color="white_on_blue") +shooter = Shooter() +spawner = Alien((random.randint(0, width-1), random.randint(0, height-1))) +game = Game([ship, spawner, shooter], {"score": 0}, board_size=board_size, color="white_on_blue") game.play() \ No newline at end of file diff --git a/proposal.md/shooter.py b/proposal.md/shooter.py new file mode 100644 index 0000000..e633efb --- /dev/null +++ b/proposal.md/shooter.py @@ -0,0 +1,48 @@ + + +class Shooter: + name = "shooter" + character = 'I' + display = False + + def __init__(self): + self.position = (0, 0) + + def handle_keystroke(self, keystroke, game): + + if keystroke == ' ' and not self.display: + ship = game.get_agent_by_name('ship') + if ship is None: + return + + x, y = ship.position + new_position = (x, y - 1) + + if game.on_board(new_position): + self.position = new_position + self.display = True + + def play_turn(self, game): + + if not self.display: + + return + + x, y = self.position + new_position = (x, y - 1) + + + if not game.on_board(new_position): + self.display = False + return + + agents_by_position = game.get_agents_by_position() + agents_here = agents_by_position.get(new_position, []) + + for agent in agents_here: + if getattr(agent, "character", None) == 'A': + game.end() + return + + self.position = new_position + diff --git a/proposal.md/targets.py b/proposal.md/targets.py index add21a5..391ad96 100644 --- a/proposal.md/targets.py +++ b/proposal.md/targets.py @@ -1,19 +1,46 @@ -class Asteroid: - character = 'O' +from random import randint + + +class Alien: + character = 'A' def __init__(self, position): self.position = position def play_turn(self, game): + width, height = game.board_size - if game.turn_number % 2 == 0: - x, y = self.position - if y == height - 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 + + x, y = self.position + + directions = [ + (-1, 0), # left + (1, 0), # right + (0, -1), # up + (0, 1), # down + (-1, -1), # up-left + (-1, 1), # down-left + (1, -1), # up-right + (1, 1) # down-right + ] + + possible_positions = [] + for dx, dy in directions: + new_x = x + dx + new_y = y + dy + + if 0 <= new_x < width and 0 <= new_y < height: + possible_positions.append((new_x, new_y)) + + if not possible_positions: + return + random_index = randint(0, len(possible_positions) - 1) + new_position = possible_positions[random_index] + + ship = game.get_agent_by_name('ship') + + if ship is not None and new_position == ship.position: + game.end() + else: + + self.position = new_position