AI五子棋_07 落子點四周棋形獲取


AI五子棋 第七步

恭喜你到達第七步!

到這一步,你對戰場環境就有了充分的了解。下面我們准備打造機器大腦了。你可能已經有你自己的想法了,不過別着急,先跟着我的思路做。我會提示你解決一些基本的問題。

棋局的分析關鍵在於分析棋型,在五子棋中,我們僅需要考慮一條線上的棋子分布,一個點同時屬於4條線,如下圖紅線所示,其中交點為要考察的點:

image

由於五子棋僅需要考慮五個棋子成為一條線的情況,我們只需要考慮要考察的點周圍5個格子范圍內的點。

想一想image

任務 7

實現棋型算法,通過服務器的檢驗。

訪問http://2**.2**.**.1**:9012/step_07服務器會給你一個棋盤的坐標表示(board字段),以及一系列要考察的點的坐標(coord字段),坐標之間用逗號,隔開,整體用[]包圍,事實上它是一個JSON的數組。

  • 請給出每個考察點的四條線上的棋型
  • 只考慮周圍5個格子的范圍
  • 用.表示空白位置,x表示黑棋,o表示白棋。
  • 每個考察點返回四個表示棋型的字符串
  • 所有考察點的棋型字符串按順序返回,其中單個考察點的棋型字符串順序、棋型字符串中棋子的順序不做規定
  • 返回值寫入ans字段,提交到http://2**.2**.**.1**: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**.2**.**.1**: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**.2**.**.1**:9012/step_07', params=param)
print(getHtml.text)

直接運行即可獲得下一關地址

tips

這個程序的核心就在於 getline()這個函數

一開始想用一個條件(四種條件的聚合),同時執行四條線的拼接。

但是事實可能沒有這么美好。

0線橫線,只需要考慮橫坐標在不在棋盤里即可,縱坐標根本與橫線沒什關系。

1線斜線,橫坐標不在棋盤里,那么縱坐標一定不在棋盤里。橫坐標在棋盤里,縱坐標不一定在棋盤里。具體為什么可以在棋盤上畫一畫。橫縱坐標增長方向相同。

2線豎線,只需要考慮縱坐標在不在棋盤里即可,橫坐標根本與縱線沒什關系。

3線斜線,同1線判定相同,但因為斜率為負,橫縱坐標的增長不是同一個方向,而是一方增大,一方減小。注意算法的不同。

加油吧少年,根據這個博客你也可以寫出一個相對智能的五子棋程序,甚至更強的AI算法!

文章會隨時改動,注意到博客里去看。一些網站會爬取本文章,但是可能會有出入。
https://www.cnblogs.com/asmurmur/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM