Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: работа со строками
 
 автор: selma   (29.09.2010 в 03:06)   письмо автору
 
 

Здравствуйте!
Возникла проблемка при работе со строками в написании игры типа висилица
<?
//итак загадываем слово 
$_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, но что то совсем запуталась. Подскажите как открывать повторяющиеся буквы если таковые имеются. Спасибо

  Ответить  
 
 автор: sim5   (29.09.2010 в 04:49)   письмо автору
 
   для: 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] : "*";

  Ответить  
 
 автор: selma   (29.09.2010 в 05:51)   письмо автору
 
   для: 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] : "*";
?>

  Ответить  
 
 автор: sim5   (29.09.2010 в 06:33)   письмо автору
 
   для: 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>

  Ответить  
 
 автор: selma   (29.09.2010 в 07:15)   письмо автору
 
   для: sim5   (29.09.2010 в 06:33)
 

уважаемый sim5 мы немного не понимаем друг друга, все работает правильно, но только если буквы в слове не повторяются, есть какая нибудь возможность написать вам то что у меня работает, в другом месте (не на форуме)?

  Ответить  
 
 автор: sim5   (29.09.2010 в 07:30)   письмо автору
 
   для: 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>

  Ответить  
 
 автор: selma   (29.09.2010 в 07:44)   письмо автору
 
   для: 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);

  Ответить  
 
 автор: sim5   (29.09.2010 в 07:52)   письмо автору
 
   для: 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));

  Ответить  
 
 автор: selma   (29.09.2010 в 08:39)   письмо автору
 
   для: sim5   (29.09.2010 в 07:52)
 

Вот спасибо, и еще одна маленька просьбочка, как считать ошибки, и к примеру если больше 10 ошибок то "Вы проиграли"

  Ответить  
 
 автор: sim5   (29.09.2010 в 09:12)   письмо автору
 
   для: 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'] и решение
//иначе при прерывании цикла (как сперва было предложено) 
//не все слово может быть выведено

  Ответить  
 
 автор: selma   (29.09.2010 в 09:56)   письмо автору
 
   для: sim5   (29.09.2010 в 09:12)
 

не работает так: проверяем
echo "Попыток ".$_SESSION['error']." из 11";


при любой, даже угаданой букве Внимание! сразу показывает 5 попыток (слово "слово" состоит из 5 букв)

  Ответить  
 
 автор: sim5   (29.09.2010 в 10:06)   письмо автору
 
   для: 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//заново
}

  Ответить  
 
 автор: selma   (29.09.2010 в 10:16)   письмо автору
 
   для: sim5   (29.09.2010 в 10:06)
 

УРА! Теперь все работает, спасибо вам огромное!!! немного доработаю, и будет отлично. спасибо

  Ответить  
 
 автор: sim5   (29.09.2010 в 10:29)   письмо автору
 
   для: selma   (29.09.2010 в 10:16)
 

Добавьте перевод получаемых букв в нижний регистр.

  Ответить  
 
 автор: selma   (29.09.2010 в 10:31)   письмо автору
 
   для: sim5   (29.09.2010 в 10:29)
 

я добавила проверку на существование букв в сессии, чтобы не дублировались, а буквы у меня передаются и загадываются на латинице (поэтому даже iconv не требуется:)), а потом транлитируются для пользователя
+ выводится алфавит, и если букву нажали, то эта буква из алфавита убирается, так что сейчас игра вполне закончена:)

  Ответить  
 
 автор: sim5   (29.09.2010 в 10:47)   письмо автору
 
   для: selma   (29.09.2010 в 10:31)
 

>передаются и загадываются на латинице (поэтому даже iconv не требуется:)),

А чего же вы тогда мадам в изначальном коде своем применяте функции для работы с мультибайными строками, если у вас и слово латиница ну и соответсвенно буквы угадываемые?

  Ответить  
 
 автор: Trianon   (29.09.2010 в 10:46)   письмо автору
 
   для: sim5   (29.09.2010 в 10:06)
 

зачем Вы человека накормили двойным iconv'ом?
Что он Вам сделал?

  Ответить  
 
 автор: sim5   (29.09.2010 в 10:48)   письмо автору
 
   для: Trianon   (29.09.2010 в 10:46)
 

Ничего он не сделал, это у меня так пример, начания header('Content-type: text/html; charset=utf-8');, а все в 1251... Думаю леди это поняла. ;-)

  Ответить  
 
 автор: selma   (29.09.2010 в 10:54)   письмо автору
 
   для: sim5   (29.09.2010 в 10:48)
 

Еще раз спасибо, все что не нужно убрала

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования