Forum Webscript.Ru
Программирование => Perl => Тема начата: AlieN от 31 Марта 2003, 08:59:01
-
Пишу бота викторины на перле
собственно вот кусок кода:
sub blabla{
my ......
$obj->{hint}++;
@allchars=split(\'\',$obj->{cur_answer});
for($i2=1;$i2<$length;++$i2){
$char=$allchars[$i2];
if( $i==$obj->{hint} && $i<=$maxhint ){
$chars[$i2]=$char;
}else{
$chars[$i2]="*";
}
++$i;
if( $i % 6==0 ){$i=0;}
}
$obj->{curhint}=join(\'\',@chars);
}
Что он должен делать: из ответа по очереди заменять незасвеченные буквы на *, при этом циклируясь на 6 символах (извините за ломаный русский - сами мы не местные)
В общем если ответ "сембернар", то вот что он должен последовательно выводить:
c*****н**
*е*****а*
**м*****р
***б*****
А вот что он сейас выдает(правильный ответ "кричать"):
*и*****
**ч*****
***а****
****т***
-
for($i2=1;$i2<$length;++$i2)
Вообще, насколько я помню, массив начинается с нуля а не с единицы, поэтому:
for($i2=0;$i2<$length;++$i2)
-
Phoinix
только все равно разное кол-во букв
Скрипт просто торчит:
Вопрос: Место для слуги на задке кареты, кипажа. букв -9
Атвет: запятки
Подсказка 1: з*****и**
Подсказка 2: *а*****
Подсказка 3: **п*****
Подсказка 4: ***я*****
Вопрос: Значение женского имени (исп.) ласкательное к Лола. букв -8
Атвет: -лолита
Подсказка 1: л*****
Подсказка 2: *о*****
Подсказка 3: **л*****
Подсказка 4: ***и****
Вопрос: Цинковая обманка. букв -10
Атвет: -сфалерит
Подсказка 1: с*****и***
Подсказка 2: *ф*****т**
Подсказка 3: **а*****
Подсказка 4: ***л*****
package trivia
blabla
sub update_hint{
my $obj=shift;
my $length=length($obj->{cur_answer});
my $char="";
my ($i,$i2,$maxhint)=0;
my @chars=();
my @allchars=();
$obj->{hint}++;
if($obj->{hint}>4){$obj->{curhint}="";return 0;}
if($length>2){$maxhint=1;}
if($length>3){$maxhint=2;}
if($length>4){$maxhint=3;}
if($length>5){$maxhint=4;}
@allchars=split(\'\',$obj->{cur_answer});
foreach $char (@allchars){
++$i;++$i2;
if($i==$obj->{hint} && $i<=$maxhint){
$chars[$i2]=$char;else{
$chars[$i2]="*";
}
if( $i % 6==0 ){$i=0;}
}
$obj->{curhint}=join(\'\',@chars);
}
сам скрипт
blabla
requri trivia;
$trivia = new Trivia;
$conn->{trivia}=$trivia;
blabla
sub repeat_question {
my $conn = shift;
if(!$conn->{trivia}->{flag}){
$conn->privmsg($conn->{channel}, "3Вопрос: 12".$conn->{trivia}{cur_question}." букв -".length($conn->{trivia}{cur_answer}));
$conn->privmsg($conn->{channel}, "3Атвет: 12-".$conn->{trivia}{cur_answer}."----");
}
$conn->{trivia}->{flag}=1;
}
sub repeat_hint{
if($conn->{trivia}->{curhint}){$conn->privmsg($conn->{channel}, "3Подсказка ".$conn->{trivia}->{hint}.": 4".$conn->{trivia}->{curhint});}
}
-
Ну если через foreach то
foreach $char (@allchars){
++$i;
if (($i==$obj->{hint} && $i<=$maxhint) || ($i==($obj->{hint}+6)){
$chars[$i]=$char;}
else{
$chars[$i]="*";
}
}
По идее так, проверь...
$i2 - не нужен, а просто делаешь сравнение соответствия $i одному из первых четырех символов или одному из первых четырех после первой шестерки... (надеюсь понятно изложил... ;-)