Hallo,
ich habe eine Bewegungsrichtung, die ich über ein Enum setzen kann
|
C#-Quelltext
|
1
2
3
4
5
6
7
|
public enum MovementDirections
{
Up,
Down,
Left,
Right
}
|
und ein Grid, bestehend aus Zellen
|
C#-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class Cell
{
public Cell(int posX, int posY, bool isObstacle)
{
PosX = posX;
PosY = posY;
IsObstacle = isObstacle;
}
public int PosX { get; set; }
public int PosY { get; set; }
public bool IsObstacle { get; set; }
}
|
Beim Erzeugen der Karte speichere ich mir alle Zellen in einer Liste. Für das Verständnis,
|
C#-Quelltext
|
1
|
mapCells
|
ist die Liste mit sämtlichen Zellen der Karte.
|
C#-Quelltext
|
1
|
playerInfo.CurrentCell
|
speichert einfach nur die Zelle, auf der sich der Spieler momentan befindet.
Bei einer Bewegung möchte ich also alle Zellen einer Reihe haben. Dabei kann aber eine Zelle auch ein Hindernis sein, dann soll der Spieler beim "ersten" Hindernis stoppen. Die folgende Methode soll mir die finale Zelle zurückliefern, dabei gibt es viele Ähnlichkeiten im Code und die fast identischen Schleifen springen mir ins Auge. Ebenso die fast immer gleichen If-Abfragen. Dennoch fällt mir momentan keine saubere Lösung ein, da ich in dem zweiten Switch die Anzahl der Zellen in der Reihe brauche und diese Anzahl lege ich erst im ersten Switch fest.
Vielleicht hat ja jemand eine Idee, ob man den Code noch kürzer / sauberer / optimaler aufbauen kann.
|
C#-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
public Cell GetTargetCell(MovementDirections movementDirection)
{
List<Cell> cellsOnPath = new List<Cell>(); // Alle Zellen in der Reihe
for (int i = 0; i < mapCells.Count; i++)
{
Cell currentCell = mapCells[i];
switch (movementDirection)
{
case MovementDirections.Up:
if (currentCell.PosX == playerInfo.CurrentCell.PosX && currentCell.PosY > playerInfo.CurrentCell.PosY) // (0,1)
{
cellsOnPath.Add(currentCell);
}
break;
case MovementDirections.Down:
if (currentCell.PosX == playerInfo.CurrentCell.PosX && currentCell.PosY < playerInfo.CurrentCell.PosY) // (0,-1)
{
cellsOnPath.Add(currentCell);
}
break;
case MovementDirections.Left:
if (currentCell.PosX < playerInfo.CurrentCell.PosX && currentCell.PosY == playerInfo.CurrentCell.PosY) // (-1,0)
{
cellsOnPath.Add(currentCell);
}
break;
case MovementDirections.Right:
if (currentCell.PosX > playerInfo.CurrentCell.PosX && currentCell.PosY == playerInfo.CurrentCell.PosY) // (1,0)
{
cellsOnPath.Add(currentCell);
}
break;
}
}
int closestObstacleIndex = cellsOnPath.Count; // der Index für das "erste" Hindernis
for (int i = 0; i < cellsOnPath.Count; i++)
{
Cell currentCell = cellsOnPath[i];
switch (movementDirection)
{
case MovementDirections.Up:
if (currentCell.PosY < closestObstacleIndex)
{
closestObstacleIndex = currentCell.PosY;
}
break;
case MovementDirections.Down:
if (currentCell.PosY > closestObstacleIndex)
{
closestObstacleIndex = currentCell.PosY;
}
break;
case MovementDirections.Left:
if (currentCell.PosX > closestObstacleIndex)
{
closestObstacleIndex = currentCell.PosX;
}
break;
case MovementDirections.Right:
if (currentCell.PosX < closestObstacleIndex)
{
closestObstacleIndex = currentCell.PosX;
}
break;
}
}
return cellsOnPath[closestObstacleIndex];
}
|
Vielleicht geht es auch nicht besser, aber wie gesagt, ich sehe da schon einige Ähnlichkeiten im Code