156 lines
3.6 KiB
D
156 lines
3.6 KiB
D
module gumballmachine;
|
|
|
|
import std.stdio : writeln;
|
|
import std.conv : to;
|
|
|
|
class GumballMachine
|
|
{
|
|
static const int SOLD_OUT = 0; // нет шариков
|
|
static const int NO_QUARTER = 1; // нет монетки
|
|
static const int HAS_QUARTER = 2; // есть монетка
|
|
static const int SOLD = 3; // шарик продан
|
|
|
|
int state = SOLD_OUT;
|
|
int count = 0;
|
|
|
|
this(int count)
|
|
{
|
|
this.count = count;
|
|
if (count > 0)
|
|
{
|
|
state = NO_QUARTER;
|
|
}
|
|
}
|
|
|
|
void insertQuarter()
|
|
{
|
|
if (state == HAS_QUARTER)
|
|
{
|
|
writeln("You can't insert another quarter");
|
|
}
|
|
else if (state == NO_QUARTER)
|
|
{
|
|
state = HAS_QUARTER;
|
|
writeln("You inserted a quarter");
|
|
}
|
|
else if (state == SOLD_OUT)
|
|
{
|
|
writeln("You can't insert a quarter, the machine is sold out");
|
|
}
|
|
else if (state == SOLD)
|
|
{
|
|
writeln("Please wait, we're already giving you a gumball");
|
|
}
|
|
}
|
|
|
|
void ejectQuarter()
|
|
{
|
|
if (state == HAS_QUARTER)
|
|
{
|
|
writeln("Quarter returned");
|
|
state = NO_QUARTER;
|
|
}
|
|
else if (state == NO_QUARTER)
|
|
{
|
|
writeln("You haven't inserted a quarter");
|
|
}
|
|
else if (state == SOLD)
|
|
{
|
|
writeln("Sorry, you already turned the crank");
|
|
}
|
|
else if (state == SOLD_OUT)
|
|
{
|
|
writeln("You can't eject, you haven't inserted a quarter yet");
|
|
}
|
|
}
|
|
|
|
void turnCrank()
|
|
{
|
|
if (state == SOLD)
|
|
{
|
|
writeln("Turning twice doesn't get you another gumball!");
|
|
}
|
|
else if (state == NO_QUARTER)
|
|
{
|
|
writeln("You turned but there's no quarter");
|
|
}
|
|
else if (state == SOLD_OUT)
|
|
{
|
|
writeln("You turned, but there are no gumballs");
|
|
}
|
|
else if (state == HAS_QUARTER)
|
|
{
|
|
writeln("You turned...");
|
|
state = SOLD;
|
|
dispense();
|
|
}
|
|
}
|
|
|
|
private void dispense()
|
|
{
|
|
if (state == SOLD)
|
|
{
|
|
writeln("A gumball comes rolling out the slot");
|
|
--count;
|
|
if (count == 0)
|
|
{
|
|
writeln("Oops, out of gumballs!");
|
|
state = SOLD_OUT;
|
|
}
|
|
else
|
|
{
|
|
state = NO_QUARTER;
|
|
}
|
|
}
|
|
else if (state == NO_QUARTER)
|
|
{
|
|
writeln("You need to pay first");
|
|
}
|
|
else if (state == SOLD_OUT)
|
|
{
|
|
writeln("No gumball dispensed");
|
|
}
|
|
else if (state == HAS_QUARTER)
|
|
{
|
|
writeln("No gumball dispensed");
|
|
}
|
|
}
|
|
|
|
void refill(int numGumBalls)
|
|
{
|
|
this.count = numGumBalls;
|
|
state = NO_QUARTER;
|
|
}
|
|
|
|
override string toString() const
|
|
{
|
|
string s;
|
|
s ~= "\nMighty Gumball, Inc.";
|
|
s ~= "\nJava-enabled Standing Gumball Model #2004\n";
|
|
s ~= "Inventory: " ~ count.to!string ~ " gumball";
|
|
if (count != 1)
|
|
{
|
|
s ~= "s";
|
|
}
|
|
s ~= "\nMachine is ";
|
|
if (state == SOLD_OUT)
|
|
{
|
|
s ~= "sold out";
|
|
}
|
|
else if (state == NO_QUARTER)
|
|
{
|
|
s ~= "waiting for quarter";
|
|
}
|
|
else if (state == HAS_QUARTER)
|
|
{
|
|
s ~= "waiting for turn of crank";
|
|
}
|
|
else if (state == SOLD)
|
|
{
|
|
s ~= "delivering a gumball";
|
|
}
|
|
s ~= "\n";
|
|
return s;
|
|
}
|
|
}
|