conception.adoc 4.55 KB
Newer Older
Gerson Sunyé's avatar
Gerson Sunyé committed
1
= Conception détaillée
2

3
== diagramme de classe
4

5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[plantuml]
....
interface Joueur {
    askRole()
    yourRole(role : String)
}

interface Creature {
    placerArtemia()
    placerCreature()
    placerCible()
    askCarteTraque()
}

interface Traque {
    recupLieuxFromDefausse()
    askCarteSurvie()
    askCarteLieux()
    getLieuxDefausse()
24
    perdrePionsVolonte(pv : integer)
25
26
27
28
}

interface InterfaceServeur {
    lacherPrise()
29
30
31
    placerCreature(lieux : ArrayList<Lieu>)
    placerCible(lieux : ArrayList<Lieu>)
    placerArtemia(lieux : ArrayList<Lieu>)
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
    setLieu(id : integer, lieu : Lieu)
    setCarteSurvie(id : integer, carte : CarteSurvie)
    setCarteTraque(carte : CarteTraque)
    wantRole()
    rendDefausse(id : integer, defausse : Lieux[10])

}

Joueur <|-- Traque
Joueur <|-- Creature

interface CarteLieu {
    getId() : Integer
    power()
}

interface CarteSurvie {
    getNom() : String
}
interface CarteTraque {
    getNom() : String
}

class Serveur {
56
57
58
59
    listeJoueur : ArrayList<Joueur>
    creature : Creature
    traque : ArrayList<Traque>
    listeDesDefausses : ArrayList<ArrayList<Lieu>>
60
61
62
63

}

class Client {
64
65
66
67
68
    id :Integer
    defausseLieux : ArrayList<Lieu>
    mainLieux : ArrayList<Lieu>
    mainSurvie : ArrayList<CarteSurvie>
    mainTraque : ArrayList<CarteTraque>
69

70
71
72
    getId() : Integer
    resister(nbPv : Integer)
    lacherPrise()
73
74
75
76
77
78
79
80
81
}

InterfaceServeur <|-- Serveur
Traque <|-- Client
Creature <|-- Client
Client *-- "[0-10] main" CarteLieu
Client *-- "[0-10] defausse" CarteLieu
Client *-- "[0-*] main" CarteSurvie
Client *-- "[0-3] main" CarteTraque
82
Serveur *-- "[2-7] joueurs" Client
83
....
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
== Game Server

.GameSever
[plantuml]
....
interface GameServer {
    createGame(numberOfPlayers : Integer): Integer
    join(gameId : Integer): Integer
}

package game {
    class "GameServerController" as controller {
        createGame(numberOfPlayers : Integer): Integer
        join(gameId : Integer): Integer
    }
Gerson Sunyé's avatar
Gerson Sunyé committed
99
    class "Game \n[Thread]" as game {
100
101
102
103
104
105
        id : Integer {id}
        numberOfPlayers : Integer
    }
    class "Player" as player {
        id : Integer {id}
    }
106
107
108
109
110
111
112
    class "Creature" as creature {

    }
    class "Traque" as traque {

    }

113
114
    GameServer <|-- controller
    controller *- "[*] games" game : \t\t\t
Gerson Sunyé's avatar
Gerson Sunyé committed
115
    game *-- "[0..7] players" player
116
117
118
119

    creature --|> player
    traque --|> player

120
121
122
123
124
125
126
127
128
129
}
note right of game: Uncompleted!
....

[plantuml]
....
state Game {
    [*] --> Created
    Created -> Started : start()
    Started -> Phase1 : \t
130
131
132
133
134
135
    Phase1 --> Phase2
    Phase2 --> Phase3
    Phase3 --> Phase4
    Phase4 --> Phase1 : NOT victory condition
    Phase4 --> [*] : victory condition
    }
136
137
138
}
note right of Game : Uncompleted!
....
139
victory condition = `"Game::secours == 0 OR Game::assimilation == 0"`
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168

=== Opérations du GameServerController

.Create Game
[source,OCL]
----
GameServerController::createGame(numberOfPlayers : Integer): Integer
pre:
    numberOfPlayers > 1 and numberOfPlayers <= 7

post:
    self.games -> exists(each | each.isOclNew())and
    game.oclinState(Created)
----

.Join Game
[source,OCL]
----
GameServerController::join(gameId : Integer): Integer
pre:
    self.games -> exists(each | each.id = gameId)
post:
    let game = self.games->select(id = gameId)->first() in
    game.players->exists(each| each.isOclNew())
----

.Start Game
[plantuml]
----
Gerson Sunyé's avatar
Gerson Sunyé committed
169
partition Game::run() {
170
171
172
173
174
175
176
177
178
    start
    while (enough players?)
        :JoinRequest<
        :handleRequest();
    endwhile
    :Game Start>
    stop
}
----
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241


=== Opérations de Creature

.L'interface Créature
[plantuml]
....
interface Creature {
    setCard(Card : String): void
    placerCreature(lieu : String) : void
    placerArtemia(lieu : String) : void
    placerCible(lieux : [String, String]) : void
}
....


.Placer le jeton Creature
[source,OCL]
----
Creature::placerCreature(String : lieu) : void
pre:
    Game::phase = 2 and self.position = null
post:
    self.position = lieu
----


.Placer le jeton Artemia
[source,OCL]
----
Creature::placerArtemia(String : lieu) : void
pre:
    Game::phase = 2 and self.artemia = null
post:
    self.artemia = lieu
----


.Placer le jeton Cible
[source,OCL]
----
Creature::placerCible({String, String} : lieux) : void
pre:
    Game::phase = 2 and (self.cible = null or self.cible->size() = 0)
post:
    self.cible = lieux
----

== Invariant de Traque
.invariant sur les cartes Lieu en mains
[source,OCL]
----
//pas de doublon dans les cartes Lieu en main
Context Traque
inv: self.carteLieu->isUnique(each : Lieu | each.name)
----

.invariant sur les pions Volonté
[source,OCL]
----
Context Traque
inv: self.volonté >= 0 and self.volonté <= 3
----