From d3ecbdd30ed139a1914bbc88c2b475e498206de9 Mon Sep 17 00:00:00 2001 From: Wizard of z/OS Date: Sun, 14 Sep 2025 13:18:54 +0200 Subject: [PATCH] Update GFX, classes in seperate files, random speed increase upon eat food --- classes/__init__.py | 2 + classes/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 211 bytes classes/__pycache__/field.cpython-38.pyc | Bin 0 -> 2632 bytes classes/__pycache__/snake.cpython-38.pyc | Bin 0 -> 2371 bytes classes/field.py | 70 +++++++++++++++ snake.py => classes/snake.py | 94 +------------------- game.py | 41 +++++++++ 7 files changed, 114 insertions(+), 93 deletions(-) create mode 100644 classes/__init__.py create mode 100644 classes/__pycache__/__init__.cpython-38.pyc create mode 100644 classes/__pycache__/field.cpython-38.pyc create mode 100644 classes/__pycache__/snake.cpython-38.pyc create mode 100644 classes/field.py rename snake.py => classes/snake.py (53%) create mode 100644 game.py diff --git a/classes/__init__.py b/classes/__init__.py new file mode 100644 index 0000000..8e5e3b9 --- /dev/null +++ b/classes/__init__.py @@ -0,0 +1,2 @@ +from .field import Field +from .snake import Snake \ No newline at end of file diff --git a/classes/__pycache__/__init__.cpython-38.pyc b/classes/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60c3fc1fc8cff95bb23ec937500ae6041154d7e7 GIT binary patch literal 211 zcmWIL<>g`kg1ZZjWf%hK#~=SFB4!|aB|{M#kOC9G zjPx_|b5r#*QuB&3^@~yq@{9EgDoZl*^K`))^pkTEi;Gi>_2c6+^D;}~|!&T0sPegD-)LMKrS9lf;Q1arZIPeqZf&{1h1%w1&b=yvy1d*}2yLzU(y6UT{ul>!!LZ0FI z{nf8~zxj;)Nt2t8gUJgt{T!WSl6P3cj=aImTr>nm(Q&$N!{zJ?CLQUXGU=X(h9~(J z3%x7sW%ZC}Io0gRb}wnsi<^(YDts4Ygc~Q`T^-!iFn7>0|E6oD4Afa!%$k z=H$FAU<~AfEMlCKi#W8Dd7roAj%<I{N#8Io?S5jw-(Qe#}RWpgB9kM&iH>Hf?UeZpELxG)fXGi6r=8~xe41ZOt zd;M-)-HUswT~+a6Usn&0lf8cL1EaUv>NK^Eb=7EFKRnKYC~EiGNfeP5y@ZZ&UkGk~ ze+RzL13oMo(AFnQTjavzaUoDM=zR$x0dgtZ2YRdQM2z^Yxd6IiSB#w0!76c(Q^*ZS zPRh$H6*V^499UG{x&cg)c7-%#K#*`V4y!pxnP>dK`vT2)JLCJAZ{aa`*se&M=FvSu z)3lU1C0^oz$nzo}maKQz$jL|;Q=i#B zNiK7A1=}f&wpT}{OilsTwTd6bz(q2NJNxPAEi_%4>Tg{H%fH2v2LqzU*sM_7wCZAA`>B!g6 zU2+qP8^EvN?d*}^gO9v))a#^~l2eiQs!SdEY9$j|A}flFCa@VFKE7A~46GDYT5YnH zEVQ(OJY*D2Q~y-i_e7JBGtqbg!9;Uu63x`4!hgnby7Rrs&b1Lw5y=BbtzqPL>FwIck>1Fk&euk6>SMQuHr7Y`K4v3-AX9$sr?@Oq z|H9#H@b&mwFyXuU2alS@Fk@lPCiELH-SC*j$YgqecbN|^(uu-4!)v~7sThoIs(^~j zRCwm@#ZB38RR6nM$&mRf?#WoakENOt1C-7Kx5!IQp09`kcX@$75yOJT*)E`_}s_U?|G6Kg-kI!&3%aEs>ouxzco zXJtLi(^cGScH=0@@=?_7%cBm-g(w;vH9Pi;TBMWdDpLf2G8sgrV-0#;$M{j13&-( literal 0 HcmV?d00001 diff --git a/classes/__pycache__/snake.cpython-38.pyc b/classes/__pycache__/snake.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d58131b55aed9b4d0e1e009b907e0d93e2419c03 GIT binary patch literal 2371 zcmZWrPj4GV6rY(L+v|<(xJfCr3MCR8FcNhS5uhrdQd$ZEnToWc__A_5(|F_cA7(cZ zvCN5rIP(b{AtCi!AP#&3E_>xdBt8Kb_`R96V<#)koA>7T=FQBT_ulN2YBgZ^e*Wc; z-k)X0{vu)d^B~+sOWpxdO!1htUC-Ox%AzgMi`W~;w&d&~Q=XE~nUdd&c0uty)+n4| zE^9S-Rx+KTiiT;I29`eo;VxQoA4D@U4YOQ{=dA5HgKen_stCEDO3FuHRAm*QFR3+E zLGP=os-Z8dbu3!X3VXv&Uw6s${3E`A_7Pfg8)V9-EMzG^6zDxH$PetYmU@=T192dM zO2z0bEyFSI%n~wpMjmPuGCAxFbXM#hnM5a9`LhRKhhKjB@RP?`Sw%*7(`YmVIvN?3 zG(;v79X~TAOnt#j72UthW^Xjm&7K~bsA=?glr+aDX>T-qJE3DVyKyIh<))QxjZZQ^ z45ML`h9Ox=iXe;^x$jMC_T0DT@FfS(uB`(Mm?=-$A@2)wW6BN%c#n8GszpfJ$q~}p zSs)TpD@O{%FA$P?IYL@Jhrophls)!>w;Dy`W9`f*FMa;t;R;R-~~fj~sUY zi?3P@VJZZOZqItkks1wE6P<<&_tH?Z0m8g%T=JzRCY#PDEBal!!}%w{P_vHt9SjbD zXurigI&i=#K;PwPKhz$qX(;d|gY&wMdBXx3V z$59e?;^jp1nNc zpXR754GT1nTA5W(nMKO8+9@-Cr((A5MrQQ|a)mhM?b&Q;$d-8(XSU_trObv6I9HpfUK#SM z*(5@x%3L8rPS1*+@mLR)*(RalV$#)m^BN6#$w`t){Vh^%6LIGhbSDk}h!eJ7)5TMDI z;(qZiP%(B7Bb5MD0k^8Oi03+OMcDY^b3B~ wf8Ap9mq(`2K$|z9lojcpWHd0eVXL!b(=K738h_Vq^aFY{5{d@$C_F6w2TH5haR2}S literal 0 HcmV?d00001 diff --git a/classes/field.py b/classes/field.py new file mode 100644 index 0000000..e5dd0c0 --- /dev/null +++ b/classes/field.py @@ -0,0 +1,70 @@ +import curses +import time +import sys +from random import randint + +class Field: + def __init__(self, size): + self.size = size + self.icons = { + 0: ' . ', # empty baord + 1: ' ▢ ', # snake tail + 2: ' ⏺ ', # snake head + 3: ' △ ', # food + } + self.snake_coords = [] + self._generate_field() + self.add_entity() + + def add_entity(self): + + while(True): + i = randint(0, self.size-1) + j = randint(0, self.size-1) + entity = [i, j] + + if entity not in self.snake_coords: + self.field[i][j] = 3 + break + + def _generate_field(self): + self.field = [[0 for j in range(self.size)] for i in range(self.size)] + + def _clear_field(self): + self.field = [[j if j!= 1 and j!= 2 else 0 for j in i] for i in self.field] + + + def render(self, screen): + size = self.size + self._clear_field() + + + # Render snake on the field + for i, j in self.snake_coords: + self.field[i][j] = 1 + + # Mark head + head = self.snake_coords[-1] + self.field[head[0]][head[1]] = 2 + + for i in range(size): + row = '' + for j in range(size): + row += self.icons[ self.field[i][j] ] + + screen.addstr(i, 0, row) + + def get_entity_pos(self): + for i in range(self.size): + for j in range(self.size): + if self.field[i][j] == 3: + return [i, j] + + return [-1, -1] + + + def is_snake_eat_entity(self): + entity = self.get_entity_pos() + head = self.snake_coords[-1] + return entity == head + diff --git a/snake.py b/classes/snake.py similarity index 53% rename from snake.py rename to classes/snake.py index edb2c79..4dbd62c 100644 --- a/snake.py +++ b/classes/snake.py @@ -3,72 +3,6 @@ import sys from random import randint -class Field: - def __init__(self, size): - self.size = size - self.icons = { - 0: ' . ', - 1: ' * ', - 2: ' # ', - 3: ' & ', - } - self.snake_coords = [] - self._generate_field() - self.add_entity() - - def add_entity(self): - - while(True): - i = randint(0, self.size-1) - j = randint(0, self.size-1) - entity = [i, j] - - if entity not in self.snake_coords: - self.field[i][j] = 3 - break - - def _generate_field(self): - self.field = [[0 for j in range(self.size)] for i in range(self.size)] - - def _clear_field(self): - self.field = [[j if j!= 1 and j!= 2 else 0 for j in i] for i in self.field] - - - def render(self, screen): - size = self.size - self._clear_field() - - - # Render snake on the field - for i, j in self.snake_coords: - self.field[i][j] = 1 - - # Mark head - head = self.snake_coords[-1] - self.field[head[0]][head[1]] = 2 - - for i in range(size): - row = '' - for j in range(size): - row += self.icons[ self.field[i][j] ] - - screen.addstr(i, 0, row) - - def get_entity_pos(self): - for i in range(self.size): - for j in range(self.size): - if self.field[i][j] == 3: - return [i, j] - - return [-1, -1] - - - def is_snake_eat_entity(self): - entity = self.get_entity_pos() - head = self.snake_coords[-1] - return entity == head - - class Snake: def __init__(self, name): self.name = name @@ -158,6 +92,7 @@ def move(self): curses.beep() self.level_up() self.field.add_entity() + return 1 @@ -166,30 +101,3 @@ def set_field(self, field): self.field = field -def main(screen): - # Configure screen - screen.timeout(0) - - # Init snake & field - field = Field(10) - snake = Snake("Joe") - snake.set_field(field) - - while(True): - # Get last pressed key - ch = screen.getch() - if ch != -1: - # If some arrows did pressed - change direction - snake.set_direction(ch) - - # Move snake - snake.move() - - # Render field - field.render(screen) - screen.refresh() - - time.sleep(.4) - -if __name__=='__main__': - curses.wrapper(main) diff --git a/game.py b/game.py new file mode 100644 index 0000000..ddfbe06 --- /dev/null +++ b/game.py @@ -0,0 +1,41 @@ +import curses +import time +import sys +from random import randint +from classes import Field +from classes import Snake + + +def main(screen): + # Configure screen + screen.timeout(0) + + # Init snake & field + field = Field(10) + snake = Snake("Joe") + snake.set_field(field) + speed = 0.4 + + while(True): + # Get last pressed key + ch = screen.getch() + if ch != -1: + # If some arrows did pressed - change direction + snake.set_direction(ch) + + # Move snake + hit = snake.move() + if hit == 1: + # we ate a food + if randint(1,10) > 6: + # incrase speed every now and then... + speed -= 0.05 + + # Render field + field.render(screen) + screen.refresh() + + time.sleep(speed) + +if __name__=='__main__': + curses.wrapper(main)