ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AI五子棋_07 落子点四周棋形获取

2021-08-26 21:31:36  阅读:218  来源: 互联网

标签:棋形 07 棋型 纵坐标 五子棋 coord board ord line


AI五子棋 第七步

恭喜你到达第七步!

到这一步,你对战场环境就有了充分的了解。下面我们准备打造机器大脑了。你可能已经有你自己的想法了,不过别着急,先跟着我的思路做。我会提示你解决一些基本的问题。

棋局的分析关键在于分析棋型,在五子棋中,我们仅需要考虑一条线上的棋子分布,一个点同时属于4条线,如下图红线所示,其中交点为要考察的点:

image

由于五子棋仅需要考虑五个棋子成为一条线的情况,我们只需要考虑要考察的点周围5个格子范围内的点。

想一想image

任务 7

实现棋型算法,通过服务器的检验。

访问http://2**.207.12.156:9012/step_07服务器会给你一个棋盘的坐标表示(board字段),以及一系列要考察的点的坐标(coord字段),坐标之间用逗号,隔开,整体用[]包围,事实上它是一个JSON的数组。

  • 请给出每个考察点的四条线上的棋型
  • 只考虑周围5个格子的范围
  • 用.表示空白位置,x表示黑棋,o表示白棋。
  • 每个考察点返回四个表示棋型的字符串
  • 所有考察点的棋型字符串按顺序返回,其中单个考察点的棋型字符串顺序、棋型字符串中棋子的顺序不做规定
  • 返回值写入ans字段,提交到http://2**.207.12.156:9012/step_07

如上例中,问题为:

  • {'board': 'HHJHKGIILFHJJFJJKFIFKEKHIGGILD', 'coord': ['IG']}

考察点IG的四条线上的棋型分别为

. . . o x . o . .
. . . . x o . . .
. . . . x . x . .
. . o x x x x x .

上面的棋型按照下图中标出的顺序给出,不过你可以自己选择你觉得方便的顺序。

image

我们最后把所有的棋型字符串用逗号隔开,依次写入ans字段。

待处理信息

{"is_success": true, "board": "ghhggggfgigjhhfhiijjfghiihigjhkhhjgkjgffhfkgjijfiejdjeheidkfkikekdlfmgmfifnf", "coord": ["nk", "ok", "bn", "ef", "lk", "im", "gb", "fd", "ha"]}

Python实现

import requests as re

def getIndex(coords):
        """ 将字符下标转换为数字下标"""
        """coords y x"""
        # 0行 [0]='.'--- [14]='.'[15]='\n'
        # 1行 [16]='.'--- [30]='.'[31]='\n'
        # 2行 [32]='.'--- [46]='.'[47]='\n'
        # 15行 [240]='.'--- [254]='.'[255]='\n'
        return (ord(coords[0]) - ord('a'))*16 + ord(coords[1]) - ord('a')

def getLine(coord,board):
        """
        获得中心点的四周点情况 返回一个字符串列表
        coord[0] y 纵坐标 coord[1] x 控制横坐标
        board  棋局
        """
        line = ['', '' , '' , '']
        i =0
        """ 核心思想就是 将周围点两个坐标x,y的限制 转化为一个位置index的限制 """
        while(i != 9):
                if ord(coord[1])-ord('a')- 4 + i in range(0, 15) :      # line[0]是横线 只需保证 横坐标在棋盘里就好
                        line[0] +=board[(ord(coord[0])-ord('a'))*16 + ord(coord[1])-ord('a')- 4 + i]
                else:
                        line[0] += ' '
                if ord(coord[0])-ord('a') -4 + i in range(0, 15) :      # line[2]是竖线 只需保证 纵坐标在棋盘里就好
                        line[2] +=board[(ord(coord[0])-ord('a')- 4 + i)*16 + ord(coord[1])-ord('a')]
                else:
                        line[2] += ' '
                # - 4 + i 是从最小值上升判断  + 4 - i 是从最大值下降判断 两者没有什么不同 根据index的求法而定
                if ord(coord[1])-ord('a')- 4 + i in range(0, 15) and ord(coord[0])-ord('a') -4 + i in range(0, 15) :    # line[1]是\线 保证 横纵坐标都在棋盘里就好
                        line[1] +=board[(ord(coord[0])-ord('a')- 4 + i)*16 + ord(coord[1])-ord('a')- 4 + i]
                else:
                        line[1] += ' '
                if ord(coord[1])-ord('a') + 4 - i in range(0, 15) and ord(coord[0])-ord('a') -4 + i in range(0, 15) :   # line[3]是/线 保证 横纵坐标都在棋盘里就好
                        line[3] +=board[(ord(coord[0])-ord('a')- 4 + i)*16 + ord(coord[1])-ord('a')+ 4 - i]
                else:
                        line[3] += ' '
                        
                i += 1
        return line

getHtml = re.get("http://2**.207.12.156:9012/step_07/")

testOrder = getHtml.json()['board']     # 命令序列
coords = getHtml.json()['coord']        # 待计算四条线的点坐标集        

board = ''              # 初始化棋板
for i in range(0,15):
	board += '...............' + '\n'

step = 0 # 步数 用于判断黑白 黑方先走

answer = ''

for i in range(0, len(testOrder), 2): # i = 0 2 4 6 8 

	index = getIndex(testOrder[i:i+2])

	# Python不允许直接修改字符串 只能用拼接的方法
	if (step % 2) == 0:
		board = board[0: index] + 'x' + board[index + 1:]
	else:
		board = board[0: index] + 'o' + board[index + 1:]
	step += 1
print(board)            # 展示根据命令序列生成的棋板

for coord in coords:	# 开始计算
        print(coord)
        print(getLine(coord,board))
        answer += ','.join(getLine(coord,board)) + ','
	

param = {
        'ans' : answer[:-1]
        }

getHtml = re.get('http://2**.207.12.156:9012/step_07', params=param)
print(getHtml.text)

直接运行即可获得下一关地址

tips

这个程序的核心就在于 getline()这个函数

一开始想用一个条件(四种条件的聚合),同时执行四条线的拼接。

但是事实可能没有这么美好。

0线横线,只需要考虑横坐标在不在棋盘里即可,纵坐标根本与横线没什关系。

1线斜线,横坐标不在棋盘里,那么纵坐标一定不在棋盘里。横坐标在棋盘里,纵坐标不一定在棋盘里。具体为什么可以在棋盘上画一画。横纵坐标增长方向相同。

2线竖线,只需要考虑纵坐标在不在棋盘里即可,横坐标根本与纵线没什关系。

3线斜线,同1线判定相同,但因为斜率为负,横纵坐标的增长不是同一个方向,而是一方增大,一方减小。注意算法的不同。

加油吧少年,根据这个博客你也可以写出一个相对智能的五子棋程序,甚至更强的AI算法!

文章会随时改动,注意到博客里去看。一些网站会爬取本文章,但是可能会有出入。
https://www.cnblogs.com/asmurmur/

标签:棋形,07,棋型,纵坐标,五子棋,coord,board,ord,line
来源: https://www.cnblogs.com/asmurmur/p/15191577.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有