简易五子棋游戏2

提交数: 440, 通过率: 28.86%, 平均分: 43.13

题目描述:

五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏。游戏双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜。棋具与围棋通用,标准棋盘横竖各19条线,互相交叉形成361个点作为棋子位置,如下图所示。

1648773847309003409.png

现在给定15*15的二维棋盘(数组), 黑白双方都已经各下了 20 手棋 ,请编写程序判断当前局面的胜负情况。 

黑棋为1,白棋为2。

输入格式:

 给定一个黑白双方都已经各下了 20 手棋的棋局,1代表黑子,2代表白子。

输出格式:

输出一行,表示黑赢,白赢或平局。

黑赢输出black,, 白赢输出 white, 平局输出 draw。

数据范围:

棋盘大小为15*15。

样例输入:

200000200000000
122000000000000
000000000000000
000022001020002
020000000000001
000000001000002
000200000000000
000020100000000
000100000000012
000000000011001
021000002001000
010020001000102
000001000020000
000000100001000
020002000101000

样例输出:

draw

提示:

请完善程序:

# 函数名: is_win(r, c)
# 参数表: r, c 棋子在棋盘中的行列坐标
# 返回值: 若棋子获胜返回 True, 否则返回 False
def is_win(r, c):
    direction = [ [1, -1], [1, 0], [1, 1], [0, 1] ] #该棋子周围 4 个方向
    counts = [0] * 4 #记录各个方向上连续相同棋子数量
    #enumerate(seq)分别提取序列的索引和数据元素, 例如:d=0,  pos=(1,-1); d=1,  pos=(1,0);
    for d, pos in enumerate(direction):
        for k in range(1, 5): #某一方向上最多考虑 4 个棋子
            i = r + pos[0] * k #相邻交叉点位置
            j = c + pos[1] * k #相邻交叉点位置
            if 0 <= i < size and 0 <= j < size and _________(1)____________:
                counts[d] += 1 #没有越界且为同色棋子, 则统计
            else:
                break
    for i in range(4): #超过五子连珠说明已经获胜
        if _________(2)__________ :
            return True
    return False

def situation():
    condition = ["draw", "black", "white"]   #"平局", "黑胜", "白胜"
    for i in range(size):
        for j in range(size):
            if ________________(3)________________:
                return condition[ int( gobang_map[i][j] ) ] #黑胜或白
    return condition[0]   #平局

size = 15 #棋盘大小
gobang_map = [ [0] * size for i in range(size) ] #创建空白棋盘
#读取棋谱信息
for i in range( size ):
    line = input()
    for j in range( size ):
        gobang_map[ i] [j] = line[j]

print( situation() ) #输出当前局面胜负情况
时间限制: 1000ms
空间限制: 256MB