state gummball winner

This commit is contained in:
Alexander Zhirov 2022-11-20 21:09:50 +03:00
parent e93f2da595
commit ffaefeac75
14 changed files with 458 additions and 28 deletions

View File

@ -2,4 +2,4 @@
Поведенческий паттерн проектирования, который позволяет объектам менять поведение в зависимости от своего состояния. Извне создаётся впечатление, что изменился класс объекта. Поведенческий паттерн проектирования, который позволяет объектам менять поведение в зависимости от своего состояния. Извне создаётся впечатление, что изменился класс объекта.
Паттерн **Состояние** управляет изменением поведения объекта при изменении его внутреннего состояния. Внешне это выглядит так, словно объект меняет свой класс.

View File

@ -6,10 +6,10 @@ import soldoutstate, noquarterstate, hasquarterstate, soldstate, state;
class GumballMachine class GumballMachine
{ {
State soldOutState; State soldOutState; // нет жевательных шариков
State noQuarterState; State noQuarterState; // нет четвертака (есть жевательные шарики, готов к продаже)
State hasQuarterState; State hasQuarterState; // вставлен четвертак (либо купить шарик, либо вернуть моентку)
State soldState; State soldState; // продажа шарика (выдача шарика)
State state; State state;
int count = 0; int count = 0;
@ -50,7 +50,7 @@ class GumballMachine
void releaseBall() void releaseBall()
{ {
writeln("A gumball comes rolling out the slot..."); writeln("Из щели выкатывается шарик жевательной резинки...");
if (count > 0) if (count > 0)
{ {
count = count - 1; count = count - 1;
@ -65,7 +65,8 @@ class GumballMachine
void refill(int count) void refill(int count)
{ {
this.count += count; this.count += count;
writeln("The gumball machine was just refilled; its new count is: ", this.count); writeln("Автомат для жевательных резинок был только что заправлен; его новое количество составляет: ",
this.count);
state.refill(); state.refill();
} }
@ -103,7 +104,7 @@ class GumballMachine
{ {
string s; string s;
s ~= "\nMighty Gumball, Inc."; s ~= "\nMighty Gumball, Inc.";
s ~= "\nJava-enabled Standing Gumball Model #2004"; s ~= "\nD-enabled Standing Gumball Model #2004";
s ~= "\nInventory: " ~ count.to!string ~ " gumball"; s ~= "\nInventory: " ~ count.to!string ~ " gumball";
if (count != 1) if (count != 1)
{ {

View File

@ -14,30 +14,30 @@ class HasQuarterState : State
void insertQuarter() void insertQuarter()
{ {
writeln("You can't insert another quarter"); writeln("Вы не можете вставить еще один четвертак");
} }
void ejectQuarter() void ejectQuarter()
{ {
writeln("Quarter returned"); writeln("Четвертак возвращен");
gumballMachine.setState(gumballMachine.getNoQuarterState()); gumballMachine.setState(gumballMachine.getNoQuarterState());
} }
void turnCrank() void turnCrank()
{ {
writeln("You turned..."); writeln("Вы дернули за рычаг...");
gumballMachine.setState(gumballMachine.getSoldState()); gumballMachine.setState(gumballMachine.getSoldState());
} }
void dispense() void dispense()
{ {
writeln("No gumball dispensed"); writeln("Жевательная резинка не выдается");
} }
void refill() {} void refill() {}
override string toString() const override string toString() const
{ {
return "waiting for turn of crank"; return "ожидание поворота рычага";
} }
} }

View File

@ -14,29 +14,29 @@ class NoQuarterState : State
void insertQuarter() void insertQuarter()
{ {
writeln("You inserted a quarter"); writeln("Вы вставили четвертак");
gumballMachine.setState(gumballMachine.getHasQuarterState()); gumballMachine.setState(gumballMachine.getHasQuarterState());
} }
void ejectQuarter() void ejectQuarter()
{ {
writeln("You haven't inserted a quarter"); writeln("Вы не вставили четвертак");
} }
void turnCrank() void turnCrank()
{ {
writeln("You turned, but there's no quarter"); writeln("Вы дернули за рычаг, но нет четвертака");
} }
void dispense() void dispense()
{ {
writeln("You need to pay first"); writeln("Сначала вам нужно заплатить");
} }
void refill() { } void refill() { }
override string toString() const override string toString() const
{ {
return "waiting for quarter"; return "в ожидании четвертака";
} }
} }

View File

@ -14,22 +14,22 @@ class SoldOutState : State
void insertQuarter() void insertQuarter()
{ {
writeln("You can't insert a quarter, the machine is sold out"); writeln("Вы не можете вставить четвертак, машина распродана");
} }
void ejectQuarter() void ejectQuarter()
{ {
writeln("You can't eject, you haven't inserted a quarter yet"); writeln("Вы не можете извлечь, вы еще не вставили четвертак");
} }
void turnCrank() void turnCrank()
{ {
writeln("You turned, but there are no gumballs"); writeln("Вы дернули за рычаг, но там нет жевательных шариков");
} }
void dispense() void dispense()
{ {
writeln("No gumball dispensed"); writeln("Жевательная резинка не выдается");
} }
void refill() void refill()
@ -39,6 +39,6 @@ class SoldOutState : State
override string toString() const override string toString() const
{ {
return "sold out"; return "продано";
} }
} }

View File

@ -14,17 +14,17 @@ class SoldState : State
void insertQuarter() void insertQuarter()
{ {
writeln("Please wait, we're already giving you a gumball"); writeln("Пожалуйста, подождите, мы уже даем вам жвачку");
} }
void ejectQuarter() void ejectQuarter()
{ {
writeln("Sorry, you already turned the crank"); writeln("Извините, вы уже дернули за рычаг");
} }
void turnCrank() void turnCrank()
{ {
writeln("Turning twice doesn't get you another gumball!"); writeln("Дважды дернув за рычаг вы не получите другую жвачку!");
} }
void dispense() void dispense()
@ -36,7 +36,7 @@ class SoldState : State
} }
else else
{ {
writeln("Oops, out of gumballs!"); writeln("Упс, кончились жевательные шарики!");
gumballMachine.setState(gumballMachine.getSoldOutState()); gumballMachine.setState(gumballMachine.getSoldOutState());
} }
} }
@ -45,6 +45,6 @@ class SoldState : State
override string toString() const override string toString() const
{ {
return "dispensing a gumball"; return "раздача жевательной резинки";
} }
} }

View File

@ -0,0 +1,46 @@
module app;
import gumballmachine;
import std.stdio : writeln;
void main()
{
GumballMachine gumballMachine = new GumballMachine(10);
writeln(gumballMachine);
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
writeln(gumballMachine);
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
writeln(gumballMachine);
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
writeln(gumballMachine);
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
writeln(gumballMachine);
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
writeln(gumballMachine);
}

View File

@ -0,0 +1,124 @@
module gumballmachine;
import std.stdio : writeln;
import std.conv : to;
import soldoutstate, noquarterstate, hasquarterstate, soldstate, state, winnerstate;
class GumballMachine
{
State soldOutState; // нет жевательных шариков
State noQuarterState; // нет четвертака (есть жевательные шарики, готов к продаже)
State hasQuarterState; // вставлен четвертак (либо купить шарик, либо вернуть моентку)
State soldState; // продажа шарика (выдача шарика)
State winnerState; // выдача дополнительного шарика при 10% вероятности
State state;
int count = 0;
this(int numberGumballs)
{
soldOutState = new SoldOutState(this);
noQuarterState = new NoQuarterState(this);
hasQuarterState = new HasQuarterState(this);
soldState = new SoldState(this);
winnerState = new WinnerState(this);
this.count = numberGumballs;
if (numberGumballs > 0)
{
state = noQuarterState;
}
else
{
state = soldOutState;
}
}
void insertQuarter()
{
state.insertQuarter();
}
void ejectQuarter()
{
state.ejectQuarter();
}
void turnCrank()
{
state.turnCrank();
state.dispense();
}
void releaseBall()
{
writeln("Из щели выкатывается шарик жевательной резинки...");
if (count > 0)
{
count = count - 1;
}
}
int getCount()
{
return count;
}
void refill(int count)
{
this.count += count;
writeln("Автомат для жевательных резинок был только что заправлен; его новое количество составляет: ",
this.count);
state.refill();
}
void setState(State state)
{
this.state = state;
}
State getState()
{
return state;
}
State getSoldOutState()
{
return soldOutState;
}
State getNoQuarterState()
{
return noQuarterState;
}
State getHasQuarterState()
{
return hasQuarterState;
}
State getSoldState()
{
return soldState;
}
State getWinnerState()
{
return winnerState;
}
override string toString() const
{
string s;
s ~= "\nMighty Gumball, Inc.";
s ~= "\nD-enabled Standing Gumball Model #2004";
s ~= "\nInventory: " ~ count.to!string ~ " gumball";
if (count != 1)
{
s ~= "s";
}
s ~= "\n";
s ~= "Machine is " ~ state.to!string ~ "\n";
return s;
}
}

View File

@ -0,0 +1,53 @@
module hasquarterstate;
import std.stdio : writeln;
import std.random : Random, uniform, unpredictableSeed;
import state, gumballmachine;
class HasQuarterState : State
{
GumballMachine gumballMachine;
Random randomWinner;
this(GumballMachine gumballMachine)
{
this.gumballMachine = gumballMachine;
randomWinner = Random(unpredictableSeed);
}
void insertQuarter()
{
writeln("Вы не можете вставить еще один четвертак");
}
void ejectQuarter()
{
writeln("Четвертак возвращен");
gumballMachine.setState(gumballMachine.getNoQuarterState());
}
void turnCrank()
{
writeln("Вы дернули за рычаг...");
if ((uniform(0, 10, randomWinner) == 0) && (gumballMachine.getCount() > 1))
{
gumballMachine.setState(gumballMachine.getWinnerState());
}
else
{
gumballMachine.setState(gumballMachine.getSoldState());
}
}
void dispense()
{
writeln("Жевательная резинка не выдается");
}
void refill() {}
override string toString() const
{
return "ожидание поворота рычага";
}
}

View File

@ -0,0 +1,42 @@
module noquarterstate;
import std.stdio : writeln;
import state, gumballmachine;
class NoQuarterState : State
{
GumballMachine gumballMachine;
this(GumballMachine gumballMachine)
{
this.gumballMachine = gumballMachine;
}
void insertQuarter()
{
writeln("Вы вставили четвертак");
gumballMachine.setState(gumballMachine.getHasQuarterState());
}
void ejectQuarter()
{
writeln("Вы не вставили четвертак");
}
void turnCrank()
{
writeln("Вы дернули за рычаг, но нет четвертака");
}
void dispense()
{
writeln("Сначала вам нужно заплатить");
}
void refill() { }
override string toString() const
{
return "в ожидании четвертака";
}
}

View File

@ -0,0 +1,44 @@
module soldoutstate;
import std.stdio : writeln;
import state, gumballmachine;
class SoldOutState : State
{
GumballMachine gumballMachine;
this(GumballMachine gumballMachine)
{
this.gumballMachine = gumballMachine;
}
void insertQuarter()
{
writeln("Вы не можете вставить четвертак, машина распродана");
}
void ejectQuarter()
{
writeln("Вы не можете извлечь, вы еще не вставили четвертак");
}
void turnCrank()
{
writeln("Вы дернули за рычаг, но там нет жевательных шариков");
}
void dispense()
{
writeln("Жевательная резинка не выдается");
}
void refill()
{
gumballMachine.setState(gumballMachine.getNoQuarterState());
}
override string toString() const
{
return "продано";
}
}

View File

@ -0,0 +1,50 @@
module soldstate;
import std.stdio : writeln;
import state, gumballmachine;
class SoldState : State
{
GumballMachine gumballMachine;
this(GumballMachine gumballMachine)
{
this.gumballMachine = gumballMachine;
}
void insertQuarter()
{
writeln("Пожалуйста, подождите, мы уже даем вам жвачку");
}
void ejectQuarter()
{
writeln("Извините, вы уже дернули за рычаг");
}
void turnCrank()
{
writeln("Дважды дернув за рычаг вы не получите другую жвачку!");
}
void dispense()
{
gumballMachine.releaseBall();
if (gumballMachine.getCount() > 0)
{
gumballMachine.setState(gumballMachine.getNoQuarterState());
}
else
{
writeln("Упс, кончились жевательные шарики!");
gumballMachine.setState(gumballMachine.getSoldOutState());
}
}
void refill() {}
override string toString() const
{
return "раздача жевательной резинки";
}
}

View File

@ -0,0 +1,11 @@
module state;
interface State
{
void insertQuarter();
void ejectQuarter();
void turnCrank();
void dispense();
void refill();
}

View File

@ -0,0 +1,59 @@
module winnerstate;
import std.stdio : writeln;
import state, gumballmachine;
class WinnerState : State
{
GumballMachine gumballMachine;
this(GumballMachine gumballMachine)
{
this.gumballMachine = gumballMachine;
}
void insertQuarter()
{
writeln("Пожалуйста, подождите, мы уже даем вам жвачку");
}
void ejectQuarter()
{
writeln("Пожалуйста, подождите, мы уже даем вам жвачку");
}
void turnCrank()
{
writeln("Дважды дернув за рычаг вы не получите другую жвачку!");
}
void dispense()
{
gumballMachine.releaseBall();
if (gumballMachine.getCount() == 0)
{
gumballMachine.setState(gumballMachine.getSoldOutState());
}
else
{
gumballMachine.releaseBall();
writeln("ТЫ ПОБЕДИТЕЛЬ! У тебя есть два жевательных шарика на твой четвертак");
if (gumballMachine.getCount() > 0)
{
gumballMachine.setState(gumballMachine.getNoQuarterState());
}
else
{
writeln("Упс, кончились шарики!");
gumballMachine.setState(gumballMachine.getSoldOutState());
}
}
}
void refill() {}
override string toString() const
{
return "раздаем два жевательных шарика за твою четвертак, потому что ТЫ ПОБЕДИТЕЛЬ!";
}
}