Flash Actionscript: код MoneyCounter не работает правильно - PullRequest
2 голосов
/ 02 июля 2019

Я пытаюсь настроить виртуальный автобусный торговый автомат в анимации Adobe Flash (Animate).

Предполагается, что вы должны ввести точный тариф в слот, поскольку водители не несут сдачу.Точный тариф составляет 2 доллара.Машина принимает номиналы в 5 центов, 10 центов, 25 центов, 1, 5, 10 и 20 долларов.Если будет введено что-то более 2 долларов США, появится сообщение «Точный тариф только, пожалуйста. Водители не могут предоставить сдачу».Таким образом, в этом случае сработают только номиналы в 5, 10, 25 и 1 цент, но их необходимо ввести, чтобы получить в сумме ровно 2 доллара.

Приведенный ниже код корректно работает для 25 центов и 1 доллара.деноминации одни и в комбинации, но работают беспорядочно, когда 5 центов и 10 центов используются по отдельности или включаются в комбинации с 25 центами и 1 долларом США.Например, если вы попытаетесь набрать 2 доллара, используя только 10 центов, общая сумма достигнет 1,90, но вы не выплатите тариф при вводе последних 10 центов.Вместо этого появляется всплывающее сообщение «Точный тариф только пожалуйста».Если затем вы добавите никель, общая сумма достигнет $ 1,95, но снова не будет выплачивать плату за проезд при вводе конечного никеля.Вместо этого всплывающее окно «Точный тариф только, пожалуйста».сообщение срабатывает снова.

Ввод $ 1, а затем еще $ 1 работает отлично.Ввод 8 кварталов работает так же, как ввод 1 и 4 кварталов.Не могу понять, в чем проблема.Буду признателен за любую помощь.Спасибо!

Код указан ниже:

var Cash = 00.00
var payola = Money.text = "02.00";
Money.text = "$" + Cash.toFixed(2);
popup.visible = false;


nickel_btn.addEventListener(MouseEvent.CLICK, add5cents);

function add5cents(event:MouseEvent):void
{
    nickelcoin_mc.gotoAndPlay ("nickel_pay"); 
    Cash+=00.05;
    Money.text = "$" + Cash.toFixed(2);
    if(Cash == payola){
      setTimeout(delay, 500);
      function delay(){
        gotoAndStop(46);
        }
    }
    if(Cash > payola){
        nickelcoin_mc.gotoAndPlay ("nickel_nopay");
        Cash-=00.05;
        Money.text = "$" + Cash.toFixed(2);
        popup.visible = true;
    }
    else {
        popup.visible = false;
    }
}

dime_btn.addEventListener(MouseEvent.CLICK, add10cents);

function add10cents(event:MouseEvent):void
{
    dimecoin_mc.gotoAndPlay ("dime_pay"); 
    Cash+=00.10;
    Money.text = "$" + Cash.toFixed(2);
    if(Cash == payola){
      setTimeout(delay, 500);
      function delay(){
        gotoAndStop(46);
        }
    }
    if(Cash > payola){
        dimecoin_mc.gotoAndPlay ("dime_nopay");
        Cash-=00.10;
        Money.text = "$" + Cash.toFixed(2);
        popup.visible = true;
    }
    else {
        popup.visible = false;
    }
}

quarter_btn.addEventListener(MouseEvent.CLICK, add25cents);

function add25cents(event:MouseEvent):void
{
    quartercoin_mc.gotoAndPlay ("quarter_pay"); 
    Cash+=00.25;
    Money.text = "$" + Cash.toFixed(2);
    if(Cash == payola){
      setTimeout(delay, 500);
      function delay(){
        gotoAndStop(46);
        }
    }
    if(Cash > payola){
        quartercoin_mc.gotoAndPlay ("quarter_nopay");
        Cash-=00.25;
        Money.text = "$" + Cash.toFixed(2);
        popup.visible = true;
    }
    else {
        popup.visible = false;
    }
}

one_btn.addEventListener(MouseEvent.CLICK, add$1);

function add$1(event:MouseEvent):void
{
    onebill_mc.gotoAndPlay ("one_pay"); 
    Cash+=01.00;
    Money.text = "$" + Cash.toFixed(2);
    if(Cash == payola){
      setTimeout(delay, 500);
      function delay(){
        gotoAndStop(46);
        }
    }
    if(Cash > payola){
        onebill_mc.gotoAndPlay ("one_nopay");
        Cash-=01.00;
        Money.text = "$" + Cash.toFixed(2);
        popup.visible = true;
    }
    else {
        popup.visible = false;
    }
}

five_btn.addEventListener(MouseEvent.CLICK, add$5);

function add$5(event:MouseEvent):void
{
    fivebill_mc.gotoAndPlay ("five_pay"); 
    Cash+=05.00;
    Money.text = "$" + Cash.toFixed(2);
    if(Cash == payola){
      setTimeout(delay, 500);
      function delay(){
        gotoAndStop(46);
        }
    }
    if(Cash > payola){
        fivebill_mc.gotoAndPlay ("five_nopay");
        Cash-=05.00;
        Money.text = "$" + Cash.toFixed(2);
        popup.visible = true;
    }
    else {
        popup.visible = false;
    }
}

ten_btn.addEventListener(MouseEvent.CLICK, add$10);

function add$10(event:MouseEvent):void
{
    tenbill_mc.gotoAndPlay ("ten_pay"); 
    Cash+=10.00;
    Money.text = "$" + Cash.toFixed(2);
    if(Cash == payola){
      setTimeout(delay, 500);
      function delay(){
        gotoAndStop(46);
        }
    }
    if(Cash > payola){
        tenbill_mc.gotoAndPlay ("ten_nopay"); 
        Cash-=10.00;
        Money.text = "$" + Cash.toFixed(2);
        popup.visible = true;
    }
    else {
        popup.visible = false;
    }
}

twenty_btn.addEventListener(MouseEvent.CLICK, add$20);

function add$20(event:MouseEvent):void
{
    twentybill_mc.gotoAndPlay ("twenty_pay"); 
    Cash+=20.00;
    Money.text = "$" + Cash.toFixed(2);
    if(Cash == payola){
      setTimeout(delay, 500);
      function delay(){
        gotoAndStop(46);
        }
    }
    if(Cash > payola){
        twentybill_mc.gotoAndPlay ("twenty_nopay");
        Cash-=20.00;
        Money.text = "$" + Cash.toFixed(2);
        popup.visible = true;
    }
    else {
        popup.visible = false;
    }
}


stop();

1 Ответ

3 голосов
/ 02 июля 2019

Это может быть проблемой, вызванной числами с плавающей запятой.Попробуйте вставить это в свой код и проверьте вывод консоли:

// Expect result to be 0.1
trace(0.3-0.2);

0.09999999999999998

// Adding lots of 5 cent coins. Expect result to be 0.5
trace(0.05 + 0.05 + 0.05 + 0.05 + 0.05 + 0.05 + 0.05 + 0.05 + 0.05 + 0.05);

0.49999999999999994

Ваше == сравнение иногда терпит неудачу, потому что сложение чисел с плавающей запятой может привести к неожиданным значениям.Этот ответ хорошо объясняет проблему: https://stackoverflow.com/a/3730040/11678918

В вашем случае попробуйте изменить переменную Cash на int и сохранить центы вместо долларов:

var Cash:int = 0;
var payola:int = 200; // 2 dollars

// Add 5 cents
Cash += 5;

// Adding 1 dollar
Cash += 100;

// Printing out the amount in dollars and cents
Money.text = "$" + (Cash / 100).toFixed(2);

// Our exact check is safe now that we avoid floats.
if(Cash == payola) { ... }
...