篇幅太长了加开一篇
第七步
棋局的分析关键在于分析棋型,在五子棋中,我们仅需要考虑一条线上的棋子分布,一个点同时属于4条线,如下图红线所示,其中交点为要考察的点:
由于五子棋仅需要考虑五个棋子成为一条线的情况,我们只需要考虑要考察的点周围5个格子范围内的点。
任务 7
实现棋型算法,通过服务器的检验。
访问http://xxx/step_07服务器会给你一个棋盘的坐标表示(board字段),以及一系列要考察的点的坐标(coord字段),坐标之间用逗号,隔开,整体用[]包围,事实上它是一个JSON的数组。
{"is_success": true, "board": "ghhggggfgigjhhfhiijjfghiihigjhkhhjgkjgffhfkgjijfiejdjeheidkfkikekdlfmgmfifnf", "coord": ["nk", "ok", "bn", "ef", "lk", "im", "gb", "fd", "ha"]}
请给出每个考察点的四条线上的棋型
~只考虑周围5个格子的范围
~用.表示空白位置,x表示黑棋,o表示白棋。
~每个考察点返回四个表示棋型的字符串
~所有考察点的棋型字符串按顺序返回,其中单个考察点的棋型字符串顺序、棋型字符串中棋子的顺序不做规定
~返回值写入ans字段,提交到http://xxx/step_07
如上例中,问题为:
{'board': 'HHJHKGIILFHJJFJJKFIFKEKHIGGILD', 'coord': ['IG']}
考察点IG的四条线上的棋型分别为
...ox.o..
....xo...
....x.x..
..oxxxxx.
上面的棋型按照下图中标出的顺序给出,不过你可以自己选择你觉得方便的顺序。
我们最后把所有的棋型字符串用逗号隔开,依次写入ans字段。
python处理json参考:https://blog.csdn.net/weixin_40636692/article/details/81212304
https://blog.csdn.net/cunjie3951/article/details/106921740
https://blog.csdn.net/pengjunlee/article/details/89280812
https://www.cnblogs.com/zzmmyy/p/11904148.html
字典嵌套列表:https://blog.csdn.net/qq_36222979/article/details/94364812
棋型考察:
import json
def draw_board(): # 棋盘初绘
for i in range(15):
board.append([])
for j in range(15):
board[i].append(".")
def print_board(): # 正常的打印棋盘
for i in range(15):
for j in range(15):
print(board[i][j], end="")
print()
print()
def game_simulation(): # 棋局模拟
flag = 1
for i in range(0, len(step), 2):
a = ord(step[i]) - 97
b = ord(step[i + 1]) - 97
if flag & 1 == 1: # 棋子判断,单数黑棋”x“
board[a][b] = "x"
else:
board[a][b] = "o"
flag = flag + 1
def transverse_judge(i): # 横向判断
a = ord(i[0]) - 97
b = ord(i[1]) - 97
for j in range(-4, 5):
if 0 <= b + j <= 14:
print(board[a][b + j], end="")
else:
continue
print(",", end="")
def portrait_judge(i): # 纵向判断
a = ord(i[0]) - 97
b = ord(i[1]) - 97
for j in range(-4, 5):
if 0 <= a + j <= 14:
print(board[a + j][b], end="")
else:
continue
print(",", end="")
def left_leaning_judge(i): # 左倾判断(\)
a = ord(i[0]) - 97
b = ord(i[1]) - 97
for j in range(-4, 5):
if 0 <= a + j <= 14 and 0 <= b + j <= 14:
print(board[a + j][b + j], end="")
else:
continue
print(",", end="")
def right_deviation_judge(i): # 右倾判断(/)
a = ord(i[0]) - 97
b = ord(i[1]) - 97
for j in range(-4, 5):
if 0 <= a - j <= 14 and 0 <= b + j <= 14:
print(board[a - j][b + j], end="")
else:
continue
print(",", end="")
board = []
draw_board()
data = input()
dic = json.loads(data) # 将 JSON 对象类型转换为 Python 字典
step = dic['board'] # 步型读入
check = dic['coord'] # 检查点读入
game_simulation() # 棋局模拟
for k in check:
transverse_judge(k)
portrait_judge(k)
left_leaning_judge(k)
right_deviation_judge(k)
验证成功,四向判断的输出是为了提交验证,需要可视化时修改一下即可