public Field(int _w, int _h, int _g, int _amnt) { grid_step = _g; kX = _w / _g; kY = _h / _g; amnt = _amnt; ParicleS = new List<ParicleS>(); wall = new int[kX, kY]; countC1 = countL1 = countT1 = countC2 = countL2 = countT2 = 0; for (var i = 0; i < amnt; ++i) { ParicleS part; bool f; do { part = new ParicleS(kY); f = ParicleS.Any(p => p.X == part.X && p.Y == part.Y); } while (f); ParicleS.Add(part); } //создание стен for (var i = 0; i < (kX / 2); i++) { wall[i, (kY/3 - 1)] = 1; wall[i, ((kY / 3)*2)] = 1; } for (int i = 0; i < (kY/3); i++) wall[(kX/2), i] = 1; for (int i = (kY / 3) * 2; i < kY; i++) wall[(kX/2), i] = 1; for (int i = (kX / 2); i < kX; i++) { wall[i, 0] = 1; wall[i, kY-1] = 1; } for (int i = (kY / 3); i < (kY / 3) * 2; i++) wall[(kX/3)*2, i] = 1; for (int i = (kX / 3)*2; i < kX; i++) { wall[i, (kY/3)] = 1; wall[i, (kY / 3)*2] = 1; } for (int i = 0; i < (kY / 3); i++) wall[kX-1, i] = 1; for (int i = (kY / 3) * 2; i < kY; i++) wall[kX-1, i] = 1; }
private Vector NextPos(ParicleS p) { var v = new Vector(p.X, p.Y); var oldV = new Vector(p.X, p.Y); if (p.Go()) { var rand = new Random((int)DateTime.Now.Ticks); var m = (float)rand.NextDouble(); if (0.2 >= m) { if (p.type==0) v.Y += 1; else v.Y -= 1; } if (feelWall(v)) v.Y = oldV.Y; if(v.Y == oldV.Y) v.X += 1; } if(feelWall(v)) v.X -= 1; if (v.X == kX / 3 && !p.isCnt1) { countC1++; p.isCnt1 = true; } if ((v.X == (kX / 3) * 2 + 2) && !p.isCnt2) { if (v.Y < kY / 2) countC2++; else countL2++; p.isCnt2 = true; } return v; }