From 20b930520ff7567d0f6148db205628a59df0e4da Mon Sep 17 00:00:00 2001 From: danii Date: Tue, 16 Apr 2024 11:47:52 +0200 Subject: [PATCH] Changes from lesson 18 --- HNC/Exercises/Ship_Battle/ShipDirection.py | 6 + HNC/Exercises/Ship_Battle/ShipField.py | 107 ++++++++++++++---- HNC/Exercises/Ship_Battle/ShipField_test.py | 72 +++++++++--- HNC/Exercises/Ship_Battle/ShipMode.py | 5 + .../__pycache__/ShipDirection.cpython-311.pyc | Bin 0 -> 535 bytes .../__pycache__/ShipField.cpython-311.pyc | Bin 10074 -> 12771 bytes ...hipField_test.cpython-311-pytest-8.1.1.pyc | Bin 12098 -> 15583 bytes .../__pycache__/ShipMode.cpython-311.pyc | Bin 0 -> 492 bytes 8 files changed, 150 insertions(+), 40 deletions(-) create mode 100644 HNC/Exercises/Ship_Battle/ShipDirection.py create mode 100644 HNC/Exercises/Ship_Battle/ShipMode.py create mode 100644 HNC/Exercises/Ship_Battle/__pycache__/ShipDirection.cpython-311.pyc create mode 100644 HNC/Exercises/Ship_Battle/__pycache__/ShipMode.cpython-311.pyc diff --git a/HNC/Exercises/Ship_Battle/ShipDirection.py b/HNC/Exercises/Ship_Battle/ShipDirection.py new file mode 100644 index 0000000..6c002f6 --- /dev/null +++ b/HNC/Exercises/Ship_Battle/ShipDirection.py @@ -0,0 +1,6 @@ +from enum import Enum + +class ShipDirection(Enum): + VERTICAL = 0 + HORIZONTAL = 1 + UNKNOWN = -1 \ No newline at end of file diff --git a/HNC/Exercises/Ship_Battle/ShipField.py b/HNC/Exercises/Ship_Battle/ShipField.py index a87c565..9e3790f 100644 --- a/HNC/Exercises/Ship_Battle/ShipField.py +++ b/HNC/Exercises/Ship_Battle/ShipField.py @@ -1,4 +1,6 @@ from ShootResult import ShootResult +from ShipMode import ShipMode +from ShipDirection import ShipDirection class ShipField: @@ -17,9 +19,9 @@ class ShipField: self.ships = [4, 3, 3, 2, 2, 2, 1, 1, 1, 1] self.field_size = 10 - self.field_mode = 0 + self.field_mode = ShipMode.PUT self.ship_size = 4 - self.ship_direction = 0 + self.ship_direction = ShipDirection.VERTICAL def __getitem__(self, item): @@ -38,27 +40,30 @@ class ShipField: def action(self, row, col): self.clear_marker() - if self.field_mode == 0: - 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 == 1: + elif self.field_mode == ShipMode.SHOOT: self.shoot(row, col) def target(self, row, col): self.clear_marker() - if self.field_mode == 0: + if self.field_mode == ShipMode.PUT: if self.check_possible(row, col): - if self.ship_direction == 0: + 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 == 1: + 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" @@ -83,13 +88,13 @@ class ShipField: if col < 0 or col > self.field_size: return index = row * self.field_size + col - if self.ship_direction == 0: + 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 == 1: + if self.ship_direction == ShipDirection.HORIZONTAL: if self.field_size - col < self.ship_size: return for c in range(col, col + self.ship_size): @@ -99,6 +104,59 @@ class ShipField: if self.ship_size in self.ships: self.ships.remove(self.ship_size) + 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 + + + # check vertical + 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[r * self.field_size + col] = '' + else: + break + + + if ship_direction == ShipDirection.UNKNOWN: + # check horizontal + 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 @@ -113,16 +171,19 @@ class ShipField: return ShootResult.DAMAGED 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): - if self.ship_direction == 0: + if self.ship_direction == ShipDirection.VERTICAL: if self.field_size - row >= self.ship_size: for r in range(row, row + self.ship_size): if not self.check_blocked(r, col): return False return True - if self.ship_direction == 1: + 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): @@ -154,24 +215,24 @@ class ShipField: if value is None: return - if type(value) is str and value.isnumeric(): - value = int(value) - - if type(value) is int and 0 <= value <= 1: + if type(value) is not ShipDirection: + return + + if value != ShipDirection.UNKNOWN: self.ship_direction = value def toggle_ship_direction(self): - if self.field_mode == 0: - if self.ship_direction == 0: - self.ship_direction = 1 + if self.field_mode == ShipMode.PUT: + if self.ship_direction == ShipDirection.VERTICAL: + self.ship_direction = ShipDirection.HORIZONTAL else: - self.ship_direction = 0 + self.ship_direction = ShipDirection.VERTICAL def toggle_field_mode(self): - if self.field_mode == 0: - self.field_mode = 1 + if self.field_mode == ShipMode.PUT: + self.field_mode = ShipMode.SHOOT else: - self.field_mode = 0 + self.field_mode = ShipMode.PUT def print_field(self): for r in range(0, self.field_size): diff --git a/HNC/Exercises/Ship_Battle/ShipField_test.py b/HNC/Exercises/Ship_Battle/ShipField_test.py index bc5ceb7..f12ede3 100644 --- a/HNC/Exercises/Ship_Battle/ShipField_test.py +++ b/HNC/Exercises/Ship_Battle/ShipField_test.py @@ -1,6 +1,8 @@ from unittest import TestCase from ShipField import ShipField from ShootResult import ShootResult +from ShipMode import ShipMode +from ShipDirection import ShipDirection class TestShipField(TestCase): @@ -45,20 +47,16 @@ class TestShipField(TestCase): def test_toggle_field_mode(self): ship_field = ShipField() # Заводим объект типа ShipField - self.assertEqual(ship_field.field_mode, 0) # Проверяем, что изначальное значение field_mode равно 0 + self.assertEqual(ship_field.field_mode, ShipMode.PUT) # Проверяем, что изначальное значение field_mode равно 0 ship_field.toggle_field_mode() # Вызываем метод, который тестируем - self.assertEqual(ship_field.field_mode, 1) # Проверяем, что field_mode принял желаемое значение + self.assertEqual(ship_field.field_mode, ShipMode.SHOOT) # Проверяем, что field_mode принял желаемое значение ship_field.toggle_field_mode() # Вызываем метод, который тестируем - self.assertEqual(ship_field.field_mode, 0) # Проверяем, что field_mode принял желаемое значение + self.assertEqual(ship_field.field_mode, ShipMode.PUT) # Проверяем, что field_mode принял желаемое значение def test_action(self): - ship_field = ShipField() - self.assertEqual(ship_field.action, 0) - - ship_field.action() - self.assertEqual(ship_field.action, 1) + self.fail() def test_target(self): self.fail() @@ -67,10 +65,12 @@ class TestShipField(TestCase): ship_field = ShipField() ship_field.field[0] = 'p' ship_field.field[ship_field.field_size - 1] = 'p' + ship_field.field[ship_field.field_size - 4] = 'r' ship_field.clear_marker() self.assertNotIn('p', ship_field.field) + self.assertNotIn('r', ship_field.field) def test_shoot_empty(self): ship_field = ShipField() @@ -133,7 +133,7 @@ class TestShipField(TestCase): def test_set_ship_size4_horizontal_direction(self): ship_field = ShipField() ship_field.set_ship_size(4) - ship_field.set_ship_direction(1) + ship_field.set_ship_direction(ShipDirection.HORIZONTAL) ship_field.set_ship(6, 3) @@ -154,18 +154,56 @@ class TestShipField(TestCase): self.assertEqual(new_field_string, old_field_string) def test_check_possible(self): - self.fail() + ship_field = ShipField() + ship_field.set_ship_size(4) + ship_field.set_ship_direction(ShipDirection.HORIZONTAL) + + ship_field.set_ship(5, 3) + + self.assertEqual(ship_field.check_possible(5, 3), False) + self.assertEqual(ship_field.check_possible(5, 4), False) + self.assertEqual(ship_field.check_possible(5, 5), False) + self.assertEqual(ship_field.check_possible(5, 6), False) + + self.assertEqual(ship_field.check_possible(6, 3), False) + self.assertEqual(ship_field.check_possible(6, 4), False) + self.assertEqual(ship_field.check_possible(6, 5), False) + self.assertEqual(ship_field.check_possible(6, 6), False) + + self.assertEqual(ship_field.check_possible(7, 3), True) + self.assertEqual(ship_field.check_possible(7, 4), True) + self.assertEqual(ship_field.check_possible(7, 5), True) + self.assertEqual(ship_field.check_possible(7, 6), True) def test_check_blocked(self): - self.fail() + ship_field = ShipField() + ship_field.set_ship_size(4) + ship_field.set_ship_direction(ShipDirection.HORIZONTAL) + + ship_field.set_ship(5, 3) + + self.assertEqual(ship_field.check_possible(5, 3), False) + self.assertEqual(ship_field.check_possible(5, 4), False) + self.assertEqual(ship_field.check_possible(5, 5), False) + self.assertEqual(ship_field.check_possible(5, 6), False) + + self.assertEqual(ship_field.check_possible(6, 3), False) + self.assertEqual(ship_field.check_possible(6, 4), False) + self.assertEqual(ship_field.check_possible(6, 5), False) + self.assertEqual(ship_field.check_possible(6, 6), False) + + self.assertEqual(ship_field.check_possible(7, 3), True) + self.assertEqual(ship_field.check_possible(7, 4), True) + self.assertEqual(ship_field.check_possible(7, 5), True) + self.assertEqual(ship_field.check_possible(7, 6), True) def test_set_ship_direction(self): ship_field = ShipField() - ship_field.set_ship_direction(1) - self.assertEqual(ship_field.ship_direction, 1) + ship_field.set_ship_direction(ShipDirection.HORIZONTAL) + self.assertEqual(ship_field.ship_direction, ShipDirection.HORIZONTAL) - ship_field.set_ship_direction(0) - self.assertEqual(ship_field.ship_direction, 0) + ship_field.set_ship_direction(ShipDirection.VERTICAL) + self.assertEqual(ship_field.ship_direction, ShipDirection.VERTICAL) def test_toggle_ship_direction(self): @@ -173,9 +211,9 @@ class TestShipField(TestCase): ship_field.toggle_ship_direction() - self.assertEqual(ship_field.ship_direction, 1) + self.assertEqual(ship_field.ship_direction, ShipDirection.HORIZONTAL) ship_field.toggle_ship_direction() - self.assertEqual(ship_field.ship_direction, 0) + self.assertEqual(ship_field.ship_direction, ShipDirection.VERTICAL) diff --git a/HNC/Exercises/Ship_Battle/ShipMode.py b/HNC/Exercises/Ship_Battle/ShipMode.py new file mode 100644 index 0000000..657f3e7 --- /dev/null +++ b/HNC/Exercises/Ship_Battle/ShipMode.py @@ -0,0 +1,5 @@ +from enum import Enum + +class ShipMode(Enum): + PUT = 0 + SHOOT = 1 \ No newline at end of file diff --git a/HNC/Exercises/Ship_Battle/__pycache__/ShipDirection.cpython-311.pyc b/HNC/Exercises/Ship_Battle/__pycache__/ShipDirection.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31f8f6e439b39b561893c7bc0aba013773caa3ab GIT binary patch literal 535 zcmZut%}T>S5S~p^EyeyqFM{5Cun!<2)Ee4aNufUqA+Ut(N`q-yw+ZO22Oq#&-#`&x z#$(9UQ*V`e>P2^xv>-aOJNtb*KRY`w*=z>5l-0wVTYi2BvXN8*R#gt>K!6|zMo32p zBxnGU9)ZXdJ<9-Ze8-|oMCm~#wGgy|LPd4`k(D^310`g&&%qoh=!gJML%K{PT_Lib zic5sq-q4<$+l*SCJ$9MI;};@(@y$i6?1X8IU2{Y+4l@{!#>967-oyCLH=V?jzEZpW zR=su^W}2ODOYdlXj&}!ITkBkFudovBtXt&Rs4>rHc;I@JG20q?#?ZBni0Rt4V>Gq8 zq25zw*;6_-L|^#K^gM?~c-v!j^1#H{A|qxpJ>X`x)gWJ(HG^Vlb`j(XvxZQX-^6Pb zIaDYg7ZaIrot!{XM1iAq`Xv74DJyX*W-)DZvy>4+0hHf=ucacR;u8Lvr}Iy7`}L12 Gdh7=a(Sqs# literal 0 HcmV?d00001 diff --git a/HNC/Exercises/Ship_Battle/__pycache__/ShipField.cpython-311.pyc b/HNC/Exercises/Ship_Battle/__pycache__/ShipField.cpython-311.pyc index b442d41a1aba8da0842f467645086a618a5a8d47..1b091d4cc9b3796513568bbb0907d748b7cd072a 100644 GIT binary patch literal 12771 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 ZMSaRwEE!oG;r>7WrhNPN15n5i{~NwB#fty{ delta 3796 zcmb_eUu;`f89(R#v7I>fbzoy3WgCZ202amZkUc4sX5!CQ%0s0-j3=0Q0kIc1inQoT!1(u2Aq`jJDG$K+o$FjX zS&OQw$G*RN&iT%t@0{=Vec%0C&YJSS1w3oS|_i@0=<5}jBS6O)+hj`@OnH$dkSnlyrS6O`M-IL9C zkr;Q8E364?NHd1q6mXYf&ASWk3aJ?90YTEmTa{?oYCfAc3i{kaQ8%n6^IU#u&de_x z{L9L>TrL=9KF|NIjJ9q?J6Dx8Z7ULmmwzkPb33KZ(x?v?l2`~{mXa?S3ns4L+soSd zbytE$`0re6t}t}vWd4lW$xH6BL7mPEpI}GIE(fOJLMHKohV7m~keY81e%;rZ{!w)!Y8m(w4_}@}K%pBXu9DD!R?}K+TCpR-Ep_9j(yQ6`$Jp!=mBL23u zxplhXi&uPcKHD5~^+AP&`8V4mQlG?&?x+3ERatOq2~M3z{krj@9Qo-IlAu<~6n^Bq z%17F|#|~bWvF^yod9B>t%q|V2 zGOlZDaQHGru7}nDHTUqZw?u-w_qY4sX&DGYRBX^o^nbr2ykZAL!2^pfS(FL-Z_`w= ziN)b`HV^u+)&^jyEW7xsQ6mQSBA1y4a6=W`U<25J24@EVESfX%8i6AYOG;Vxs!TkK3u~f+Bj2)+>dB-Dh zOq^d0bkgVeF9ScIf@!pkztVb1(kXwtt)2g;)k7uzo3{3#V|egPn@$qY=`dAzv8_we zWfB1$z%V*{ducg8kQ`V7o?_cX$b0j5o3bd^{Tr^B1)+zY_G$E4G7M zbW~V1=@y0(hO{jxu0dGPkJsR0#zOI;k#y~`q^0H;b>pkTplldMn&=I}q_*d?ey)YW zu2U#_o~J{nJnQidZ-2$x&+ml}^52H`H+EcsOT5(+x&2<(&*+edw#WdBX4t3Uy-i=) zQ55~fYWm{T#PP`!Q^zNmkAElD{WONn29`YqO%rbn^$~H1?T6N~Ru4iVcAe#airulz zH!}l){tXPCFwibeOgI6(mG{?X~*|>?<76cPIac>P73VQ$=^?FE2a!_-PsOnN!2#~`k)Vl30U+$cd zo1Z&VDCXu3oehC>kGnGT{pEf2%d}@K6-_gLreIva8Gj4{zDBmZ+NL+=SpI{)T;1v) z^o{dN{R7~VKklEVE5hpa%!>AB=%$mWcbrowDyWGr@Ci!Rxo9alqfqz+BagtW1?RynIUrVn>fDA-%FhB>`SapY_{}N#J?(&mRQBxy*{!&0@?H91Cf;( z82SLG=x%fh$5omz4bC~vBEBmivFz!A3}c^4vU7VrwvQRoM*mSH%CLU9D;pY3YT}3;R$nBY7ThC|iAy+r?3T zr$c-s*{V}p^+v7v&D2=t7ckZw0NAT;tY>v%?F*~$`>0-J;oG6~4=EkxH;1xMh}bJw zF6?{+Rm%?@$U`)#f{&IQ^{6-VPs&X z0~d)QBoIar;t2f+`w>JcKZ3Pq5l$eyfN&CF8sG+DxTYOSaZiSzz+?Us;5Fx0RRU^n zl{hdMYgR*5;y~1+#;e4E4t_KjB)lQ5Fo?MukhK?=nGX>Nuo2fN*?^WXUqQm Je};&i{s$f3-n0M! diff --git a/HNC/Exercises/Ship_Battle/__pycache__/ShipField_test.cpython-311-pytest-8.1.1.pyc b/HNC/Exercises/Ship_Battle/__pycache__/ShipField_test.cpython-311-pytest-8.1.1.pyc index f41d633a4c63b386e345671809aaaa7d602705fb..add44a678ea10d508ea888294322e514ab2f20d0 100644 GIT binary patch literal 15583 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 literal 0 HcmV?d00001