真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PyQt5實(shí)現(xiàn)五子棋游戲(人機(jī)對(duì)弈)-創(chuàng)新互聯(lián)

這篇博客主要是為了學(xué)習(xí)Python和PyQt,因?yàn)閷?duì)棋類游戲比較熱衷,所以從規(guī)則較簡(jiǎn)單的五子棋入手,利用PyQt5實(shí)現(xiàn)圖形界面,做一個(gè)可以進(jìn)行人機(jī)對(duì)弈的腳本,最后打包成應(yīng)用程序。AI的算法打算用神經(jīng)網(wǎng)絡(luò)來(lái)完成,正在苦學(xué)TensorFlow中。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:國(guó)際域名空間、虛擬空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、德令哈網(wǎng)站維護(hù)、網(wǎng)站推廣。

本來(lái)我以為五子棋規(guī)則很簡(jiǎn)單,不就像小學(xué)時(shí)候玩的那樣,五個(gè)棋子連在一起就贏了嘛,但是后來(lái)發(fā)現(xiàn)事情并沒(méi)有那么簡(jiǎn)單,現(xiàn)在的五子棋有禁手這個(gè)規(guī)則 ,“三三禁手” 、“四四禁手”、“長(zhǎng)連禁手”等等,都是為了限制現(xiàn)行一方必勝。我也不是職業(yè)的棋手,對(duì)吧,所以禁手什么的就不考慮了,弄個(gè)簡(jiǎn)單的成品出來(lái)就很滿足了。

代碼全是邊學(xué)習(xí)邊寫的,有瑕疵的地方歡迎提出。

第一步,收集素材

主要就是棋子、棋盤的圖片,還有下棋的音效

PyQt5實(shí)現(xiàn)五子棋游戲(人機(jī)對(duì)弈)

PyQt5實(shí)現(xiàn)五子棋游戲(人機(jī)對(duì)弈)

PyQt5實(shí)現(xiàn)五子棋游戲(人機(jī)對(duì)弈)

音效與代碼一起在最后給出

第二步,五子棋的邏輯類

收集完素材后,不著急界面的編寫,先將五子棋的邏輯寫好,界面和邏輯要分開,這很重要。

先想想在五子棋的邏輯類里要有哪些東西。

首先是棋盤,棋盤用15*15的數(shù)組表示
然后是棋子,黑棋用1表示,白棋用2表示,空白就用0表示
再然后還要獲取指定點(diǎn)的坐標(biāo),獲取指定點(diǎn)的方向等等。
最重要的也是稍微有點(diǎn)難度的部分就是判斷輸贏。結(jié)合網(wǎng)上的方法和我自己的理解,下面貼出我寫的代碼,僅供參考。

chessboard.py

# ----------------------------------------------------------------------
# 定義棋子類型,輸贏情況
# ----------------------------------------------------------------------
EMPTY = 0
BLACK = 1
WHITE = 2


# ----------------------------------------------------------------------
# 定義棋盤類,繪制棋盤的形狀,切換先后手,判斷輸贏等
# ----------------------------------------------------------------------
class ChessBoard(object):
 def __init__(self):
 self.__board = [[EMPTY for n in range(15)] for m in range(15)]
 self.__dir = [[(-1, 0), (1, 0)], [(0, -1), (0, 1)], [(-1, 1), (1, -1)], [(-1, -1), (1, 1)]]
 #  (左 右) (上 下) (左下 右上) (左上 右下)

 def board(self): # 返回?cái)?shù)組對(duì)象
 return self.__board

 def draw_xy(self, x, y, state): # 獲取落子點(diǎn)坐標(biāo)的狀態(tài)
 self.__board[x][y] = state

 def get_xy_on_logic_state(self, x, y): # 獲取指定點(diǎn)坐標(biāo)的狀態(tài)
 return self.__board[x][y]

 def get_next_xy(self, point, direction): # 獲取指定點(diǎn)的指定方向的坐標(biāo)
 x = point[0] + direction[0]
 y = point[1] + direction[1]
 if x < 0 or x >= 15 or y < 0 or y >= 15:
  return False
 else:
  return x, y

 def get_xy_on_direction_state(self, point, direction): # 獲取指定點(diǎn)的指定方向的狀態(tài)
 if point is not False:
  xy = self.get_next_xy(point, direction)
  if xy is not False:
  x, y = xy
  return self.__board[x][y]
 return False

 def anyone_win(self, x, y):
 state = self.get_xy_on_logic_state(x, y) # 當(dāng)前落下的棋是黑棋還是白棋,它的狀態(tài)存儲(chǔ)在state中
 for directions in self.__dir: # 對(duì)米字的4個(gè)方向分別檢測(cè)是否有5子相連的棋
  count = 1 # 初始記錄為1,因?yàn)閯偮湎碌钠逡菜?  for direction in directions: # 對(duì)落下的棋子的同一條線的兩側(cè)都要檢測(cè),結(jié)果累積
  point = (x, y) # 每次循環(huán)前都要刷新
  while True:
   if self.get_xy_on_direction_state(point, direction) == state:
   count += 1
   point = self.get_next_xy(point, direction)
   else:
   break
  if count >= 5:
  return state
 return EMPTY

 def reset(self): # 重置
 self.__board = [[EMPTY for n in range(15)] for m in range(15)]

網(wǎng)頁(yè)題目:PyQt5實(shí)現(xiàn)五子棋游戲(人機(jī)對(duì)弈)-創(chuàng)新互聯(lián)
分享地址:http://weahome.cn/article/csspcd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部