From ffaefeac75845f2a939ddbabf6f531039a14f5f9 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 20 Nov 2022 21:09:50 +0300 Subject: [PATCH] state gummball winner --- state/README.md | 2 +- state/gumballmachinestate/gumballmachine.d | 15 ++- state/gumballmachinestate/hasquarterstate.d | 10 +- state/gumballmachinestate/noquarterstate.d | 10 +- state/gumballmachinestate/soldoutstate.d | 10 +- state/gumballmachinestate/soldstate.d | 10 +- state/gumballmachinewinnerstate/app.d | 46 +++++++ .../gumballmachine.d | 124 ++++++++++++++++++ .../hasquarterstate.d | 53 ++++++++ .../noquarterstate.d | 42 ++++++ .../gumballmachinewinnerstate/soldoutstate.d | 44 +++++++ state/gumballmachinewinnerstate/soldstate.d | 50 +++++++ state/gumballmachinewinnerstate/state.d | 11 ++ state/gumballmachinewinnerstate/winnerstate.d | 59 +++++++++ 14 files changed, 458 insertions(+), 28 deletions(-) create mode 100644 state/gumballmachinewinnerstate/app.d create mode 100644 state/gumballmachinewinnerstate/gumballmachine.d create mode 100644 state/gumballmachinewinnerstate/hasquarterstate.d create mode 100644 state/gumballmachinewinnerstate/noquarterstate.d create mode 100644 state/gumballmachinewinnerstate/soldoutstate.d create mode 100644 state/gumballmachinewinnerstate/soldstate.d create mode 100644 state/gumballmachinewinnerstate/state.d create mode 100644 state/gumballmachinewinnerstate/winnerstate.d diff --git a/state/README.md b/state/README.md index 9cd1f3b..7b345ee 100644 --- a/state/README.md +++ b/state/README.md @@ -2,4 +2,4 @@ Поведенческий паттерн проектирования, который позволяет объектам менять поведение в зависимости от своего состояния. Извне создаётся впечатление, что изменился класс объекта. - +Паттерн **Состояние** управляет изменением поведения объекта при изменении его внутреннего состояния. Внешне это выглядит так, словно объект меняет свой класс. diff --git a/state/gumballmachinestate/gumballmachine.d b/state/gumballmachinestate/gumballmachine.d index 8423f38..479b40e 100644 --- a/state/gumballmachinestate/gumballmachine.d +++ b/state/gumballmachinestate/gumballmachine.d @@ -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) { diff --git a/state/gumballmachinestate/hasquarterstate.d b/state/gumballmachinestate/hasquarterstate.d index 6f6508c..89124a1 100644 --- a/state/gumballmachinestate/hasquarterstate.d +++ b/state/gumballmachinestate/hasquarterstate.d @@ -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 "ожидание поворота рычага"; } } \ No newline at end of file diff --git a/state/gumballmachinestate/noquarterstate.d b/state/gumballmachinestate/noquarterstate.d index b3ead62..3eec142 100644 --- a/state/gumballmachinestate/noquarterstate.d +++ b/state/gumballmachinestate/noquarterstate.d @@ -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 "в ожидании четвертака"; } } \ No newline at end of file diff --git a/state/gumballmachinestate/soldoutstate.d b/state/gumballmachinestate/soldoutstate.d index 4f3bace..53ac965 100644 --- a/state/gumballmachinestate/soldoutstate.d +++ b/state/gumballmachinestate/soldoutstate.d @@ -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 "продано"; } } diff --git a/state/gumballmachinestate/soldstate.d b/state/gumballmachinestate/soldstate.d index 73bab9f..8fb1154 100644 --- a/state/gumballmachinestate/soldstate.d +++ b/state/gumballmachinestate/soldstate.d @@ -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 "раздача жевательной резинки"; } } \ No newline at end of file diff --git a/state/gumballmachinewinnerstate/app.d b/state/gumballmachinewinnerstate/app.d new file mode 100644 index 0000000..26f6d89 --- /dev/null +++ b/state/gumballmachinewinnerstate/app.d @@ -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); +} diff --git a/state/gumballmachinewinnerstate/gumballmachine.d b/state/gumballmachinewinnerstate/gumballmachine.d new file mode 100644 index 0000000..4ede1bc --- /dev/null +++ b/state/gumballmachinewinnerstate/gumballmachine.d @@ -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; + } +} \ No newline at end of file diff --git a/state/gumballmachinewinnerstate/hasquarterstate.d b/state/gumballmachinewinnerstate/hasquarterstate.d new file mode 100644 index 0000000..8e6bf16 --- /dev/null +++ b/state/gumballmachinewinnerstate/hasquarterstate.d @@ -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 "ожидание поворота рычага"; + } +} \ No newline at end of file diff --git a/state/gumballmachinewinnerstate/noquarterstate.d b/state/gumballmachinewinnerstate/noquarterstate.d new file mode 100644 index 0000000..3eec142 --- /dev/null +++ b/state/gumballmachinewinnerstate/noquarterstate.d @@ -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 "в ожидании четвертака"; + } +} \ No newline at end of file diff --git a/state/gumballmachinewinnerstate/soldoutstate.d b/state/gumballmachinewinnerstate/soldoutstate.d new file mode 100644 index 0000000..53ac965 --- /dev/null +++ b/state/gumballmachinewinnerstate/soldoutstate.d @@ -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 "продано"; + } +} diff --git a/state/gumballmachinewinnerstate/soldstate.d b/state/gumballmachinewinnerstate/soldstate.d new file mode 100644 index 0000000..8fb1154 --- /dev/null +++ b/state/gumballmachinewinnerstate/soldstate.d @@ -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 "раздача жевательной резинки"; + } +} \ No newline at end of file diff --git a/state/gumballmachinewinnerstate/state.d b/state/gumballmachinewinnerstate/state.d new file mode 100644 index 0000000..813481d --- /dev/null +++ b/state/gumballmachinewinnerstate/state.d @@ -0,0 +1,11 @@ +module state; + +interface State +{ + void insertQuarter(); + void ejectQuarter(); + void turnCrank(); + void dispense(); + + void refill(); +} diff --git a/state/gumballmachinewinnerstate/winnerstate.d b/state/gumballmachinewinnerstate/winnerstate.d new file mode 100644 index 0000000..51d1d18 --- /dev/null +++ b/state/gumballmachinewinnerstate/winnerstate.d @@ -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 "раздаем два жевательных шарика за твою четвертак, потому что ТЫ ПОБЕДИТЕЛЬ!"; + } +}