Flash ActionScript:Moneycounter代码无法正常运行

Flash actionscript: moneycounter code not behaving correctly

我正在尝试以Adobe Flash(动画)动画设置虚拟公交车售票机。

前提是您必须在舱位中输入准确的票价,因为驾驶员不携带零钱。确切的票价是2美元。本机接受5美分,10美分,25美分,1美元,5美元,10美元和20美元的面额。如果输入的金额超过2美元,则会弹出一条消息,提示"请只提供准确的票价。驾驶员无法提供零钱。"因此,在这种情况下,只有5美分,10美分,25美分和1美元的面额可用必须输入以加起来恰好是$ 2。

下面的代码对于25美分和1美元面额的单独或组合正确地工作,但是当5美分和10美分单独使用或与25美分和1美元组合使用时,则无法正常工作。例如,如果您尝试仅使用角钱达到$ 2,则总计将达到$ 1.90,但是当您输入最后的10美分时不会支付费用。而是会弹出"请只提供准确票价"消息。如果再添加一个镍,总金额将达到$ 1.95,但再次输入最终镍将不会支付车费。而是再次触发弹出的"请只提供准确票价"消息。

输入$ 1,然后再输入$ 1,效果很好。输入8个季度以及输入1美元和4个季度同样有效。无法找出问题所在。将不胜感激。
谢谢!

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
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
2
// Expect result to be 0.1
trace(0.3-0.2);

0.09999999999999998

1
2
// 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,然后存储美分而不是美元:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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) { ... }