summaryrefslogtreecommitdiff
path: root/ws2015/eip/blaetter/07/H7-1C/de/lmu/tcs/Spielfeld.java
diff options
context:
space:
mode:
Diffstat (limited to 'ws2015/eip/blaetter/07/H7-1C/de/lmu/tcs/Spielfeld.java')
-rw-r--r--ws2015/eip/blaetter/07/H7-1C/de/lmu/tcs/Spielfeld.java205
1 files changed, 205 insertions, 0 deletions
diff --git a/ws2015/eip/blaetter/07/H7-1C/de/lmu/tcs/Spielfeld.java b/ws2015/eip/blaetter/07/H7-1C/de/lmu/tcs/Spielfeld.java
new file mode 100644
index 0000000..1044c1e
--- /dev/null
+++ b/ws2015/eip/blaetter/07/H7-1C/de/lmu/tcs/Spielfeld.java
@@ -0,0 +1,205 @@
1package de.lmu.tcs;
2
3import java.util.ArrayList;
4import java.util.Collections;
5
6/**
7 * Model
8 *
9 * Created by jost on 24.11.15.
10 */
11public class Spielfeld {
12
13 private final Zelle[][] feld;
14 private final int max_x; //Breite
15 private final int max_y; //Höhe
16
17 public Spielfeld(int breite, int höhe) {
18 this.max_x = breite;
19 this.max_y = höhe;
20 feld = new Zelle[this.max_x][this.max_y];
21 for (int y = 0; y < max_y; y++) {
22 for (int x=0;x<max_x - (y % 2);x++) {
23 final Position p = new Position(x, y);
24 feld[x][y] = new Zelle(p, Zelle.TOT);
25 }
26 }
27 }
28
29 private boolean isValid(int x, int y)
30 {
31 return x >= 0 && x < max_x && y >= 0 && y < max_y;
32 }
33
34 /**
35 * Liefert Zelle des Spielfelds an einer Position.
36 * @param p Position, der Zelle ausgelesen werden soll
37 * @return Zelle des Spielfelds an dieser Position, falls vorhanden; sonst null.
38 */
39 public Zelle getZelle(Position p) {
40 if (isValid(p.getX(), p.getY())) {
41 return feld[p.getX()][p.getY()];
42 } else {
43 return null;
44 }
45 }
46
47 /**
48 * Setzt eine gegebene Zelle ins Spielfeld ein.
49 * Überschreibt vorherige Zelle.
50 *
51 * @param zelle Einzusetzende Zelle
52 * @return Ob die Position der Zelle im Spielfeld enthalten ist (false bedeutuet ungültig).
53 */
54 public boolean setZelle(Zelle zelle) {
55 final Position p = zelle.getPosition();
56 if (isValid(p.getX(), p.getY())) {
57 feld[p.getX()][p.getY()] = zelle;
58 return true;
59 } else {
60 return false;
61 }
62 }
63
64 /**
65 * Liefert das gesamte Spielfeld direkt aus;
66 * nicht so schöne, da interne Repräsentierung offenbart wird
67 * und das Array von aussen verändert werden kann! Autsch!
68 *
69 * @return Alle Zellen des Felds im 2D array
70 */
71 public Zelle[][] getFeld() {
72 return feld;
73 }
74
75 /**
76 * BESSERE ALTERNATIVE zu getter-Methode getFeld():
77 * Liefert alle Zellen des Spielfeldes aus. Vorteile:
78 * 1) Interne Repräsentation bleibt versteckt.
79 * 2) Da die Zellen immutable sind, kann hier das
80 * Spielfeld auch nicht woanders manipuliert werden.
81 *
82 * @return Alle Zellen des Spielfeldes als ArrayList
83 */
84 public ArrayList<Zelle> getZellen() {
85 ArrayList<Zelle> result = new ArrayList<>(max_x*max_y);
86 for (int x=0;x<max_x;x++) {
87 for (int y = 0; y < max_y; y++) {
88 result.add(feld[x][y]);
89 }
90 }
91
92 return result;
93 }
94
95 /**
96 * Genau wie getZellen, nur mit echtem Array anstatt ArrayList.
97 * Vorteile bleiben erhalten!
98 *
99 * @return Alle Zellen des Spielfeldes als Array
100 */
101 public Zelle[] getZellenAry() {
102 Zelle[] result = new Zelle[max_x*max_y];
103 int i = 0;
104 for (int x=0;x<max_x;x++) {
105 for (int y = 0; y < max_y; y++) {
106 result[i] = feld[x][y];
107 i++;
108 }
109 }
110 return result;
111 }
112
113 /**
114 * Berechnet alle Nachbarn einer Zelle.
115 *
116 * @param zelle deren Nachbarn berechnet werden sollen
117 * @return alle Nachbarn von {@code zelle}, Anzahl Nachbarn variabel
118 */
119 public ArrayList<Zelle> getNachbarn(Zelle zelle) {
120 ArrayList<Zelle> result = new ArrayList<>();
121 if (zelle == null)
122 return result;
123 Position pos = zelle.getPosition();
124 Position[] offsets = { new Position(0, -1), new Position(1, -1)
125 , new Position(-1, 0), new Position(1, 0)
126 , new Position(0, 1), new Position (1, 1)
127 };
128 for (Position offset : offsets) {
129 Zelle nachbar = this.getZelle(pos.add(offset));
130 if (nachbar != null) {
131 result.add(nachbar);
132 }
133 }
134 return result;
135 }
136
137 // /**
138 // * Berechnet alle Nachbarn einer Zelle.
139 // * Variante von getNachbar mit Array anstatt ArrayList
140 // *
141 // * @param zelle deren Nachbarn berechnet werden sollen
142 // * @return alle Nachbarn von {@code zelle}, Anzahl Nachbarn variabel
143 // */
144 // public Zelle[] getNachbarnAry(Zelle zelle) {
145 // Position pos = zelle.getPosition();
146 // int minx = Math.max(pos.getX() - 1, 0);
147 // int maxx = Math.min(pos.getX() + 1, this.max_x);
148 // int miny = Math.max(pos.getY() - 1, 0);
149 // int maxy = Math.min(pos.getY() + 1, this.max_y);
150 // Zelle[] result = new Zelle[maxx - minx * maxy - miny];
151 // int i = 0;
152 // for (int x = minx; x <= maxx; x++) {
153 // for (int y = miny; y <= maxy; y++) {
154 // if (x!=0 || y!=0) {
155 // result[i] = feld[x][y];
156 // i++;
157 // }
158 // }
159 // }
160 // return result;
161 // }
162
163 /**
164 * Berechnet alle Nachbarn einer Zelle auf Wrap-Around Spielfeld..
165 *
166 * @param zelle deren Nachbarn berechnet werden sollen
167 * @return alle Nachbarn von {@code zelle}, Anzahl Nachbarn variabel
168 */
169 public ArrayList<Zelle> getNachbarnWrapped(Zelle zelle) {
170 ArrayList<Zelle> result = new ArrayList<Zelle>(8);
171 Position pos = zelle.getPosition();
172 for (int x = -1; x <= 1; x++) {
173 for (int y = -1; y <= 1; y++) {
174 if (x!=0 || y!=0) {
175 Zelle z = getZelle(new Position((pos.getX() + x + max_x )% max_x, (pos.getY() + y + max_y) % max_y));
176 result.add(z);
177 }
178 }
179 }
180 return result;
181 }
182
183 /**
184 * Berechnet alle Nachbarn einer Zelle auf Warap-Around Spielfeld.
185 * Variante von getNachbarWrapped mit Array anstatt ArrayList
186 *
187 * @param zelle deren Nachbarn berechnet werden sollen
188 * @return alle Nachbarn von {@code zelle}, Anzahl Nachbarn variabel
189 */
190 public Zelle[] getNachbarnAryWrapped(Zelle zelle) {
191 Zelle[] result = new Zelle[8];
192 Position pos = zelle.getPosition();
193 int i = 0;
194 for (int x = -1; x <= 1; x++) {
195 for (int y = -1; y <= 1; y++) {
196 if (x!=0 || y!=0) {
197 Zelle z = getZelle(new Position((pos.getX() + x + max_x )% max_x, (pos.getY() + y + max_y) % max_y));
198 result[i] = z;
199 i++;
200 }
201 }
202 }
203 return result;
204 }
205}