Files
4Gewinnt/API/Models/Game/GameField.cs
T

79 lines
2.0 KiB
C#

namespace API.Models.Game;
public readonly struct Coordinates(int x, int y)
{
public readonly int X = x;
public readonly int Y = y;
}
public enum PlaceResult
{
OutOfGameField,
NotAllowedPlayer,
OccupiedRed,
OccupiedYellow,
InvalidFieldValue,
Placed
}
public enum FieldState
{
OutOfGameField,
Empty,
OccupiedRed,
OccupiedYellow,
InvalidFieldValue
}
public class GameField(Coordinates gFs)
{
public int[,] CurrentField { get; } = new int[gFs.Y, gFs.X];
public int[,] BackupField { get; } = new int[gFs.Y, gFs.X];
public PlaceResult Place(Coordinates coordinates, int player)
{
if (coordinates.X < 0 || coordinates.X >= CurrentField.GetLength(1) ||
coordinates.Y < 0 || coordinates.Y >= CurrentField.GetLength(0))
return PlaceResult.OutOfGameField;
if (player != 1 && player != 2)
return PlaceResult.NotAllowedPlayer;
var currentValue = CurrentField[coordinates.Y, coordinates.X];
if (currentValue != 0)
return currentValue switch
{
1 => PlaceResult.OccupiedRed,
2 => PlaceResult.OccupiedYellow,
_ => PlaceResult.InvalidFieldValue
};
CreateSave();
CurrentField[coordinates.Y, coordinates.X] = player;
return PlaceResult.Placed;
}
public FieldState CheckField(Coordinates coordinates)
{
if (coordinates.X < 0 || coordinates.X >= CurrentField.GetLength(1) ||
coordinates.Y < 0 || coordinates.Y >= CurrentField.GetLength(0))
return FieldState.OutOfGameField;
var currentValue = CurrentField[coordinates.Y, coordinates.X];
return currentValue switch
{
0 => FieldState.Empty,
1 => FieldState.OccupiedRed,
2 => FieldState.OccupiedYellow,
_ => FieldState.InvalidFieldValue
};
}
private void CreateSave()
{
Array.Copy(CurrentField, BackupField, CurrentField.Length);
}
}