如何实现自动售货机?

时间:2013-10-29 15:14:32

标签: winforms visual-studio-2010 visual-studio

对于学校项目,我被要求使用visual basic在Windows窗体应用程序中创建虚拟自动售货机。我已经完成了大约80%,但是我有一些问题,我已经多次研究但仍然无法找到帮助。

首先,在自动售货机上购买物品时,如果剩余的信用额(更改)小于产品原件价格,则会显示错误消息,说明您没有足够的信用来购买产品。我如何制作它,如果信用额度不足以购买产品而不是在购买后立即显示该信息?

其次,我如何在购买后为剩余的信用额度制作系统,因为目前我只有一个信用退回按钮,用户将用它来提取购买后留下的剩余信用,而不是一个发布变化的系统。

最后,我如何制作它以便不允许用户在文本框中输入文本,因为自动售货机使用两个文本框,一个显示信用,另一个显示其他常规信息,例如澄清您购买了某种产品,或者您没有足够的信用来购买某种产品。

到目前为止,这是我的代码:

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    RichTextBox1.Text = "You Have Selected Galaxy Caramel, Please Insert 60p"
    If credit >= 60 Then RichTextBox1.Text = "Thank you for purchasing a Galaxy Caramel bar"
    credit = credit - 60
    TextBox1.Text = credit
    If credit < 60 Then RichTextBox1.Text = "You do not have enough credit to purchase a Galaxy Caramel Bar"



End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    RichTextBox1.Text = "You Have Selected Cadburys Milk Chocolate, Please Insert 75p"
    If credit >= 75 Then RichTextBox1.Text = "Thank you for purchasing a Cadburys Milk Chocolate Bar"
    credit = credit - 75
    TextBox1.Text = credit
    If credit < 75 Then RichTextBox1.Text = "You do not have enough credit to purchase a Cadburys Milk Chocolate Bar"
End Sub

Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    RichTextBox1.Text = "You Have Selected Bounty, Please Insert 70p"
    If credit >= 70 Then RichTextBox1.Text = "Thank you for purchasing a Bounty bar"
    credit = credit - 70
    TextBox1.Text = credit
    If credit < 70 Then RichTextBox1.Text = "You do not have enough credit to purchase a Bounty Bar"



End Sub

Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
    RichTextBox1.Text = "You Have Selected Yorkie, Please Insert 60p"
    If credit >= 60 Then RichTextBox1.Text = "Thank you for purchasing a Yorkie bar"
    credit = credit - 60
    TextBox1.Text = credit
    If credit < 60 Then RichTextBox1.Text = "You do not have enough credit to purchase a Yorkie Bar"




End Sub

Private Sub Button8_Click(sender As System.Object, e As System.EventArgs) Handles Button8.Click
    RichTextBox1.Text = "You Have Selected Doritos Tangy Cheese, Please Insert 85p"
    If credit >= 85 Then RichTextBox1.Text = "Thank you for purchasing Doritos Tangy Cheese Crisps"
    credit = credit - 85
    TextBox1.Text = credit
    If credit < 85 Then RichTextBox1.Text = "You do not have enough credit purchase Doritos Tangy Cheese Crisps"



End Sub

Private Sub Button7_Click(sender As System.Object, e As System.EventArgs) Handles Button7.Click
    RichTextBox1.Text = "You Have Selected Doritos Cool Original, Please Insert 75p"
    If credit >= 75 Then RichTextBox1.Text = "Thank you for purchasing Doritos Cool Original Crisps"
    credit = credit - 75
    TextBox1.Text = credit
    If credit < 75 Then RichTextBox1.Text = "You do not have enough credit to purchase Doritos Cool Original Crisps"

End Sub

Private Sub Button6_Click(sender As System.Object, e As System.EventArgs) Handles Button6.Click
    RichTextBox1.Text = "You Have Selected Walkers Cheese & Onion, Please Insert 70p"
    If credit >= 70 Then RichTextBox1.Text = "Thank you for purchasing Walkers Cheese & Onion Crisps"
    credit = credit - 70
    TextBox1.Text = credit
    If credit < 70 Then RichTextBox1.Text = "You do not have enough credit to purchase Walkers Cheese & Onion Crisps"


End Sub

Private Sub Button5_Click(sender As System.Object, e As System.EventArgs) Handles Button5.Click
    RichTextBox1.Text = "You Have Selected Mccoy's Cheddar, Please Insert 80p"
    If credit >= 80 Then RichTextBox1.Text = "Thank you for purchasing Mccoy's Cheddar Crisps"
    credit = credit - 80
    TextBox1.Text = credit
    If credit < 80 Then RichTextBox1.Text = "You do not have enough credit to purchase Mccoy's Cheddar Crisps"


End Sub

Private Sub Button9_Click(sender As System.Object, e As System.EventArgs) Handles Button9.Click
    RichTextBox1.Text = "You Have Selected Pepsi Max, Please Insert £1.10"
    If credit >= 110 Then RichTextBox1.Text = "Thank you for purchasing Pepsi Max"
    credit = credit - 110
    TextBox1.Text = credit
    If credit < 110 Then RichTextBox1.Text = "You do not have enough credit to purchase Pepsi Max"


End Sub

Private Sub Button12_Click(sender As System.Object, e As System.EventArgs) Handles Button12.Click
    RichTextBox1.Text = "You Have Selected Mountain Dew, Please Insert 99p"
    If credit >= 99 Then RichTextBox1.Text = "Thank you for purchasing Mountain Dew"
    credit = credit - 99
    TextBox1.Text = credit
    If credit < 99 Then RichTextBox1.Text = "You do not have enough credit to purchase Mountain Dew"

End Sub

Private Sub Button10_Click(sender As System.Object, e As System.EventArgs) Handles Button10.Click
    RichTextBox1.Text = "You Have Selected Fanta, Please Insert £1.05"
    If credit >= 105 Then RichTextBox1.Text = "Thank you for purchasing Fanta"
    credit = credit - 105
    TextBox1.Text = credit
    If credit < 105 Then RichTextBox1.Text = "You do not have enough credit to purchase Fanta"

End Sub

Private Sub Button11_Click(sender As System.Object, e As System.EventArgs) Handles Button11.Click
    RichTextBox1.Text = "You Have Selected Dr.Pepper, Please Insert £1.20"
    If credit >= 120 Then RichTextBox1.Text = "Thank you for purchasing Dr.Pepper"
    credit = credit - 120
    TextBox1.Text = credit
    If credit < 120 Then RichTextBox1.Text = "You do not have enough credit to purchase Dr.Pepper"

End Sub

Private Sub Button13_Click(sender As System.Object, e As System.EventArgs) Handles Button13.Click
    RichTextBox1.Text = "You Have Selected Buxton Mineral Water, Please Insert 90p"
    If credit >= 90 Then RichTextBox1.Text = "Thank you for purchasing Buxton Mineral Water"
    credit = credit - 90
    TextBox1.Text = credit
    If credit < 90 Then RichTextBox1.Text = "You do not have enough credit to purchase Buxton Mineral Water"
End Sub

Private Sub Button14_Click(sender As System.Object, e As System.EventArgs) Handles Button14.Click
    credit = credit + 1
    TextBox1.Text = credit
End Sub

Private Sub Button21_Click(sender As System.Object, e As System.EventArgs) Handles Button21.Click
    credit = credit + 2
    TextBox1.Text = credit
End Sub

Private Sub Button20_Click(sender As System.Object, e As System.EventArgs) Handles Button20.Click
    credit = credit + 5
    TextBox1.Text = credit
End Sub

Private Sub Button19_Click(sender As System.Object, e As System.EventArgs) Handles Button19.Click
    credit = credit + 10
    TextBox1.Text = credit
End Sub

Private Sub Button18_Click(sender As System.Object, e As System.EventArgs) Handles Button18.Click
    credit = credit + 20
    TextBox1.Text = credit
End Sub

Private Sub Button17_Click(sender As System.Object, e As System.EventArgs) Handles Button17.Click
    credit = credit + 50
    TextBox1.Text = credit
End Sub

Private Sub Button16_Click(sender As System.Object, e As System.EventArgs) Handles Button16.Click
    credit = credit + 100
    TextBox1.Text = credit
End Sub

Private Sub Button15_Click(sender As System.Object, e As System.EventArgs) Handles Button15.Click
    credit = credit + 200
    TextBox1.Text = credit
End Sub

Private Sub Button22_Click(sender As System.Object, e As System.EventArgs) Handles Button22.Click
    credit = 0
    TextBox1.Text = credit
    RichTextBox1.Text = "Credit has been returned"
End Sub

Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
    If credit < 0 Then credit = 0
    TextBox1.Text = credit


    If credit >= 1000 Then credit = 1000
    TextBox1.Text = credit
    If credit = 1000 Then RichTextBox1.Text = "Maximum credit of £10"
End Sub

Private Sub Button23_Click(sender As System.Object, e As System.EventArgs) Handles Button23.Click
    RichTextBox1.Text = "You Have Selected Monster Munch, Please Insert 90p"
    If credit >= 90 Then RichTextBox1.Text = "Thank you for purchasing Monster Munch Crisps"
    credit = credit - 90
    TextBox1.Text = credit
    If credit < 90 Then RichTextBox1.Text = "You do not have enough credit to purchase Monster Munch Crisps"


End Sub

结束班

2 个答案:

答案 0 :(得分:1)

  

我该怎么做才能只显示该信息,如果信用不是   足以购买产品,而不是直接购买   购买?

首先,您应该始终使用End If来关闭If语句,即使它们只有一行。如果If语句为真,那么当您认为代码的“块”正在运行时,不这样做会导致细微的错误,但只有第一行受到影响而其余行总是运行。

对于您的特定代码,您非常接近。通过添加Else块,End If并重新格式化代码,它变得如此简单:

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    RichTextBox1.Text = "You Have Selected Galaxy Caramel, Please Insert 60p"
    If credit >= 60 Then
        RichTextBox1.Text = "Thank you for purchasing a Galaxy Caramel bar"
        credit = credit - 60
        TextBox1.Text = credit
    Else
        RichTextBox1.Text = "You do not have enough credit to purchase a Galaxy Caramel Bar"
    End If
End Sub

显然,您需要更改所有项目以遵循上述模式。

  

其次,我将如何建立一个信用系统   在购买之后,目前我只获得了一笔信用   用户将用于提取剩余信用的返回按钮   购买后遗留下来,而不是放弃的系统   变化

不确定你的意思。你能更详细地解释一下你想要发生什么吗?

  

最后,我将如何制作,以便不允许用户输入文字   进入文本框,因为自动售货机使用两个文本框,一个到   显示信用,另一个显示其他常规信息,如   澄清你已经购买了某种产品或者你没有购买   有足够的信用购买某种产品。

TextBox和RichTextBox都有一个ReadOnly()属性,您可以将其设置为True,以便用户无法更改它们。但由于他们只使用按钮,而根本不需要打字,为什么不使用像Labels这样的不同控件?

答案 1 :(得分:0)

您可以在此方案中使用状态机。 Head First Design Patterns有一个使用State Design模式的自动售货机的好例子。即使本书以Java形式提供样本,您仍然可以计算出概念。

为了计算变化,我在下面写了这个块。它接受可用的硬币库存和所需的更改,并返回一个布尔值以指示是否可以返回所有更改。该方法将尝试返回给定库存可能的最大更改。

    /// <summary>
    /// This method attempts to calculate required change from a given coin inventory
    /// </summary>
    /// <param name="coinInventory">Key is the denomination of coin and value is the available number </param>
    /// <param name="changeRequired">The change to count and return</param>
    /// <param name="updatedCoinInventory"></param>
    /// <param name="coinsToReturn"></param>
    /// <returns>True if changeRequired could be calculated, False if coinsToReturn represent less than changeRequired </returns>
    public bool GetChange(IDictionary<int, int> coinInventory, int changeRequired, 
                          ref IDictionary<int, int> updatedCoinInventory, 
                          ref IDictionary<int, int> coinsToReturn,
                          ref int amountDue) 
    {
        int changeOutstanding = changeRequired;

        updatedCoinInventory = coinInventory.ToDictionary(kvp => kvp.Key, kvp => kvp.Value); 

        coinsToReturn = new Dictionary<int, int>();

        foreach (KeyValuePair<int, int> coin in coinInventory)
        {
            if (changeOutstanding == 0) break;

            int numberOfAvailableCoins = coin.Value;

            while (changeOutstanding >= coin.Key && numberOfAvailableCoins >= 1)
            {
                if (!coinsToReturn.ContainsKey(coin.Key))
                {
                    coinsToReturn.Add(coin.Key, 1);
                }
                else
                {
                    ++ coinsToReturn[coin.Key];
                }

                changeOutstanding = changeOutstanding - coin.Key;

                -- updatedCoinInventory[coin.Key];
                -- numberOfAvailableCoins;
            }
        }

        amountDue = changeOutstanding;

        return changeOutstanding == 0;
    }

}

希望这有帮助。