• 大小: 88KB
    文件类型: .zip
    金币: 2
    下载: 2 次
    发布日期: 2021-09-13
  • 语言: Python
  • 标签: python  五子棋  人机  

资源简介

人机对战,解压既能运行,使用版本python3.6需要使用PyQt5的模块

资源截图

代码片段和文件信息

#!/usr/bin/env python
# -*- coding:utf-8 -*-


# evaluation: 棋盘评估类,给当前棋盘打分用
# ----------------------------------------------------------------------
class evaluation(object):
    def __init__(self):
        self.POS = []
        for i in range(15):
            row = [(7 - max(abs(i - 7) abs(j - 7))) for j in range(15)]
            self.POS.append(tuple(row))
        self.POS = tuple(self.POS)
        self.STWO = 1  # 冲二
        self.STHREE = 2  # 冲三
        self.SFOUR = 3  # 冲四
        self.TWO = 4  # 活二
        self.THREE = 5  # 活三
        self.FOUR = 6  # 活四
        self.FIVE = 7  # 活五
        self.DFOUR = 8  # 双四
        self.FOURT = 9  # 四三
        self.DTHREE = 10  # 双三
        self.NOTYPE = 11
        self.ANALYSED = 255  # 已经分析过
        self.TODO = 0  # 没有分析过
        self.result = [0 for i in range(30)]  # 保存当前直线分析值
        self.line = [0 for i in range(30)]  # 当前直线数据
        self.record = []  # 全盘分析结果 [row][col][方向]
        for i in range(15):
            self.record.append([])
            self.record[i] = []
            for j in range(15):
                self.record[i].append([0 0 0 0])
        self.count = []  # 每种棋局的个数:count[黑棋/白棋][模式]
        for i in range(3):
            data = [0 for i in range(20)]
            self.count.append(data)
        self.reset()

        # 复位数据

    def reset(self):
        TODO = self.TODO
        count = self.count
        for i in range(15):
            line = self.record[i]
            for j in range(15):
                line[j][0] = TODO
                line[j][1] = TODO
                line[j][2] = TODO
                line[j][3] = TODO
        for i in range(20):
            count[0][i] = 0
            count[1][i] = 0
            count[2][i] = 0
        return 0

        # 四个方向(水平,垂直,左斜,右斜)分析评估棋盘,再根据结果打分

    def evaluate(self board turn):
        score = self.__evaluate(board turn)
        count = self.count
        if score < -9000:
            stone = turn == 1 and 2 or 1
            for i in range(20):
                if count[stone][i] > 0:
                    score -= i
        elif score > 9000:
            stone = turn == 1 and 2 or 1
            for i in range(20):
                if count[turn][i] > 0:
                    score += i
        return score

        # 四个方向(水平,垂直,左斜,右斜)分析评估棋盘,再根据结果打分

    def __evaluate(self board turn):
        record count = self.record self.count
        TODO ANALYSED = self.TODO self.ANALYSED
        self.reset()
        # 四个方向分析
        for i in range(15):
            boardrow = board[i]
            recordrow = record[i]
            for j in range(15):
                if boardrow[j] != 0:
                    if recordrow[j][0] == TODO:  # 水平没有分析过?
                        self.__analysis_horizon(board i j)
                    if recordrow[j][1] == TODO:  # 垂直没有分析过?
                        self.__analysis_vertical(board i j)
                    if recordrow[j][2] == TODO:  # 左斜没有分析过?
                        self.__analysis_left(board i j

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-05-28 10:09  GoBang\
     文件          65  2017-12-23 16:31  GoBang\.gitattributes
     文件       18452  2017-12-23 16:31  GoBang\ai.py
     文件        2483  2017-12-23 16:31  GoBang\chessboard.py
     文件        7610  2017-12-23 16:31  GoBang\gobangGUI.py
     目录           0  2018-05-28 10:09  GoBang\img\
     文件        1173  2017-12-23 16:31  GoBang\img\black.png
     文件       49712  2017-12-23 16:31  GoBang\img\chessboard.jpg
     文件        1268  2017-12-23 16:31  GoBang\img\white.png
     文件          57  2017-12-23 16:31  GoBang\README.md
     目录           0  2018-05-28 10:09  GoBang\sound\
     文件       12632  2017-12-23 16:31  GoBang\sound\defeated.wav
     文件       15590  2017-12-23 16:31  GoBang\sound\move.wav
     文件       27150  2017-12-23 16:31  GoBang\sound\win.wav

评论

共有 条评论