[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Крестики-нолики. Помогите с алгоритмом.
qwerty
Я в растерянности). Игра крестики-нолики человек-человек. На форму меня хватило, хватило и на то, чтобы крестики с ноликами чередовались, но как сделать, чтоб после нажатия на кнопку, если value кнопки не пробел, а крестик или нолик, оно не сбрасывалось. Хотелось обойтись малой кровью, то есть чтоб совсем просто. Я так понимаю, что просто циклом это никак не решить?


<?php

$r=0;

echo '<table>' .'<tr>';
while ($r<9) {

$r++;
if (isset ($_GET['action'])) {
if ($_GET['action']=="x") $act="?action=y";
if ($_GET['action']=="y") $act="?action=x";}
else
$act="?action=x";


$submit=$_POST['subm'.$r];


echo '<td>'.'<form action="' .$_SERVER['PHP_SELF']. $act . '"' .'method="post"' . 'name="' . $r . '"' . '>'
. '<input type="submit"';

if(isset($submit)) {
echo $res = 'value="' . $_GET["action"] .'"';
}

if (!isset($submit)) {
echo $res2 = 'value=" "';
}

echo 'name="subm' . $r . '" />'
. '</form>' . '</td>';
if ($r%3 == 0)
echo '</tr>' . '<tr>';
}
echo '</tr>'. '</table>';

?>




Спустя 47 минут, 46 секунд (11.11.2010 - 13:37) kovaldm написал(а):
Я думаю надо данные о содержимом поля value каждой кнопки сохранять в массиве, а массив каждый раз передавать в поле hidden. Перед выводом формы проверять содержимое массива и заполнять поля в соответствии с содержимым.

Спустя 1 час, 12 секунд (11.11.2010 - 14:37) kovaldm написал(а):
У меня получилось вот так

error_reporting(E_ALL);
//Массив со значениями кнопок для первого запуска
$array['a1'] = '';
$array['a2'] = '';
$array['a3'] = '';
$array['b1'] = '';
$array['b2'] = '';
$array['b3'] = '';
$array['c1'] = '';
$array['c2'] = '';
$array['c3'] = '';
$array['id'] = 'x';

if(!empty($_POST))
{
$button=array_keys($_POST);//Получаем имя нажатой кнопки

$array = unserialize($_POST['hidden']);//Получаем массив со значениями кнопок

if($array['id'] == 'x')//Проверяем что было поставлено в предидущий раз
{
$array[$button[0]] = 'x';
$array['id'] = 'o';
}
else
{
$array[$button[0]] = 'o';
$array['id'] = 'x';
}
}


//Форма
echo '<form action=./index.php method=post>
<input type=submit name="a1" value="'
.$array['a1'].'">
<input type=submit name="a2" value="'
.$array['a2'].'">
<input type=submit name="a3" value="'
.$array['a3'].'">
<br>
<input type=submit name="b1" value="'
.$array['b1'].'">
<input type=submit name="b2" value="'
.$array['b2'].'">
<input type=submit name="b3" value="'
.$array['b3'].'">
<br>
<input type=submit name="c1" value="'
.$array['c1'].'">
<input type=submit name="c2" value="'
.$array['c2'].'">
<input type=submit name="c3" value="'
.$array['c3'].'">
<input type=hidden name=hidden value='
.serialize($array).'>
</form>'
;

Спустя 6 минут, 35 секунд (11.11.2010 - 14:44) inpost написал(а):
$array['a1'] = isset($array['a1'])?$array['a1']:''; ??? Что это? Если существует а1, то а1 будет ровняться а1 =)))

Спустя 17 минут, 52 секунды (11.11.2010 - 15:02) kovaldm написал(а):
Забыл убрать, сначала логика была немного другой. smile.gif

Спустя 39 секунд (11.11.2010 - 15:02) qwerty написал(а):
kovaldm, собственно, одни нули). и все равно value не сохраняет значение.

Спустя 1 минута, 18 секунд (11.11.2010 - 15:04) kovaldm написал(а):
Как это нули? blink.gif У меня все работает.

Спустя 3 минуты, 20 секунд (11.11.2010 - 15:07) qwerty написал(а):
все, что я изменила, это строчку Error_Reporting(E_ALL & ~E_NOTICE);. иначе ошибки лезут. и там одни 0, да)

Спустя 2 минуты, 34 секунды (11.11.2010 - 15:09) kovaldm написал(а):
Какие ошибки?
Текст ошибки/ошибок в студию.

Спустя 3 минуты, 10 секунд (11.11.2010 - 15:13) qwerty написал(а):
Notice: unserialize() [function.unserialize]: Error at offset 5 of 48 bytes in Z:\home\localhost\www\index.php on line 19

Notice: Undefined index: a1 in Z:\home\localhost\www\index.php on line 34

Notice: Undefined index: a2 in Z:\home\localhost\www\index.php on line 35

Notice: Undefined index: a3 in Z:\home\localhost\www\index.php on line 36

Notice: Undefined index: b1 in Z:\home\localhost\www\index.php on line 38

Notice: Undefined index: b3 in Z:\home\localhost\www\index.php on line 40

Notice: Undefined index: c1 in Z:\home\localhost\www\index.php on line 42

Notice: Undefined index: c2 in Z:\home\localhost\www\index.php on line 43

Notice: Undefined index: c3 in Z:\home\localhost\www\index.php on line 44

Спустя 6 минут, 15 секунд (11.11.2010 - 15:19) kovaldm написал(а):
Понятно.
Это сериализованный массив в браузер выводится криво, а точнее в кавычках, вроде так.

Спустя 6 минут, 25 секунд (11.11.2010 - 15:25) kovaldm написал(а):
Попробуйте вот так

//Форма
echo "<form action=./index.php method=post>
<input
type=submit name=\"a1\" value=".$array['a1'].">
<input type=submit name=
\"a2\" value=".$array['a2'].">
<input type=submit name=
\"a3\" value=".$array['a3'].">
<br>
<input type=submit name=
\"b1\" value=".$array['b1'].">
<input type=submit name=
\"b2\" value=".$array['b2'].">
<input type=submit name=
\"b3\" value=".$array['b3'].">
<br>
<input type=submit name=
\"c1\" value=".$array['c1'].">
<input type=submit name=
\"c2\" value=".$array['c2'].">
<input type=submit name=
\"c3\" value=".$array['c3'].">
<input type=hidden name=hidden value='"
.serialize($array)."'>
</form>"
;

Спустя 2 минуты, 57 секунд (11.11.2010 - 15:28) qwerty написал(а):
Да, я уже успела попробовать с кавычками, но ругается по-прежнему на то же

Спустя 6 минут, 15 секунд (11.11.2010 - 15:35) kovaldm написал(а):
Попробуйте вот такой код:

Error_Reporting(E_ALL & ~E_NOTICE);
//Массив со значениями кнопок для первого запуска
$array['a1'] = '';
$array['a2'] = '';
$array['a3'] = '';
$array['b1'] = '';
$array['b2'] = '';
$array['b3'] = '';
$array['c1'] = '';
$array['c2'] = '';
$array['c3'] = '';
$array['id'] = 'x';

if(!empty($_POST))
{
$button=array_keys($_POST);//Получаем имя нажатой кнопки

$inarray = explode('#', $_POST['hidden']);//Получаем массив со значениями кнопок

$array['a1'] = $inarray[0];
$array['a2'] = $inarray[1];
$array['a3'] = $inarray[2];
$array['b1'] = $inarray[3];
$array['b2'] = $inarray[4];
$array['b3'] = $inarray[5];
$array['c1'] = $inarray[6];
$array['c2'] = $inarray[7];
$array['c3'] = $inarray[8];
$array['id'] = $inarray[9];

if($array['id'] == 'x')//Проверяем что было поставлено в предидущий раз
{
$array[$button[0]] = 'x';
$array['id'] = 'o';
}
else
{
$array[$button[0]] = 'o';
$array['id'] = 'x';
}
}


//Форма
echo "<form action=./index.php method=post>
<input type=submit name=
\"a1\" value=".$array['a1'].">
<input type=submit name=
\"a2\" value=".$array['a2'].">
<input type=submit name=
\"a3\" value=".$array['a3'].">
<br>
<input type=submit name=
\"b1\" value=".$array['b1'].">
<input type=submit name=
\"b2\" value=".$array['b2'].">
<input type=submit name=
\"b3\" value=".$array['b3'].">
<br>
<input type=submit name=
\"c1\" value=".$array['c1'].">
<input type=submit name=
\"c2\" value=".$array['c2'].">
<input type=submit name=
\"c3\" value=".$array['c3'].">
<input type=hidden name=hidden value='"
.implode('#', $array)."'>
</form>"
;

Спустя 8 минут, 29 секунд (11.11.2010 - 15:43) qwerty написал(а):
Да, спасибо ) все работает, вы очень помогли, буду разбираться

Спустя 2 часа, 32 минуты, 2 секунды (11.11.2010 - 18:15) inpost написал(а):
kovaldm
echo "<input type=submit name=\"a1\" value=".$array['a1'].">"; // Твоя запись
echo "<input type=\"submit\" name=\"a1\" value=\"".$array['a1']."\">"; // Должна быть твоей записью
echo '<input type="submit" name="a1" value="'.$array['a1'].'">'; // А так удобнее


Если name выделяешь кавычками, значит и все остальные свойства выделяй. Вообще так правильнее писать. Не выделяет - Гугл, чтобы сократить количество кода, но тогда не стоит выделять всё, а не половина на половину.

Спустя 3 часа, 8 минут, 18 секунд (11.11.2010 - 21:23) kirik написал(а):
Ну вы намутили :)
echo '<form method="post">';
for($i = 0; $i < 9; $i++) {
if(!empty($_POST['h_' . $i])) {
$_POST['c_' . $i] = $_POST['h_' . $i];
} elseif(isset($_POST['c_' . $i])) {
$_POST['h_' . $i] = $_POST['c_' . $i] = $_POST['last'];
} else {
$_POST['c_' . $i] = $_POST['h_' . $i] = '';
}

echo '<input type="submit" name="c_' . $i . '" value="' . $_POST['c_' . $i] . '" />' .
'<input type="hidden" name="h_' . $i . '" value="' . $_POST['h_' . $i] . '" />' .
(((
$i + 1) % 3 == 0) ? '<br />' : '');
}
echo '<input type="hidden" name="last" value="' . ((isset($_POST['last']) && $_POST['last'] == 'x') ? 'o' : 'x') . '" />' .
'</form>';


Еще задача по теме - дописать свой скрипт чтобы он выводил победителя в конце игры (ну и соответственно не давал играть дальше).

Спустя 48 минут, 50 секунд (11.11.2010 - 22:12) kirik написал(а):
Есть вариант.

Спустя 17 минут, 7 секунд (11.11.2010 - 22:29) kovaldm написал(а):
Попробую, но чет мыслей вобще нет хороших.

Спустя 31 минута, 31 секунда (11.11.2010 - 23:01) kirik написал(а):
Что бы сделать лишь бы не то что нужно, блин :)
Написал крестики-нолики человек-vs-компьютер :)
тут код, кому интересно
// новая игра
if(!empty($_POST) && !isset($_POST['plays'])) {
header('Location: ' . $_SERVER['PHP_SELF']);
}

// ячейки игры
$cells = array_fill(0, 9, '');
// ссылочный массив выйгрышных вариантов
$wins = array(
// горизонтальные
array(&$cells[0], &$cells[1], &$cells[2]),
array(&$cells[3], &$cells[4], &$cells[5]),
array(&$cells[6], &$cells[7], &$cells[8]),
// вертикальные
array(&$cells[0], &$cells[3], &$cells[6]),
array(&$cells[1], &$cells[4], &$cells[7]),
array(&$cells[2], &$cells[5], &$cells[8]),
// диагональные
array(&$cells[0], &$cells[4], &$cells[8]),
array(&$cells[2], &$cells[4], &$cells[6])
);


for($i = 0; $i < 9; $i++) {
if(!empty($_POST['h_' . $i])) {
$cells[$i] = $_POST['h_' . $i];
} elseif(isset($_POST['c_' . $i])) {
$cells[$i] = $_POST['plays'];
}
}


// проверяем на выйгрыш
$empty = array();
$move = false;
foreach($wins as $wi => &$win) {
$e = $x = $o = 0;
foreach($win as &$c) {
if(empty($c)) {
$e++;
$empty[$wi] = &$c;
} elseif($c == 'o') {
$o++;
$x--;
} elseif($c == 'x') {
$x++;
$o--;
}
}

if(($o > 1 || $x > 1) && $move == false) { // выигрываем сами
$empty[$wi] = 'o';
$move = true;
}
if(implode($win) === 'xxx') {
$winner = 'X';
} elseif(implode($win) === 'ooo') {
$winner = 'O';
}
}

if($move == false && !empty($_POST)) {
if(empty($empty)) {
$winner = false;
} else {
$k = array_rand($empty);
$empty[$k] = 'o';
}
}

unset($win);

echo '<form method="post">';
foreach($cells as $i => $cell) {
echo '<input type="submit" name="c_' . $i . '" value="' . $cell . '" style="width:25px" />' .
'<input type="hidden" name="h_' . $i . '" value="' . $cell . '" />' .
(((
$i + 1) % 3 == 0) ? '<br />' : '');
}
// Показываем выйгравшего, если есть
if(isset($winner)) {
if($winner === false) {
echo 'Ничья';
} else {
echo 'Победитель: ' . $winner;
}
echo '<br /><small>Нажмите любую кнопку чтобы сыграть заново</small>';
} else {
// $plays = (isset($_POST['plays']) && $_POST['plays'] == 'x') ? 'o' : 'x';
echo '<input type="hidden" name="plays" value="x" /> <br />';
// 'Играет: ' . $plays;
}
echo '</form>';

но есть пока дырка в алгоритме (можно обдурить скрипт), думаю как поправить.

Спустя 3 часа, 51 минута, 58 секунд (12.11.2010 - 02:53) kirik написал(а):

Спустя 14 минут, 53 секунды (12.11.2010 - 03:08) inpost написал(а):
Курящее полотенчико, почему твой сайт не работает?
Последний ответ не отображается, а пишется "ничья", хотя остаётся 2 поля свободных, один для компа, другой для меня =)

Спустя 9 минут, 14 секунд (12.11.2010 - 03:17) kirik написал(а):
Цитата (inpost @ 11.11.2010 - 19:08)
Последний ответ не отображается, а пишется "ничья", хотя остаётся 2 поля свободных, один для компа, другой для меня =)

Да, эт поправил smile.gif
Цитата (inpost @ 11.11.2010 - 19:08)
почему твой сайт не работает?

Лень бложек вести smile.gif

По поводу игры - логика работает, только в крестиках-ноликах есть один вариант, когда полюбому можно выйграть.. надо этот вариант вычислить smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.