Esempio n. 1
0
    def keyPressEvent(self, event):
        self.canKeyboardInput = True
        key = event.key()

        if self.status == EGameStatus.EPlaying:

            if self.player is None:
                print('Null player')
                return

            # delta 값 초기화
            deltaX = 0
            deltaY = 0

            if key == Qt.Key_Left:
                # print('Left Arrow Pressed')
                deltaX = -1
                deltaY = 0
            elif key == Qt.Key_Right:
                # print('Right Arrow Pressed')
                deltaX = 1
                deltaY = 0
            elif key == Qt.Key_Up:
                # print('Up Arrow Pressed')
                deltaX = 0
                deltaY = -1
            elif key == Qt.Key_Down:
                # print('Down Arrow Pressed')
                deltaX = 0
                deltaY = 1
            elif key == Qt.Key_R:
                self.onClickReset()
                return
            elif key == Qt.Key_1:
                if self.backButton.isEnabled():
                    self.onClickBack()
                return
            elif key == Qt.Key_2:
                if self.nextButton.isEnabled():
                    self.onClickNext()
                return
            else:
                return

            # currentStage에 있는 object들
            deltaObject = self.currentStage[App.player.y +
                                            deltaY][App.player.x + deltaX]
            playerPositionOnStage = self.currentStage[App.player.y][
                App.player.x]
            deltaClassName = type(deltaObject).__name__

            # 끔찍한 코드... 더 낫게 할 수 없을까?
            if deltaClassName == 'Blank':
                print('You can go (Blank)')
                self.gamePlayerMove(deltaX, deltaY)
            elif deltaClassName == 'Button':
                if deltaObject.status == EButtonStatus.blank:
                    print('You can go (Button-Blank)')
                    self.gamePlayerMove(deltaX, deltaY)
                elif deltaObject.status == EButtonStatus.withBox:
                    doubleDeltaObject = self.currentStage[App.player.y +
                                                          deltaY *
                                                          2][App.player.x +
                                                             deltaX * 2]
                    doubleDeltaClassName = type(doubleDeltaObject).__name__

                    if doubleDeltaClassName == 'Blank':
                        print('You can go (Button(with Box)-Blank)')
                        deltaObject.changeStatus(EButtonStatus.blank)
                        self.currentStage[doubleDeltaObject.y][
                            doubleDeltaObject.x] = Box(doubleDeltaObject.x,
                                                       doubleDeltaObject.y,
                                                       self.boxPixmap)
                        self.goal += 1
                        self.gamePlayerMove(deltaX, deltaY)
                    elif doubleDeltaClassName == 'Button':
                        if doubleDeltaObject.status == EButtonStatus.blank:
                            doubleDeltaObject.changeStatus(
                                EButtonStatus.withBox)
                            deltaObject.changeStatus(EButtonStatus.blank)
                            print(
                                'You can go (Button(withBox) - Button(Blank))')
                            self.gamePlayerMove(deltaX, deltaY)
                        elif doubleDeltaObject.status == EButtonStatus.withBox:
                            print(
                                'You can\'t go (Button(with Box)-(Button(with Box))'
                            )
                    elif doubleDeltaClassName == 'Box':
                        print('You can\'t go (Button(with Box)-Box)')
                    elif doubleDeltaClassName == 'Wall':
                        print('You can\'t go (Button(With Box) - Wall)')
            elif deltaClassName == 'Wall':
                print('You can\'t go (Wall)')
                pass
            elif deltaClassName == 'Box':
                doubleDeltaObject = self.currentStage[App.player.y +
                                                      deltaY * 2][App.player.x
                                                                  + deltaX * 2]
                doubleDeltaClassName = type(doubleDeltaObject).__name__

                if doubleDeltaClassName == 'Box':
                    print('You can\'t go (Box - Box)')
                    pass
                elif doubleDeltaClassName == 'Wall':
                    print('You can\'t go (Box - Wall)')
                    pass
                elif doubleDeltaClassName == 'Blank':
                    print('You can go (Box - Blank)')
                    self.swapInCurrentStage(doubleDeltaObject, deltaObject)
                    self.gamePlayerMove(deltaX, deltaY)
                elif doubleDeltaClassName == 'Button':
                    if doubleDeltaObject.status == EButtonStatus.blank:
                        deltaObject.erase()
                        print('You can go (Box - Button(Blank))')
                        blank = Blank(deltaObject.x, deltaObject.y,
                                      self.blankPixmap0)
                        self.currentStage[App.player.y +
                                          deltaY][App.player.x +
                                                  deltaX] = blank
                        blank.erase()
                        del deltaObject
                        self.goal -= 1
                        self.gamePlayerMove(deltaX, deltaY)
                        doubleDeltaObject.changeStatus(EButtonStatus.withBox)
                    elif doubleDeltaObject.status == EButtonStatus.withBox:
                        print('You can\'t go (Box - Button(With Box))')

        if self.goal == 0:
            print('Clear!')
            self.nextButton.setEnabled(True)
Esempio n. 2
0
    def loadStage(self, number):
        self.eraseStage()
        self.currentStage = [[] for i in range(0, len(self.mapData[number]))]
        self.blankList = []
        self.step = 0
        goalNum = 0
        self.nextButton.setEnabled(False)
        if number == 0:
            self.backButton.setEnabled(False)
        else:
            self.backButton.setEnabled(True)

        gc.collect()

        self.stageText.setText('Stage: ' + str(number + 1))
        self.stepText.setText('Step: ' + str(self.step))
        self.currentLevel = number

        # 게임 화면을 중앙으로
        x = (self.width - Object.size * len(self.mapData[number][0])) * 0.5
        y = (self.height - Object.size * len(self.mapData[number])) * 0.5
        Object.setPositionOffset(x, y + 40)

        for y in range(0, len(self.mapData[number])):
            for x in range(0, len(self.mapData[number][y])):
                # 일단 모든 맵을 공백으로 채운다. blankList에 blank를 추가한다.
                print(type(self.mapData[number][y][x]), type(EObjects.EPlayer),
                      y, x)
                if self.mapData[number][y][x] != EObjects.EBlankWithNoGlass:
                    if randomPercent(0.1):
                        blank = Blank(x, y, self.blankPixmap1)
                    elif randomPercent(0.05):
                        blank = Blank(x, y, self.blankPixmap2)
                    elif randomPercent(0.02):
                        blank = Blank(x, y, self.blankPixmap3)
                    else:
                        blank = Blank(x, y, self.blankPixmap0)
                    self.blankList.append(blank)
                    blank.lower()
                    # pass
                    self.background.stackUnder(blank)

                if self.mapData[number][y][x] == EObjects.EBox:
                    box = Box(x, y, self.boxPixmap)
                    self.currentStage[y].append(box)
                    box.raise_()
                elif self.mapData[number][y][x] == EObjects.EPlayer:
                    playerStartX = x
                    playerStartY = y
                    print('Player found!')

                    blank = Blank(x, y, self.blankPixmap0)
                    self.currentStage[y].append(blank)
                    blank.erase()
                elif self.mapData[number][y][x] == EObjects.EWall:
                    self.currentStage[y].append(Wall(x, y, self.wallPixmap))
                elif self.mapData[number][y][x] == EObjects.EButton:
                    goalNum += 1
                    self.currentStage[y].append(Button(x, y,
                                                       self.buttonPixmap))
                elif self.mapData[number][y][
                        x] == EObjects.EBlank or self.mapData[number][y][
                            x] == EObjects.EBlankWithNoGlass:
                    blank = Blank(x, y, self.blankPixmap0)
                    self.currentStage[y].append(blank)
                    blank.erase()

        self.goal = goalNum
        self.goalText.setText('Goal: ' + str(self.goal))

        # ordering을 위해 player는 마지막에 생성한다!
        App.player = Player(playerStartX, playerStartY, self.playerPixmap)