1
+
2
+
3
+ console.log("Hello World!");
4
+
5
+ /* Events */
6
+ var Events = {
7
+ START: 0,
8
+ GUESS: 1,
9
+ CORRECT: 2,
10
+ INCORRECT: 3
11
+ }
12
+
13
+ /* States */
14
+ var States = {
15
+ START: 0,
16
+ PLAYING: 1,
17
+ GAMEOVER: 2
18
+ }
19
+
20
+ /* Model */
21
+ class Model {
22
+ constructor () {
23
+ this.gameState = States.START;
24
+ this.theNumber = -1;
25
+ this.guesses = 0;
26
+ this.lastGuess = -1;
27
+ }
28
+
29
+ init () {
30
+ this.theNumber = Math.floor(Math.random() * 100) + 1
31
+ this.guesses = 0
32
+ this.lastGuess = -1
33
+ }
34
+
35
+ guess (new_guess) {
36
+ this.guesses++;
37
+ this.lastGuess = new_guess;
38
+
39
+ if (new_guess == this.theNumber) {
40
+ return Events.CORRECT;
41
+ } else {
42
+ return Events.INCORRECT;
43
+ }
44
+ }
45
+ }
46
+
47
+
48
+ /* View Interface */
49
+ class View {
50
+ constructor (root) {
51
+ console.log("here!");
52
+ this.root = root;
53
+ this.gameOut = document.getElementById('#output')
54
+ this.gameIn = document.getElementById("#gameInput")
55
+ this.gameBtn = document.getElementById("#gameBtn")
56
+ this.btn_cb = null;
57
+ this.last_guess_count = 0;
58
+
59
+ this.btnHandler = this.btnHandler.bind(this);
60
+ this.update = this.update.bind(this);
61
+
62
+ console.log(this.gameBtn);
63
+ this.gameBtn.addEventListener("click", this.btnHandler);
64
+ }
65
+
66
+ addButtonListener( btn_cb ) {
67
+ this.btn_cb = btn_cb;
68
+ }
69
+
70
+ btnHandler () {
71
+ var inputText = this.gameIn.value;
72
+ if (this.btn_cb) {
73
+ this.btn_cb(parseInt(inputText));
74
+ }
75
+ }
76
+
77
+ update (model, event) {
78
+ if (model.guesses == this.last_guess_count) {
79
+ return;
80
+ }
81
+ this.last_guess_count = model.guesses;
82
+
83
+ if (model.lastGuess == "") {
84
+ this.gameOut.innerHTML += "Type a number between 1 and 100!<br>";
85
+ }
86
+
87
+ if (isNaN(model.lastGuess)) {
88
+ this.gameOut.innerHTML += "That wasn't a number...<br>";
89
+ }
90
+
91
+ if (model.lastGuess == model.theNumber) {
92
+ this.gameOut.innerHTML += "You got it in " + model.guesses + " tries!<br>";
93
+ }
94
+
95
+ if (model.lastGuess < model.theNumber) {
96
+ this.gameOut.innerHTML += model.lastGuess + " was too low...<br>"
97
+ }
98
+
99
+ if (model.lastGuess > model.theNumber) {
100
+ this.gameOut.innerHTML += model.lastGuess + " was too high...<br>"
101
+ }
102
+ }
103
+ }
104
+
105
+
106
+ /* Control Logic */
107
+ class Control {
108
+ constructor () {
109
+ this.fsm = this.fsm.bind(this);
110
+ this.guessHandler = this.guessHandler.bind(this);
111
+ this.setView = this.setView.bind(this);
112
+ }
113
+
114
+ setView (view) {
115
+ this.view = view;
116
+ }
117
+
118
+ fsm(model, event, data) {
119
+ switch (model.gameState) {
120
+ case States.START:
121
+ switch (event) {
122
+ case Events.START:
123
+ model.init();
124
+ model.gameState = States.PLAYING;
125
+ break;
126
+ }
127
+ break;
128
+
129
+ case States.PLAYING:
130
+ switch (event) {
131
+ case Events.GUESS: {
132
+ var result = model.guess(data);
133
+ this.fsm(model, result, data);
134
+ } break;
135
+ case Events.CORRECT:
136
+ model.gameState = States.GAMEOVER;
137
+ break;
138
+ case Events.INCORRECT:
139
+ model.gameState = States.PLAYING;
140
+ break;
141
+ }
142
+ break;
143
+ case States.GAMEOVER:
144
+ break;
145
+ }
146
+
147
+ this.view.update(model, event);
148
+ }
149
+
150
+ guessHandler( guessText ) {
151
+ q(Events.GUESS, guessText);
152
+ }
153
+ }
154
+
155
+
156
+
157
+ /* Main */
158
+ var model = new Model();
159
+ model.init();
160
+
161
+ var control = new Control();
162
+
163
+ var gameroot = document.getElementById("#gamecontainer");
164
+ var view = new View(gameroot)
165
+ view.addButtonListener(control.guessHandler);
166
+ control.setView(view);
167
+
168
+ function q(event, data) {
169
+ setTimeout(control.fsm, 0, model, event, data);
170
+ }
171
+
172
+ control.fsm(model, Events.START, {});
0 commit comments