4 gewinnt diagonale Abfrage C#
Hey Leute, ich bin gerade dabei ein 4 gewinnt zu programmieren in C#. Nun kommt ich bei der diagonalen Abfrage ob jemand gewonnen hat nicht weiter. Horizontal und vertikal habe ich jeweils 2 for Schleifen benutzt:
for (int y = 0; y < 7; y++)
{
for (int x = 0; x < 8; x++)
{
if (gespWert == spielfeld[x, y] && spielfeld[x, y] != 0)
{
++counter;
}
else
{
counter = 0;
}
gespWert = spielfeld[x, y];
if (counter == 3)
{
MessageBox.Show("Sie haben gewonnen!");
finish = true;
break;
}
}
}
Nun wollte ich die diagonale Abfrage mit 2 while Schleifen machen, die eben dem x und dem y Wert im Array immer 1 hinzu addieren und das ganze dann mit einem break beendet wird. Zudem muss ich ja auch noch eine if Abfrage machen ob sich der abgefragte Bereich überhaupt noch im Array befindet, oder?
Könnt ihr mir ein bisschen auf die Sprünge helfen?
Danke schonmal im Vorraus!
2 Antworten
Mein Vorschlag:
for(StartX = FeldgrößeX-1; StartX > 0; StartX--)
{
int y = -1;
for (x = StartX; x < FeldgrößeX; x++)
{
y++;
if (Spielfeld[x,y] nicht vorhanden)
{
break;
}
if(Spielfeld[x,y] markiert von Spieler)
{
counter++;
}else{
counter = 0;
}
if (counter == 3)
{
MessageBox.Show("Sie haben gewonnen!");
finish = true;
break;
}
}
}
for(StartY = 0; StartY<FeldgrößeY; StartY++)
{
int x = -1;
for (y = StartY; y < FeldgrößeY; y++)
{
x++;
if (Spielfeld[x,y] nicht vorhanden)
{
break;
}
if(Spielfeld[x,y] markiert von Spieler)
{
counter++;
}else{
counter = 0;
}
if (counter == 3)
{
MessageBox.Show("Sie haben gewonnen!");
finish = true;
break;
}
}
}
Kann gut sein, dass die Syntax falsch ist, da ich gerade in Java bin, aber der Sinn sollte rüber kommen.
Hi hier ein stwas andere ansatz... in dem vectoren ueberprueft werden...
public enum Cell { EMPTY, BLUE, RED }
class Vector
{
public int i;
public int j;
public Vector(int i, int j) { this.i = i; this.j = j; }
}
private static List<List<Vector>> winTemplates = new List<List<Vector>>
{
Enumerable.Range(0, 4).Select(x => new Vector(x, 0)).ToList(),
Enumerable.Range(0, 4).Select(x => new Vector(0, x)).ToList(),
Enumerable.Range(0, 4).Select(x => new Vector(x, x)).ToList(),
Enumerable.Range(0, 4).Select(x => new Vector(4 - x - 1, x)).ToList()
};
private static int boardHeight = 8;
private static int boardWidth = 8;
private static Cell[,] board = new Cell[boardHeight, boardHeight];
private static Func<Tuple<Cell, List<Vector>>> findWinOnBoard = () => Enumerable.Range(0, boardHeight - 4)
.SelectMany(i => Enumerable.Range(0, boardWidth - 4).Select(j => new Vector(i, j)))
.Select(p => getWinFromPosition(p))
.FirstOrDefault();
private static Func<Vector, Tuple<Cell, List<Vector>>> getWinFromPosition = p => winTemplates
.SelectMany(winTemplate => winTemplate
.Select(q => new Vector(p.i + q.i, p.j + q.j))
.GroupBy(v => board[v.i, v.j])
.Where(g => g.Key != Cell.EMPTY && g.Count() == 4)
.Select(g => Tuple.Create(g.Key, g.ToList())))
.FirstOrDefault();
static void Main(string[] args)
{
// dein spiel code here...
var win = findWinOnBoard();
if (null != win)
{
Console.WriteLine("Das {0] team hat gewonnen", win.Item1.ToString());
}
}
}