国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

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

2020-02-16 00:54:17
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

本來(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)就很滿(mǎn)足了。

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

第一步,收集素材

主要就是棋子、棋盤(pán)的圖片,還有下棋的音效

這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

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

第二步,五子棋的邏輯類(lèi)

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

先想想在五子棋的邏輯類(lèi)里要有哪些東西。

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

chessboard.py

# ----------------------------------------------------------------------# 定義棋子類(lèi)型,輸贏情況# ----------------------------------------------------------------------EMPTY = 0BLACK = 1WHITE = 2# ----------------------------------------------------------------------# 定義棋盤(pán)類(lèi),繪制棋盤(pán)的形狀,切換先后手,判斷輸贏等# ----------------------------------------------------------------------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)]            
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宝山区| 宿迁市| 隆尧县| 诸暨市| 余姚市| 濉溪县| 塔河县| 龙海市| 永福县| 乐昌市| 昌平区| 奉节县| 连云港市| 兴安盟| 平武县| 阜平县| 慈溪市| 樟树市| 五华县| 措美县| 万山特区| 井陉县| 灵武市| 广东省| 山东省| 吕梁市| 太保市| 葵青区| 普定县| 湄潭县| 嘉定区| 澄迈县| 太谷县| 安岳县| 门头沟区| 绥棱县| 新晃| 文山县| 子长县| 全州县| 电白县|