2020计算机博弈大赛幻影围棋分组第一天 信息交互模块

2020计算机博弈大赛幻影围棋分组第一天

这篇博客已经被盗用了,盗用的博客上面有个小错误,希望大家支持原创,之后我会慢慢更新专栏,希望能帮助到参加计算机博弈大赛幻影围棋的小伙伴们,同时也会挂上项目的Gitee地址。
一些感想
计算机博弈大赛终于结束了,北科大是真的厉害,唯一输的一局是因为程序崩溃了,我认为他们应该比我们早很多就开始 准备比赛了,我们夺得了亚军,也算对得起肝了这么多天代码

从学长那拿到了2018,2019年参加幻影围棋比赛的代码,咸鱼了几天之后,我组三人正式开始准备2020年的比赛,这篇博客主要记录我参与的部分。
在看到源码的时候,不禁感叹,源码之混乱(毕竟祖传代码传了不止一代),所以下决心对源码进行重构,并且加深对源码的理解。
我们仔细研读了学长的程序之后,提出了自己的程序结构,结构图如下:
在这里插入图片描述

首先从最简单也是最基础的信息交互模块开始写

信息交互模块

这个模块的功能与平台进行信息交互,从评估系统模块接收下棋点,更新棋盘信息等等。
引擎与平台通信的技术是进程间通信,所以我们只需要用标准输入输出函数即可实现与平台的通信。
这是平台与引擎的通信协议规范
链接: https://pan.baidu.com/s/1OxH4YbOE5pEIk21rPn0pHQ
提取码: u54e
引擎向平台发送的指令只有move, 表明在哪下棋, 格式为 move + ’ ’ + positionlist, 例如

printf("move %c%c\n",step.point.x+'A',step.point.y+'A');

幻影围棋允许pass

printf("move pass\n");

鉴于平台可能有更改通信格式的可能,所以我们将输出封装为一些函数,引擎调用该方法即可,命令格式改变不会影响整体程序的的运行。

"""
这里有向平台发送命令和参数的函数, 已经封装好了
"""

def sendMove(point):
    """
    与平台通信,发送Move命令 格式 move 12 12是坐标1, 2
    :param point: 向平台提交下棋的点坐标
    :return: None
    """
    print("move {0}{1}".format(chr(point.x + ord('A')), chr(point.y + ord('A'))))


def sendMoveByXY(x, y):
    """
    与平台通信,发送Move命令 格式 move 12 12是坐标1, 2
    :param point: 向平台提交下棋的点坐标
    :return: None
    """
    print("move {0}{1}".format(chr(x + ord('A')), chr(y + ord('A'))))

def sendMovePass():
    print("move pass")

def sendName(name):
    """
    向平台发送引擎名称
    :param name:名称
    :return: None
    """
    print("name {0}".format(name))

信息交互模块中,当平台向引擎发送指令以及数据时,对于不同的指令都会有一些处理逻辑,最后可能导致信息交互模块文件if/else每条分支都很长,代码可读性和可维护性都大大降低。所以这里我们将处理每条指令的逻辑都封装为一个方法。

class BoardControlInterface(object):
    """
    这是一个棋盘控制的接口,所有的棋盘控制类都应该继承他,并且实现里面的方法
    """
    def move(self, msg):
        """

        :param msg: 平台发送过来的信息
        :return:
        """
        print("move action")
        pass

    def accept(self):
        """
        如果下法被平台接受了,则执行这个方法
        :return:
        """
        print("accept action")
        pass

    def refuse(self):
        """
        如果被平台拒绝了则执行这个方法
        :return:
        """
        print("refuse action")
        pass

    def take(self):
        """
        如果我方提子,则执行这个方法
        :return:
        """
        print("take action")
        pass

    def taked(self, msg):
        """
        如果我方被对方提子,则执行这个方法
        :param msg:平台发送过来的信息
        :return:
        """
        print("taked action")
        pass

    def new(self, msg):
        """
        新建对局
        :param msg:平台发送过来的信息
        :return:
        """
        print("new action")
        pass

接收平台信息的模块,原来的模块代码量大,处理逻辑复杂,重构就要解决这个问题,提高程序的可读性和可维护性。没有什么是加一层不能解决的,如果有,那就加两层,这里将原来的信息交互模块分为了两层,一层负责接收,另一层负责处理。

import sys
import go_configuration.game_conf as gf
import go_interaction.order_to_be_send as order
import go_board_control.board_control_interface as BoardControl

sys.path.append("..")

"""
这里是总控制文件,当处理的条件少的时候直接用if/else结构简单清晰,条件变多的时候建议用反射机制实现
"""

def run():
    boardControl = BoardControl.BoardControlInterface()
    while True:
        sys.stdout.flush()
        msg = input().split(" ")
        sys.stdin.flush()

        if gf.GameStatus.isGuessMode == True:
            pass
        elif 'new' in msg[0]:
            boardControl.new(msg)
            pass
        elif 'move' in msg[0]:
            boardControl.move(msg)
            order.sendMove(1, 2)
            pass
        elif 'accept' in msg[0]:
            boardControl.accept()
            pass
        elif 'refuse' in msg[0]:
            boardControl.refuse()
            pass
        elif 'take' in msg[0]:
            boardControl.take()
            pass
        elif 'taked' in msg[0]:
            boardControl.taked(msg)
            pass
        elif 'error' in msg[0]:
            pass
        elif 'name?' in msg[0]:
            order.sendName("Blizzard")
        msg.clear()

    pass

总结:

1. 对于经常用到的语句,都把他们封装为函数,以函数调用的方式执行,让程序的可维护性大大提高。

2. 对于代码逻辑复杂,单文件过长导致可读性和可维护性都低的情况,可以在原有基础上分层,每层尽量只做一件事情。

戳它戳它戳它-> 幻影围棋第二天 围棋规则学习
或者直接看第三篇->幻影围棋第三天 数据结构的编写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值