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)
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)