以為第二篇很晚到來,主要是我的想法是等我把機器學習學個大概之後再回來優化。不過最近在深入的學習python,學到了一些pythonic的**風格,所以決定回來重構一下我的五子棋**
###這次主要做了
####1.優化了我的**,使得**更加簡潔美觀。可讀性更高。
比如這段優化前的函式:
def robotchess(self):
if self.player == 0:
if len(self.bla_chessed) == 0 and len(self.whi_chessed) == 0:
self.can.create_oval(25 + 30 * 7 - 11, 25 + 30 * 7 - 11, 25 + 30 * 7 + 11, 25 + 30 * 7 + 11,
fill="black")
self.board[7][7] = 1
return
else:
_x, _y, _ = self.robot.maxvalue_po(1, 0)
#print([_x, _y], [x, y])
newpoint = [_x * 30 + 25, _y * 30 + 25]
self.can.create_oval(newpoint[0] - 11, newpoint[1] - 11, newpoint[0] + 11, newpoint[1] + 11,
fill="black")
self.board[_x][_y] = 0
else:
_x, _y, _ = self.robot.maxvalue_po(0, 1)
newpoint = [_x * 30 + 25, _y * 30 + 25]
self.can.create_oval(newpoint[0] - 11, newpoint[1] - 11, newpoint[0] + 11, newpoint[1] + 11,
fill="white")
self.board[_x][_y] = 1
優化後:
def robotchess(self):
"""機械人下棋"""
if self.player == 0:
if len(self.bla_chessed) == 0 and len(self.whi_chessed) == 0:
'''電腦執黑棋,開局優化'''
self.draw_a_chess(*self.bla_start_pos, player=0)
return
else:
_x, _y, _ = self.robot.maxvalue_po(0, 1)
newpoint = pos_in_board(_x, _y)
self.draw_a_chess(*newpoint, player=0)
else:#白棋下
_x, _y, _ = self.robot.maxvalue_po(1, 0)
newpoint = pos_in_board(_x, _y)
self.draw_a_chess(*newpoint, player=1)
很明顯**更加簡潔,不會看起來很混亂####2.新增了注釋,可以幫助閱讀
####3.運用了一些pythonic的寫法,特別是大量運用拆包,使得**可以很簡潔,沒有那麼多看起來那麼多的變數。還有將一些有重複性的功能模組化,減少了整體的**量。
如果不知道拆包是什麼,請看我的另一篇博文:python高階(一):python技巧
比如這一段**就運用:
if len(self.whi_chessed) != 0:
for tmp in self.whi_chessed:
oval = pos_to_draw(*tmp[0:2])
self.can.create_oval(oval, fill="white")
其中第三行:
oval = pos_to_draw(*tmp[0:2])
*temp[0:2]實際相當於tmp[0],tmp[1]
而pos_to_draw的原函式是:
def pos_to_draw(*args):
"""計算棋子在棋盤的頂,底,左,右的位置"""
x, y = args
return x - 11, y - 11, x + 11, y + 11
這裡*arg運用到另乙個知識點,請看: python高階(三):*args,**kwargs的使用效果: 五子棋練習(二)
這是主程式的部分。到這裡已經可以實現黑白輪流落子了。import chess import tkinter as tk import time 生成視窗和畫布 root tk.tk cv tk.canvas root,width 980,height 700,bg c09900 cv.create ...
下五子棋的bot 五子棋演算法
include include include include include include jsoncpp json.h c 編譯時預設包含此庫 define n 7 每個節點的分支數 以下為各棋型的識別碼 權重 define win 1 4000 define lose 2 4000 defi...
窮舉五子棋
本想窮舉五子棋必勝點,可惜呀,這貨窮舉太不現實了,寫出來了,根本沒辦法執行出來結果 include include include define rl 17 char s 14 int five rl rl void init void void print void int cs int i,in...