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

View File

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

View File

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

View File

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

View File

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