qingGo_0_0需求:
1,設計一個9路棋盤,對弈雙方輪流落子
2,已落子的點不能再落子
3,棋盤上沒有空點時,統計雙方棋子數量,多的一方贏
設計:
1,使用QipanModel類建立棋盤模型

1 class QipanModel(): 2 def __init__(self,n=9): 3 self.n = n #棋盤路數,默認9路棋盤 4 #棋盤點位,從(1,1)開始,(9,9)結束 5 #用字典表示,例"1_1":0, 0空,1黑,-1白,初始所有點為空 6 self.dot = {f'{i}_{j}':0 for i in range(1,self.n+1) for j in range(1,self.n+1)} 7 #棋子數量,黑子白子初始為0 8 self.black_num = 0 9 self.white_num = 0 10 11 #更改點位狀態,(x,y)是要更改的點位 12 def update_dot_status(self,x:int,y:int,color:str): 13 if color == 'black': 14 self.dot[f'{x}_{y}'] = 1 15 self.black_num+=1 16 elif color == "white": 17 self.dot[f'{x}_{y}'] = -1 18 self.white_num+=1 19 20 #查看點位狀態 21 def select_dot_status(self,x,y): 22 print(f'點({x},{y})為{self.dot[f"{x}_{y}"]}') 23 24 #獲取所有空的點位 25 def empty_dot(self): 26 return [k for k in self.dot if self.dot[k] == 0]QipanModel
2,用繼承Tk類的QipanView實作界面

1 from tkinter import * 2 3 class QipanView(Tk): 4 def __init__(self,n=9): 5 print("qingGo棋盤開始繪制!!!") 6 Tk.__init__(self) ###父類必須初始化 7 self.n = n #9路棋盤 8 self.title("圍棋qingGo_0_0") 9 10 11 # 創建畫布 12 self.canvas = Canvas(self, width=600, height=500, bg='red') 13 self.canvas.pack() 14 # 畫棋盤 15 self.size = 40 #圍棋每小格的長度,每小格長度(單位是像素) 16 # 畫外框線 17 # 起點start_dot(sx,sy) 終點end_dot(ex,ey) 18 sx = self.canvas.winfo_x() + 20 19 sy = self.canvas.winfo_y() + 20 20 ex = sx + self.size * (self.n - 1) 21 ey = sy + self.size * (self.n - 1) 22 self.canvas.create_rectangle(sx, sy, ex, ey, fill='') 23 # 畫豎線 24 # 外框線畫好因此只需畫n-2條線 25 # 豎線起點每條線x遞增size,y不變 26 for i in range(1, self.n - 1): 27 self.canvas.create_line(sx + self.size * i, sy, sx + self.size * i, ey) 28 # 畫橫線,每條線y遞增size,x不變 29 for i in range(1, self.n - 1): 30 self.canvas.create_line(sx, sy + self.size * i, ex, sy + self.size * i) 31 self.wm_attributes('-topmost', 1) # 確保視窗在最上層 32 33 print("qingGo棋盤繪制完成!!!") 34 35 36 # x,y是坐標,從1開始,(1,1)開始,(9,9)結束,棋手落子時,傳入坐標點,棋手顏色 37 def luozi(self, x: int, y: int,color='black'): 38 # sx,sy是繪制棋盤外框線時左上角的坐標 39 sx = self.canvas.winfo_x() + 20 40 sy = self.canvas.winfo_y() + 20 41 # 棋子左上角和右下角的坐標分別如下,加2減2為了讓棋子小一點 42 x1 = sx + (x - 1) * self.size - self.size / 2 + 2 43 y1 = sy + (y - 1) * self.size - self.size / 2 + 2 44 x2 = sx + (x - 1) * self.size + self.size / 2 - 2 45 y2 = sy + (y - 1) * self.size + self.size / 2 - 2 46 self.canvas.create_oval(x1, y1, x2, y2, fill=color) # 畫棋子 47 self.update() #更新畫布,不然畫不了QipanView
3,創建棋手類,用于作為對弈雙方的抽象

1 import random 2 from qingGo.qingGo0_0.caipan import Caipan 3 from qingGo.qingGo0_0.qipan_model import QipanModel 4 from qingGo.qingGo0_0.qipan_view import QipanView 5 6 class Qishou(): 7 def __init__(self,color='black'): 8 self.color = color 9 print(self.color+"方就位!") 10 11 #下棋 12 def xiaqi(self, qipan_model:QipanModel, qing_view:QipanView, caipan:Caipan): 13 # 獲取空點 14 empty_dot = qipan_model.empty_dot() 15 l = len(empty_dot) 16 if l == 0: 17 print("棋盤滿了!請裁判判定勝負!!!") 18 caipan.who_win(qipan_model) 19 return "棋盤滿了!" 20 21 #用隨機函式,選擇一個點 22 dot = empty_dot[random.randint(0,l-1)] 23 x = int(dot[0]) 24 y = int(dot[2]) 25 #更改棋盤中點狀態 26 qipan_model.update_dot_status(x, y, color=self.color) 27 #落子,界面展示 28 qing_view.luozi(x,y,color=self.color) 29 #落子后裁判報位置 30 caipan.luozi_place(x, y, self.color)Qishou
4,裁判類,棋手落子后播報位置,判斷勝負

1 from qingGo.qingGo0_0.qipan_model import QipanModel 2 class Caipan(): 3 def __init__(self): 4 print("裁判上場!") 5 6 #棋手下棋后裁判報位置 7 def luozi_place(self,x,y,color): 8 print(f"{color} 落子在({x},{y})") 9 # 判斷勝負 10 def who_win(self,qipan_model:QipanModel): 11 print(f"黑子:{qipan_model.black_num},白子:{qipan_model.white_num}") 12 if qipan_model.black_num>qipan_model.white_num: 13 print("黑方獲得勝利!") 14 else: 15 print("白方獲得勝利!")Caipan
5,創建run.py實作功能

1 import random 2 import time 3 4 from qingGo.qingGo0_0.caipan import Caipan 5 from qingGo.qingGo0_0.qipan_model import QipanModel 6 from qingGo.qingGo0_0.qipan_view import QipanView 7 from qingGo.qingGo0_0.qishou import Qishou 8 9 if __name__ == '__main__': 10 #繪制棋盤 11 qv = QipanView() 12 13 #初始化模型 14 qm = QipanModel() 15 #白方上場 16 w = Qishou("white") 17 #黑方上場 18 b = Qishou("black") 19 #裁判上場 20 cp = Caipan() 21 22 #下棋次數為9*9,加1是為了看棋盤滿了后的效果 23 i = qm.n**2+1 24 while i>0: 25 if i%2 == 1: 26 w.xiaqi(qm, qv,cp) 27 else: 28 b.xiaqi(qm, qv,cp) 29 i-=1 30 time.sleep(0.05) 31 32 # 畫畫功能 33 qv.mainloop()run.py
效果圖:
簡單的目錄結構,其中的Pictures檔案夾是其他專案的,與此無關
總結:
忽略美觀程度,可以看到,效果已經有了,畢竟是初代程式,等后續升級.
至此,我們可以得出結論,在這個版本中,想要贏的勝利,只需要先下棋就行了,畢竟需求沒有提到要吃子
意圖設計一個圍棋AI
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/550297.html
標籤:Python