-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathGame.py
More file actions
153 lines (115 loc) · 4.72 KB
/
Game.py
File metadata and controls
153 lines (115 loc) · 4.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
from player.Player import Player
from player.ComputerPlayer import ComputerPlayer
from player.RealPlayer import RealPlayer
from Deck import Deck
from Card import Card
from typing import List
class Game():
def __init__(self) -> None:
self.players: List[Player] = []
self.turns: int = 1
self.deck: Deck
self.board: List[tuple[Player,Card]] = []
self.initTurns()
self.initDeck()
def initDeck(self) -> None:
self.deck = Deck()
def initTurns(self) -> None:
self.turns = 1
def initBoard(self) -> None:
self.board = []
def addTurn(self,number)-> None:
self.turns += number
def setPlayer(self, playerType: str) -> None:
if playerType == 'pc':
self.players.append(ComputerPlayer())
if playerType == 'real':
self.players.append(RealPlayer())
def gameStart(self)-> None:
print("遊戲開始:")
index = 1
while True:
# try:
playerType = input(f"""新增玩家 {index},
欲新增真實玩家請輸入0, 欲新增電腦玩家請輸入1:""")
if int(playerType) == 1:
print('新增電腦玩家')
self.setPlayer('pc')
if int(playerType) == 0:
print('新增真實玩家')
self.setPlayer('real')
if len(self.players)>= 4:
break
else:
index += 1
# except:
# continue
self.deck.initDeck()
self.deck.shuffle()
pass
def drawStage(self, players: List[Player])-> None:
self.initTurns()
print('抽牌階段')
while self.turns < 13:
self.addTurn(1)
for player in players:
if player.hand.countCards() < 13:
card:Card = self.deck.drawCard()
player.hand.addCard(card = card)
for index, player in enumerate(players):
handContent = [f'{card.surface()}' for card in player.hand.cards]
print(f'玩家{index+1} 手牌為 {handContent}')
pass
def takeTurn(self,player: Player, otherPlayers: List[Player])-> None:
# 交換手牌
if player.decideToExchange():
player.chooseExchangePlayer(otherPlayers)
# showCard
countCard = player.hand.countCards()
if countCard > 0:
card = player.showCard()
self.board.append([player,card])
if countCard <= 0:
print(f'玩家{ player.name},手牌為空,跳過本回合')
pass
def mainStage(self, players: List[Player])-> None:
self.initTurns()
while self.turns < 13:
self.initBoard()
print("==============================")
print(f'第{self.turns}回合:')
# 每個玩家輪流 takeTurn
for index, player in enumerate(players):
print(f'玩家{index+1} {player.name} 執行動作:')
self.takeTurn(player = player,
otherPlayers= players[:index] + players[index + 1:])
player.checkTurnCounter()
# 顯示 players 出牌內容
print('出牌結果')
for item in self.board:
player, card = item
print(f'玩家: {player.name}, {card.surface()}')
# 比較手牌大小
print('比較手牌大小')
maxItem = tuple[Player,Card]
maxScore:int = 0
for item in self.board:
player, card = item
value = card.value()
if maxScore < value or maxScore == 0:
maxItem = item
maxScore = value
player,card = maxItem
player.addPoint()
print(f'本回合獲勝者: {player.name}, {card.surface()}')
self.turns += 1
# 13 回合後,P1~P4 皆已出完全部的牌,遊戲結束。取得最多分數的玩家為勝者,將勝者的名稱顯示出來。
maxScore:int = 0
winner:Player
for player in players:
if maxScore == 0 or maxScore < player.point:
winner = player
print(f'最終贏家:{winner.name}, 共{winner.point}點')
pass
def finish(self)-> None:
print('遊戲結束')