private void GameProcess() { gs = GameState.Playing; var rnd = new Random(); while (gs == GameState.Playing) { for (var i = 0; i < _field.GetLength(0); i++) { for (var j = 0; j < _field.GetLength(1); j++) { if (_field[i, j].M.Count > 0) { if (_field[i, j].M.Count >= 2) // what if female and male moles are in one cell { var femIndex = _field[i, j].M.FindIndex(x => x.Gender == Gender.Female && x.Hunger == GlobalVars.MaxHunger); var malIndex = _field[i, j].M.FindIndex(x => x.Gender == Gender.Male && x.Hunger == GlobalVars.MaxHunger); if (femIndex >= 0 && malIndex >= 0) { _field[i, j].M.Add(new Mole((Gender)rnd.Next(0, 2), GlobalVars.DefaultSpeed, i, j, _moleId++)); } } foreach (var tmp in _field[i, j].M) { tmp.Eat(_field[i, j].P); } if (_field[i, j].P == null || _field[i, j].C != null) // move mole { if (_field[i, j].M.Count == 0) { break; } for (var x = 0; x < _field[i, j].M.Count; x++) { if (_field[i, j].M[x].Moved) { continue; } var succeedMole = false; while (!succeedMole) // while it's possible to move { var d = (Direction)rnd.Next(0, 4); switch (d) { case Direction.Left: if (i - 1 >= 0 && i - 1 != _field[i, j].M[x].PrevW) { _field[i, j].M[x].Moved = true; _field[i, j].M[x].PrevW = i; _field[i, j].M[x].PrevH = j; _field[i - 1, j].M.Add(_field[i, j].M[x]); _field[i, j].M.Remove(_field[i, j].M[x]); succeedMole = true; } break; case Direction.Up: if (j - 1 >= 0 && j - 1 != _field[i, j].M[x].PrevH) { _field[i, j].M[x].Moved = true; _field[i, j].M[x].PrevW = i; _field[i, j].M[x].PrevH = j; _field[i, j - 1].M.Add(_field[i, j].M[x]); _field[i, j].M.Remove(_field[i, j].M[x]); succeedMole = true; } break; case Direction.Right: if (i + 1 < _field.GetLength(0) && i + 1 != _field[i, j].M[x].PrevW) { _field[i, j].M[x].Moved = true; _field[i, j].M[x].PrevW = i; _field[i, j].M[x].PrevH = j; _field[i + 1, j].M.Add(_field[i, j].M[x]); _field[i, j].M.Remove(_field[i, j].M[x]); succeedMole = true; } break; case Direction.Down: if (j + 1 < _field.GetLength(1) && j + 1 != _field[i, j].M[x].PrevH) { _field[i, j].M[x].Moved = true; _field[i, j].M[x].PrevW = i; _field[i, j].M[x].PrevH = j; _field[i, j + 1].M.Add(_field[i, j].M[x]); _field[i, j].M.Remove(_field[i, j].M[x]); succeedMole = true; } break; default: throw new ArgumentOutOfRangeException(); } } } } } if (_field[i, j].C != null) { { foreach (var tmp in _field[i, j].M) { _field[i, j].C.Hit(tmp); } if (_field[i, j].M.Count == 0 && !_field[i, j].C.Moved) // moving cottager { // only if there is no mole and he hasn't moved yet _field[i, j].C.PrevW = i; _field[i, j].C.PrevH = j; var succeedCottager = false; while (!succeedCottager) { var d = (Direction)rnd.Next(0, 4); switch (d) { case Direction.Left: if (i - 1 >= 0 && i - 1 != _field[i, j].C.PrevW) { _field[i - 1, j].C = _field[i, j].C; _field[i, j].C = null; succeedCottager = true; } break; case Direction.Up: if (j - 1 >= 0 && j - 1 != _field[i, j].C.PrevH) { _field[i, j - 1].C = _field[i, j].C; _field[i, j].C = null; succeedCottager = true; } break; case Direction.Right: if (i + 1 < _field.GetLength(0) && i + 1 != _field[i, j].C.PrevW) { _field[i + 1, j].C = _field[i, j].C; _field[i, j].C = null; succeedCottager = true; } break; case Direction.Down: if (j + 1 < _field.GetLength(1) && j + 1 != _field[i, j].C.PrevH) { _field[i, j + 1].C = _field[i, j].C; _field[i, j].C = null; succeedCottager = true; } break; default: throw new ArgumentOutOfRangeException(); } } } } } if (_field[i, j].P != null && _field[i, j].P.S == Status.Dead) { _field[i, j].P = null; } if (_field[i, j].M.Count > 0) { _field[i, j].M.RemoveAll(a => a.S == Status.Dead); } } } _field.Cast <GameCell>().ToList().ForEach(x => x.M.ForEach(y => y.Moved = false)); gs = _field.Cast <GameCell>().Count(x => x.P != null) == 0 // number of cell, where plant != null // so, if there is no plants and if there is no mole , then moles wins. Else cottager wins or we continue playing ? GameState.MWiNs : _field.Cast <GameCell>().Count(x => x.M.Count > 0) == 0 ? GameState.СWiNs : GameState.Playing; _form.Invoke(_update); Thread.Sleep(1000); } }
private void GameProcess() { gs = GameState.Playing; var rnd = new Random(); while (gs == GameState.Playing) { for (var i = 0; i < _field.GetLength(0); i++) { for (var j = 0; j < _field.GetLength(1); j++) { if (_field[i, j].M.Count > 0) { if (_field[i, j].M.Count >= 2) // плодим кротов { var femIndex = _field[i, j].M.FindIndex(x => x.Gender == Gender.Female && x.Hunger == GlobalVars.MaxHunger); var malIndex = _field[i, j].M.FindIndex(x => x.Gender == Gender.Male && x.Hunger == GlobalVars.MaxHunger); if (femIndex >= 0 && malIndex >= 0) { _field[i, j].M.Add(new Mole((Gender)rnd.Next(0, 2), GlobalVars.DefaultSpeed, i, j, _moleId++)); } } foreach (var tmp in _field[i, j].M) { tmp.Eat(_field[i, j].P); } if (_field[i, j].P == null || _field[i, j].C != null) // двигаем крота { if (_field[i, j].M.Count == 0) { break; } for (var x = 0; x < _field[i, j].M.Count; x++) { if (_field[i, j].M[x].Moved) { continue; } var succeedMole = false; while (!succeedMole) // пока удается двигаться { var d = (Direction)rnd.Next(0, 4); switch (d) { case Direction.Left: if (i - 1 >= 0 && i - 1 != _field[i, j].M[x].PrevW) { _field[i, j].M[x].Moved = true; _field[i, j].M[x].PrevW = i; // запоминаю этому кроту текущую клетку как предыдущую _field[i, j].M[x].PrevH = j; _field[i - 1, j].M.Add(_field[i, j].M[x]); // добавляю крота в новую клетку, _field[i, j].M.Remove(_field[i, j].M[x]); // удаляю крота из текущей succeedMole = true; // удалось подвинуться } break; case Direction.Up: if (j - 1 >= 0 && j - 1 != _field[i, j].M[x].PrevH) { _field[i, j].M[x].Moved = true; _field[i, j].M[x].PrevW = i; _field[i, j].M[x].PrevH = j; _field[i, j - 1].M.Add(_field[i, j].M[x]); _field[i, j].M.Remove(_field[i, j].M[x]); succeedMole = true; } break; case Direction.Right: if (i + 1 < _field.GetLength(0) && i + 1 != _field[i, j].M[x].PrevW) { _field[i, j].M[x].Moved = true; _field[i, j].M[x].PrevW = i; _field[i, j].M[x].PrevH = j; _field[i + 1, j].M.Add(_field[i, j].M[x]); _field[i, j].M.Remove(_field[i, j].M[x]); succeedMole = true; } break; case Direction.Down: if (j + 1 < _field.GetLength(1) && j + 1 != _field[i, j].M[x].PrevH) { _field[i, j].M[x].Moved = true; _field[i, j].M[x].PrevW = i; _field[i, j].M[x].PrevH = j; _field[i, j + 1].M.Add(_field[i, j].M[x]); _field[i, j].M.Remove(_field[i, j].M[x]); succeedMole = true; } break; default: throw new ArgumentOutOfRangeException(); //Исключение, которое выдается, если значение аргумента не соответствует допустимому //диапазону значений, установленному вызванным методом. } } } } } if (_field[i, j].C != null) { { foreach (var tmp in _field[i, j].M) { _field[i, j].C.Hit(tmp); } if (_field[i, j].M.Count == 0 && !_field[i, j].C.Moved) // двигаем дачника { // двигается только если нет кротов, и он еще не двигался _field[i, j].C.PrevW = i; _field[i, j].C.PrevH = j; var succeedCottager = false; while (!succeedCottager) { var d = (Direction)rnd.Next(0, 4); switch (d) { case Direction.Left: if (i - 1 >= 0 && i - 1 != _field[i, j].C.PrevW) { _field[i - 1, j].C = _field[i, j].C; _field[i, j].C = null; succeedCottager = true; } break; case Direction.Up: if (j - 1 >= 0 && j - 1 != _field[i, j].C.PrevH) { _field[i, j - 1].C = _field[i, j].C; _field[i, j].C = null; succeedCottager = true; } break; case Direction.Right: if (i + 1 < _field.GetLength(0) && i + 1 != _field[i, j].C.PrevW) { _field[i + 1, j].C = _field[i, j].C; _field[i, j].C = null; succeedCottager = true; } break; case Direction.Down: if (j + 1 < _field.GetLength(1) && j + 1 != _field[i, j].C.PrevH) { _field[i, j + 1].C = _field[i, j].C; _field[i, j].C = null; succeedCottager = true; } break; default: throw new ArgumentOutOfRangeException(); } } } } } if (_field[i, j].P != null && _field[i, j].P.S == Status.Dead) { _field[i, j].P = null; } if (_field[i, j].M.Count > 0) { _field[i, j].M.RemoveAll(a => a.S == Status.Dead); } } } _field.Cast <GameCell>().ToList().ForEach(x => x.M.ForEach(y => y.Moved = false)); gs = _field.Cast <GameCell>().Count(x => x.P != null) == 0 // количество клеток, в которых растение не равно null. // то есть все условие сверху значит - если нет растений, а далее если нет кротов ? GameState.MWiNs // значит, выиграли кроты, иначе либо дачник, либо играем дальше : _field.Cast <GameCell>().Count(x => x.M.Count > 0) == 0 ? GameState.СWiNs : GameState.Playing; _form.Invoke(_update); // обовляем форму Thread.Sleep(1000); } }
public IEnumerator <GameCell> GetEnumerator() { return(Cells.Cast <GameCell>().GetEnumerator()); }