feat: 최대 강화 단계, 현재 골드 기반 랭크 추가

This commit is contained in:
bumpsoo 2026-02-08 17:08:37 +09:00
parent 30debc44f5
commit 71e09915b7
6 changed files with 197 additions and 9 deletions

View file

@ -17,6 +17,10 @@ class PacketID(IntEnum):
CS_RankingRequest = 40
SC_RankingList = 41
class RankingType(IntEnum):
LEVEL = 0
GOLD = 1
class SwordGameClient(ctk.CTk):
def __init__(self):
super().__init__()
@ -57,6 +61,7 @@ class SwordGameClient(ctk.CTk):
# 메인 레이아웃
self.grid_columnconfigure(0, weight=1)
self.grid_columnconfigure(1, weight=2)
self.grid_columnconfigure(2, weight=1)
self.grid_rowconfigure(0, weight=1)
# 왼쪽: 유저 정보 창
@ -78,6 +83,9 @@ class SwordGameClient(ctk.CTk):
self.sell_btn = ctk.CTkButton(self.info_frame, text="판매 하기", fg_color="#dc3545", hover_color="#c82333", command=self.send_sell)
self.sell_btn.pack(pady=10, fill="x", padx=20)
self.ranking_btn = ctk.CTkButton(self.info_frame, text="랭킹 갱신", fg_color="#17a2b8", hover_color="#138496", command=self.request_rankings)
self.ranking_btn.pack(pady=10, fill="x", padx=20)
# 오른쪽: 채팅 창
self.chat_frame = ctk.CTkFrame(self)
self.chat_frame.grid(row=0, column=1, padx=20, pady=20, sticky="nsew")
@ -89,7 +97,24 @@ class SwordGameClient(ctk.CTk):
self.chat_entry.pack(fill="x", padx=10, pady=(0, 10))
self.chat_entry.bind("<Return>", lambda e: self.send_chat())
# TODO: 채팅창 오른 쪽에 랭킹?
# 오른쪽: 랭킹 창
self.ranking_frame = ctk.CTkFrame(self)
self.ranking_frame.grid(row=0, column=2, padx=20, pady=20, sticky="nsew")
self.rank_title = ctk.CTkLabel(self.ranking_frame, text="실시간 랭킹", font=("Arial", 18, "bold"))
self.rank_title.pack(pady=10)
self.rank_tab = ctk.CTkSegmentedButton(self.ranking_frame, values=["강화 단계", "자산"], command=self.on_rank_tab_changed)
self.rank_tab.set("강화 단계")
self.rank_tab.pack(pady=5, padx=10, fill="x")
self.rank_list_box = ctk.CTkTextbox(self.ranking_frame, state="disabled", font=("Courier New", 12))
self.rank_list_box.pack(expand=True, fill="both", padx=10, pady=10)
self.my_rank_label = ctk.CTkLabel(self.ranking_frame, text="내 순위: -", font=("Arial", 14, "bold"), text_color="#FFD700")
self.my_rank_label.pack(pady=10)
self.request_rankings()
def connect_to_server(self):
self.nickname = self.nickname_entry.get()
@ -171,6 +196,11 @@ class SwordGameClient(ctk.CTk):
msg = payload.decode('utf-8')
self.after(0, lambda: self.log_chat(msg))
elif pkt_id == PacketID.SC_RankingList:
res = Protocol.SC_RankingList()
res.ParseFromString(payload)
self.after(0, lambda: self.update_ranking_ui(res))
def update_stats(self):
self.level_label.configure(text=f"검 레벨: {self.current_level}")
self.gold_label.configure(text=f"골드: {self.current_gold:,}")
@ -194,6 +224,42 @@ class SwordGameClient(ctk.CTk):
self.chat_box.see("end")
self.chat_box.configure(state="disabled")
def request_rankings(self):
tab = self.rank_tab.get()
rtype = RankingType.LEVEL if tab == "강화 단계" else RankingType.GOLD
pkt = Protocol.CS_RankingRequest()
pkt.type = rtype
self.send_packet(PacketID.CS_RankingRequest, pkt)
def on_rank_tab_changed(self, value):
self.request_rankings()
def update_ranking_ui(self, res):
self.rank_list_box.configure(state="normal")
self.rank_list_box.delete("1.0", "end")
header = f"{'순위':<4} {'닉네임':<12} {'':<10}\n"
self.rank_list_box.insert("end", header)
self.rank_list_box.insert("end", "-" * 30 + "\n")
for entry in res.entries:
val_str = f"{entry.value:,}"
if res.type == RankingType.LEVEL:
val_str = f"{entry.value}단계"
line = f"{entry.rank:<4} {entry.nickname:<12} {val_str:<10}\n"
self.rank_list_box.insert("end", line)
self.rank_list_box.configure(state="disabled")
if res.my_rank != -1:
my_val_str = f"{res.my_value:,}"
if res.type == RankingType.LEVEL:
my_val_str = f"{res.my_value}단계"
self.my_rank_label.configure(text=f"내 순위: {res.my_rank}위 ({my_val_str})")
else:
self.my_rank_label.configure(text="내 순위: 기록 없음")
if __name__ == "__main__":
app = SwordGameClient()
app.mainloop()