Пример #1
0
class Simulation:

    def __init__(self, size, req_points):

        self.counter = 0
        self.mapa = Mapa(size)  # ustawienie wielkości mapy
        self.req_points = req_points
        self.city_population = {}

    @staticmethod
    def scan_map(fraction, mapa):

        """funkcja sprawdzająca czy cała mapa nie jest zajęta przez 1 frakcję"""

        a = []
        for y in range(1, mapa.size + 1): #dodaje do listy liczbę 1 gdy jest na mapie budynek danej frakcji
            for x in range(1, mapa.size + 1):
                if mapa.ground_objects[x, y].symbol.__contains__(fraction.symbol):
                    a.append(1)
                else:
                    a.append(0)

        b = []
        for i in range(a.__len__()): #lista przypadku gdy cała mapa byłaby zajęta przez frakcję
            b.append(1)

        if a == b: #przyrównanie list
            print("Wygrała frakcja {}{}!".format("z symbolem: ", fraction.symbol))
            exit() #koniec

    @classmethod
    def check_win(cls, a, b ,c ,d, mapa, points):

        """sprawdzenie czy frakcja nie przekroczyła punktów rozwoju"""


        if a != None: #sprawdzenie czy frakcja istnieje, potem sprawdza zwycięstwo
            cls.scan_map(b, mapa)
            if a.points >= points:
                name = a.symbol
                win = "Wygrala frakcja {}{}!".format("z symbolem: ", name)
                print(win)
                with open("sim_save.txt",mode='a',  encoding='UTF8') as  save_file:  # zapisz do pliku wszystkich danych potrzebnych do odtworzenia symulacji
                    save_simulation = csv.writer(save_file, quotechar='"', quoting=csv.QUOTE_MINIMAL)
                    save_simulation.writerow([win])
                exit()

        if b != None:
            cls.scan_map(b, mapa)
            if b.points >= points:
                name = b.symbol
                win = "Wygrala frakcja {}{}!".format("z symbolem: ", name)
                print(win)
                with open("sim_save.txt", mode='a',  encoding='UTF8') as  save_file:  # zapisz do pliku wszystkich danych potrzebnych do odtworzenia symulacji
                    save_simulation = csv.writer(save_file,  quotechar='"', quoting=csv.QUOTE_MINIMAL)
                    save_simulation.writerow([win])
                exit()

        if c != None:
            cls.scan_map(b, mapa)
            if c.points >= points:
                name = c.symbol
                win = "Wygrala frakcja {}{}!".format("z symbolem: ", name)
                print(win)
                with open("sim_save.txt", mode='a', encoding='UTF8') as  save_file:  # zapisz do pliku wszystkich danych potrzebnych do odtworzenia symulacji
                    save_simulation = csv.writer(save_file, quotechar='"', quoting=csv.QUOTE_MINIMAL)
                    save_simulation.writerow([win])
                exit()

        if d != None:
            cls.scan_map(b, mapa)
            if d.points >= points:
                name = d.symbol
                win = "Wygrala frakcja {}{}!".format("z symbolem: ", name)
                print(win)
                with open("sim_save.txt",mode='a',  encoding='UTF8') as  save_file:  # zapisz do pliku wszystkich danych potrzebnych do odtworzenia symulacji
                    save_simulation = csv.writer(save_file, quotechar='"', quoting=csv.QUOTE_MINIMAL)
                    save_simulation.writerow([win])
                exit()

    @staticmethod
    def check_pos(a, object):

        """Metoda sprawdzająca pozycje wszystkich miast danej frakcji"""

        position = object.check_city(a)  # zebranie współrzędnych miast danej frakcji do 1 zmiennej
        x = []  # puste listy do ktorych będą wrzucane współrzędne
        y = []
        for i in range(position.__len__()):  # pętla budująca miasta, farmy i kopalnie
            for j in range(2):
                if j == 0:
                    x.append(position[i][j])  # dodanie współrzędnych do listy
                if j == 1:
                    y.append(position[i][j])
        return x, y #zwrócenie współrzędnych

    @staticmethod
    def check_mine(a, object):

        """Metoda sprawdzająca pozycje wszystkich kopalni danej frakcji"""

        position = object.check_mine(a)
        for i in range(position.__len__()):  # pętla zbierająca surowce z każdej kopalni
            for j in range(2):
                if j == 0:
                    x = position[i][j]
                if j == 1:
                    y = position[i][j]
            object.collect_resources(a, x, y)

    @staticmethod
    def check_farm(a, object):

        """ Metoda sprawdzająca pozycje wszystkich farm danej frakcji"""

        position = object.check_farm(a)  # zebranie współrzędnych wszystkich farm danej frakcji do 1 zmiennej
        for i in range(position.__len__()):  # pętla zbierająca jedzenie z każdej farmy
            for j in range(2):
                if j == 0:
                    x = position[i][j]
                if j == 1:
                    y = position[i][j]
            object.collect_food(a, x, y)  # zbiór

    def start(self):
        """Rozpoczyna symulacje"""
        while self.counter < 99:
            if self.counter == 0: #czynność startowa
                self.mapa.draw() #narysowanie mapy
                self.mapa.show() #pokazanie mapy
                time.sleep(0.25)
                self.mapa.build_city(self.mapa.fraction1, self.mapa.fraction1.x, self.mapa.fraction1.y, None) #budowa początkowa miasta kopalni i farmy
                self.mapa.build_mine(self.mapa.fraction1, self.mapa.fraction1.x, self.mapa.fraction1.y)
                self.mapa.build_farm(self.mapa.fraction1, self.mapa.fraction1.x, self.mapa.fraction1.y)
                self.mapa.build_city(self.mapa.fraction2, self.mapa.fraction2.x, self.mapa.fraction2.y, None)
                self.mapa.build_mine(self.mapa.fraction2, self.mapa.fraction2.x, self.mapa.fraction2.y)
                self.mapa.build_farm(self.mapa.fraction2, self.mapa.fraction2.x, self.mapa.fraction2.y)
                self.mapa.build_city(self.mapa.fraction3, self.mapa.fraction3.x, self.mapa.fraction3.y, None)  # budowa początkowa miasta kopalni i farmy
                self.mapa.build_mine(self.mapa.fraction3, self.mapa.fraction3.x, self.mapa.fraction3.y)
                self.mapa.build_farm(self.mapa.fraction3, self.mapa.fraction3.x, self.mapa.fraction3.y)
                self.mapa.build_city(self.mapa.fraction4, self.mapa.fraction4.x, self.mapa.fraction4.y, None)  # budowa początkowa miasta kopalni i farmy
                self.mapa.build_mine(self.mapa.fraction4, self.mapa.fraction4.x, self.mapa.fraction4.y)
                self.mapa.build_farm(self.mapa.fraction4, self.mapa.fraction4.x, self.mapa.fraction4.y)
                self.mapa.show() #pokazanie mapy po budowie
                time.sleep(0.25)

            x, y = Simulation.check_pos(self.mapa.fraction1, self.mapa) #wywołanie funkcji zwracającej współrzędne

            while x.__len__() != 0:
                a = random.randint(0, x.__len__()-1) #wylosowanie z listy losowych współrzędnych
                if self.city_population.__contains__((x[a], y[a])) == False:
                    p = self.mapa.consume(self.mapa.fraction1, x[a], y[a], 10)
                    self.city_population.update({(x[a], y[a]): p})
                elif self.city_population.__contains__((x[a], y[a])) == True:
                    p = self.mapa.consume(self.mapa.fraction1, x[a], y[a], self.city_population[(x[a], y[a])])
                    self.city_population.update({(x[a], y[a]): p})
                self.mapa.auto_build(x[a], y[a], self.mapa.fraction1, None) #losowe tworzenie budynków
                x.remove(x[a])
                y.remove(y[a])

            x, y = Simulation.check_pos(self.mapa.fraction2, self.mapa) #wywołanie funkcji zwracającej współrzędne

            while (x.__len__() != 0):
                a = random.randint(0, x.__len__() - 1)  # wylosowanie z listy losowych współrzędnych
                if self.city_population.__contains__((x[a], y[a])) == False:
                    p = self.mapa.consume(self.mapa.fraction2, x[a], y[a], 10)
                    self.city_population.update({(x[a], y[a]): p})
                elif self.city_population.__contains__((x[a], y[a])) == True:
                    p = self.mapa.consume(self.mapa.fraction2, x[a], y[a], self.city_population[(x[a], y[a])])
                    self.city_population.update({(x[a], y[a]): p})
                self.mapa.auto_build(x[a], y[a], self.mapa.fraction2, None)  # losowe tworzenie budynków
                x.remove(x[a])
                y.remove(y[a])

            x, y = Simulation.check_pos(self.mapa.fraction3, self.mapa)  # wywołanie funkcji zwracającej współrzędne

            while (x.__len__() != 0):
                a = random.randint(0, x.__len__() - 1)  # wylosowanie z listy losowych współrzędnych
                if self.city_population.__contains__((x[a], y[a])) == False:
                    p = self.mapa.consume(self.mapa.fraction3, x[a], y[a], 10)
                    self.city_population.update({(x[a], y[a]): p})
                elif self.city_population.__contains__((x[a], y[a])) == True:
                    p = self.mapa.consume(self.mapa.fraction3, x[a], y[a], self.city_population[(x[a], y[a])])
                    self.city_population.update({(x[a], y[a]): p})
                self.mapa.auto_build(x[a], y[a], self.mapa.fraction3, None)  # losowe tworzenie budynków
                x.remove(x[a])
                y.remove(y[a])

            x, y = Simulation.check_pos(self.mapa.fraction4, self.mapa)  # wywołanie funkcji zwracającej współrzędne

            while (x.__len__() != 0):
                a = random.randint(0, x.__len__() - 1)  # wylosowanie z listy losowych współrzędnych
                if self.city_population.__contains__((x[a], y[a])) == False:
                    p = self.mapa.consume(self.mapa.fraction4, x[a], y[a], 10)
                    self.city_population.update({(x[a], y[a]): p})
                elif self.city_population.__contains__((x[a], y[a])) == True:
                    p = self.mapa.consume(self.mapa.fraction4, x[a], y[a], self.city_population[(x[a], y[a])])
                    self.city_population.update({(x[a], y[a]): p})
                self.mapa.auto_build(x[a], y[a], self.mapa.fraction4, None)  # losowe tworzenie budynków
                x.remove(x[a])
                y.remove(y[a])


            Simulation.check_mine(self.mapa.fraction1, self.mapa) #zbiory materiałów 1 frakcji
            Simulation.check_mine(self.mapa.fraction2, self.mapa) #zbiory materiałów 2 frakcji
            Simulation.check_mine(self.mapa.fraction3, self.mapa)  # zbiory materiałów 3 frakcji
            Simulation.check_mine(self.mapa.fraction4, self.mapa)  # zbiory materiałów 4 frakcji
            Simulation.check_farm(self.mapa.fraction1, self.mapa) #zbiory jedzenia 1 frakcji
            Simulation.check_farm(self.mapa.fraction2, self.mapa) #zbiory jedzienia 2 frakcji
            Simulation.check_farm(self.mapa.fraction3, self.mapa)  # zbiory jedzenia 3 frakcji
            Simulation.check_farm(self.mapa.fraction4, self.mapa)  # zbiory jedzienia 4 frakcji

            self.mapa.show_fraction(self.mapa.fraction1) #pokazanie danych frakcji
            self.mapa.show_fraction(self.mapa.fraction2)
            self.mapa.show_fraction(self.mapa.fraction3)
            self.mapa.show_fraction(self.mapa.fraction4)

            self.mapa.show() #pokazanie mapy po zmianach
            if Simulation.check_win(self.mapa.fraction1, self.mapa.fraction2, self.mapa.fraction3, self.mapa.fraction4, self.mapa, self.req_points) == str: #sprawdzenie zwycięstwa na końcu pętli
                win = Simulation.check_win(self.mapa.fraction1, self.mapa.fraction2, self.mapa.fraction3, self.mapa.fraction4, self.req_points)
                print(win)

            with open("sim_save.txt", mode='w') as  save_file: #zapisz do pliku wszystkich danych potrzebnych do odtworzenia symulacji
                save_simulation = csv.writer(save_file, delimiter=" ", quotechar='"', quoting = csv.QUOTE_MINIMAL)
                fractions = [self.mapa.fraction1, self.mapa.fraction2, self.mapa.fraction3, self.mapa.fraction4]

                save_simulation.writerow(["Symulacja zakończyła się po", self.counter, "cyklach."])
                save_simulation.writerow(["Próg punktów zwycięstwa:", self.req_points])
                save_simulation.writerow(["Wielkość mapy", self.mapa.size])
                save_simulation.writerow(["_______________________________________________________"])

                for fraction in fractions:
                    save_simulation.writerow(["Frakcja:", fraction.symbol])
                    save_simulation.writerow(["Punkty:", int(fraction.points)])
                    save_simulation.writerow(["Ilość jedzenia:", int(fraction.food), " Ilość materiałów:", int(fraction.material)])
                    save_simulation.writerow(["Pozycja startowa:", (fraction.x, fraction.y)])
                    save_simulation.writerow(["_______________________________________________________"])

                for y in range(1, self.mapa.size + 1):
                    for x in range(1, self.mapa.size + 1):
                        save_simulation.writerow(["Budynki na polu", (x, y), ":", self.mapa.ground_objects[x, y].symbol])



                if self.counter == 98:
                    save_simulation.writerow(["REMIS!"])


            time.sleep(0.25)
            self.counter += 1

        print("REMIS!") #Wyświetla remis jeżeli żadna frakcja nie wygrała po wszystkich cyklach

        exit()
        """Zakańcza działanie programu"""