2011-01-23 3 views
-2

Я слежу за учебником, написанным для ActionScript 2, и успешно преобразовал его в AS 3, однако на второй до последней части я застрял.Случайное число в Actionscript 3

Учебник здесь (http://www.cleverpig.com/tutorials/whackapig/whack.htm шаг 8) имеет следующий фрагмент кода:

if (_currentframe==1) { 
    // randomly choose whether or not to play 
    if (random(100)>97) { 
     // should we tease or popup? 
     if (random(3)<1) { 
     this.gotoAndPlay ("popup"); 
     } else { 
     this.gotoAndPlay (1); 
     } 
    } 
    } 

это предназначается, чтобы добавить некоторую хаотичность в движение персонажа. После некоторого googling я создал этот код в AS 3, надеясь, что это сработает.

if (currentFrame==1) { 
    // randomly choose whether or not to play 
    if(Math.floor(Math.random()*99)-97) { 
     // should we tease or popup? 
     if (Math.floor(Math.random() *3)-1) 
    ) { 
     this.gotoAndPlay ("popup"); 
     } else { 
     this.gotoAndPlay (1); 
     } 
    } 
    } 

При запуске программы с помощью этого кода всей анимации персонажа играет один раз (вниз, на полпути вверх, вверх, удар). Предполагается, что он будет воспроизводить только первые 3 кадра и повторить это.

EDIT:

function random (n:int) : int { 
    return Math.floor (Math.random() * n); 
} 

if (currentFrame==1) { 
    // randomly choose whether or not to play 
    if(random(100)): 97 { 
     // should we tease or popup? 
     if (random(3)): 1 
     { 
     this.gotoAndPlay ("popup"); 
     } else { 
     this.gotoAndPlay (1); 
     } 
    } 
    } 

Символ 'дыра', слой 'Actionscript', Frame 1, строка 10 1084: Синтаксическая ошибка: ожидается идентификатор до того двоеточия. Символ «дыра», слой «ActionScript», кадр 1, строка 10 1008: Атрибут недействителен. Символ 'отверстие', слой 'Actionscript', кадр 1, строка 12 1084: Ошибка синтаксиса: ожидающий идентификатор перед двоеточием. Символ 'отверстие', слой 'Actionscript', кадр 1, строка 13 1008: Атрибут недействителен. Символ 'дыра', Layer 'Actionscript', Кадр 1, Строка 15 1083: Синтаксическая ошибка: другое неожиданно.

ответ

0

Я бы дал -1 писателю оригинального учебника, положив числовое случайное выражение в такое условное выражение.

Чтобы определить результат выражения условного выражения, он всегда оценивается как булев. Если вы поместите туда номер/int, он будет ложным, только если его значение равно 0 (.0). Во всех остальных случаях (включая отрицательные числа) он будет оцениваться как истинный.

Да, вы можете сделать более легкую случайную функцию(), выполнив ответ @ weltraumpirat, но я бы предпочел, чтобы вы выбрали функцию random() из условного выражения и обернули ее методом sort(). Например:

function feelingLucky(ratio:Number):Boolean { 
    return Math.random() <= ratio; 
} 

Затем вызвать этот метод даст вам лучше х из у синтаксиса, как:

if (feelingLucky(97/99)) { 
    // you're lucky. 
} else { 
    // not so lucky. 
} 

либо другой условный, feelingLucky(1/3). Или попробуйте победную серию с feelingLucky(100/100).

Удачи :)

P.S. Ваше недавнее редактирование завершилось неудачно из-за двоеточия и цифры: 97 после операторов if. Их там не должно быть.

+0

Спасибо Эрик, это объяснение помогло разобраться. :) – RapsFan1981

+0

Вот и все! Я только что внес изменения, и они отлично работают. Большое спасибо за то, что нашли время, чтобы указать на недостатки исходного кода и представить эту альтернативу. – RapsFan1981

+1

@ Eric-Paul: Вы ошибаетесь: в исходном учебнике первый условный результат оценивается как true, если случайное число было * больше, чем * 97, так что это было бы верно в 2 из 100 раз, что и есть то, что автор предназначался для этого. – weltraumpirat

3

Вы можете просто легко реализовать собственную случайную функцию() и сохранить остальную часть кода точно так же:

function random (n:int) : int { 
    return Math.floor (Math.random() * n); 
} 
+1

@weltraumpirat. Ваша формула вводит предвзятость. Правильной формулой является 'Math.floor (Math.random() * n)' (это исключает n из возможных результатов). Вы также можете избавиться от Math.floor, если вы возвращаете положительные ints, поскольку усечение десятичных знаков имеет тот же эффект на практике, что и наложение положительного реального числа. –

+0

Вы правы, я ожидал, что Math.random() вернет 0 <= n <= 1, но я проверил документацию, и на самом деле это 0 <= n <1. Я изменил свой ответ, чтобы отразить это. Спасибо, что указали. – weltraumpirat

+0

@weltraumpirat. Нет проблем. +1 за отправку правильного ответа. –

0

Есть ли причина для изменения больше/меньше операторов к оператору минус? Кажется, что если блоки будут выполняться для всего, кроме 0.

Формат

if (condition) где условие истинно, ложно.

Я считаю, что ваше выражение преобразуется в булевский тип. Пример

if (random(100)>97)
99> 97 => Да (условие имеет значение истина)
пока 96> 97 => Нет (условие оценивается как ложное)

if (random(100)-97)
99 - 97 = 2
2, представленное как логическое, истинно (Условие соответствует true)
97 - 97 = 0
0, представленное как логическое значение, является ложным (условие принимает значение false)

+0

Хммм .. Не могли бы вы разработать немного Филиппа? Я понимаю, что вы говорите. – RapsFan1981

+0

@Casey Вы сначала отредактировали свой код, и вы просто использовали минус вместо более или менее операторов, предоставленных в учебнике. Таким образом, каждый раз, когда блок if приводил к истине по неправильным причинам. – phwd