pythonAI五子棋 二

2021-08-09 14:56:26 字數 2516 閱讀 2716

以為第二篇很晚到來,主要是我的想法是等我把機器學習學個大概之後再回來優化。不過最近在深入的學習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...