За последние 24 часа нас посетили 18284 программиста и 1642 робота. Сейчас ищут 1583 программиста ...

Морской бой =)

Тема в разделе "Решения, алгоритмы", создана пользователем [vs], 14 апр 2009.

  1. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Код (PHP):
    1. <?php
    2. /* Функции */
    3. function addShip ($shipN, $matrix, $x1, $y1) {
    4.     /* Матрицы кораблей
    5.     $ships[N][x][y,y,...] */
    6.     $ships[0][0] = array(0);
    7.     $ships[1][0] = array(0);
    8.     $ships[2][0] = array(0);
    9.     $ships[2][1] = array(0,1);
    10.     $ships[2][2] = array(0);
    11.     $ships[3][0] = array(0,1);
    12.     $ships[3][1] = array(1,2);
    13.     $ships[4][0] = array(1);
    14.     $ships[4][1] = array(1);
    15.     $ships[4][2] = array(0,1);
    16.     $ships[5][0] = array(0,1);
    17.     $ships[5][1] = array(1);
    18.  
    19.     foreach ($ships[$shipN] as $x2 => $row) {
    20.         foreach ($row as $y2) {
    21.             if ($x1 + $x2 > 7 or $y1 + $y2 > 7
    22.                 or $matrix[$x1 + $x2][$y1 + $y2] === 'ok') {
    23.                 return false;
    24.             }
    25.             $matrix[$x1 + $x2][$y1 + $y2] = 'ok';
    26.         }
    27.     }
    28.     return $matrix;
    29. }
    30.  
    31. function genMatrix ($mode = false) {
    32.     $matrix = array();
    33.     for ($i=0; $i<8; $i++) {
    34.         for ($c=0; $c<8; $c++) {
    35.             $matrix[$i][$c] = true;
    36.         }
    37.     }
    38.     if ($mode) {
    39.         for ($i=0; $i<6; $i++) {
    40.             $matrixTmp = addShip($i, $matrix, rand(0, 6), rand(0, 6));
    41.             if ($matrixTmp) {
    42.                 $matrix = $matrixTmp;
    43.             } else {
    44.                 $i--;
    45.             }
    46.         }
    47.     }
    48.     return $matrix;
    49. }
    50.  
    51. function printMatrix($matrix, $user = false) {
    52.     $buff = '<table>';
    53.     foreach ($matrix as $x => $row) {
    54.         $buff .= '<tr>';
    55.         foreach ($row as $y => $cell) {
    56.             $buff .= '<td bgcolor="';
    57.             if (!$cell) {
    58.                 $buff .= '#FF0000';
    59.             }
    60.             elseif ($cell === 'ok') {
    61.                 $buff .= '#00FF00';
    62.             }
    63.             elseif ($cell === 'sea') {
    64.                 $buff .= '#7777FF';
    65.             } else {
    66.                 $buff .= '#0000FF';
    67.             }
    68.             $buff .= '">';
    69.             if ($cell && $cell !== 'sea' && !$user) {
    70.                 $buff .= '<a href="?x='.$x.'&y='.$y.'">';
    71.             }
    72.             $buff .= '    </a></td>';
    73.         }
    74.         $buff .= '</tr>';
    75.     }
    76.     $buff .= '</table>';
    77.     return $buff;
    78. }
    79.  
    80. function countLives ($matrix) {
    81.     $lives = 0;
    82.     foreach ($matrix as $row) {
    83.         foreach ($row as $cell) {
    84.             if ($cell === 'ok') {
    85.                 $lives++;
    86.             }
    87.         }
    88.     }
    89.     return $lives;
    90. }
    91.  
    92. /* Процедурная часть */
    93.  
    94. if (isset($_GET['reset'])) {
    95.     session_destroy();
    96.     header ('Location: /seabattle.php');
    97.     die();
    98. }
    99.  
    100. /* Карты-матрицы 8-) */
    101. if (!isset($_SESSION['pcShips'])) { //Корабли компьютера
    102.     $_SESSION['pcShips'] = genMatrix(1);
    103. }
    104. $pcShips = &$_SESSION['pcShips'];
    105.  
    106. if (!isset($_SESSION['uShips'])) { //Корабли пользователя
    107.     $_SESSION['uShips'] = genMatrix(1);
    108. }
    109. $uShips = &$_SESSION['uShips'];
    110.  
    111. if (!isset($_SESSION['pcUncover'])) { //Открытая карта компьютера
    112.     $_SESSION['pcUncover'] = genMatrix();
    113. }
    114. $pcUncover = &$_SESSION['pcUncover'];
    115.  
    116. if (!isset($_SESSION['uUncover'])) { //Открытая карта пользователя
    117.     $_SESSION['uUncover'] = genMatrix();
    118. }
    119. $uUncover = &$_SESSION['uUncover'];
    120.  
    121. /* Алгоритм хода */
    122. if (isset($_GET['x']) && isset($_GET['y'])) {
    123.     $livesBeforeShoot = countLives($pcShips);
    124.     if ($pcShips[$_GET['x']][$_GET['y']] === 'ok') {
    125.         $pcShips[$_GET['x']][$_GET['y']] = false;
    126.     } else {
    127.         $pcShips[$_GET['x']][$_GET['y']] = 'sea';
    128.     }
    129.     $pcUncover[$_GET['x']][$_GET['y']] = $pcShips[$_GET['x']][$_GET['y']];
    130.  
    131.     /* Ход компьютера */
    132.     if ($livesBeforeShoot === countLives($pcShips)) {
    133.         while (true) {
    134.             $livesBeforeShoot = countLives($uShips);
    135.             $x = rand(0,7);
    136.             $y = rand(0,7);
    137.             if ($uUncover[$x][$y] !== false && $uUncover[$x][$y] !== 'sea') {
    138.                 if ($uShips[$x][$y] === 'ok') {
    139.                     $uShips[$x][$y] = false;
    140.                 } else {
    141.                     $uShips[$x][$y] = 'sea';
    142.                 }
    143.                 $uUncover[$x][$y] = $uShips[$x][$y];
    144.                 if (countLives($uShips) === $livesBeforeShoot || countLives($uShips) === 0) {
    145.                     break;
    146.                 }
    147.             }
    148.         }
    149.     }
    150. }
    151.  
    152. $userLives = countLives($uShips);
    153. $user = printMatrix($uShips, 1);
    154. $pcLives = countLives($pcShips);
    155. if ($userLives < 1 or $pcLives < 1) {
    156.     $pc = printMatrix($pcShips, 1);
    157. } else {
    158.     $pc = printMatrix($pcUncover);
    159. }
    160. $precent = round((100/($userLives + $pcLives))*$userLives);
    161. ?>
    162.  
    163. <html>
    164. <head>
    165. <title>Sea Battle by [vs] v.php</title>
    166. <style>
    167.     a:link {
    168.         text-decoration: none;
    169.     }
    170.     a:visited {
    171.         text-decoration: none;
    172.     }
    173. </style>
    174. </head>
    175. <body>
    176. <pre>
    177.  __        __                            ___
    178. /   _  _  |  \  _  ___ ___ |    _       / _
    179. \  |  / \ |_ / / \  |   |  |   |    \  / /_
    180.  \ |- |-| |  | |-|  |   |  |   |-    \/    \
    181. _/ |_ | | |__/ | |  |   |  |__ |_ ::  _____/
    182. </pre>
    183. <table border="1">
    184. <th bgcolor="#EEEEFF">Карта игрока</th><th bgcolor="#CCCCCC">
    185.     
    186. </th><th bgcolor="#FFEEEE">Карта компьютера</th>
    187. <tr>
    188. <td><?=$user;?></td><td bgcolor="#CCCCCC"></td><td><?=$pc;?></td>
    189. </tr>
    190. <tr>
    191. <td>Живых секций: <?=$userLives;?></td>
    192. <td></td>
    193. <td>Живых секций: <?=$pcLives;?></td>
    194. </tr>
    195. </table>
    196. <?php
    197. if ($userLives + $pcLives == 0) {
    198.     echo '<b>Ничья!</b>';
    199. }
    200. elseif ($userLives < 1) {
    201.     echo '<b style="color: #FF0000">Вы прогирали!</b>';
    202. }
    203. elseif ($pcLives < 1) {
    204.     echo '<b style="color: #00FF00">Победа!</b>';
    205. } else {
    206.     echo '<b>Удача: </b>'.$precent.'%';
    207. }
    208. ?>
    209.  | [url="?reset"]Сбросить[/url]
    Демо: http://tanktiks.com/vs/seabattle.php
     
  2. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
  3. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    А у меня где-то шахматы были, правдо там ходить нужно было вводить письменно
    если найду щас выложу
     
  4. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    а где демка?
     
  5. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    где то я тот код уже видел
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Нинада нинада, я его позавчера написал сам, в поезде, с отсутствием инета =)
    Добавил сцылку =)
     
  7. kostyl

    kostyl Guest

    куда?
     
  8. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    я выиграл)))))
     
  9. kostyl

    kostyl Guest

    я проиграл, потому что вообще все рандом... :(
     
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    o_0
    Ну комп то конечно рандомом ходит, но там 5 видов формы кораблей, разве что они могут вплотную стоять =)
     
  11. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
  12. EvelRus

    EvelRus Активный пользователь

    С нами с:
    16 ноя 2006
    Сообщения:
    2.168
    Симпатии:
    0
    Адрес:
    Москва
    [vs], слушай, лучше помоги мне с игрой :)))))

    А игра прикольная... халко что нельзя самому ставить карабли и ресет не пашет )
     
  13. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
  14. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Nemo
    Исправил ресет =) Чтобы получить нужное расположение кораблей, можно ресетить, пока не станут как надо =) А что у тебя за игра?
     
  15. EvelRus

    EvelRus Активный пользователь

    С нами с:
    16 ноя 2006
    Сообщения:
    2.168
    Симпатии:
    0
    Адрес:
    Москва
    Браузерная онлайка ))) Но там сверхмассивная работа :(((

    Будет интересно пиши в личку или асю
     
  16. EvelRus

    EvelRus Активный пользователь

    С нами с:
    16 ноя 2006
    Сообщения:
    2.168
    Симпатии:
    0
    Адрес:
    Москва
    и еще бага... Мне казалось что карабли не могут быть смежными ))
     
  17. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Ну если денег заплатишь )))
     
  18. EvelRus

    EvelRus Активный пользователь

    С нами с:
    16 ноя 2006
    Сообщения:
    2.168
    Симпатии:
    0
    Адрес:
    Москва
    если бы :))))
    максимум после сентября :(
     
  19. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    А почему корабли не по правилам выставлены? Между кораблями должна быть как минимум одна пустая клетка. А у меня -- все корабли всмятку )
     
  20. EvelRus

    EvelRus Активный пользователь

    С нами с:
    16 ноя 2006
    Сообщения:
    2.168
    Симпатии:
    0
    Адрес:
    Москва
     
  21. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Алгоритм расставления кораблей должен резервировать ореол вокруг корабля размером с одну клетку.
     
  22. kostyl

    kostyl Guest

    да, и на сколько я знаю, почему я и проиграл, они не могут быть зигзагом, они всегда прямые, тогда и алгоритм проще и логика и играть интереснее, а так можно и в карты играть с пятьюдесятью мастями и сотней всяких цифр - никакого интереса. Да экстрима нету в моем варианте, но тут как мне кажеться классика, какой нах экстрим...
     
  23. klerick

    klerick Guest

    Игра прикольная. :) Вот только действительно лучше на досуге доделать, чтобы по правилам все было. А то корабли смешаны и все "плывет" в глазах. :)
     
  24. Вльдемар

    Вльдемар Активный пользователь

    С нами с:
    20 май 2006
    Сообщения:
    635
    Симпатии:
    0
    Адрес:
    Белхород
    накидал пробную версию, кривовата правда и на код лучше не смотреть :)

    http://fire.uvadega.ru/
     
  25. GudGuy

    GudGuy Активный пользователь

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    Вльдемар
    каждый раз. Браузер ФФ