Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [PHP] Игра "Морской бой" 
:(
    Опции темы
bogdach
Дата 13.10.2007, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 26.3.2007

Репутация: нет
Всего: нет



На этом форуме два человека просили помощи создать эту игру на Visual Studio но, к сожалению ответа не получили. Надеюсь, что я получу. По крайней мере, в этой теме я буду принимать самое активное участия, и добью её до конца.

Теперь задача:  Создайте игру "Морской бой" для двух игроков на одном компьютере. Компьютер распечатывает таблицу 10х10 и располагает 5 кораблей для каждого игрока в случайных местах таблице (корабли будут спрятаны, в каком ни будь элементе формы).  На первой странице выводится ход первого игрока, после того как первый игрок пометит флажком цель и нажмёт кнопку, компьютер должен вывести результат его хода и передать ход второму игроку. 

Если вас интересует, что я уже сделал, то вот.
Код

<html>
<center>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" >
<table border="1" align="center">
<?php

// Здесь будет скрипт который расставит 5 кораблей для каждого игрока
$ship = array (1, 2, 3, 4, 5);

$step = $_POST['step'];
$checked = $_POST['$i$j'];
// 4 цикла игры
if ($step > 3) {
    $step = 1;
} else {
    $step += 1;
}//end if
//Ход первого игрока
if ($step == 1) {
    echo "Player 1";
    for ($i = a; $i < k; $i++){
     echo "<tr><td width='20'>$i</td>";
       for ($j = 1; $j < 11; $j++){
         echo "<td><input type='radio' value='$i$j' name='fire'></td>";
       } // end for loop
     echo "</tr>";
    } // end for loop
    echo "<tr><td></td>";
    for ($j = 1; $j < 11; $j++){
     echo "<td>$j</td>";
    }
    echo "</tr></table><input type='submit' value='FIRE'>";
    //Результат хода первого игрока
} else if($step == 2) {
    echo "Result 1";
        for ($i = a; $i < k; $i++){
     echo "<tr><td width='20'>$i</td>";
       for ($j = 1; $j < 11; $j++){
       if ($checked){
         echo "<td><input type='checkbox' checked='checked' name='$i$j'></td>";
        } else {
         echo "<td><input type='checkbox' name='$i$j'></td>";
        }
       } // end for loop
     echo "</tr>";
    } // end for loop
    echo "<tr><td></td>";
    for ($j = 1; $j < 11; $j++){
     echo "<td>$j</td>";
    }
    echo "</tr></table><br><input type='submit' name='' value='Player 2 Turn'>";
    //Ход второго игрока
} else if($step == 3) {
    echo "Player 2";
    for ($i = a; $i < k; $i++){
     echo "<tr><td width='20'>$i</td>";
       for ($j = 1; $j < 11; $j++){
         echo "<td><input type='submit' value='fire' name='$i$j'></td>";
       } // end for loop
     echo "</tr>";
    } // end for loop
    echo "<tr><td></td>";
    for ($j = 1; $j < 11; $j++){
     echo "<td>$j</td>";
    }
    echo "</tr></table>";
    // Результат хода второго игрока
} else {
    echo "Result 2 ";
    for ($i = a; $i < k; $i++){
     echo "<tr><td width='20'>$i</td>";
       for ($j = 1; $j < 11; $j++){
         echo "<td><input type='checkbox' checked='checked' disabled='disabled' name='$i$j'></td>";
       } // end for loop
     echo "</tr>";
    } // end for loop
    echo "<tr><td></td>";
    for ($j = 1; $j < 11; $j++){
     echo "<td>$j</td>";
    }
    echo "</tr></table><br><input type='submit' name='' value='Player 1 Turn'>";
}//end if
?>

<input type="hidden"  name="step" value="<?php echo $step; ?>"
</form>
</center>
</html>

Пока, здесь полная неразбериха. Хотя если разберётесь, пожалуйста, помогите.

PM MAIL   Вверх
bogdach
Дата 14.10.2007, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 26.3.2007

Репутация: нет
Всего: нет



Наконец готова самая главная часть, хотя эта часть будет невидимой для игроков.
Этот скрипт создаёт 5 кораблей и расставляет их в таблице.
Код

<?
$fleet1 =  $_POST['fleet1'];
$fleet2 =  $_POST['fleet2'];

function addShip($theShip, $dir){
  global $board;

  $itWorked = TRUE;

  switch ($dir){
    case "E":
      $newCol = rand(0, 9 - strlen($theShip));
      $newRow = rand(0, 9);

      for ($i = 0; $i < strlen($theShip); $i++){
        $boardNumber = $board[$newRow][$newCol + $i];
        $shipNumber = substr($theShip, $i, 1);
        if (($boardNumber == $shipNumber) ||
            ($boardNumber == ".")){
          $board[$newRow][$newCol + $i] = $shipNumber;
        } else {
          $itWorked = FALSE;
        }
      }
      break;

    case "S":
      $newCol = rand(0, 9);
      $newRow = rand(0, 9 - strlen($theShip));

      for ($i = 0; $i < strlen($theShip); $i++){
        $boardNumber = $board[$newRow + $i][$newCol];
        $shipNumber = substr($theShip, $i, 1);
        if (($boardNumber == $shipNumber) ||
            ($boardNumber == ".")){
          $board[$newRow + $i][$newCol] = $shipNumber;
        } else {
         $itWorked = FALSE;
       }
      }
      break;

  }
  return $itWorked;
}

function fillBoard(){
  global $ships;
  $direction = array("S","E");
  $itWorked = TRUE;
  $counter = 0;
  $keepGoing = TRUE;
  while($keepGoing){
    $dir = rand(0, 1);
    $result = addShip($ships[$counter], $direction[$dir]);
    if ($result == FALSE){
      $keepGoing = FALSE;
      $itWorked = FALSE;
    }
    $counter++;
    if ($counter >= count($ships)){
      $keepGoing = FALSE;
    }
  }
  return $itWorked;
}

function makeBoard($theBoard){
  $fleet = "";
  $fleet .= "<table border = 1>\n";
  for ($row = 0; $row < 10; $row++){
    $fleet .= "<tr>\n";
    for ($col = 0; $col < 10; $col++){
      $fleet .= "  <td width = 20>{$theBoard[$row][$col]}</td>\n";
    }
    $fleet .= "</tr>\n";
  }
  $fleet .= "</table>\n";
  return $fleet;
}

  $ships = array ("22","333","4444","55555","666666");
if ($fleet1 && $fleet2){} else {    $legalBoard = FALSE;
    while ($legalBoard == FALSE){
      for ($row = 0; $row < 10; $row++){
        for ($col = 0; $col < 10; $col++){
          $board[$row][$col] = ".";
        }
      }
      $legalBoard = fillBoard();
    }

    $fleet1 = makeBoard($board);

    $legalBoard = FALSE;
    while ($legalBoard == FALSE){
      for ($row = 0; $row < 10; $row++){
        for ($col = 0; $col < 10; $col++){
          $board[$row][$col] = ".";
        }
      }
      $legalBoard = fillBoard();
    }
    $fleet2 = makeBoard($board);
}

  echo <<<HERE
  <center>
  <h1>BattleShip</h1>
  $fleet1 $fleet2
  <h3>Ships</h3>
  <table border = 5>
HERE;
  foreach ($ships as $theShip){
    echo "<tr><td>$theShip</td></tr>\n";
  }
  $target = $board[0][0];
  echo "$target</table></center>";
?>

Конечно в окончательном коде результат не будет выводится на страницу, а будет спрятан, например таким способом.
Код

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" >
<input type="hidden" name="fleet1" value="<?= $fleet1; ?>">
<input type="hidden" name="fleet2" value="<?= $fleet2; ?>">
</form>

Это не очень хороший способ, так как потом трудно будет сравнивать ячейку пользовательского ввода с ячейками сохраненной таблицы.
Не подскажете, как будет лучше сохранит эти данные, чтобы было легко сравнивать?

PM MAIL   Вверх
bogdach
Дата 17.10.2007, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 26.3.2007

Репутация: нет
Всего: нет



Наконец то я сделал это. Без всякой графики, всё в одном файле. Играйте на здоровье. smile 
Код

<html>
<head>
<title>BattleShip</title>
</head>
<body>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" >
<?
$fleet1 =  $_POST['fleet1'];
$fleet2 =  $_POST['fleet2'];
$fire1 =  $_POST["fire1"];
$fire2 =  $_POST["fire2"];
$selected1 =  $_POST["selected1"];
$selected2 =  $_POST["selected2"];
$selectedA =  $_POST["selectedA"];
$selectedB =  $_POST["selectedB"];
$turn =  $_POST["turn"];

function addShip($theShip, $dir){
  //attempt to add a ship to the board or return false if failed
  global $board;

  $itWorked = TRUE;

  switch ($dir){
    case "E":
      //col from 0 to board width - ship lenth
      //row from 0 to board height
      $newCol = rand(0, 9 - strlen($theShip));
      $newRow = rand(0, 9);

      for ($i = 0; $i < strlen($theShip); $i++){
        //new character same row, initial column + $i
        $boardNumber = $board[$newRow][$newCol + $i];
        $shipNumber = substr($theShip, $i, 1);

        //check for legal values in current space on board
        if (($boardNumber == $shipNumber) ||
            ($boardNumber == ".")){
          $board[$newRow][$newCol + $i] = $shipNumber;
        } else {
          $itWorked = FALSE;
        } // end if
      } // end for loop
      break;

    case "S":
      //col from 0 to board width
      //row from 0 to board height - ship length
      $newCol = rand(0, 9);
      $newRow = rand(0, 9 - strlen($theShip));
      //print "south:\tRow: $newRow\tCol: $newCol<br>\n";

      for ($i = 0; $i < strlen($theShip); $i++){
        //check for a legal move
        $boardNumber = $board[$newRow + $i][$newCol];
        $shipNumber = substr($theShip, $i, 1);
        if (($boardNumber == $shipNumber) ||
            ($boardNumber == ".")){
          $board[$newRow + $i][$newCol] = $shipNumber;
        } else {
         $itWorked = FALSE;
       } // end if
      } // end for loop
      break;

  } // end switch
  return $itWorked;
} // end addShip

function fillBoard(){
  //fill board with ships by calling addShip() for each ship
  //or return false if failed
  global $ships;
  $direction = array("S","E");
  $itWorked = TRUE;
  $counter = 0;
  $keepGoing = TRUE;
  while($keepGoing){
    $dir = rand(0, 1);
    $result = addShip($ships[$counter], $direction[$dir]);
    if ($result == FALSE){
      //print "failed to place $ship[$counter]";
      $keepGoing = FALSE;
      $itWorked = FALSE;
    } // end if
    $counter++;
    if ($counter >= count($ships)){
      $keepGoing = FALSE;
    } // end if
  } // end while
  return $itWorked;
} // end fillBoard

function makeBoard($theBoard){
  //given a board array, return an HTML table based on the array
  $fleet = "";
  $fleet .= "<table border = 1>\n";
  //check logic here
  for ($row = 0; $row < 10; $row++){
    $fleet .= "<tr>\n";
    for ($col = 0; $col < 10; $col++){
      $fleet .= "  <td width = 20>{$theBoard[$row][$col]}</td>\n";
    } // end col for loop
    $fleet .= "</tr>\n";
  } // end row for loop
  $fleet .= "</table>\n";
  return $fleet;
} // end makeBoard;

  $ships = array ("22","333","4444","55555","666666");

  if ($turn == 1) {
    $turn1 = " disabled='disabled'";
    $turn2 = "";
    $turn = 2;
  } else {
    $turn2 = " disabled='disabled'";
    $turn1 = "";
    $turn = 1;
  }

if ($fleet1){

      //seporatly save vlaue of each cel
      for ($row = 0; $row < 10; $row++){
        for ($col = 0; $col < 10; $col++){
          echo "<input type='hidden' name='a$row$col' value='{$_POST["a$row$col"]}'>\n";
        } // end col for loop
        echo "\n";
      } // end row for loop
} else {
    $legalBoard = FALSE;
    //keep trying to build a board until you get a legal result
    while ($legalBoard == FALSE){
      //initialize board with a . in each cell
      for ($row = 0; $row < 10; $row++){
        for ($col = 0; $col < 10; $col++){
          $board[$row][$col] = ".";
        } // end col for loop
      } // end row for loop
      $legalBoard = fillBoard();
    } // end while

    //make the final fleet
    $fleet1 = makeBoard($board);

      for ($row = 0; $row < 10; $row++){
        for ($col = 0; $col < 10; $col++){
          echo "<input type='hidden' name='a$row$col' value='{$board[$row][$col]}'>\n";
        } // end col for loop
        echo "\n";
      } // end row for loop
   }
if ($fleet2){
      //seporatly save vlaue of each cel
      for ($row = 0; $row < 10; $row++){
        for ($col = 0; $col < 10; $col++){
          echo "<input type='hidden' name='b$row$col' value='{$_POST["b$row$col"]}'>\n";
        } // end col for loop
        echo "\n";
      } // end row for loop
} else {
    $legalBoard = FALSE;
    while ($legalBoard == FALSE){
      //initialize board with a . in each cell
      for ($row = 0; $row < 10; $row++){
        for ($col = 0; $col < 10; $col++){
          $board[$row][$col] = ".";
        } // end col for loop
      } // end row for loop
      $legalBoard = fillBoard();
    }
    $fleet2 = makeBoard($board);

      //seporatly save vlaue of each cel
      for ($row = 0; $row < 10; $row++){
        for ($col = 0; $col < 10; $col++){
          echo "<input type='hidden' name='b$row$col' value='{$board[$row][$col]}'>\n";
        } // end col for loop
        echo "\n";
      } // end row for loop
} //end if

  //print out page to user with fleet on it
  echo <<<HERE
  <center>
  <h1>BattleShip</h1>
  <h3>Ships</h3>
  <table border = 5><tr>
HERE;
  //print ship list
  foreach ($ships as $theShip){
    echo "<td>$theShip</td>\n";
  } // end foreach
  echo "</tr></table>";
echo "<table border='1'><tr><td>";
      echo " Player 1";
        if (is_numeric($_POST[$fire1])) {  echo " YOU HIT SHIP #$_POST[$fire1]!<table border='1'>";} else {echo "<table border='2'>";}
      $selected1 = explode('.', $selected1);
      $selectedA = explode('.', $selectedA);
    for ($i = 0; $i < 10; $i++){
     echo "<tr>";
       for ($j = 0; $j < 10; $j++){
         if ($fire1 == "a" . $i . $j && is_numeric($_POST[$fire1]) || in_array($i . $j, $selectedA)) {
            array_push($selectedA, $i . $j);
            echo "<td><input type='checkbox' checked='checked' disabled='disabled' value='c$i$j' name='c$i$j'></td>";
         } else if($fire1 == "a" . $i . $j || in_array($i . $j, $selected1)) {
            array_push($selected1, $i . $j);
            echo "<td><input type='checkbox' disabled='disabled' value='c$i$j' name='c$i$j'></td>";
         } else {
            echo "<td><input type='radio' $turn1 value='a$i$j' name='fire1'></td>";
         }

       } // end for loop
     echo "</tr>";
    } // end for loop
    $selected1 = implode('.', $selected1);
    $selectedA = implode('.', $selectedA);
     echo "</table>";


echo "</td><td>";
      echo " Player 2";
  if (is_numeric($_POST[$fire2])) {  echo " YOU HIT SHIP #$_POST[$fire2]!<table border='2'>";} else {echo "<table border='2'>";}
      $selected2 = explode('.', $selected2);
      $selectedB = explode('.', $selectedB);
    for ($i = 0; $i < 10; $i++){
     echo "<tr>";
       for ($j = 0; $j < 10; $j++){
         if ($fire2 == "b" . $i . $j && is_numeric($_POST[$fire2]) || in_array($i . $j, $selectedB)) {
            array_push($selectedB, $i . $j);
            echo "<td><input type='checkbox' checked='checked' disabled='disabled' value='d$i$j' name='d$i$j'></td>";
         } else if($fire2 == "b" . $i . $j || in_array($i . $j, $selected2)) {
            array_push($selected2, $i . $j);
            echo "<td><input type='checkbox' disabled='disabled' value='d$i$j' name='d$i$j'></td>";
         } else {
            echo "<td><input type='radio' $turn2 value='b$i$j' name='fire2'></td>";
         }

       } // end for loop
     echo "</tr>";
    } // end for loop
    $selected2 = implode('.', $selected2);
    $selectedB = implode('.', $selectedB);
echo "</table>";


?></td></table>
<input type="submit" value="FIRE"></center>
<input type='hidden' name='fleet1' value='<?=$fleet1?>'>
<input type='hidden' name='fleet2' value='<?=$fleet2?>'>
<input type="hidden" name="selected1" value="<?=$selected1?>" />
<input type="hidden" name="selected2" value="<?=$selected2?>" />
<input type="hidden" name="selectedA" value="<?=$selectedA?>" />
<input type="hidden" name="selectedB" value="<?=$selectedB?>" />
<input type="hidden" name="turn" value="<?=$turn?>" />

</form>
</body>
</html>

Может быть код не очень чистый, зато работает.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0903 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.