public List<Pozycja> wZasiegu(Statek statek, Rozmiar rozmiar) { List<Pozycja> poz = new List<Pozycja>(); for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) { if (j == 0 && i == 0) continue; foreach (Pozycja p in statek.pozycje) if (modulo((pPelnePozycje[3].x + i), rozmiar.x) == p.x && (modulo(pPelnePozycje[3].y + j, rozmiar.y) == p.y)) poz.Add(p); } for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) { if (j == 0 && i == 0) continue; foreach (Pozycja p in statek.pozycje) if (modulo((pPelnePozycje[1].x - i), rozmiar.x) == p.x && (modulo(pPelnePozycje[1].y + j, rozmiar.y) == p.y)) poz.Add(p); } for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) { if (j == 0 && i == 0) continue; foreach (Pozycja p in statek.pozycje) if (modulo((pPelnePozycje[0].x - i), rozmiar.x) == p.x && (modulo(pPelnePozycje[0].y - j, rozmiar.y) == p.y)) poz.Add(p); } for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) { if (j == 0 && i == 0) continue; foreach (Pozycja p in statek.pozycje) if (modulo((pPelnePozycje[2].x + i), rozmiar.x) == p.x && (modulo(pPelnePozycje[2].y - j, rozmiar.y) == p.y)) poz.Add(p); } return poz; }
public void start() { statek = new Statek(); int idPolecenia; while (true) { string pozycjaStatku = PoleceniaSieciowe.odbierzPolecenie(stream); Polecenia polecenie = null; try { polecenie = Parser.parsuj(pozycjaStatku); } catch (Wyjatki.BlednePolecenie) { PoleceniaSieciowe.wyslijPolecenie(klient.GetStream(), new Polecenia("NO", KodyBledu.blednePolecenie)); continue; } if (polecenie.Polecenie != "SET") { PoleceniaSieciowe.wyslijPolecenie(stream, new Polecenia("NO", KodyBledu.blednePolecenie)); continue; } if (polecenie.IdKlienta != idKlienta) { PoleceniaSieciowe.wyslijPolecenie(stream, new Polecenia("NO", KodyBledu.bledneIdKlienta)); continue; } List<Pozycja> pozycje = polecenie.Pozycje; pozycje.Sort(); foreach (Pozycja p in pozycje) { if (p.x < 0 || p.x > plansza.rozmiarX - 1 || p.y < 0 || p.y > plansza.rozmiarY - 1) { PoleceniaSieciowe.wyslijPolecenie(stream, new Polecenia("NO", KodyBledu.blednePolozenieStartowe)); continue; } } bool blad = false; for (int i = 0; i < 3; i++) for (int j = i + 1; j < 4; j++) { if (pozycje[i] == pozycje[j]) blad = true; if (Math.Abs(pozycje[i].x - pozycje[j].x) > 1) if ((pozycje[i].x != 0 && pozycje[i].x != plansza.rozmiarX - 1) || (pozycje[j].y != 0 && pozycje[j].y != plansza.rozmiarX - 1)) { blad = true; break; } if (Math.Abs(pozycje[i].y - pozycje[j].y) > 1) if ((pozycje[i].y != 0 && pozycje[i].y != plansza.rozmiarY - 1) || (pozycje[j].y != 0 && pozycje[j].y != plansza.rozmiarY - 1)) { blad = true; break; } if (blad) break; } if (blad) { PoleceniaSieciowe.wyslijPolecenie(stream, new Polecenia("NO", KodyBledu.blednePolozenieStartowe)); continue; } statek = new Statek(idKlienta, stream, pozycje); if (plansza.moznaDodacStatek(statek)) { plansza.dodajStatek(statek); } else { PoleceniaSieciowe.wyslijPolecenie(stream, new Polecenia("NO", KodyBledu.maksymalnaLiczbaGraczy)); continue; } idPolecenia = polecenie.IdPolecenie; break; } statek.dodano = true; PoleceniaSieciowe.wyslijPolecenie(stream, new Polecenia("OK", idPolecenia)); th = Thread.CurrentThread; plansza.zglosGotowosc(odbierajPolecenia); }
public bool kolizja(Statek s, int kierunek, Rozmiar rozmiar) { foreach (Pozycja p in s.pozycje) { foreach (Pozycja pp in pozycje) { if (kierunek == Kierunki.gora) return (modulo((p.y + 1), rozmiar.y) == pp.y && (p.x == pp.x)); if (kierunek == Kierunki.dol) return (modulo((p.y - 1), rozmiar.y) == pp.y && (p.x == pp.x)); if (kierunek == Kierunki.prawo) { if (modulo((p.x + 1), rozmiar.x) == pp.x && (p.y == pp.y)) Console.WriteLine("1. " + p.ToString() + "2. " + pp.ToString()); return (modulo((p.x + 1), rozmiar.x) == pp.x && (p.y == pp.y)); } if (kierunek == Kierunki.lewo) return (modulo((p.x - 1), rozmiar.x) == pp.x && (p.y == pp.y)); } } mutexPozycje.ReleaseMutex(); s.mutexPozycje.ReleaseMutex(); return false; }