16
16
Game * = ref object of RootObj
17
17
player_count* : int
18
18
players* : seq [Player ]
19
- current_player_number* : int
20
- winner_player_number* : int
19
+ current_player_number* : int # 1, 2, 3,... but 0 is never used
20
+ winner_player_number* : int # 0=no winner; -1=stalemate; n=winner
21
21
22
22
Player * = ref object of RootObj
23
23
name* : string
@@ -46,13 +46,11 @@ method display(self: Player, msg: string) {.base.} =
46
46
echo $ msg
47
47
48
48
49
- method get_move (self: Player , game: Game ): string {.base .} =
49
+ method get_move * (self: Player , game: Game ): string {.base .} =
50
50
var move_list: seq [string ] = @ []
51
51
var descriptive_move_list: OrderedTable [string , string ]
52
52
var compact_description: bool = false
53
53
echo " "
54
- echo " $#'s TURN" .format ([self.name])
55
- echo " "
56
54
echo TAB & " Status:"
57
55
echo indent (game.status (), 2 , TAB )
58
56
game.set_possible_moves (move_list)
@@ -92,15 +90,20 @@ method set_possible_moves*(self: Game, moves: var seq[string]) {.base.} =
92
90
93
91
94
92
method set_possible_moves * (self: Game , moves: var OrderedTable [string , string ]) {.base .} =
95
- raise newException (FieldError , " possible_moves( ) must be overridden" )
93
+ raise newException (FieldError , " set_possible_moves(OrderedTable ) must be overridden" )
96
94
97
95
98
96
method current_player * (self: Game ) : Player {.base .} =
99
97
self.players[self.current_player_number - 1 ]
100
98
101
99
102
100
method winning_player * (self: Game ) : Player {.base .} =
103
- self.players[self.winner_player_number - 1 ]
101
+ if self.winner_player_number > NO_WINNER_YET :
102
+ return self.players[self.winner_player_number - 1 ]
103
+ elif self.winner_player_number == NO_WINNER_YET :
104
+ return Player (name: " NO WINNER YET" )
105
+ else :
106
+ return Player (name: " STALEMATE OR TIE" )
104
107
105
108
106
109
method next_player_number * (self: Game ): int {.base .} =
@@ -130,10 +133,18 @@ method determine_winner(self: Game) {.base.} =
130
133
raise newException (FieldError , " determine_winner() must be overridden" )
131
134
132
135
133
- method scoring * (self: Game ): int {.base .} =
136
+ method scoring * (self: Game ): float {.base .} =
134
137
raise newException (FieldError , " scoring() must be overridden (if used)" )
135
138
136
139
140
+ method get_state * (self: Game ): string {.base .} =
141
+ raise newException (FieldError , " get_state() must be overridden (if used)" )
142
+
143
+
144
+ method restore_state * (self: Game , state: string ): void {.base .} =
145
+ raise newException (FieldError , " restore_state() must be overridden (if used)" )
146
+
147
+
137
148
method setup * (self: Game , players: seq [Player ]) {.base .} =
138
149
raise newException (FieldError , " setup() must be overridden" )
139
150
@@ -146,15 +157,15 @@ method default_setup*(self: Game, players: seq[Player]) {.base.} =
146
157
147
158
148
159
method play * (self: Game ) : seq [string ] {.base discardable .} =
149
- var history: seq [ string ] = @ []
160
+ result = @ []
150
161
var move: string = " "
151
162
while not self.is_over ():
152
- # when declaredInScope( self.status):
153
- # self.current_player.display(self.status( ))
163
+ self.current_player. display ( " ----------------- " )
164
+ self.current_player.display (" $1's Turn " . format (self.current_player.name ))
154
165
move = self.current_player.get_move (self)
155
166
if move.isNil:
156
- return history
157
- history .add (move)
167
+ break
168
+ result .add (move)
158
169
self.current_player.display (" " )
159
170
self.current_player.display (TAB & self.make_move (move))
160
171
self.determine_winner ()
@@ -164,5 +175,5 @@ method play*(self: Game) : seq[string] {.base discardable.} =
164
175
self.current_player.display (" STALEMATE." )
165
176
else :
166
177
self.current_player.display (" WINNER IS $#" .format ([self.winning_player.name]))
167
- return history
178
+ break
168
179
self.current_player_number = self.next_player_number ()
0 commit comments