From 67434ce5ad1f79e4c33a344902b62e929088e2ac Mon Sep 17 00:00:00 2001 From: root Date: Mon, 16 Dec 2024 23:56:26 -0500 Subject: [PATCH] I just added snake game to see what's up. --- __pycache__/asteroid.cpython-310.pyc | Bin 821 -> 821 bytes __pycache__/asteroid_spawner.cpython-310.pyc | Bin 1050 -> 1050 bytes __pycache__/spaceship.cpython-310.pyc | Bin 903 -> 903 bytes asteroid.py | 1 + asteroid_spawner.py | 5 +- blessed/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 976 bytes blessed/__pycache__/color.cpython-311.pyc | Bin 0 -> 10134 bytes blessed/__pycache__/keyboard.cpython-311.pyc | Bin 0 -> 18524 bytes blessed/__pycache__/terminal.cpython-311.pyc | Bin 0 -> 68725 bytes retro/__pycache__/game.cpython-311.pyc | Bin 0 -> 11126 bytes snake.py | 203 +++++++++++++++++++ 11 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 blessed/__pycache__/__init__.cpython-311.pyc create mode 100644 blessed/__pycache__/color.cpython-311.pyc create mode 100644 blessed/__pycache__/keyboard.cpython-311.pyc create mode 100644 blessed/__pycache__/terminal.cpython-311.pyc create mode 100644 retro/__pycache__/game.cpython-311.pyc create mode 100644 snake.py diff --git a/__pycache__/asteroid.cpython-310.pyc b/__pycache__/asteroid.cpython-310.pyc index f710e2f9b1617d17e178772f85e46d14c06ae3ce..dbbdb8ee289f6e0ad9cc3a12e9cebbf60a2cdbaa 100644 GIT binary patch delta 40 tcmdnWwv~-HpO=@50SNN)2VkVZalUtcK006Py2+9Be delta 40 tcmdnWwv~-HpO=@50SNAfN2m8~2VkVYvlUtcK006W;2-N@p diff --git a/__pycache__/asteroid_spawner.cpython-310.pyc b/__pycache__/asteroid_spawner.cpython-310.pyc index 67e952a0d3705c4bb489e62ca34bbc08ffbb21f3..6348f68567adb0df63a94615ac55b65bbaf319a0 100644 GIT binary patch delta 22 ccmbQmF^hvYpO=@50SFv&}$aT~d7m;oxC1X}?RE&iYN*mv><|lkjt>iOp*MHMR=b5n>Sgm9dt&pk=%;dNAd%Nv@a1#X@K(mXcB~lKj5P9;6jI`BLdLN~F*z z6XOY}6nDDCyGV9fcm+kmYf0Afd^8YV6j6aZ!TTXWl8S(ZD&F!UugQES8I2JO(c^8| z<)Kq7cBPDNx^A=`F(;Y?x#*<6+w^H1Q&K$E@{f|-GZqp)h$}G3Kb;a+%wtm}g`UO4 z=y_F4p||5Ss?iR)H{n7dr6iupqq?)<)Dah`BdDi(MQw#At)V)K`%%P&M5IrVs4pRt~nc3r&^g$au^fd!Z1}wzc*o1y0$zqnu!b$l#6*1!>W?`Err3ZoT^S%&VXkpLym2e5;tO|bwCyEH1 z-f;!z(ha;G3p;qgWEZzMp>8l})!cr_WZm_>CKgl*o=xAyN`*;`)um7Kw*pT3KD{kg z6`y_@@i%40CWLToSkM{+ZOQ;H4Z)eoIt1s3*&5rxTHd`eGMB!XDCn15{BIpumEphZ$Sl9HMvE8r*7s_A>!ZbsT5uCi?9Unep)l*sR!y-DN~^Cgj{!XU g5dHwLvC%p-P|I%^fbR?w0f~men=?054Au8UO$Q literal 0 HcmV?d00001 diff --git a/blessed/__pycache__/color.cpython-311.pyc b/blessed/__pycache__/color.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef7d8c2fd04d60cdbec20d3e9b07d18a8293b936 GIT binary patch literal 10134 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 UlkjuM@4<%pP4jN%7QLJK50gq?-v9sr literal 0 HcmV?d00001 diff --git a/blessed/__pycache__/keyboard.cpython-311.pyc b/blessed/__pycache__/keyboard.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b290a251d5f0998cf648274593ff9b3497283109 GIT binary patch literal 18524 zcmcJ0Yit`=mSz=SdQjHewk*HOmTg(KL|gJ(aqP%?S+OlSmh2>Q(iFuiS(GVKsUj^| zBX=tUFGdNxXicvh_AGiZnwd@}JqggkViw2@W`V{6gV~>?!A3L$8pvSLzy?_CGH|jx zn?JkXIk&1^Xx0B?s=Z&5{xdyTpDOd_`G50E z(i2IQ#wAr&J#l$l=BsDi!&mRP7gulGH|rnw%c4wRJm8Tu?@XE1*oV0J*m{su-(3$q z=s|9we7pizf4p)wI9?@7iAu&+nAj}>>yZW}HSkbU%e25uwbj&zUbKs^_>9-6QikMEY>Birw^wtffmG5YKTS@7CoAkfEq)f%k{_kk9X+vpO|LP9Rw#8XrZ3gCm z3$qiLgD%W2U=F!3yMbwSVfFxX*oD~(Oq&a%0CU8J*$2!~7iK>&?Ji8qhB60$>2Q@f z2u#R@IRuPrUDa0Y7|~ZftR3fTo7TzKBU%?%yD|#y#hkfpOF20x)iBUIfNX@mGLx^F$9YZl1UVjGHHVfpPOhA29Bg`+;%yJ^)Og zYZimRKr)IC)8{fU11`)EFoRCa4Qc$c`YNyv8mU+C?4Y8070(X(sMql9ppH6>XUASr zNAT?6Y4tju9UQH`hUcN;DAXHxe%0|jisvhi=P^8AEj~{L$FHe3$A?wVsML0A@yKX; zvST)>rsJA2rzh{l)L7z<(t20BKbef^suG!x=vqQEjMmVX)W~p~oDYuZs-|mdUo4u+ zm%ScKsL6Q)__}a3G8dVQ#bc@a;Y4IsGon_%boH1I&mZFEiKIzTFcK*jD3%J<_fQ`9 zX@1rJP;!gW@c^lV@iMJ^rowDNn(EMxaHRf)zUhM`O)bw$OT^w=cPD54m+fNY?ZXd+Z; z))(bt2_qFrL^Z3DW^7VN(Y2_?og@=VEHRf(wR0o$)3NBZG8?(CM3aeBB$iNS)A3Yn z4*f-^BYGs7(sZ;(P4bJ$`zcK^w0F`PdUQ4sGtjIWi$+qI$mD%mAR3+Qfu8v)8A!gp!&@M=701fVLyb-9&OeQS91kl?XV2 z38bRa=nA8qjU^&+ZdH(nI*(1JQ+P|1jV5R3B6`e7CfXGvjk#lP6BAS~bfy2z@YVi- zF?$?i_7FOV&6MPn7?m}BM+50rt9I+e1P?eG1vhIdkEBSC`_{Or!HISyl2EC18YPKp zH0kbHEj8Ue5f1CxoE{Eia(GUPhEhpIjTv)stXD*tPR~XX9l91#Ba>J!%x=~iqRnn- z5zR9tcqBHnP~)1RB~nI68A>q+B+$xJeq&{WW94%@6<0p+xNk$9Sxmm8W% z8!6@stWDy+!gVc%HrFl01@qEy)MsrYTn+vD7qIKQ=ob?L3Bko;qo0xbYf-%t> zaq~o4l4fufA5~7vAd_eD9JU>C05c)2wT4}4F$vghRQpMuYAz4?H9Ke=jT9oqMT6&uq+h~?Ak~SA~O@C7B_BU@C05OW%+3fFYuc~fEJ~nTX-GDoZCWe zvY2J*jOx+VVs&vwv>C|rcuov#FJPv8$L~JeuAxLqy8{NqIBBOTf(apYH)Fk6BGnes zx1-k$R3~0?j*%Mcp@QTU@wnQ&dO7Zghuf-X^=J~<`IX_YFi~({6%N0Xj>OG35DscG ziq)f8=F3gxc3&r_ju*Me4LVUsry=}8^u_x?C)bq$joA1zfMxry;HmYO7bF4){Qic5 zTFJI328o%℘FCMt=Unn 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 Qji6R=NM0_ZKh{*)f6l$Yw{&A1 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 DBpo2) literal 0 HcmV?d00001 diff --git a/snake.py b/snake.py new file mode 100644 index 0000000..52b6059 --- /dev/null +++ b/snake.py @@ -0,0 +1,203 @@ +from random import randint +from retro.game import Game + +class Apple: + """An agent representing the Apple. + Note how Apple doesn't have ``play_turn`` or + ``handle_keystroke`` methods: the Apple doesn't need to do + anything in this game. It just sits there waiting to get + eaten. + + Attributes: + name: "Apple" + character: '@' + color: "red_on_black" (`Here's documentation on how colors + work `_ + position: (0, 0). The Apple will choose a random position + as soon as the game starts, but it needs an initial + position to be assigned. + + """ + name = "Apple" + character = '@' + color = "red_on_black" + position = (0, 0) + + def relocate(self, game): + """Sets position to a random empty position. This method is + called whenever the snake's head touches the apple. + + Arguments: + game (Game): The current game. + """ + self.position = self.random_empty_position(game) + + + def random_empty_position(self, game): + """Returns a randomly-selected empty position. Uses a very + simple algorithm: Get the game's board size, choose a + random x-value between 0 and the board width, and choose + a random y-value between 0 and the board height. Now use + the game to check whether any Agents are occupying this + position. If so, keep randomly choosing a new position + until the position is empty. + """ + bw, bh = game.board_size + occupied_positions = game.get_agents_by_position() + while True: + position = (randint(0, bw-1), randint(0, bh-1)) + if position not in occupied_positions: + return position + + +class SnakeHead: + """An Agent representing the snake's head. When the game starts, you control + the snake head using the arrow keys. The SnakeHead always has a direction, and + will keep moving in that direction every turn. When you press an arrow key, + you change the SnakeHead's direction. + + Attributes: + name: "Snake head" + position: (0,0) + character: ``'v'`` Depending on the snake head's direction, its character + changes to ``'<'``, ``'^'``, ``'>'``, or ``'v'``. + next_segment: Initially ``None``, this is a reference to a SnakeBodySegment. + growing: When set to True, the snake will grow a new segment on its next move. + """ + RIGHT = (1, 0) + UP = (0, -1) + LEFT = (-1, 0) + DOWN = (0, 1) + name = "Snake head" + position = (0, 0) + direction = DOWN + character = 'v' + next_segment = None + growing = False + + def play_turn(self, game): + """On each turn, the snake head uses its position and direction to figure out + its next position. If the snake head is able to move there (it's on the board and + not occuppied by part of the snake's body), it moves. + + Then, if the snake head is on the Apple, the Apple moves to a new random position + and ``growing`` is set to True. + + Now we need to deal with two situations. First, if ``next_segment`` is not None, there is + a SnakeBodySegment attached to the head. We need the body to follow the head, + so we call ``self.next_segment.move``, passing the head's old position + (this will be the body's new position), a reference to the game, and a value for + ``growing``. If the snake needs to grow, we need to pass this information along + the body until it reaches the tail--this is where the next segment will be attached. + + If there is no ``next_segment`` but ``self.growing`` is True, it's time to add + a body! We set ``self.next_segment`` to a new SnakeBodySegment, set its + position to the head's old position, and add it to the game. We also add 1 to the + game's score. + """ + x, y = self.position + dx, dy = self.direction + if self.can_move((x+dx, y+dy), game): + self.position = (x+dx, y+dy) + if self.is_on_apple(self.position, game): + apple = game.get_agent_by_name("Apple") + apple.relocate(game) + self.growing = True + if self.next_segment: + self.next_segment.move((x, y), game, growing=self.growing) + elif self.growing: + self.next_segment = SnakeBodySegment(1, (x, y)) + game.add_agent(self.next_segment) + game.state['score'] += 1 + self.growing = False + + + def handle_keystroke(self, keystroke, game): + """Checks whether one of the arrow keys has been pressed. + If so, sets the SnakeHead's direction and character. + """ + x, y = self.position + if keystroke.name == "KEY_RIGHT": + self.direction = self.RIGHT + self.character = '>' + elif keystroke.name == "KEY_UP": + self.direction = self.UP + self.character = '^' + elif keystroke.name == "KEY_LEFT": + self.direction = self.LEFT + self.character = '<' + elif keystroke.name == "KEY_DOWN": + self.direction = self.DOWN + self.character = 'v' + + + def can_move(self, position, game): + on_board = game.on_board(position) + empty = game.is_empty(position) + on_apple = self.is_on_apple(position, game) + return on_board and (empty or on_apple) + + def is_on_apple(self, position, game): + apple = game.get_agent_by_name("Apple") + return apple.position == position + + +class SnakeBodySegment: + """Finally, we need an Agent for the snake's body segments. + SnakeBodySegment doesn't have ``play_turn`` or ``handle_keystroke`` methods because + it never does anything on its own. It only moves when the SnakeHead, or the previous + segment, tells it to move. + + Arguments: + segment_id (int): Keeps track of how far back this segment is from the head. + This is used to give the segment a unique name, and also to keep track + of how many points the player earns for eating the next apple. + position (int, int): The initial position. + + Attributes: + character: '*' + next_segment: Initially ``None``, this is a reference to a SnakeBodySegment + when this segment is not the last one in the snake's body. + + """ + character = '*' + next_segment = None + + def __init__(self, segment_id, position): + self.segment_id = segment_id + self.name = f"Snake body segment {segment_id}" + self.position = position + + def move(self, new_position, game, growing=False): + """When SnakeHead moves, it sets off a chain reaction, moving all its + body segments. Whenever the head or a body segment has another segment + (``next_segment``), it calls that segment's ``move`` method. + + This method updates the SnakeBodySegment's position. Then, if + ``self.next_segment`` is not None, calls that segment's ``move`` method. + If there is no next segment and ``growing`` is True, then we set + ``self.next_segment`` to a new SnakeBodySegment in this segment's old + position, and update the game's score. + + Arguments: + new_position (int, int): The new position. + game (Game): A reference to the current game. + growing (bool): (Default False) When True, the snake needs to + add a new segment. + """ + old_position = self.position + self.position = new_position + if self.next_segment: + self.next_segment.move(old_position, game, growing=growing) + elif growing: + self.next_segment = SnakeBodySegment(self.segment_id + 1, old_position) + game.add_agent(self.next_segment) + game.state['score'] += self.segment_id + 1 + + +if __name__ == '__main__': + head = SnakeHead() + apple = Apple() + game = Game([head, apple], {'score': 0}, board_size=(32, 16), framerate=12) + apple.relocate(game) + game.play() \ No newline at end of file