|
|
|
| Здравствуйте!
Возникла проблемка при работе со строками в написании игры типа висилица
<?
//итак загадываем слово
$_SESSION['word'] = 'слово';
//Заменяем буквы загаданого слова знаками *
$_SESSION['pole'] = str_repeat("*", mb_strlen($_SESSION['word']));
//$_GET['char'] = 'передаваемый символ/буква';
$position = mb_strpos($_SESSION['word'], $_GET['char']);
//Процесс замены символа * на угаданую букву
if ($position!== false)
{
$_SESSION['pole'][$position] = $_SESSION['word'][$position];
echo "Верно!";
}
else echo "Не верно";
?>
|
Так вот проблема такая: при угадывании буквы "О" в слове "слово", открывается первая буква, а вот вторая нет...пробовала str_replace, но что то совсем запуталась. Подскажите как открывать повторяющиеся буквы если таковые имеются. Спасибо | |
|
|
|
|
|
|
|
для: selma
(29.09.2010 в 03:06)
| |
<?
$word = "слово";
echo str_repeat("*", strlen($word)) . "<br>";
$liter = "о";
for($i=0; $i<strlen($word); $i++) echo ($word[$i]==$liter) ? $word[$i] : "*";
|
| |
|
|
|
|
|
|
|
для: sim5
(29.09.2010 в 04:49)
| | Т.е я так поняла? чтобы применительно к любым буквам
<?
$word = "слово";
echo str_repeat("*", strlen($word)) . "<br>";
$liter = $_GET['char'];
for($i=0; $i<strlen($word); $i++) echo ($word[$i]==$liter) ? $word[$i] : "*";
?>
|
| |
|
|
|
|
|
|
|
для: selma
(29.09.2010 в 05:51)
| | Вообще, если у вас строки многобайтные, то у вас вот тут уже ошибка:
mb_strlen($_SESSION['word'])
проверьте:
<?
//utf-8
$_SESSION['word'] = "слово";
echo mb_strlen($_SESSION['word']); // 10
echo mb_strlen($_SESSION['word'], "utf-8"); // 5
| Ну и ошибка в том, что вы не проверяете вхождения вообще в слове, не то что все слово. Я показал примером почему у вас не получается, а не для "применительно к любым буквам". Если вы работаете в utf, то можно так:
<?
$_SESSION['word'] = "слово"; //исходное слово, не знаю от куда...
$_SESSION['word'] = iconv("UTF-8","windows-1251",$_SESSION['word']); //исходное в 1251
if(!isset($_SESSION['liter'])) $_SESSION['liter'] = array(); //удобнее названные буквы держать в массиве
//входные литеры также в 1251
if(isset($_GET['liter'])) $_SESSION['liter'][] = iconv("UTF-8","windows-1251",trim($_GET['liter']));
//а это проверка вхождений литер в слове и вывод, в utf
for($i=0; $i<strlen($_SESSION['word']); $i++) echo (in_array($_SESSION['word'][$i], $_SESSION['liter'])) ? iconv("windows-1251","UTF-8",$_SESSION['word'][$i]) : "*";
?>
<form action="">
<input type="text" name="liter"> <input type="submit" value="Send">
</form>
|
| |
|
|
|
|
|
|
|
для: sim5
(29.09.2010 в 06:33)
| | уважаемый sim5 мы немного не понимаем друг друга, все работает правильно, но только если буквы в слове не повторяются, есть какая нибудь возможность написать вам то что у меня работает, в другом месте (не на форуме)? | |
|
|
|
|
|
|
|
для: selma
(29.09.2010 в 07:15)
| | Это каким образом оно у вас может работать, если в слове "слово" две буквы "о", а по запросу позиции этой буквы в слове вам возвращается никак не массив всех позиций найденных, а только первая найденная? У вас и намека нет о проходе по слову для поиска всех позиций. И как же у вас все заменяется?
Я вам показал пример, в котором все будет заменяться как положено, чего вам еще надо? Вот вам еще пример, до самого "упора", пока не будет угадано слово:
<?
$_SESSION['word'] = "слово"; //слово "слово"
$_SESSION['word'] = iconv("UTF-8","windows-1251",$_SESSION['word']);
if(!isset($_SESSION['liter'])) $_SESSION['liter'] = array();
$word = &$_SESSION['word']; //сократим обращение
$liter = &$_SESSION['liter']; //сократим обращение
//получаем букву, если не пробел
if(isset($_GET['liter']) && trim($_GET['liter'])) $liter[] = iconv("UTF-8","windows-1251",trim($_GET['liter']));
//ТОЛЬКО ТАК можно все вхождения проверить
//(если только не использовать массив и его преимущества)
//пройдясь по всему слову!
for($i=0, $k=0; $i<strlen($word); $i++) {
if(in_array($word[$i], $liter)) {
echo iconv("windows-1251","UTF-8",$word[$i]);
$k++;
} else echo "*";
}
echo $k == strlen($word) ? iconv("windows-1251","UTF-8", "<br>Угадали!") : ($liter ?
iconv("windows-1251","UTF-8", "<br>Названы буквы: " . implode(",", $liter)) : null);
?>
<form action="">
<input type="text" name="liter"> <input type="submit" value="Send">
</form>
|
| |
|
|
|
|
|
|
|
для: sim5
(29.09.2010 в 07:30)
| | ох уж эти тернарные операторы...
не разобрала только
echo $k == strlen($word) ? iconv("windows-1251","UTF-8", "<br>Угадали!") : ($liter ?
iconv("windows-1251","UTF-8", "<br>Названы буквы: " . implode(",", $liter)) : null);
|
| |
|
|
|
|
|
|
|
для: selma
(29.09.2010 в 07:44)
| | А чего тут непонятного?
Печатать = если количество угаданных букв ($k) равно длине угадываемого слова ($word - ссылка на слово в сессии), то "<br>Угадали!" (первое после ? и конвертируемое в utf), иначе (после :), если массив названных букв ($liter - ссылка на их массив в сессии) не пуст, то (после ?) конвертируемое в utf "<br>Названы буквы: " плюс строковое представление массива $liter через запятую, иначе (после :) ничего не делаем.
Так понятнее? ) Это тоже самое, что и:
<?
if($k == strlen($word)) echo iconv("windows-1251","UTF-8", "<br>Угадали!");
else if($liter) echo iconv("windows-1251","UTF-8", "<br>Названы буквы: " . implode(",", $liter));
|
| |
|
|
|
|
|
|
|
для: sim5
(29.09.2010 в 07:52)
| | Вот спасибо, и еще одна маленька просьбочка, как считать ошибки, и к примеру если больше 10 ошибок то "Вы проиграли" | |
|
|
|
|
|
|
|
для: selma
(29.09.2010 в 08:39)
| | Ну можно добавить в сессию счетчик, например, $_SESSION['error'], изначально равный ноль (при начале игры), который инкрементировать при неугадывании:
<?
//.....
if(in_array($word[$i], $liter)) {
echo iconv("windows-1251","UTF-8",$word[$i]);
$k++;
} else {
echo "*";
if($_SESSION['error'] < $max) $_SESSION['error']++;
}
//.....
//проверка $_SESSION['error'] и решение
//иначе при прерывании цикла (как сперва было предложено)
//не все слово может быть выведено
|
| |
|
|
|
|
|
|
|
для: sim5
(29.09.2010 в 09:12)
| | не работает так: проверяем
echo "Попыток ".$_SESSION['error']." из 11";
|
при любой, даже угаданой букве Внимание! сразу показывает 5 попыток (слово "слово" состоит из 5 букв) | |
|
|
|
|
|
|
|
для: selma
(29.09.2010 в 09:56)
| | Правильно, не там надо проверять и не так. )
<?
$_SESSION['word'] = "слово";
$_SESSION['word'] = iconv("UTF-8","windows-1251",$_SESSION['word']);
$max = 10; //число попыток
if(!isset($_SESSION['liter'])) $_SESSION['liter'] = array();
if(!isset($_SESSION['error'])) $_SESSION['error'] = $max;
$word = &$_SESSION['word'];
$liter = &$_SESSION['liter'];
$_GET['liter'] = isset($_GET['liter']) ? iconv("UTF-8","windows-1251",trim($_GET['liter'])) : "";
if($_SESSION['error']) {
if($_GET['liter']) $liter[] = $_GET['liter'];
if($_GET['liter'] && !stristr($word, $_GET['liter'])) $_SESSION['error']--;
for($i=0, $k=0; $i<strlen($word); $i++) {
if(in_array($word[$i], $liter)) {
echo iconv("windows-1251","UTF-8",$word[$i]);
$k++;
} else echo "*";
}
echo $k == strlen($word) ? iconv("windows-1251","UTF-8", "<br>Угадали!") : ($liter ?
iconv("windows-1251","UTF-8", "<br>Названы буквы: " . implode(",", $liter)) : null);
} else {
echo iconv("windows-1251","UTF-8", "<br>Приехали...");
$_SESSION['error'] = $max; //заново
}
|
| |
|
|
|
|
|
|
|
для: sim5
(29.09.2010 в 10:06)
| | УРА! Теперь все работает, спасибо вам огромное!!! немного доработаю, и будет отлично. спасибо | |
|
|
|
|
|
|
|
для: selma
(29.09.2010 в 10:16)
| | Добавьте перевод получаемых букв в нижний регистр. | |
|
|
|
|
|
|
|
для: sim5
(29.09.2010 в 10:29)
| | я добавила проверку на существование букв в сессии, чтобы не дублировались, а буквы у меня передаются и загадываются на латинице (поэтому даже iconv не требуется:)), а потом транлитируются для пользователя
+ выводится алфавит, и если букву нажали, то эта буква из алфавита убирается, так что сейчас игра вполне закончена:) | |
|
|
|
|
|
|
|
для: selma
(29.09.2010 в 10:31)
| | >передаются и загадываются на латинице (поэтому даже iconv не требуется:)),
А чего же вы тогда мадам в изначальном коде своем применяте функции для работы с мультибайными строками, если у вас и слово латиница ну и соответсвенно буквы угадываемые? | |
|
|
|
|
|
|
|
для: sim5
(29.09.2010 в 10:06)
| | зачем Вы человека накормили двойным iconv'ом?
Что он Вам сделал? | |
|
|
|
|
|
|
|
для: Trianon
(29.09.2010 в 10:46)
| | Ничего он не сделал, это у меня так пример, начания header('Content-type: text/html; charset=utf-8');, а все в 1251... Думаю леди это поняла. ;-) | |
|
|
|
|
|
|
|
для: sim5
(29.09.2010 в 10:48)
| | Еще раз спасибо, все что не нужно убрала | |
|
|
|