Skip to content

Commit 2654b7a

Browse files
committed
Make .play more friendly to AI
1 parent db86f2b commit 2654b7a

File tree

2 files changed

+26
-15
lines changed

2 files changed

+26
-15
lines changed

src/turn_based_game.nim

+25-14
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ type
1616
Game* = ref object of RootObj
1717
player_count*: int
1818
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
2121

2222
Player* = ref object of RootObj
2323
name*: string
@@ -46,13 +46,11 @@ method display(self: Player, msg: string) {.base.} =
4646
echo $msg
4747

4848

49-
method get_move(self: Player, game: Game): string {.base.} =
49+
method get_move*(self: Player, game: Game): string {.base.} =
5050
var move_list: seq[string] = @[]
5151
var descriptive_move_list: OrderedTable[string, string]
5252
var compact_description: bool = false
5353
echo ""
54-
echo "$#'s TURN".format([self.name])
55-
echo ""
5654
echo TAB & "Status:"
5755
echo indent(game.status(), 2, TAB)
5856
game.set_possible_moves(move_list)
@@ -92,15 +90,20 @@ method set_possible_moves*(self: Game, moves: var seq[string]) {.base.} =
9290

9391

9492
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")
9694

9795

9896
method current_player*(self: Game) : Player {.base.} =
9997
self.players[self.current_player_number - 1]
10098

10199

102100
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")
104107

105108

106109
method next_player_number*(self: Game): int {.base.} =
@@ -130,10 +133,18 @@ method determine_winner(self: Game) {.base.} =
130133
raise newException(FieldError, "determine_winner() must be overridden")
131134

132135

133-
method scoring*(self: Game): int {.base.} =
136+
method scoring*(self: Game): float {.base.} =
134137
raise newException(FieldError, "scoring() must be overridden (if used)")
135138

136139

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+
137148
method setup*(self: Game, players: seq[Player]) {.base.} =
138149
raise newException(FieldError, "setup() must be overridden")
139150

@@ -146,15 +157,15 @@ method default_setup*(self: Game, players: seq[Player]) {.base.} =
146157

147158

148159
method play*(self: Game) : seq[string] {.base discardable.} =
149-
var history: seq[string] = @[]
160+
result = @[]
150161
var move: string = ""
151162
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))
154165
move = self.current_player.get_move(self)
155166
if move.isNil:
156-
return history
157-
history.add(move)
167+
break
168+
result.add(move)
158169
self.current_player.display("")
159170
self.current_player.display(TAB & self.make_move(move))
160171
self.determine_winner()
@@ -164,5 +175,5 @@ method play*(self: Game) : seq[string] {.base discardable.} =
164175
self.current_player.display("STALEMATE.")
165176
else:
166177
self.current_player.display("WINNER IS $#".format([self.winning_player.name]))
167-
return history
178+
break
168179
self.current_player_number = self.next_player_number()

turn_based_game.nimble

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Package
22

3-
version = "1.1.0"
3+
version = "1.1.1"
44
author = "John Dupuy"
55
description = "Game rules framework for turn-based games"
66
license = "MIT"

0 commit comments

Comments
 (0)