コード例 #1
0
class Kenttaeditori(QtWidgets.QMainWindow):

    def __init__(self, paavalikko):
        super().__init__()
        self.__scene_size = paavalikko.scene_size       # kentän koko pikseleinä
        self.__paavalikko = paavalikko
        self.__viive = 1500             # tallennuksen onnistumisen ja päävalikkoon palaamisen välinen viive

        self.setCentralWidget(QtWidgets.QWidget())
        self.__paa_layout = QtWidgets.QHBoxLayout()
        self.centralWidget().setLayout(self.__paa_layout)

        # ikkuna
        self.setGeometry(0, 0, self.__scene_size + 420, self.__scene_size + 20)
        self.setWindowTitle('Strategiapeli')
        self.show()

        # scene
        self.__scene = QtWidgets.QGraphicsScene()

        # näkymä
        self.__nakyma = QtWidgets.QGraphicsView(self.__scene, self)
        self.__nakyma.adjustSize()
        self.__nakyma.show()
        self.__paa_layout.addWidget(self.__nakyma)

        self.__nappi_layout = QtWidgets.QGridLayout()
        self.__paa_layout.addLayout(self.__nappi_layout)

        # widgetit
        self.__uusi_ohje = QtWidgets.QLabel("SYÖTÄ UUDEN\nKENTÄN PITUUS\nJA LEVEYS\nVÄLILYÖNNILLÄ\nEROTETTUNA")
        self.__uusi_ohje.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        self.__muokkaa_ohje = QtWidgets.QLabel("SYÖTÄ MUOKATTAVAN\nKENTÄN NIMI\nILMAN\nTIEDOSTOPÄÄTETTÄ")
        self.__muokkaa_ohje.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        self.__uusi_kentta_nappi = QtWidgets.QPushButton("UUSI KENTTÄ")
        self.__uusi_kentta_nappi.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        self.__muokkaa_vanhaa_nappi = QtWidgets.QPushButton("MUOKKAA KENTTÄÄ")
        self.__muokkaa_vanhaa_nappi.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        self.__vaihda_nappien_sisalto = QtWidgets.QPushButton("VAIHDA\nYKSIKÖT/MAASTOT")
        self.__vaihda_nappien_sisalto.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        self.__poistu_nappi = QtWidgets.QPushButton("POISTU EDITORISTA")
        self.__poistu_nappi.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        self.__tasanko_nappi = QtWidgets.QPushButton("TASANKO")
        self.__tasanko_nappi.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        self.__kukkula_nappi = QtWidgets.QPushButton("KUKKULA")
        self.__kukkula_nappi.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        self.__pelto_nappi = QtWidgets.QPushButton("PELTO")
        self.__pelto_nappi.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        self.__vuoristo_nappi = QtWidgets.QPushButton("VUORISTO")
        self.__vuoristo_nappi.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        self.__silta_nappi = QtWidgets.QPushButton("SILTA")
        self.__silta_nappi.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        self.__joki_nappi = QtWidgets.QPushButton("JOKI")
        self.__joki_nappi.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)

        self.__koko = QtWidgets.QLineEdit()
        self.__koko.setSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        self.__nimi = QtWidgets.QLineEdit()
        self.__nimi.setSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)

        self.__uusi_ohje.setStyleSheet("font: 10pt Arial")
        self.__muokkaa_ohje.setStyleSheet("font: 10pt Arial")
        self.__uusi_kentta_nappi.setStyleSheet("font: 10pt Arial")
        self.__muokkaa_vanhaa_nappi.setStyleSheet("font: 10pt Arial")
        self.__poistu_nappi.setStyleSheet("font: 10pt Arial")
        self.__vaihda_nappien_sisalto.setStyleSheet("font: 10pt Arial")
        self.__tasanko_nappi.setStyleSheet("font: 10pt Arial")
        self.__kukkula_nappi.setStyleSheet("font: 10pt Arial")
        self.__pelto_nappi.setStyleSheet("font: 10pt Arial")
        self.__vuoristo_nappi.setStyleSheet("font: 10pt Arial")
        self.__silta_nappi.setStyleSheet("font: 10pt Arial")
        self.__joki_nappi.setStyleSheet("font: 10pt Arial")
        self.__koko.setStyleSheet("font: 10pt Arial")
        self.__nimi.setStyleSheet("font: 10pt Arial")

        self.__vaihda_nappien_sisalto.setEnabled(False)
        self.__tasanko_nappi.setEnabled(False)
        self.__kukkula_nappi.setEnabled(False)
        self.__pelto_nappi.setEnabled(False)
        self.__vuoristo_nappi.setEnabled(False)
        self.__silta_nappi.setEnabled(False)
        self.__joki_nappi.setEnabled(False)

        self.__nappi_layout.addWidget(self.__uusi_ohje, 0, 0)
        self.__nappi_layout.addWidget(self.__muokkaa_ohje, 0, 1)
        self.__nappi_layout.addWidget(self.__koko, 1, 0)
        self.__nappi_layout.addWidget(self.__nimi, 1, 1)
        self.__nappi_layout.addWidget(self.__uusi_kentta_nappi, 2, 0)
        self.__nappi_layout.addWidget(self.__muokkaa_vanhaa_nappi, 2, 1)
        self.__nappi_layout.addWidget(self.__vaihda_nappien_sisalto, 3, 0)
        self.__nappi_layout.addWidget(self.__poistu_nappi, 3, 1)
        self.__nappi_layout.addWidget(self.__tasanko_nappi, 4, 0)
        self.__nappi_layout.addWidget(self.__kukkula_nappi, 4, 1)
        self.__nappi_layout.addWidget(self.__pelto_nappi, 5, 0)
        self.__nappi_layout.addWidget(self.__vuoristo_nappi, 5, 1)
        self.__nappi_layout.addWidget(self.__silta_nappi, 6, 0)
        self.__nappi_layout.addWidget(self.__joki_nappi, 6, 1)

        self.__uusi_kentta_nappi.clicked.connect(self.__lue_koko)
        self.__muokkaa_vanhaa_nappi.clicked.connect(self.__lue_kentan_nimi)
        self.__vaihda_nappien_sisalto.clicked.connect(self.__muuta_nappien_toiminnot)
        self.__poistu_nappi.clicked.connect(self.__poistu)
        self.__tasanko_nappi.clicked.connect(self.valitse_tasanko)
        self.__pelto_nappi.clicked.connect(self.valitse_pelto)
        self.__vuoristo_nappi.clicked.connect(self.valitse_vuoristo)
        self.__kukkula_nappi.clicked.connect(self.valitse_kukkula)
        self.__silta_nappi.clicked.connect(self.valitse_silta)
        self.__joki_nappi.clicked.connect(self.valitse_joki)

        self.__kartan_lukija = Kartan_lukija()

        self.__koko_x = 0
        self.__koko_y = 0

        self.__kartta = None

        # voi olla maasto tai yksikkö
        self.__valittu_elementti = None
        self.__valittu_omistaja = None

        # käyttöliittymän muutokset
        self.__editoi_kenttaa = False
        self.__muokkaa_vanhaa = False

        # ikkunan keskittäminen
        res_x = self.paavalikko.kayttoliittyman_lukija.x
        res_y = self.paavalikko.kayttoliittyman_lukija.y
        self.move(int(res_x / 2) - int(self.frameSize().width() / 2),
                  int(res_y / 2) - int(self.frameSize().height() / 2))

    @property
    def scene(self):
        return self.__scene

    @property
    def paavalikko(self):
        return self.__paavalikko

    @property
    def koko_x(self):
        return self.__koko_x

    @property
    def koko_y(self):
        return self.__koko_y

    @property
    def scene_size(self):
        return self.__scene_size

    @property
    def valittu_elementti(self):
        return self.__valittu_elementti

    @property
    def kartta(self):
        return self.__kartta

    @property
    def valittu_omistaja(self):
        return self.__valittu_omistaja

    def __aseta_scene_rect(self, x, y):
        # rectin skaalauskertoimet
        if x > y:
            y /= x
            x = 1
        else:
            x /= y
            y = 1
        self.__scene.setSceneRect(0, 0, self.__scene_size * x, self.__scene_size * y)

        # keskelle liikuttaminen
        res_x = self.paavalikko.kayttoliittyman_lukija.x
        res_y = self.paavalikko.kayttoliittyman_lukija.y
        self.move(int(res_x / 2) - int(self.frameSize().width() / 2),
                  int(res_y / 2) - int(self.frameSize().height() / 2))

    def __lue_koko(self):
        try:
            text = self.__koko.text().split(" ")
            if int(text[0])*int(text[1]) > 10000:
                raise ValueError
            self.__koko_x = int(text[0])
            self.__koko_y = int(text[1])
            self.__piirra_tyhja_kartta()
        except ValueError:
            self.__koko.setText("")
        except IndexError:
            self.__koko.setText("")

    def __lue_kentan_nimi(self):
        nimi = self.__nimi.text()
        validi = Kentan_tallentaja.tarkista_nimi(nimi)
        nimi += ".txt"
        # jos on false, nimen mukainen kenttä löytyi
        if validi is False:
            nimi, x, y, ruudut, yksikot = self.__kartan_lukija.lue_kartta(nimi)
            koko = (x, y)
            self.__koko_x = koko[0]
            self.__koko_y = koko[1]
            self.__kartta = Kartta(koko[0], koko[1], ruudut, self)
            self.__aseta_scene_rect(koko[0], koko[1])

            # luodaan maastot ja lisätään yksiköt vasta koko kartan luomisen jälkeen, kun kaikki ruudut ovat paikallaan
            for ruutu in self.__kartta.ruudut:
                ruutu.luo_maasto()
                ruutu.luo_grafiikka()
                ruutu.etsi_kartta()

            self.__kartta.lisaa_yksikot(yksikot, self.__paavalikko.yksikoiden_lukija.yksikot)
            self.__editoi_kenttaa = True
            self.__muokkaa_vanhaa = True
            self.__editoi_kenttaa_napit(self.__editoi_kenttaa)
        else:
            pass

    # piirtää tyhjän kartan, jonka mitat ovat koko_x ja koko_y
    def __piirra_tyhja_kartta(self):
        self.__tyhjenna_kartta()
        ruudut = [["tasanko" for i in range(self.__koko_y)] for j in range(self.__koko_x)]
        self.__kartta = Kartta(self.__koko_x, self.__koko_y, ruudut, self)

        for ruutu in self.__kartta.ruudut:
            ruutu.luo_maasto(True)
            ruutu.luo_grafiikka(True)
            ruutu.etsi_kartta()

        self.__aseta_scene_rect(self.__koko_x, self.__koko_y)

        # nappien muutokset
        self.__editoi_kenttaa = True
        self.__editoi_kenttaa_napit(self.__editoi_kenttaa)

    def __editoi_kenttaa_napit(self, editoi):
        # muuttaa käyttöliittymää sen perusteella, editoidaanko kenttää vai ei
        if editoi:
            self.__uusi_kentta_nappi.setText("TALLENNA KENTTÄ")
            self.__uusi_kentta_nappi.clicked.disconnect(self.__lue_koko)
            self.__uusi_kentta_nappi.clicked.connect(self.__tallenna_kentta)
            self.__uusi_ohje.setText("SYÖTÄ TALLENNETTAVAN\nKENTÄN NIMI")
            self.__koko.setText("")

            self.__muokkaa_vanhaa_nappi.setText("TYHJENNÄ KENTTÄ")
            self.__muokkaa_vanhaa_nappi.clicked.disconnect(self.__lue_kentan_nimi)
            self.__muokkaa_vanhaa_nappi.clicked.connect(self.__tyhjenna_kartta)
            self.__muokkaa_ohje.setText("")
            self.__nimi.setText("")
            self.__vaihda_nappien_sisalto.setEnabled(True)
            self.__tasanko_nappi.setEnabled(True)
            self.__kukkula_nappi.setEnabled(True)
            self.__pelto_nappi.setEnabled(True)
            self.__vuoristo_nappi.setEnabled(True)
            self.__silta_nappi.setEnabled(True)
            self.__joki_nappi.setEnabled(True)
            if self.__muokkaa_vanhaa is True:
                self.__uusi_kentta_nappi.setText("TALLENNA KENTTÄ")
                self.__uusi_ohje.setText("TALLENNA VANHAN\nKENTÄN PÄÄLLE\nSYÖTTÄMÄLLÄ\nVANHAN KENTÄN"
                                         "\nNIMI TAI\nSYÖTÄ UUSI NIMI")
        else:
            self.__uusi_kentta_nappi.setText("UUSI KENTTÄ")
            self.__uusi_kentta_nappi.clicked.disconnect(self.__tallenna_kentta)
            self.__uusi_kentta_nappi.clicked.connect(self.__lue_koko)
            self.__uusi_ohje.setText("SYÖTÄ UUDEN\nKENTÄN PITUUS\nJA LEVEYS\nVÄLILYÖNNILLÄ\nEROTETTUNA")
            self.__koko.setText("")

            self.__muokkaa_vanhaa_nappi.setText("MUOKKAA KENTTÄÄ")
            self.__muokkaa_vanhaa_nappi.clicked.disconnect(self.__tyhjenna_kartta)
            self.__muokkaa_vanhaa_nappi.clicked.connect(self.__lue_kentan_nimi)
            self.__muokkaa_ohje.setText("SYÖTÄ MUOKATTAVAN\nKENTÄN NIMI\nILMAN\nTIEDOSTOPÄÄTETTÄ")
            self.__nimi.setText("")
            self.__vaihda_nappien_sisalto.setEnabled(False)
            self.__tasanko_nappi.setEnabled(False)
            self.__kukkula_nappi.setEnabled(False)
            self.__pelto_nappi.setEnabled(False)
            self.__vuoristo_nappi.setEnabled(False)
            self.__silta_nappi.setEnabled(False)
            self.__joki_nappi.setEnabled(False)

    def __tyhjenna_kartta(self):
        if self.kartta is not None:
            self.kartta.tyhjenna()
        if self.__editoi_kenttaa:
            self.__editoi_kenttaa = False
            self.__editoi_kenttaa_napit(self.__editoi_kenttaa)

    def valitse_tasanko(self):
        self.__valittu_elementti = "tasanko"

    def valitse_kukkula(self):
        self.__valittu_elementti = "kukkula"

    def valitse_pelto(self):
        self.__valittu_elementti = "pelto"

    def valitse_vuoristo(self):
        self.__valittu_elementti = "vuoristo"

    def valitse_joki(self):
        self.__valittu_elementti = "joki"

    def valitse_silta(self):
        self.__valittu_elementti = "silta"

    def valitse_ratsuvaki(self):
        self.__valittu_elementti = "ratsuvaki"

    def valitse_jousimiehet(self):
        self.__valittu_elementti = "jousimiehet"

    def valitse_parantaja(self):
        self.__valittu_elementti = "parantaja"

    def valitse_tykisto(self):
        self.__valittu_elementti = "tykisto"

    def valitse_jalkavaki(self):
        self.__valittu_elementti = "jalkavaki"

    def valitse_poista_yksikko(self):
        self.__valittu_elementti = "poista"

    def __tallenna_kentta(self):
        tallenna_paalle = False
        if self.__muokkaa_vanhaa is True:
            tallenna_paalle = True
        self.kartta.etsi_yksikot()
        onnistui = Kentan_tallentaja.tallenna_kentta(self.kartta, self.__koko.text(), tallenna_paalle)
        if onnistui:
            self.__uusi_ohje.setText("TALLENNUS ONNISTUI")
            QtTest.QTest.qWait(self.__viive)
            self.__tyhjenna_kartta()
        else:
            self.__uusi_ohje.setText("NIMI KÄYTÖSSÄ")
            QtTest.QTest.qWait(self.__viive)
            self.__uusi_ohje.setText("SYÖTÄ TALLENNETTAVAN\nKENTÄN NIMI")
            self.__koko.setText("")

    def __poistu(self):
        self.__tyhjenna_kartta()
        self.paavalikko.show()
        self.paavalikko.kartan_lukija.lue_kaikki_kartat()
        self.hide()

    def __muuta_nappien_toiminnot(self):
        # vaihtaa maastojen ja yksiköiden lisäyksen välillä
        if self.__valittu_omistaja is None:
            tyyppi = "pelaaja"
        elif self.__valittu_omistaja == "PLR":
            tyyppi = "tietokone"
        else:
            tyyppi = "maastot"
        if tyyppi == "maastot":
            self.__valittu_omistaja = None
            self.__tasanko_nappi.setText("TASANKO")
            self.__pelto_nappi.setText("PELTO")
            self.__vuoristo_nappi.setText("VUORISTO")
            self.__kukkula_nappi.setText("KUKKULA")
            self.__silta_nappi.setText("SILTA")
            self.__joki_nappi.setText("JOKI")
            self.__tasanko_nappi.clicked.connect(self.valitse_tasanko)
            self.__pelto_nappi.clicked.connect(self.valitse_pelto)
            self.__vuoristo_nappi.clicked.connect(self.valitse_vuoristo)
            self.__kukkula_nappi.clicked.connect(self.valitse_kukkula)
            self.__silta_nappi.clicked.connect(self.valitse_silta)
            self.__joki_nappi.clicked.connect(self.valitse_joki)
            self.__tasanko_nappi.clicked.disconnect(self.valitse_jalkavaki)
            self.__pelto_nappi.clicked.disconnect(self.valitse_ratsuvaki)
            self.__vuoristo_nappi.clicked.disconnect(self.valitse_jousimiehet)
            self.__kukkula_nappi.clicked.disconnect(self.valitse_tykisto)
            self.__silta_nappi.clicked.disconnect(self.valitse_parantaja)
            self.__joki_nappi.clicked.disconnect(self.valitse_poista_yksikko)
        elif tyyppi == "pelaaja":
            self.__valittu_omistaja = "PLR"
            self.__tasanko_nappi.setText("JALKAVÄKI (PEL)")
            self.__pelto_nappi.setText("RATSUVÄKI (PEL)")
            self.__vuoristo_nappi.setText("JOUSIMIEHET (PEL)")
            self.__kukkula_nappi.setText("TYKISTÖ (PEL)")
            self.__silta_nappi.setText("PARANTAJA (PEL)")
            self.__joki_nappi.setText("POISTA YKSIKKÖ")
            self.__tasanko_nappi.clicked.connect(self.valitse_jalkavaki)
            self.__pelto_nappi.clicked.connect(self.valitse_ratsuvaki)
            self.__vuoristo_nappi.clicked.connect(self.valitse_jousimiehet)
            self.__kukkula_nappi.clicked.connect(self.valitse_tykisto)
            self.__silta_nappi.clicked.connect(self.valitse_parantaja)
            self.__joki_nappi.clicked.connect(self.valitse_poista_yksikko)
            self.__tasanko_nappi.clicked.disconnect(self.valitse_tasanko)
            self.__pelto_nappi.clicked.disconnect(self.valitse_pelto)
            self.__vuoristo_nappi.clicked.disconnect(self.valitse_vuoristo)
            self.__kukkula_nappi.clicked.disconnect(self.valitse_kukkula)
            self.__silta_nappi.clicked.disconnect(self.valitse_silta)
            self.__joki_nappi.clicked.disconnect(self.valitse_joki)
        elif tyyppi == "tietokone":
            self.__valittu_omistaja = "COM"
            self.__tasanko_nappi.setText("JALKAVÄKI (TIET)")
            self.__pelto_nappi.setText("RATSUVÄKI (TIET)")
            self.__vuoristo_nappi.setText("JOUSIMIEHET (TIET)")
            self.__kukkula_nappi.setText("TYKISTÖ (TIET)")
            self.__silta_nappi.setText("PARANTAJA (TIET)")
            self.__joki_nappi.setText("POISTA YKSIKKÖ")
            self.__tasanko_nappi.clicked.connect(self.valitse_jalkavaki)
            self.__pelto_nappi.clicked.connect(self.valitse_ratsuvaki)
            self.__vuoristo_nappi.clicked.connect(self.valitse_jousimiehet)
            self.__kukkula_nappi.clicked.connect(self.valitse_tykisto)
            self.__silta_nappi.clicked.connect(self.valitse_parantaja)
            self.__joki_nappi.clicked.connect(self.valitse_poista_yksikko)
コード例 #2
0
class Pelaa_valikko(QtWidgets.QMainWindow):

    def __init__(self, paavalikko):
        super(Pelaa_valikko, self).__init__()
        self.__scene_size = paavalikko.scene_size  # kentän koko pikseleinä
        self.__paavalikko = paavalikko
        self.__viive = 1500

        self.setCentralWidget(QtWidgets.QWidget())
        self.__paa_layout = QtWidgets.QHBoxLayout()
        self.centralWidget().setLayout(self.__paa_layout)

        # ikkuna
        self.setGeometry(0, 0, self.__scene_size + 420, self.__scene_size + 20)
        self.setWindowTitle('Strategiapeli')
        self.show()

        # scene
        self.__scene = QtWidgets.QGraphicsScene()

        # näkymä
        self.__nakyma = QtWidgets.QGraphicsView(self.__scene, self)
        self.__nakyma.adjustSize()
        self.__nakyma.show()
        self.__paa_layout.addWidget(self.__nakyma)

        self.__nappi_layout = QtWidgets.QGridLayout()
        self.__paa_layout.addLayout(self.__nappi_layout)

        # widgetit
        self.__seuraava_kentta_nappi = QtWidgets.QPushButton("SEURAAVA KENTTÄ")
        self.__seuraava_kentta_nappi.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        self.__edellinen_kentta_nappi = QtWidgets.QPushButton("EDELLINEN KENTTÄ")
        self.__edellinen_kentta_nappi.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        self.__valitse_kentta = QtWidgets.QPushButton("VALITSE KENTTÄ")
        self.__valitse_kentta.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        self.__poistu_nappi = QtWidgets.QPushButton("POISTU VALIKOSTA")
        self.__poistu_nappi.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)

        self.__seuraava_kentta_nappi.setStyleSheet("font: 10pt Arial")
        self.__edellinen_kentta_nappi.setStyleSheet("font: 10pt Arial")
        self.__poistu_nappi.setStyleSheet("font: 10pt Arial")
        self.__valitse_kentta.setStyleSheet("font: 10pt Arial")

        self.__nappi_layout.addWidget(self.__seuraava_kentta_nappi, 0, 1)
        self.__nappi_layout.addWidget(self.__edellinen_kentta_nappi, 0, 0)
        self.__nappi_layout.addWidget(self.__valitse_kentta, 1, 0)
        self.__nappi_layout.addWidget(self.__poistu_nappi, 1, 1)

        self.__seuraava_kentta_nappi.clicked.connect(self.__seuraava)
        self.__edellinen_kentta_nappi.clicked.connect(self.__edellinen)
        self.__valitse_kentta.clicked.connect(self.__valitse)
        self.__poistu_nappi.clicked.connect(self.__poistu)

        # karttojen piirtämiseen tarvittavat elementit
        self.__pelinohjain = None
        self.__kartta = None
        self.__valittu_elementti = None
        self.__koko_x = 0
        self.__koko_y = 0
        self.__kartta_index = 0
        self.__kartat = list(self.__paavalikko.kartan_lukija.kartat.keys())
        self.__piirra_kartta(self.__kartat[self.__kartta_index])
        self.__valitse_kentta.setText("VALITSE\n" + self.__kartat[self.__kartta_index])

    @property
    def paavalikko(self):
        return self.__paavalikko

    @property
    def koko_x(self):
        return self.__koko_x

    @property
    def koko_y(self):
        return self.__koko_y

    @property
    def kartat(self):
        return self.__kartat

    @property
    def scene_size(self):
        return self.__scene_size

    @property
    def scene(self):
        return self.__scene

    @property
    def kartta(self):
        return self.__kartta

    @property
    def valittu_elementti(self):
        return self.__valittu_elementti

    def __aseta_scene_rect(self, x, y):
        # rectin skaalauskertoimet
        if x > y:
            y /= x
            x = 1
        else:
            x /= y
            y = 1
        self.__scene.setSceneRect(0, 0, self.__scene_size * x, self.__scene_size * y)

        # keskelle liikuttaminen
        res_x = self.paavalikko.kayttoliittyman_lukija.x
        res_y = self.paavalikko.kayttoliittyman_lukija.y
        self.move(int(res_x / 2) - int(self.frameSize().width() / 2),
                  int(res_y / 2) - int(self.frameSize().height() / 2))

    def poista_pelinohjain(self):
        self.__pelinohjain = None

    def __piirra_kartta(self, nimi):
        x, y, ruudut, yksikot = self.__paavalikko.kartan_lukija.kartat[nimi]
        koko = (x, y)
        self.__koko_x = koko[0]
        self.__koko_y = koko[1]
        self.__kartta = Kartta(koko[0], koko[1], ruudut, self)
        self.__aseta_scene_rect(koko[0], koko[1])

        # lisätään maastot ja yksiköt vasta koko kartan luomisen jälkeen, kun kaikki ruudut ovat paikallaan
        for ruutu in self.__kartta.ruudut:
            ruutu.luo_maasto()
            ruutu.luo_grafiikka()
            ruutu.etsi_kartta()

        self.__kartta.lisaa_yksikot(yksikot, self.__paavalikko.yksikoiden_lukija.yksikot)

    # karttojen selaaminen eteenpäin
    def __seuraava(self):
        self.kartta.tyhjenna()
        self.__kartta_index += 1
        if self.__kartta_index == len(self.__kartat):
            self.__kartta_index = 0
        self.__piirra_kartta(self.__kartat[self.__kartta_index])
        self.__valitse_kentta.setText("VALITSE\n" + self.__kartat[self.__kartta_index])

    # karttojen selaaminen taaksepäin
    def __edellinen(self):
        self.kartta.tyhjenna()
        self.__kartta_index -= 1
        if self.__kartta_index == -1:
            self.__kartta_index = len(self.__kartat) - 1
        self.__piirra_kartta(self.__kartat[self.__kartta_index])
        self.__valitse_kentta.setText("VALITSE\n" + self.__kartat[self.__kartta_index])

    def __valitse(self):
        self.__pelinohjain = Pelinohjain(self.__kartat[self.__kartta_index], self.__paavalikko)
        self.hide()

    def __poistu(self):
        self.paavalikko.show()
        self.hide()
コード例 #3
0
class Pelinohjain:
    def __init__(self, kartan_nimi, paavalikko, luo_yksikot=True):
        self.__paavalikko = paavalikko
        self.__tallentaja = Pelin_tallentaja(self)
        self.__kayttoliittyma = Kayttoliittyma(self)

        self.__vuoro = "PLR"  # PLR = pelaaja, COM = tietokone
        self.__viive = paavalikko.kayttoliittyman_lukija.viive

        # kartan lukeminen
        self.__kartan_lukija = paavalikko.kartan_lukija
        x, y, ruudut, yksikot = self.__kartan_lukija.kartat[kartan_nimi]
        self.__koko = (x, y)
        self.__nimi = kartan_nimi
        self.__kartta = Kartta(self.__koko[0], self.__koko[1], ruudut,
                               self.__kayttoliittyma)

        self.__kayttoliittyma.aseta_scene_rect(self.__koko[0], self.__koko[1])

        # lukeminen
        self.__maaston_lukija = paavalikko.maastojen_lukija
        self.__yksikoiden_lukija = paavalikko.yksikoiden_lukija

        # maastojen luonti tehdään vasta koko kartan luomisen jälkeen, kun kaikki ruudut ovat paikallaan
        for ruutu in self.__kartta.ruudut:
            ruutu.luo_maasto()
            ruutu.luo_grafiikka()

        # maastot täytyy luoda ensin, jotta saadaan naapurit, joihin liikkuminen on mahdollista
        for ruutu in self.__kartta.ruudut:
            ruutu.etsi_naapurit()

        # vasta lopuksi luodaan yksiköt
        if luo_yksikot:
            self.__kartta.lisaa_yksikot(yksikot,
                                        self.__yksikoiden_lukija.yksikot)

        # polunhaku
        self.__polunhaku = Polunhaku()

        # tekoälyn ohjain
        self.__tekoalyn_ohjain = Tekoalyn_ohjain(self)

        # nappien alkutila
        self.kayttoliittyma.paivita_nappien_aktiivisuus()

        # ohjetekstin alkutila
        self.__kayttoliittyma.muuta_ohjeteksti("PELAAJAN VUORO\n")

    @property
    def paavalikko(self):
        return self.__paavalikko

    @property
    def kayttoliittyma(self):
        return self.__kayttoliittyma

    @property
    def tallentaja(self):
        return self.__tallentaja

    @property
    def viive(self):
        return self.__viive

    @property
    def vuoro(self):
        return self.__vuoro

    @property
    def nimi(self):
        return self.__nimi

    @property
    def kartta(self):
        return self.__kartta

    @property
    def koko(self):
        return self.__koko

    @property
    def yksikoiden_lukija(self):
        return self.__yksikoiden_lukija

    @property
    def maaston_lukija(self):
        return self.__maaston_lukija

    @property
    def polunhaku(self):
        return self.__polunhaku

    # laskee mahdolliset kohteet aloituksen ja liikkumispisteiden perusteella
    def laske_polut(self, aloitus, liikkuminen):
        mahdolliset_ruudut = []
        for ruutu in self.__kartta.ruudut:
            # rajoitetaan haku vain alueelle, jolle liikkumispisteet riittävät
            if ruutu.maasto.liikkuminen and ruutu.yksikko is None \
                    and self.__polunhaku.heuristiikka(aloitus, ruutu) <= liikkuminen:
                ruudut, hinnat = self.__polunhaku.hae_polkua(aloitus, ruutu)
                if ruudut is not False:
                    hinta = self.__polunhaku.laske_hinta(hinnat, ruutu)
                    if hinta <= liikkuminen:
                        mahdolliset_ruudut.append(ruutu)
        return mahdolliset_ruudut

    def vaihda_vuoroa(self):
        if self.__vuoro == "PLR":
            self.__tietokoneen_vuoron_alku()
        elif self.__vuoro == "COM":
            self.__pelaajan_vuoron_alku()

    def __pelaajan_vuoron_alku(self):
        # tietokoneen vuoron loppu
        for yksikko in self.__kartta.tietokoneen_yksikot:
            # jos yksikkö on tehnyt jotain, se saa 2 energiaa, muuten 1
            yksikko.saa_energiaa()
            if yksikko.liikkuminen_kaytetty or yksikko.hyokkays_kaytetty:
                yksikko.saa_energiaa()
            yksikko.kasittele_tilavaikutukset()
            yksikko.grafiikka.paivita_tooltip()

        # pelaajan vuoron alku
        self.__vuoro = "PLR"
        if len(self.__kartta.pelaajan_yksikot) != 0:
            self.__kayttoliittyma.laita_napit_kayttoon()
            self.__kayttoliittyma.tyhjenna_valinta()
            self.__kayttoliittyma.__valitsee_hyokkayksen_kohdetta = False
            self.__kartta.palauta_pelaajan_toimivat_yksikot()
            self.__kayttoliittyma.muuta_ohjeteksti("PELAAJAN VUORO\n")
            for yksikko in self.__kartta.pelaajan_yksikot:
                if not yksikko.onko_taintunut():
                    yksikko.palauta_liikkumispisteet()
                yksikko.grafiikka.palauta_vari()
            self.kayttoliittyma.paivita_nappien_aktiivisuus()
        else:
            self.kayttoliittyma.havio()

    def __tietokoneen_vuoron_alku(self):
        # pelaajan vuoron loppu
        self.__kayttoliittyma.tyhjenna_valinta()
        self.__kayttoliittyma.__valitsee_hyokkayksen_kohdetta = False
        for yksikko in self.__kartta.pelaajan_yksikot:
            # jos yksikkö on tehnyt jotain, se saa 2 energiaa, muuten 1
            yksikko.saa_energiaa()
            if yksikko.liikkuminen_kaytetty or yksikko.hyokkays_kaytetty:
                yksikko.saa_energiaa()
            yksikko.kasittele_tilavaikutukset()
            yksikko.grafiikka.paivita_tooltip()

        # tietokoneen vuoron alku
        self.__kayttoliittyma.muuta_ohjeteksti("TIETOKONEEN VUORO\n")
        for yksikko in self.__kartta.tietokoneen_yksikot:
            if not yksikko.onko_taintunut():
                yksikko.palauta_liikkumispisteet()
        self.__tietokoneen_vuoro()

    def __tietokoneen_vuoro(self):
        self.__vuoro = "COM"
        self.__kayttoliittyma.poista_napit_kaytosta()

        self.__tekoalyn_ohjain.ohjaa_yksikoita()
        Ajastin.aloita_ajastin(self.__viive, self.vaihda_vuoroa)

    def tarkista_voitto(self):
        if len(self.kartta.tietokoneen_yksikot) == 0:
            self.kayttoliittyma.voitto()