public Wspolrzedne getWspolrzedne(string miasto) { Wspolrzedne result = new Wspolrzedne(); MainWindow.connection.Open(); string query = "SELECT dlugosc, szerokosc FROM miejscowosci WHERE nazwa='" + miasto + "'"; sql = new MySqlCommand(query, MainWindow.connection); datareader = sql.ExecuteReader(); if (datareader.FieldCount > 0) { if (datareader.Read()) { double x = Convert.ToDouble(datareader[0]); double dlugosc = Math.Floor(x) + (x - Math.Floor(x)) * 100 / 60; double y = Convert.ToDouble(datareader[1]); double szerokosc = Math.Floor(y) + (y - Math.Floor(y)) * 100 / 60; result = new Wspolrzedne(dlugosc, szerokosc); } } datareader.Close(); MainWindow.connection.Close(); return(result); }
List <Wspolrzedne> RysujProsta(Wspolrzedne poczatek, Wspolrzedne koniec) { List <Wspolrzedne> prosta = new List <Wspolrzedne>(); int x = poczatek.komorkaX; int y = poczatek.komorkaY; int dx = koniec.komorkaX - poczatek.komorkaX; int dy = koniec.komorkaY - poczatek.komorkaY; bool liniaPionowa = false; int znak = Math.Sign(dx); int wspolczynnik = Math.Sign(dy); int pozioma = Mathf.Abs(dx); int pionowa = Mathf.Abs(dy); if (pozioma < pionowa) { liniaPionowa = true; pozioma = Mathf.Abs(dy); pionowa = Mathf.Abs(dx); znak = Math.Sign(dy); wspolczynnik = Math.Sign(dx); } int skok = pozioma / 2; //точка в которой Y увеличивается (либо Х уменьшается) for (int i = 0; i < pozioma; i++) { prosta.Add(new Wspolrzedne(x, y)); if (liniaPionowa) { y += znak; } else { x += znak; } skok += pionowa; if (skok >= pozioma) { if (liniaPionowa) { x += wspolczynnik; } else { y += wspolczynnik; } skok -= pozioma; } } return(prosta); }
void UtworzKorytaz(Pokoj pokoj1, Pokoj pokoj2, Wspolrzedne komorka1, Wspolrzedne komorka2) { Pokoj.PolaczPokoje(pokoj1, pokoj2); List <Wspolrzedne> prosta = RysujProsta(komorka1, komorka2); foreach (Wspolrzedne centr in prosta) { KrokKorytarza(2, centr); } }
void KrokKorytarza(int r, Wspolrzedne o) { for (int x = -r; x <= r; x++) { for (int y = -r; y <= r; y++) { if (x * x + y * y <= r * r) { int natychmiastowaX = o.komorkaX + x; int natychmiastowaY = o.komorkaY + y; if (natychmiastowaX >= 0 && natychmiastowaX < szerokosc && natychmiastowaY >= 0 && natychmiastowaY < wysokosc) { poziom[natychmiastowaX, natychmiastowaY] = 0; } } } } }
List <Wspolrzedne> KomorkiStrefy(int poczX, int poczY) { List <Wspolrzedne> wspolrzedne = new List <Wspolrzedne>(); int[,] komorkiSprawdzone = new int[szerokosc, wysokosc]; int rodzaj = poziom[poczX, poczY]; Queue <Wspolrzedne> queue = new Queue <Wspolrzedne>(); queue.Enqueue(new Wspolrzedne(poczX, poczY)); komorkiSprawdzone[poczX, poczY] = 1; while (queue.Count > 0) { Wspolrzedne wybranaKomorka = queue.Dequeue(); wspolrzedne.Add(wybranaKomorka); for (int x = wybranaKomorka.komorkaX - 1; x <= wybranaKomorka.komorkaX + 1; x++) { for (int y = wybranaKomorka.komorkaY - 1; y <= wybranaKomorka.komorkaY + 1; y++) { if ((x >= 0 && x < szerokosc && y >= 0 && y < wysokosc) && (x == wybranaKomorka.komorkaX || y == wybranaKomorka.komorkaY)) { if (komorkiSprawdzone[x, y] == 0 && poziom[x, y] == rodzaj) { komorkiSprawdzone[x, y] = 1; queue.Enqueue(new Wspolrzedne(x, y)); } } } } } return(wspolrzedne); }
void PolaczNajblizszePokoje(List <Pokoj> pokoje, bool polaczanyPonownie = false) { List <Pokoj> listaPokojow1 = new List <Pokoj>(); List <Pokoj> listaPokojow2 = new List <Pokoj>(); //комнаты которые соединены прямо или косвенно с главной комнатой добавляем в список 2, а те которые не подключены добавляем в список 1 if (polaczanyPonownie) { foreach (Pokoj pokoj in pokoje) { if (pokoj.polaczenieZPokojemGlownym) { listaPokojow2.Add(pokoj); } else { listaPokojow1.Add(pokoj); } } } else { listaPokojow1 = listaPokojow2 = pokoje; } int odlegloscMin = 0; Wspolrzedne najblizszaKomorka1 = new Wspolrzedne(); Wspolrzedne najblizszaKomorka2 = new Wspolrzedne(); Pokoj najblizszyPokoj1 = new Pokoj(); Pokoj najblizszyPokoj2 = new Pokoj(); bool polaczenieMozliwe = false; foreach (Pokoj pokoj1 in listaPokojow1) { if (!polaczanyPonownie) { polaczenieMozliwe = false; if (pokoj1.pokojePolaczone.Count > 0) { continue; } } //итерация 2: если комната из списка не соединенных с главной, ищем для нее соединение с другими комнатами. foreach (Pokoj pokoj2 in listaPokojow2) { if (pokoj1 == pokoj2 || pokoj1.czyPolaczone(pokoj2)) { continue; } for (int granicznaKomorka1 = 0; granicznaKomorka1 < pokoj1.komorkiGraniczne.Count; granicznaKomorka1++) { for (int granicznaKomorka2 = 0; granicznaKomorka2 < pokoj2.komorkiGraniczne.Count; granicznaKomorka2++) { Wspolrzedne komorka1 = pokoj1.komorkiGraniczne[granicznaKomorka1]; Wspolrzedne komorka2 = pokoj2.komorkiGraniczne[granicznaKomorka2]; int odleglosc = (int)(((komorka1.komorkaX - komorka2.komorkaX) * (komorka1.komorkaX - komorka2.komorkaX)) + ((komorka1.komorkaY - komorka2.komorkaY) * (komorka1.komorkaY - komorka2.komorkaY))); if (odleglosc < odlegloscMin || !polaczenieMozliwe) { odlegloscMin = odleglosc; polaczenieMozliwe = true; najblizszaKomorka1 = komorka1; najblizszaKomorka2 = komorka2; najblizszyPokoj1 = pokoj1; najblizszyPokoj2 = pokoj2; } } } } if (polaczenieMozliwe && !polaczanyPonownie) { UtworzKorytaz(najblizszyPokoj1, najblizszyPokoj2, najblizszaKomorka1, najblizszaKomorka2); } } if (polaczenieMozliwe && polaczanyPonownie) { UtworzKorytaz(najblizszyPokoj1, najblizszyPokoj2, najblizszaKomorka1, najblizszaKomorka2); PolaczNajblizszePokoje(pokoje, true); } if (!polaczanyPonownie) // после того нашли соседей для каждой из комнат, запускаем функцию заново чтобы соединить все комнаты с главной. { PolaczNajblizszePokoje(pokoje, true); } }
public List <String> getLastHarmonogram(bool pokazSzczegoly) { List <String> resultList = new List <String>(); String result = ""; MainWindow.connection.Open(); string query = "SELECT MAX(idharmonogram) FROM harmonogram"; sql = new MySqlCommand(query, MainWindow.connection); datareader = sql.ExecuteReader(); int maxid = 0; if (datareader.Read() && datareader.HasRows) { maxid = int.Parse(datareader.GetString(0)); } Harmonogram h = new Harmonogram(); h.idHarmonogram = maxid; datareader.Close(); query = "SELECT * FROM harmonogram WHERE idharmonogram='" + maxid + "'"; sql = new MySqlCommand(query, MainWindow.connection); datareader = sql.ExecuteReader(); if (datareader.HasRows) { while (datareader.Read()) { h.idZlecenia.Add(int.Parse(datareader[2].ToString())); h.idPracownika.Add(int.Parse(datareader[3].ToString())); h.kolejnosc.Add(int.Parse(datareader[4].ToString())); h.czas.Add(datareader[5].ToString()); } } else { return(resultList); } datareader.Close(); foreach (int x in h.idPracownika) { query = "SELECT * FROM pracownicy WHERE idPracownicy='" + x + "'"; sql = new MySqlCommand(query, MainWindow.connection); datareader = sql.ExecuteReader(); if (datareader.HasRows) { if (datareader.Read()) { h.pracownik.Add(datareader[1].ToString()); } } datareader.Close(); } foreach (int x in h.idZlecenia) { query = "SELECT * FROM zlecenia WHERE idzlecenia='" + x + "'"; sql = new MySqlCommand(query, MainWindow.connection); datareader = sql.ExecuteReader(); if (datareader.HasRows) { if (datareader.Read()) { h.nazwaSprzetu.Add(datareader[1].ToString()); h.nazwaUslugi.Add(datareader[2].ToString()); h.idKlienta.Add(int.Parse(datareader[3].ToString())); h.czasWykonania.Add(int.Parse(datareader[4].ToString())); } } datareader.Close(); } foreach (int x in h.idKlienta) { query = "SELECT * FROM klienci WHERE NIP='" + x + "'"; sql = new MySqlCommand(query, MainWindow.connection); datareader = sql.ExecuteReader(); if (datareader.HasRows) { if (datareader.Read()) { h.nazwaFirmy.Add(datareader[1].ToString()); h.adresFirmy.Add(datareader[2].ToString()); } } datareader.Close(); } foreach (String x in h.adresFirmy) { query = "SELECT szerokosc,dlugosc FROM miejscowosci WHERE nazwa='" + x + "'"; sql = new MySqlCommand(query, MainWindow.connection); datareader = sql.ExecuteReader(); if (datareader.HasRows) { if (datareader.Read()) { double x1 = Convert.ToDouble(datareader[0]); double dlugosc = Math.Floor(x1) + (x1 - Math.Floor(x1)) * 100 / 60; double y1 = Convert.ToDouble(datareader[1]); double szerokosc = Math.Floor(y1) + (y1 - Math.Floor(y1)) * 100 / 60; Wspolrzedne lokalizacja = new Wspolrzedne(dlugosc, szerokosc); h.lokalizacja.Add(lokalizacja); } } datareader.Close(); } for (int i = 0; i < h.nazwaFirmy.Count; i++) { DataRow row = h.dt.NewRow(); row[0] = h.idZlecenia[i]; row[1] = h.idPracownika[i]; row[2] = h.kolejnosc[i]; row[3] = h.czas[i]; row[4] = h.nazwaSprzetu[i]; row[5] = h.nazwaUslugi[i]; row[6] = h.idKlienta[i]; row[7] = h.czasWykonania[i]; row[8] = h.nazwaFirmy[i]; row[9] = h.adresFirmy[i]; row[10] = h.pracownik[i]; row[11] = h.lokalizacja[i].dlugosc; row[12] = h.lokalizacja[i].szerokosc; h.dt.Rows.Add(row); } DataRow[] sortedrows = h.dt.Select("", "idPracownika, kolejnosc"); int tmp = -1; int it = 1; String res = ""; double cserwisanta = 0; Wspolrzedne lastCity = new Wspolrzedne(19.47, 51.78); foreach (DataRow r in sortedrows) { if (tmp != int.Parse(r[1].ToString())) { if (res.Length > 0) { Wspolrzedne newcity = new Wspolrzedne(19.47, 51.78); cserwisanta += lastCity.getDistance(newcity) / 90.0; lastCity = newcity; res += "+to:51.78+N,+19.47+E&ll=51.930718,20.720215&spn=6.057099,19.138184&t=m&z=6"; resultList.Add(res); result = "c serwisanta = " + cserwisanta.ToString("f") + "\n" + result; cserwisanta = 0; result += "------------------------\n"; resultList.Add(result); result = ""; //result += "\nLink do mapy google: "; //result += res; //result += "\n"; } res = "https://maps.google.com/maps?saddr=51.78+N,+19.47+E"; result += r[10]; result += ":\n"; tmp = int.Parse(r[1].ToString()); it = 1; } res += "+to:"; double sz = double.Parse(r[11].ToString()); res += sz.ToString("f", CultureInfo.InvariantCulture); res += "+N,+"; double dl = double.Parse(r[12].ToString()); res += dl.ToString("f", CultureInfo.InvariantCulture); res += "+E"; Wspolrzedne city = new Wspolrzedne(dl, sz); cserwisanta += lastCity.getDistance(city) / 90.0; lastCity = city; cserwisanta += double.Parse(r[7].ToString()); result += it; result += ". Firma "; result += r[8]; result += " z siedzibą w miejscowości "; result += r[9]; if (pokazSzczegoly) { result += "\n\tSprzęt: "; result += r[4]; result += "\n\tOpis problemu: "; result += r[5]; result += "\n\tEstymowany czas: "; result += r[7]; } result += "\n"; it++; } MainWindow.connection.Close(); if (res.Length > 0) { Wspolrzedne newcity = new Wspolrzedne(19.47, 51.78); cserwisanta += lastCity.getDistance(newcity) / 90.0; lastCity = newcity; res += "+to:51.78+N,+19.47+E&ll=51.930718,20.720215&spn=6.057099,19.138184&t=m&z=6"; resultList.Add(res); result = "c serwisanta = " + cserwisanta.ToString("f") + "\n" + result; resultList.Add(result); } return(resultList); }
public static Wspolrzedne najblizszeUkryte() { for (int i = 1; ; i++) { int lTestowanych = 0; List<Wspolrzedne> zakrytePola = new List<Wspolrzedne>(); for (int j = mojaPozycjaY + i; j >= mojaPozycjaY - i; j--) { for (int k = mojaPozycjaX - i; k <= mojaPozycjaX + i; k++) { if ((mojaPozycjaY + i > j) && (mojaPozycjaY - i < j) && (mojaPozycjaX - i < k) && (mojaPozycjaX + i > k)) { goto Nastepne; } if (((k == mojaPozycjaX - i) || (k == mojaPozycjaX + i)) && ((j == mojaPozycjaY + i) || (j == mojaPozycjaY - i))) { goto Nastepne; } ZbadanePole testowane = znajdzPole(k, j); if (testowane == null) { lTestowanych++; for (int l = j + 1; l >= j - 1; l--) { for (int m = k - 1; m <= k + 1; m++) { ZbadanePole dookolaTestowanego = znajdzPole(m, l); if (!((dookolaTestowanego == null) || dookolaTestowanego.getPrzeszkoda() || dookolaTestowanego.getUnrechable())) { Wspolrzedne dodawana = new Wspolrzedne(k, j); zakrytePola.Add(dodawana); goto Nastepne; } } } } else if (testowane.getUnrechable()) { lTestowanych++; for (int l = j + 1; l >= j - 1; l--) { for (int m = k - 1; m <= k + 1; m++) { ZbadanePole dookolaTestowanego = znajdzPole(m, l); if (!((dookolaTestowanego == null) || dookolaTestowanego.getPrzeszkoda() || dookolaTestowanego.getUnrechable())) { Wspolrzedne dodawana = new Wspolrzedne(k, j); zakrytePola.Add(dodawana); goto Nastepne; } } } } Nastepne: ; } } if (zakrytePola.Count == 0) { if (lTestowanych == (8 * i) - 4) { break; } } else { Wspolrzedne closest = null; int shortestWay = 2 * cennikSwiata.initialEnergy; foreach (Wspolrzedne wsp in zakrytePola) { int comparer = findShortestWay(wsp.x, wsp.y); if ((closest == null) || (shortestWay > comparer)) { closest = wsp; shortestWay = comparer; } } return closest; } } return null; }
//Zachowanie naszego bota static void Zachowanie(String myState) { kierunek = new int[2]; wysokosc = 100; kierunek[0] = 0; kierunek[1] = 1; mojaPozycjaX = 0; mojaPozycjaY = 0; ZnanaMapa.dodajPole(0, 0, 100, 0, false); Look(); if (3 * cennikSwiata.rotateCost < (myEnergy - cennikSwiata.rotateCost)) { if (new Random().Next(2) == 1) { RotateLeft(); RotateLeft(); RotateLeft(); } else { RotateRight(); RotateRight(); RotateRight(); } } najblizszeZrodlo = ZnanaMapa.findClosestEnergy(); if (najblizszeZrodlo != null) { kosztDoZrodla = ZnanaMapa.findShortestWay(najblizszeZrodlo.x, najblizszeZrodlo.y); } else { kosztDoZrodla = -1; } bool loop = true; while (loop) { //Czekaj(1); //FUFUFUFUFU A JA ZASTANAWIAŁEM SIĘ CZEMU TAK WOLNO DZIAŁA!!! xP //Console.WriteLine("Moja energia: " + myEnergy); if ((myEnergy < smallestCost) || (myEnergy < cennikSwiata.moveCost)) { Console.WriteLine("Mam za mało energii aby cokolwiek zrobić! Ginę!"); break; } if ((czyRozmawiam) && (myEnergy - ZnanaMapa.znajdzPole(najblizszeZrodlo.x, najblizszeZrodlo.y).getEnergia() >= kosztDoZrodla + cennikSwiata.speakCost)) { Talk(rozmowca, lastMessage); continue; } Wspolrzedne cel = ZnanaMapa.najblizszeUkryte(); if (cel == null) { Console.WriteLine("Ile moglem, tyle zbadalem!\nWIN!"); break; } if (myState == "Random") { if (ZnanaMapa.najblizszeUkryte() == null) { break; } switch (new Random().Next(4)) { case 4/*"wyjdz"*/: loop = false; break; default: break; } } else { if (najblizszeZrodlo != null) { if (ZnanaMapa.znajdzPole(najblizszeZrodlo.x, najblizszeZrodlo.y).getEnergia() > 0) { if ((myEnergy < cennikSwiata.initialEnergy - ZnanaMapa.znajdzPole(najblizszeZrodlo.x, najblizszeZrodlo.y).getEnergia()) || (myEnergy < kosztDoZrodla + 2 * cennikSwiata.moveCost)) { cel = najblizszeZrodlo; } } else { if (myEnergy < kosztDoZrodla + cennikSwiata.moveCost * 3) { cel = najblizszeZrodlo; } } } ZnanaMapa.oneStepToThe(cel.x, cel.y); } } ZnanaMapa.show(); Console.WriteLine("Press SPACEBAR to end!"); loop = true; while (loop) { switch (Console.ReadKey().Key) { case ConsoleKey.Spacebar: loop = false; break; default: break; } } }
// ładujemy się private static void Recharge() { int added = agentVLuke_Jones.Recharge(); myEnergy += added; ZnanaMapa.uaktualnijPole(mojaPozycjaX, mojaPozycjaY, added); ZbadanePole pole = ZnanaMapa.znajdzPole(mojaPozycjaX, mojaPozycjaY); if (pole.getEnergia() == 0) { najblizszeZrodlo = ZnanaMapa.findClosestEnergy(); if (najblizszeZrodlo != null) { kosztDoZrodla = ZnanaMapa.findShortestWay(najblizszeZrodlo.x, najblizszeZrodlo.y); } else { kosztDoZrodla = -1; } } Console.WriteLine("Otrzymano " + added + " energii"); if (ZnanaMapa.znajdzPole(mojaPozycjaX, mojaPozycjaY).getEnergia() != 0) if (!(myEnergy == cennikSwiata.initialEnergy)) Recharge(); }