@@ -16,38 +16,10 @@ class Board(fields: TwoDBoard<Field> = generateFields()): RectangularBoard<Field
16
16
17
17
constructor (board: Board ): this (board.gameField.clone())
18
18
19
- /* *
20
- * Setzt einen Pinguin an gewählte Koordinaten. Diese Methode ist nur für
21
- * den Server relevant, da keine vollständige Überprüfung auf korrekte Züge
22
- * durchgeführt wird. Um für einen Spieler einen neuen Pinguin zu setzen,
23
- * die [perform][sc.plugin2015.SetMove.perform]
24
- * -Methode benutzen
25
- *
26
- * @param x
27
- * X-Koordinate
28
- * @param y
29
- * Y-Koordinate
30
- * @param penguin
31
- * Pinguin, der gesetzt werden soll.
32
- */
33
- // @Throws(IllegalArgumentException::class)
34
- // fun putPenguin(x: Int, y: Int, penguin: Penguin?) {
35
- // require((x < 0 || y < 0 || x >= Constants.BOARD_SIZE || y >= Constants.BOARD_SIZE || fields[x][y].fish !== 1 || fields[x][y].penguin) == null)
36
- // fields[x][y].putPenguin(penguin)
37
- // }
38
- // /**
39
- // * nur für den Server relevant
40
- // */
41
- // @Throws(IllegalArgumentException::class)
42
- // private fun putPenguinMove(x: Int, y: Int, penguin: Penguin) {
43
- // require((x < 0 || y < 0 || x >= Constants.BOARD_SIZE || y >= Constants.BOARD_SIZE || fields[x][y].fish <= 0 || fields[x][y].penguin) == null)
44
- // fields[x][y].putPenguin(penguin)
45
- // }
46
-
47
19
override fun isValid (coordinates : Coordinates ) =
48
20
(coordinates.x + coordinates.y) % 2 == 0 &&
49
- coordinates.x >= 0 &&
50
- super .isValid(coordinates.copy(coordinates.x / 2 ))
21
+ coordinates.x >= 0 &&
22
+ super .isValid(coordinates.copy(coordinates.x / 2 ))
51
23
52
24
/* * Gibt das Feld an den gegebenen Koordinaten zurück. */
53
25
override operator fun get (x : Int , y : Int ) =
@@ -64,11 +36,11 @@ class Board(fields: TwoDBoard<Field> = generateFields()): RectangularBoard<Field
64
36
}
65
37
66
38
fun possibleMovesFrom (pos : Coordinates ) =
67
- Vector .DoubledHex .directions.flatMap { vector ->
68
- (1 until Constants .BOARD_SIZE ).map {
69
- Move .run (pos, vector * it)
70
- }.takeWhile { getOrEmpty(it.to).fish > 0 }
71
- }
39
+ Vector .DoubledHex .directions.flatMap { vector ->
40
+ (1 until Constants .BOARD_SIZE ).map {
41
+ Move .run (pos, vector * it)
42
+ }.takeWhile { getOrEmpty(it.to).fish > 0 }
43
+ }
72
44
73
45
/* * Returns a list of the non-null filter outputs */
74
46
fun <T > filterFields (filter : (Field , Coordinates ) -> T ? ): Collection <T > =
@@ -86,22 +58,29 @@ class Board(fields: TwoDBoard<Field> = generateFields()): RectangularBoard<Field
86
58
fun getOrEmpty (key : Coordinates ? ) = key?.let { getOrNull(it) } ? : Field ()
87
59
88
60
override val entries: Set <Map .Entry <Coordinates , Field >>
89
- get() = filterFields { field , coordinates -> FieldPosition (coordinates, field ) }.toSet()
61
+ get() = filterFields { f , coordinates -> FieldPosition (coordinates, f ) }.toSet()
90
62
91
63
override fun clone (): Board = Board (this )
92
64
93
65
companion object {
94
66
/* * Generiert ein neues Spielfeld mit zufällig auf dem Spielbrett verteilten Fischen. */
95
67
private fun generateFields (seed : Int = Random .nextInt()): TwoDBoard <Field > {
96
- var remainingFish = 100
68
+ var remainingFish = Constants . BOARD_SIZE * ( Constants . BOARD_SIZE + 1 )
97
69
val random = Random (seed)
98
- // TODO val holes =
99
- return List (Constants .BOARD_SIZE ) {
70
+ println ( " Board seed: $seed " )
71
+ return List (Constants .BOARD_SIZE / 2 ) {
100
72
MutableList (Constants .BOARD_SIZE ) {
101
- val fish = random.nextInt(remainingFish) / 30 + 1
73
+ val rand = random.nextInt(remainingFish)
74
+ if (rand < 5 )
75
+ return @MutableList Field ()
76
+ val fish = rand / 20 + 1
102
77
remainingFish - = fish
103
78
Field (fish)
104
79
}
80
+ }.let {
81
+ it + it.asReversed().map { list ->
82
+ MutableList (Constants .BOARD_SIZE ) { index -> list[Constants .BOARD_SIZE - index - 1 ].clone() }
83
+ }
105
84
}
106
85
}
107
86
0 commit comments