Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Освой Самостоятельно Perl за 24 часа, Самообучение 
:(
    Опции темы
Lisssa
Дата 4.11.2011, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 На четвертом часе идет изучение "Укладка строительных блоков: списки и массивы".
 Как всегда плохо  отсканированный документ дает о себе знать  smile 
 Искала по всему интернету , так и не нашла исправно работающий код программы "Висилица", написанный именно в виде массивов... никто не справился, кто брался.  smile 
 
Вот сам код:
Код

#!/usr/bin/perl -w

@words=qw( Интернет Ответ Принтер Программа ); #Инециализирует список допустимых слов в игре
$guesses[0]="";    # Хранение ранее введеных букв
$wrong=0;    # Колличество неудачных ответов

$choice=$words[rand @words];    # Рандомно выбирается слово из массива @words
$hangman="0-|--<";          # Формируется фигурка    
@letters=split(//, $choice);    # Загаданное слово разбивается на буквы и помещается в массив @letters
@hangman=split(//, $hangman);    # Фигурка разбивается на символы в индексной последовательности и иницализируется в массив @hangman
@blankword=(0) x scalar(@hangman); # @blankword Отображает положение правильно угаданных букв. В начале в @blankword находится список (0) x scalar(@hangman), длинна которого равна колличеству эллементов @hangman. Затем постепенно нули заменяются на угаданные буквы. Это делает далее $blankword[i] = $guess
OUTER:                # Отметка для основного цикла
    while ($wrong<@hangman) {    # Основной цикл выполняется, пока количество неправельных ответов не сравняется с длинной фигурки.
        foreach $i (0..$#letters) {    # Цикл foreach
            if ($blankword[$i]) {    # проверяются эллементы массива @blankword
                print $blankword[$i];    # Все угаданные буквы распечастываются 
            } else {            # , а
                print "-";        # не угаданные заменяются девисами.
            }
        }
        print "\n";
        if ($wrong) {            # Переменная $wrong сожержит количество не правельных ответов.
            print @hangman[0..$wrong-1]    # Если имеется хотябы один не правельный ответ, печатаются $wrong начальных элементов @hangman
        }
        print "\n Ваш выбор: ";        
        chomp($guess=<STDIN>);        # Вводится ответ игрока, функция chomp удаляет завершающий символ новой строки.
        foreach(@guesses) {            # Проверяем - 
            next OUTER if ($_ eq $guess);    # не выводился ли символ ранее. Если да цикл переходит к отметке OUTER и 
        }                    # игрок не наказывается за повторение не правильного ответа.    
        $guesses[$#guesses]=$guess;        # Введена пользователем буква помещается в массив @guesses.
        $right=0;                # Данный флаг указывает на неверные ответы
        for ($i=0; $i<@letters; $i++) {        # В @letters содержащем загаданное слово ищется буква ответа.
            if ($letters[$i] eq $guess) {    # Если буква найдена она
                $blankword[$i]=$guess;        # присваивается соответствующему элементу массива  @blankwords. Все эллементы этого массива это или угаданные буквы или нули.
                $right=1;            # Флаг $right получает значение 1, если хотябы одна буква правильно угадана.
            }
        }
        $wrong++ unless ($right);    # Увеличиваем переменную $wrong при каждом неправильном ответе.
        if (join('', @blankword) eq $choice) {    # Элементы массива @blankwords объединяются в строку, которая сравнивается с исходным словом. Если они совпадут,то
            print "Вы угадали! Загаданное слово было $choice\n"; # это означает , что пользователь угадал слово и распечатается сообщение о победе , после чего 
            exit;    # программа завершится.
        }
    }
    print "$hangman\n Печально, но было загадано слово $choice!\n"; # Основной цикл программа завершается, поскольку игрок исчерпал все свои попытки.




В этой программе продимонстрирован изученый материал 4 часа - списки литералов, массивы, функции split и join, контекст и циклы foreach. Ясно , что программу можно запрограммировать массой различных способов, данная же версия - иллюстрация основных возможностей массивов.

 Данный код программы работает не коректно.
1) Количество дефисов в двое больше , чем количество загадынных букв слова.
2) Ну и из этого логично , не работает часть пограммы , которая бы исправно нашла , что я ввела верную букву.
 Не могу понять , как исправить данную ошибку.  smile 
Help me ! Help me ! ))
PM MAIL   Вверх
ginnie
Дата 4.11.2011, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Lisssa, как ведет себя программа при использовании английских слов вместо русских?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
arto
Дата 4.11.2011, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

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



# perl -CSA -e '$"="";$n=shift;@a=split"",shift;@c=qw(0)x@a;while(index("@c","0")!=-1){print"@c\n";print"> ";chomp(my$w=<STDIN>);my@b=grep{$b=shift@c;push@c,$_ eq$w&&$b eq"0"?$w:$b;$_}@a;$n-="@a"eq"@b"||0;if($n==0){print"Word was: ";last}@a=@b}print"@a\n"' 6 тест
0000
> t
0000
> т
т00т
> с
т0ст
> е
тест
#

интересно, можно ли короче?
PM MAIL ICQ   Вверх
Lisssa
Дата 11.11.2011, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ginnie @ 4.11.2011,  13:42)
Lisssa, как ведет себя программа при использовании английских слов вместо русских?

Спасибки огромное , без этой наводки врядли бы додумалась ...
Изменила 
Код

@words=qw( Интернет Ответ Принтер Программа );

на
Код

@words=qw( Internet Answer Printer Program );


Все действительно заработало. 
И как про это не написали в учебном пособии ?  smile  
Может , кто знает: Как сделать , чтобы русские буквы работали и каким образом проводится диагностика , что трабла именно в языке ?

Добавлено @ 09:56
Цитата(arto @ 4.11.2011,  15:59)
# perl -CSA -e '$"="";$n=shift;@a=split"",shift;@c=qw(0)x@a;while(index("@c","0")!=-1){print"@c\n";print"> ";chomp(my$w=<STDIN>);my@b=grep{$b=shift@c;push@c,$_ eq$w&&$b eq"0"?$w:$b;$_}@a;$n-="@a"eq"@b"||0;if($n==0){print"Word was: ";last}@a=@b}print"@a\n"' 6 тест
0000
> t
0000
> т
т00т
> с
т0ст
> е
тест
#

интересно, можно ли короче?

arto спасибки , вернусь к твоим комментария , как буду изучать 12 урок , работа с командной строки, пока растрачивать себя не могу.

Это сообщение отредактировал(а) Lisssa - 11.11.2011, 09:57
PM MAIL   Вверх
dixoNICH
Дата 11.11.2011, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



подключите use locale, чтобы работатьс русским текстом, должно помочь
PM MAIL   Вверх
Lisssa
Дата 12.11.2011, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(dixoNICH @ 11.11.2011,  13:07)
подключите use locale, чтобы работатьс русским текстом, должно помочь

Пробывала добавить:
Код

use locale;

Пробывали и таким методом(Нашла в инете):
Код

use locale;
use POSIX qw (locale_h);
setlocale(LC_CTYPE, 'ru_RU.KOI8-R');

 В cpan предворительно проделала install locale.
Что-то еще нужно сделать ? 
PM MAIL   Вверх
Lols
Дата 12.11.2011, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Забавно smile А первый вариант можно? Хочу себя проверить.
PM MAIL   Вверх
Lisssa
Дата 12.11.2011, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Lols @ 12.11.2011,  02:27)
Забавно smile А первый вариант можно? Хочу себя проверить.

Немного не поняла, первый вариант чего ? 

Это сообщение отредактировал(а) Lisssa - 12.11.2011, 02:42
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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