class testLogic(unittest.TestCase): def setUp(self): self.t1 = Logic() def testDrawCard(self): newCard = self.t1.drawCard() try: self.assertIn(newCard, listOfCard) except: self.assertEqual(newCard[-1], 'D') def testCardSum(self): self.assertEqual(self.t1.cardSum(['spadesA', 'heart10', 'club5', 'diamond8']), 24) def testDie(self): self.t1.pool = 50 self.t1.playerMoney = 100 self.t1.die() self.assertEqual(self.t1.pool, 0) self.assertEqual(self.t1.playerMoney, 50) def testSetPool(self): self.t1.setPool(10) self.assertEqual(self.t1.pool, 10) self.t1.setPool(20) self.assertEqual(self.t1.pool, 30) def testEndGame(self): self.t1.dealerCard = ['club7', 'heart10'] for i in [(16, -1), (17, 0), (18, 1)]: self.t1.playerNum = i[0] self.t1.endGame() self.assertEqual(self.t1.endGame()[0], i[1]) self.t1.playerNum = 21 self.t1.endGame() self.assertEqual(self.t1.endGame()[0], 2)
class Graphic(QWidget): def __init__(self): super().__init__() # 게임을 불러옴 self.game = Logic() # 전체 설정 self.setWindowTitle("BalckJack") self.setGeometry(300, 300, 500, 500) mainLayout = QGridLayout() # 딜러, 플레이어 패 레이아웃 설정 dealerBar = QLabel() dealerBar.setText("Dealer Bar") self.dealerLayout = QHBoxLayout() self.dealerLayout.addStretch(1) playerBar = QLabel() playerBar.setText("Player Bar") self.playerLayout = QHBoxLayout() self.playerLayout.addStretch(1) # 메인레이아웃에 배치 mainLayout.addWidget(dealerBar, 0, 0, 1, 2) mainLayout.addLayout(self.dealerLayout, 1, 0, 1, 2) mainLayout.addWidget(playerBar, 2, 0, 1, 2) mainLayout.addLayout(self.playerLayout, 3, 0, 1, 2) # 상황판 배치 self.statusBox = QTextEdit() self.statusBox.setReadOnly(True) self.statusBox.setFixedSize(1500, 100) mainLayout.addWidget(self.statusBox, 4, 0, 1, 2) # 슬라이더 LCD 배치 self.poolSlider = QSlider(Qt.Horizontal) self.poolSlider.setRange(0, self.game.getMoney()) self.poolSlider.setSingleStep(1) poolLCD = QLCDNumber() self.poolSlider.valueChanged.connect(poolLCD.display) sliderLayout = QGridLayout() sliderLayout.addWidget(self.poolSlider, 1, 0) sliderLayout.addWidget(poolLCD, 0, 0) mainLayout.addLayout(sliderLayout, 5, 0) # 버튼 배치 buttonLayout = QGridLayout() self.raiseButton = Button('Raise', self.raiseEvent) self.dieButton = Button('Die', self.dieEvent) self.stayButton = Button('Stay', self.stayEvent) self.hitButton = Button('Hit', self.hitEvent) buttonLayout.addWidget(self.raiseButton, 0, 0) buttonLayout.addWidget(self.stayButton, 0, 1) buttonLayout.addWidget(self.dieButton, 1, 0) buttonLayout.addWidget(self.hitButton, 1, 1) mainLayout.addLayout(buttonLayout, 5, 1) # 전체 설정 self.setLayout(mainLayout) self.show() # 게임 시작 self.hitEvent() def raiseEvent(self): # raise버튼 눌리면 연결 # setPool호출 -> 건 돈 전달 self.game.setPool(self.poolSlider.value()) # draw호출 ret = self.game.drawCard() # 마지막 글자가 D면 21이 넘어가 게임이 끝난 상태 if ret[-1] == "D": # 버튼 종료 self.buttonSwith(False) self.playerLayout.addWidget(ImageLabel(domain(ret[:-1]))) self.statusBox.setText("21이 넘어갔습니다. \ \n플레이어 : {}\n딜러 : {}" \ .format(self.game.playerNum, self.game.dealerNum)) # 게임이 종료되었는지 확인 if self.game.remainMoney(): self.gameOver() else: # 그렇지 않으면 카드를 화면에 추가 self.playerLayout.addWidget(ImageLabel(domain(ret))) self.poolSlider.setRange(0, self.game.getMoney()) self.statusBox.setText(self.game.getPlayerStatus() \ + "\n플레이어 : {}\n딜러 : {}" \ .format(self.game.playerNum, self.game.dealerNum)) def dieEvent(self): # die버튼 눌리면 연결 # 버튼부터 끄기 self.buttonSwith(False) # 라운드 정지 판정 self.statusBox.setText("다이하셨습니다.") self.game.die() # 돈을 다 잃으면 정지 if self.game.remainMoney(): self.gameOver() def stayEvent(self): # stay버튼 눌리면 연결 # 판돈 보내기 self.game.setPool(self.poolSlider.value()) # endGame 메서드 호출 result, dealerCards = self.game.endGame() # 딜러의 카드 배치 for card in dealerCards[2:]: self.dealerLayout.addWidget(ImageLabel(domain(card))) # 결과에 따른 메시지 출력 if result == 2: self.statusBox.setText("블랙잭! 2배로 받습니다.") elif result == 1: self.statusBox.setText("이기셨습니다. 판돈만큼 받습니다.") elif result == 0: self.statusBox.setText("비기셨습니다. 돈은 그대로 유지됩니다.") else: self.statusBox.setText("지셨습니다. 판돈만큼 잃습니다.") self.statusBox.append(self.game.getPlayerStatus()) self.buttonSwith(False) # 돈을 다 잃으면 정지 if self.game.remainMoney(): self.gameOver() def hitEvent(self): # hit 버튼 눌리면 연결 # 카드 패 모두 지우기 for i in reversed(range(self.dealerLayout.count())): try: self.dealerLayout.itemAt(i).widget().deleteLater() except: pass for i in reversed(range(self.playerLayout.count())): try: self.playerLayout.itemAt(i).widget().deleteLater() except: pass # hit 메서드 호출 cards = self.game.hit() # 카드 추가 self.dealerLayout.addWidget(ImageLabel(domain(cards[0][0]))) self.dealerLayout.addWidget(ImageLabel(domain(cards[0][1]))) self.playerLayout.addWidget(ImageLabel(domain(cards[1][0]))) self.playerLayout.addWidget(ImageLabel(domain(cards[1][1]))) # 버튼 키기 self.buttonSwith(True) # 상태바 슬라이더 정리 self.statusBox.setText("게임을 시작합니다.") self.statusBox.append(self.game.getPlayerStatus()) self.poolSlider.setRange(0, self.game.getMoney()) def gameOver(self): # 남은 돈이 없으면 호출 # 버튼 다 끄기 self.buttonSwith(False) self.hitButton.setEnabled(False) self.statusBox.setText("남은 돈이 없습니다.") def buttonSwith(self, boolean): # 코드 반복 방지를 위한 버튼 키고끄는 메서드 self.raiseButton.setEnabled(boolean) self.dieButton.setEnabled(boolean) self.stayButton.setEnabled(boolean) self.hitButton.setEnabled(not boolean)