/// <summary> /// calculate the number of adjacent mines for each matrix element /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="fs"></param> /// <param name="inputField"></param> /// <returns></returns> private string CalculateAdjacentMines(int x, int y, IFieldSettings fs, char[,] inputField) { int minX, minY, maxX, maxY; int result = 0; string res = ""; // Don't check outside the edge of the field minX = (x <= 0 ? 0 : x - 1); minY = (y <= 0 ? 0 : y - 1); maxX = (x >= fs.RowsNo - 1 ? fs.RowsNo : x + 2); maxY = (y >= fs.ColumnsNo - 1 ? fs.ColumnsNo : y + 2); // Check all immediate neighbours for mines for (int i = minX; i < maxX; i++) { for (int j = minY; j < maxY; j++) { if (inputField[i, j].Equals('*')) { result++; } } } res = result.ToString(); return(res); }
/// <summary> /// populate the input field matrix according to the given settings /// </summary> /// <param name="fs"></param> /// <returns></returns> public char[,] PopulateMineField(IFieldSettings fs) { if (fs == null) { throw new NullMineFieldException("Invalid mine field"); } if (fs.RowsNo < 0 || fs.RowsNo > 100) { throw new InvalidRowNumberException("Invalid rows number"); } if (fs.ColumnsNo < 0 || fs.ColumnsNo > 100) { throw new InvalidColumnNumberException("Invalid columns number"); } char[,] InputField = new char[fs.RowsNo, fs.ColumnsNo]; // Fill the input field with safe spots for (int i = 0; i < fs.RowsNo; i++) { for (int j = 0; j < fs.ColumnsNo; j++) { InputField[i, j] = '.'; } } //insert the mines randomly InputField = PlaceRandomMines(fs, InputField); return(InputField); }
protected FieldSettingsBase(MemberInfo member, IFieldSettings settings) : this(member) { Index = settings.Index; IsNullable = settings.IsNullable; NullValue = settings.NullValue; Converter = settings.Converter; }
public void Should_Throw_MineFieldException() { //arrange GameManager gameManager = new GameManager(); IFieldSettings fs = null; //act gameManager.PopulateMineField(fs); }
protected NestedField(long id, string name, IFieldSettings settings = null) { Guard.NotNullOrEmpty(name, nameof(name)); Guard.GreaterThan(id, 0, nameof(id)); fieldId = id; fieldName = name; if (settings != null) { isLocked = settings.IsLocked; isHidden = settings.IsHidden; isDisabled = settings.IsDisabled; } }
protected RootField(long id, string name, Partitioning partitioning, IFieldSettings settings = null) { Guard.NotNullOrEmpty(name, nameof(name)); Guard.GreaterThan(id, 0, nameof(id)); Guard.NotNull(partitioning, nameof(partitioning)); fieldId = id; fieldName = name; this.partitioning = partitioning; if (settings != null) { isLocked = settings.IsLocked; isHidden = settings.IsHidden; isDisabled = settings.IsDisabled; } }
/// <summary> /// generates and returns the output field matrix starting from the input field /// </summary> /// <param name="fs"></param> /// <param name="inputField"></param> /// <returns></returns> public string[,] GenerateOutputField(IFieldSettings fs, char[,] inputField) { string[,] outputField = new string[fs.RowsNo, fs.ColumnsNo]; for (int i = 0; i < fs.RowsNo; i++) { for (int j = 0; j < fs.ColumnsNo; j++) { if (inputField[i, j].Equals('*')) { outputField[i, j] = "*"; } else { outputField[i, j] = CalculateAdjacentMines(i, j, fs, inputField); } } } return(outputField); }
/// <summary> /// places the mines randomly inside the input field matrix /// </summary> /// <param name="fs"></param> /// <param name="InputField"></param> /// <returns></returns> private char[,] PlaceRandomMines(IFieldSettings fs, char[,] InputField) { int randomRow, randomCol; int minesToPlace = fs.MinesNo; Random random = new Random(); //place randomly the mines while (minesToPlace != 0) { randomRow = random.Next(0, fs.RowsNo); randomCol = random.Next(0, fs.ColumnsNo); //don't replace an existing mine if (InputField[randomRow, randomCol].Equals('*')) { continue; } InputField[randomRow, randomCol] = '*'; minesToPlace--; } return(InputField); }
public static ArrayField AddTags(this ArrayField field, long id, string name, TagsFieldProperties properties = null, IFieldSettings settings = null) { return(field.AddField(Tags(id, name, properties, settings))); }
public static ArrayField AddGeolocation(this ArrayField field, long id, string name, GeolocationFieldProperties properties = null, IFieldSettings settings = null) { return(field.AddField(Geolocation(id, name, properties, settings))); }
public static ArrayField AddDateTime(this ArrayField field, long id, string name, DateTimeFieldProperties properties = null, IFieldSettings settings = null) { return(field.AddField(DateTime(id, name, properties, settings))); }
public static ArrayField Array(long id, string name, Partitioning partitioning, ArrayFieldProperties properties = null, IFieldSettings settings = null) { return(new ArrayField(id, name, partitioning, properties, settings)); }
public static NestedField <ReferencesFieldProperties> References(long id, string name, ReferencesFieldProperties properties = null, IFieldSettings settings = null) { return(new NestedField <ReferencesFieldProperties>(id, name, properties, settings)); }
public static NestedField <JsonFieldProperties> Json(long id, string name, JsonFieldProperties properties = null, IFieldSettings settings = null) { return(new NestedField <JsonFieldProperties>(id, name, properties, settings)); }
public RootField CreateRootField(long id, string name, Partitioning partitioning, FieldProperties properties, IFieldSettings settings = null) { CheckProperties(properties); return(properties.CreateRootField(id, name, partitioning, settings)); }
public NestedField(long id, string name, T properties = null, IFieldSettings settings = null) : base(id, name, settings) { SetProperties(properties ?? new T()); }
public ArrayField(long id, string name, Partitioning partitioning, NestedField[] fields, ArrayFieldProperties properties = null, IFieldSettings settings = null) : this(id, name, partitioning, properties, settings) { Guard.NotNull(fields, nameof(fields)); this.fields = new FieldCollection <NestedField>(fields); }
public ArrayField(long id, string name, Partitioning partitioning, ArrayFieldProperties properties = null, IFieldSettings settings = null) : base(id, name, partitioning, properties, settings) { }
public RootField(long id, string name, Partitioning partitioning, T properties = null, IFieldSettings settings = null) : base(id, name, partitioning, settings) { SetProperties(properties ?? new T()); }
public static RootField <TagsFieldProperties> Tags(long id, string name, Partitioning partitioning, TagsFieldProperties properties = null, IFieldSettings settings = null) { return(new RootField <TagsFieldProperties>(id, name, partitioning, properties, settings)); }
public static NestedField <DateTimeFieldProperties> DateTime(long id, string name, DateTimeFieldProperties properties = null, IFieldSettings settings = null) { return(new NestedField <DateTimeFieldProperties>(id, name, properties, settings)); }
public override RootField CreateRootField(long id, string name, Partitioning partitioning, IFieldSettings settings = null) { return(Fields.Number(id, name, partitioning, this, settings)); }
public static NestedField <NumberFieldProperties> Number(long id, string name, NumberFieldProperties properties = null, IFieldSettings settings = null) { return(new NestedField <NumberFieldProperties>(id, name, properties, settings)); }
public abstract RootField CreateRootField(long id, string name, Partitioning partitioning, IFieldSettings settings = null);
public NestedField CreateNestedField(long id, string name, FieldProperties properties, IFieldSettings settings = null) { CheckProperties(properties); return(properties.CreateNestedField(id, name, settings)); }
public abstract NestedField CreateNestedField(long id, string name, IFieldSettings settings = null);
public override NestedField CreateNestedField(long id, string name, IFieldSettings settings = null) { throw new NotSupportedException(); }
public static Schema AddArray(this Schema schema, long id, string name, Partitioning partitioning, Func <ArrayField, ArrayField> handler, ArrayFieldProperties properties = null, IFieldSettings settings = null) { var field = Array(id, name, partitioning, properties, settings); if (handler != null) { field = handler(field); } return(schema.AddField(field)); }
public override NestedField CreateNestedField(long id, string name, IFieldSettings settings = null) { return(Fields.Number(id, name, this, settings)); }
public static Schema AddTags(this Schema schema, long id, string name, Partitioning partitioning, TagsFieldProperties properties = null, IFieldSettings settings = null) { return(schema.AddField(Tags(id, name, partitioning, properties, settings))); }