From 1a48b971e328cfc49ad9f478cf9c1a9d846d879f Mon Sep 17 00:00:00 2001 From: ehermakov Date: Sun, 21 Apr 2024 20:07:27 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B6=D0=B0?= =?UTF-8?q?=D1=8E=20=D0=BA=D0=BE=D0=B4=20=D1=81=20=D0=B4=D0=B7=200=20?= =?UTF-8?q?=D1=81=20=D0=B2=D0=BE=D1=81=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=83?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ShipCraft/Переделка/ShipDirection.py | 7 ++ .../ShipCraft/Переделка/ShipField.py | 109 ++++++++++++++---- .../ShipCraft/Переделка/ShipMode.py | 10 ++ .../ShipCraft/Переделка/ShipModeDirection.py | 14 --- HNS/Excercises/ShipCraft/Переделка/Test.py | 1 + .../__pycache__/ShipDirection.cpython-311.pyc | Bin 0 -> 618 bytes .../__pycache__/ShipField.cpython-311.pyc | Bin 11135 -> 12867 bytes .../__pycache__/ShipMode.cpython-311.pyc | Bin 0 -> 575 bytes .../__pycache__/test_ShipField.cpython-311.pyc | Bin 15750 -> 17714 bytes .../ShipCraft/Переделка/test_ShipField.py | 64 ++++++---- 10 files changed, 147 insertions(+), 58 deletions(-) create mode 100644 HNS/Excercises/ShipCraft/Переделка/ShipDirection.py create mode 100644 HNS/Excercises/ShipCraft/Переделка/ShipMode.py delete mode 100644 HNS/Excercises/ShipCraft/Переделка/ShipModeDirection.py create mode 100644 HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipDirection.cpython-311.pyc create mode 100644 HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipMode.cpython-311.pyc diff --git a/HNS/Excercises/ShipCraft/Переделка/ShipDirection.py b/HNS/Excercises/ShipCraft/Переделка/ShipDirection.py new file mode 100644 index 0000000..cf85028 --- /dev/null +++ b/HNS/Excercises/ShipCraft/Переделка/ShipDirection.py @@ -0,0 +1,7 @@ +from enum import Enum + + +class ShipDirection(Enum): + VERTICAL = 0 + HORIZONTAL = 1 + UNKNOWN = -1 diff --git a/HNS/Excercises/ShipCraft/Переделка/ShipField.py b/HNS/Excercises/ShipCraft/Переделка/ShipField.py index a1a9e22..28e34ef 100644 --- a/HNS/Excercises/ShipCraft/Переделка/ShipField.py +++ b/HNS/Excercises/ShipCraft/Переделка/ShipField.py @@ -1,5 +1,6 @@ from ShootResult import ShootResult -from ShipModeDirection import ShipDirection, ShipMode +from ShipDirection import ShipDirection +from ShipMode import ShipMode class ShipField: @@ -18,9 +19,9 @@ class ShipField: self.ships = [4, 3, 3, 2, 2, 2, 1, 1, 1, 1] self.field_size = 10 - self.field_mode = ShipMode.PUT.value + self.field_mode = ShipMode.PUT self.ship_size = 4 - self.ship_direction = ShipDirection.VERTICAL.value + self.ship_direction = ShipDirection.VERTICAL def __getitem__(self, item): if item is None: @@ -37,31 +38,34 @@ class ShipField: def action(self, row, col): self.clear_marker() - if self.field_mode == ShipMode.PUT.value: - if self.ship_size in self.ships and self.check_possible(row, col): + if self.field_mode == ShipMode.PUT: + if self.check_ship(row, col): + self.get_ship(row, col) + + elif self.ship_size in self.ships and self.check_possible(row, col): self.set_ship(row, col) - elif self.field_mode == ShipMode.SHOOT.value: + elif self.field_mode == ShipMode.SHOOT: self.shoot(row, col) def target(self, row, col): self.clear_marker() - if self.field_mode == ShipMode.PUT.value: + if self.field_mode == ShipMode.PUT: if self.check_possible(row, col): - if self.ship_direction == ShipDirection.VERTICAL.value: + if self.ship_direction == ShipDirection.VERTICAL: for r in range(row, row + self.ship_size): if self.ship_size in self.ships: self.field[r * self.field_size + col] = "p" else: self.field[r * self.field_size + col] = "r" - if self.ship_direction == ShipDirection.HORIZONTAL.value: + if self.ship_direction == ShipDirection.HORIZONTAL: for c in range(col, col + self.ship_size): if self.ship_size in self.ships: self.field[row * self.field_size + c] = "p" else: - self.field[r * self.field_size + col] = "r" + self.field[row * self.field_size + c] = "r" else: self.field[row * self.field_size + col] += "+" @@ -79,13 +83,13 @@ class ShipField: if col < 0 or col > self.field_size: return index = row * self.field_size + col - if self.ship_direction == ShipDirection.VERTICAL.value: + if self.ship_direction == ShipDirection.VERTICAL: if self.field_size - row < self.ship_size: return for r in range(row, row + self.ship_size): index = r * self.field_size + col self.field[index] = "1" - if self.ship_direction == ShipDirection.HORIZONTAL.value: + if self.ship_direction == ShipDirection.HORIZONTAL: if self.field_size - col < self.ship_size: return for c in range(col, col + self.ship_size): @@ -96,6 +100,56 @@ class ShipField: self.ships.remove(self.ship_size) self.print_field() + def get_ship(self, row, col): + if row < 0 or row > self.field_size: + return + if col < 0 or col > self.field_size: + return + + self.field[row * self.field_size + col] = "" + + ship_size = 1 + ship_direction = ShipDirection.UNKNOWN + + # проверим вертикаль + for r in range(row + 1, self.field_size): + if self.check_ship(r, col): + ship_size += 1 + ship_direction = ShipDirection.VERTICAL + self.field[r * self.field_size + col] = "" + else: + break + + for r in range(row - 1, -1, -1): + if self.check_ship(r, col): + ship_size += 1 + ship_direction = ShipDirection.VERTICAL + self.field[row * self.field_size + col] = "" + else: + break + + if ship_direction == ShipDirection.UNKNOWN: + + # проверим горизонталь + for c in range(col + 1, self.field_size): + if self.check_ship(row, c): + ship_size += 1 + ship_direction = ShipDirection.HORIZONTAL + self.field[row * self.field_size + c] = "" + else: + break + + for c in range(col - 1, -1, -1): + if self.check_ship(row, c): + ship_size += 1 + ship_direction = ShipDirection.HORIZONTAL + self.field[row * self.field_size + c] = "" + else: + break + self.set_ship_direction(ship_direction) + self.set_ship_size(ship_size) + self.ships.append(ship_size) + def shoot(self, row, col): if row < 0 or row > self.field_size - 1: return ShootResult.UNDEFINED @@ -111,10 +165,18 @@ class ShipField: else: return ShootResult.UNDEFINED + + + def check_ship(self, row, col): + #функция должна возвражать тру, если в заданной клетке есть корабль + # в противном случае фолс + return self.field[row * self.field_size + col].strip() == "1" + + def check_possible(self, row, col): # Функция должна возвращать True, если можно поставить сюда корабль, # в противном случае - False - if self.ship_direction == ShipDirection.VERTICAL.value: + if self.ship_direction == ShipDirection.VERTICAL: # Здесь мы знаем, что корабль помещается на поле. if self.field_size - row >= self.ship_size: # Теперь нужно проверить, не заблокировано ли какое-то из полей, @@ -123,7 +185,7 @@ class ShipField: return False return True - if self.ship_direction == ShipDirection.HORIZONTAL.value: + if self.ship_direction == ShipDirection.HORIZONTAL: if self.field_size - col >= self.ship_size: for c in range(col, col + self.ship_size): if not self.check_blocked(row, c): @@ -157,23 +219,24 @@ class ShipField: if value is None: return - if type(value) is str and value.isnumeric(): - value = int(value) + if type(value) is not ShipDirection: + return - if type(value) is int and ShipDirection.VERTICAL.value <= value <= ShipDirection.HORIZONTAL.value: + if value != ShipDirection.UNKNOWN: self.ship_direction = value + def toggle_ship_direction(self): - if self.ship_direction == ShipDirection.VERTICAL.value: - self.ship_direction = ShipDirection.HORIZONTAL.value + if self.ship_direction == ShipDirection.VERTICAL: + self.ship_direction = ShipDirection.HORIZONTAL else: - self.ship_direction = ShipDirection.VERTICAL.value + self.ship_direction = ShipDirection.VERTICAL def toggle_field_mode(self): - if self.field_mode == ShipMode.PUT.value: - self.field_mode = ShipMode.SHOOT.value + if self.field_mode == ShipMode.PUT: + self.field_mode = ShipMode.SHOOT else: - self.field_mode = ShipMode.PUT.value + self.field_mode = ShipMode.PUT def print_field(self): print(self.ships) diff --git a/HNS/Excercises/ShipCraft/Переделка/ShipMode.py b/HNS/Excercises/ShipCraft/Переделка/ShipMode.py new file mode 100644 index 0000000..9516bfc --- /dev/null +++ b/HNS/Excercises/ShipCraft/Переделка/ShipMode.py @@ -0,0 +1,10 @@ +from enum import Enum + + +class ShipMode(Enum): + PUT = 0 + SHOOT = 1 + + + + diff --git a/HNS/Excercises/ShipCraft/Переделка/ShipModeDirection.py b/HNS/Excercises/ShipCraft/Переделка/ShipModeDirection.py deleted file mode 100644 index 4f8302d..0000000 --- a/HNS/Excercises/ShipCraft/Переделка/ShipModeDirection.py +++ /dev/null @@ -1,14 +0,0 @@ -from enum import Enum - - -class ShipMode(Enum): - PUT = 0 - SHOOT = 1 - - -class ShipDirection(Enum): - VERTICAL = 0 - HORIZONTAL = 1 - - -print(ShipDirection.VERTICAL.value) diff --git a/HNS/Excercises/ShipCraft/Переделка/Test.py b/HNS/Excercises/ShipCraft/Переделка/Test.py index b665305..b5a15f6 100644 --- a/HNS/Excercises/ShipCraft/Переделка/Test.py +++ b/HNS/Excercises/ShipCraft/Переделка/Test.py @@ -1,6 +1,7 @@ from ShipField import ShipField + def verify_value(actual, expected): if actual == expected: print("OK") diff --git a/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipDirection.cpython-311.pyc b/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipDirection.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6853b9174873630d3dce330abdcb33b64bbfadc GIT binary patch literal 618 zcmZ3^%ge<81TJ=}Y573$ z<1%IjhSfj}0Z~jTEWr$#tS>=aO~zX+u6d=o$xul!#R%nmmI5-SGo&&^F{Us8wJ}C9 zr!Ymaq%cRZLX5b@8=R3@;F4LCnp~2ZpI5{LRR0pB`{jQi@Y7_w#StH$mzbLxAAgH0 zK0Y@;r8Eb`=82ClEKSUT%5a3a28DP!JNn$>^6(GxjPmyj0kYXc{k;AB!~Iq=dr5cwY!wq)oLW>IMSd@|<6q1`z~w-k{d4U0m2<%{w5%A z?}Z%~wklj~RJbtVV#CFzi_Kt}Jux1B!7&+m$-1dv!@ykEisaOyu_$oj=$0|_|0A|W6b6uiaWK;i>4BO~Jt c2GI+s=mQ%wqu>VyOk#q|N08_jEK*?00Q#!97ytkO literal 0 HcmV?d00001 diff --git a/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipField.cpython-311.pyc b/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipField.cpython-311.pyc index 619f7d91ca549425edd5b1b0219264f31336e564..78bf1a311d1cce65fa55d57592a205e37162a37f 100644 GIT binary patch delta 5121 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 literal 0 HcmV?d00001 diff --git a/HNS/Excercises/ShipCraft/Переделка/__pycache__/test_ShipField.cpython-311.pyc b/HNS/Excercises/ShipCraft/Переделка/__pycache__/test_ShipField.cpython-311.pyc index 31db0874f0928ba25b9f335baa587472fde141ac..f2c30bb057e89e3398b473899af5983eb370ee1d 100644 GIT binary patch delta 3579 zcmd5FI}jDXLVB3ZaTIuOC)v+Qzr-lS3^PS)1r4O&V%9W$L6!RAM{lIZph7 zQ}J<6&%bx>Ip@B2&bjBFbA9cNU;c#IKe5@Y0$zV=^_|N2m+UTfe5oPWW|}rJK@k*j zK|Cu?i%c*GhXqBtDk$bCyJ-}J+xW{~(~`m`1ixkJt>!kC;S;B0=SCKlsGntQMEA$k z=xidk`08wK0zKK<;M;3Ue|gh-RhX_+ocNN;k54fpvnJnVo8SAN7bU}%nMKe{27{;T=CNpJ;#kskKXkMb+K^*k;XP^Ilj1$ZsnF@5 z8fiYZjfiR;z8MDXFR&0?x5tWTsQL+Z0xM~kx`^BbT_rWF93$X?%O#&fX}wEQOqbX^ zdtY`ziBp8m(j}=ERpUQ}FG^4DTAokWG_UZMG;c}qmJMqw^a7OO4ZS7qq*C?MOXZu<}6KsBv-CH$hg z%*cdGz}l+}ml(W>=@695;Wsr-Ft$5$EMrYW{_sWp@V0*VU;S|6Io;e(^uzCTLxaNL zZnZD}Tc+~O)|eEg7~oEgH&2Zwep*vU%Qql}RXh6rNDF`ssY9w8@fOeKZYk24@^~~6 ziQ~qKD7l@bnn_?C7#%+{JsO_u8-_o4TDQxIXgm>_Jsq7r6FIjSkH=0@Zl73)M_+G% z(mIbVJ9rJ}#=oR}2|aRWkaty+nXjH^&U6Y7QN>-7}R;t0_{qghuO zh10JO=U2S^OYXkU-OGK;=U2EV%{?jZS(OBf4bFLG_|7{8554u^@orzI$98!Bzp~z> zh>El+gJHB*w+er+uYlv8GN#*_|IzCVd4kOwvCpQt`Vz)&(w~>?>I8DM>{cgXzkk;J zF-3RlWIYpb!%U!_e#x1@MaFhxt=w-%NDE zlZ@h4aT9yw?e#v%goIUqU3;Iy-iGIuCoY%avH^N(WVpVk!nj!`T{d14KC-}F<^b=0 z`4w@^mqD`OB?4+%errLyXGlIoFifD?z3ztJq&kS}Bp4wG!w37%OWzs(!%|5MYn*i~HEWzaEVpX2^3YWzcCHFVaH6w`nc>||xlQ|Dk!@WT^7H}$9h|hY z#ADuxe?BfOM7!0C$fF#Ie+d8R?2T5Z1l|2WXh`YrRq0hD>sl2G<9h@D(j@=hLay2H EKZ&1kR{#J2 delta 2604 zcmai0eN0jer8yzslE3m|2 zf{8I^ahdhFKTMX0nVTUq6Yc&o(QJQeq60(bY)n)V%{KoKqtV1A>OBuA(1E_Z{(8>u zo_o$c_r7!9`{)vR<)Y!eHt?8S@Kloqy(S0zq<6u~ zCNVBscysv-+ajx|b6H0rPc5raHd2Tsoel+ur0!w5l$ddBt@NkP`n@%&k4m~HCPjMv#YW_E_Ozzst!*$a;hA>A&For{nU9~wj$ zO|fbBq52#JxFTe!zGa|SV}*w)A45;62EIs*a5Z!+90tkQmpsT>i0=kzQAev<-Rq!CIhxA9wwigrCteWQ33@4oh zs1}tWa>Pa#!fK6qF;R5GI;zo7?Va-T|lR4r>tLB__R`-Yq(>bm+ z3nWqt6NpA@0&y*o(7O{XdJ>5{iG)y8l=)cMf@Hc64RRL6$2^7hJS`O3b22z8$C4Tk zwI1j^)Y9&6ifJZ#hsJ|&!oJ&_HWmzzb@vYh`v<$vkA%aazM0 z^5_>_fq9{RL8zY->Z2)+J_3jHCPB)#soq%KViC@1(+GhclNoA!=`c{X4Hhdiz~?i< zZI=jxWpvl6{?;y6T&`ay`*R(ub68GN!?ep0x9f46-~(5BT-R^ZsXf2m-oi`jo3!$7 zVf87OBrNN2s%$5&f?AOOwP63-B8`{0L<=}vDtfdnvVlfb%3eN<(%QMmN2uPO$1OL5 zR2*!DU{ODJnTp{Iy4eM~>E3xEcR|RV6LKNN;ecx%3taKI@E5(}xjNXwG9To(z^NDR28a~R`qNh?PMj51)kL8&_$;3E6*H#lHIJt zZ@~*&@Y*;}IDA%jByIYvJ}#xX$v(JOm1g7DKdMM~ASkU}>B4)JT}iJl;6I}S;XfI; zUzES${8Jn@c)R*j`aV+Ln)Cq9X-(`H$3TUc!%6HUq0RXn(X4(^HA%phZO)L?l4fIR z5oR-cc9MY~vdwVIXDR1aGEv^R2XKv8YD($l35hv8k3$C$ih=mIaZM;TgUvt6KcHgx z>a$tQ`$NPGm9-^JPBbn+a3gpTsuAiC_9L_)97E_tIEB!I(1#F27(^I`yR{Y$dv&-3 zzN@X)?O9?3%`!l4oi&Bmlr1rFFu}39>f=7L#E6Mj+f3co7_v>ah6mqF`MJ-jlU`*zi%