Python入门习题----五子棋判胜负以及最长线

【问题描述】

已知两人分别执白棋和黑棋在一个围棋棋盘上下五子棋,若同一颜色的棋子在同一条横行、纵行或斜线上连成5个棋子,则执该颜色棋子的人获胜。编写程序读入某一时刻下棋的状态,并判断是否有人获胜。
输入的棋盘大小是19×19,用数字0表示空位置(即没有棋子),用数字1表示该位置下了一白色棋子,用数字2表示该位置下了一黑色棋子。假设同一颜色的棋子在同一条横行、纵行或斜线上连成的棋子个数不会超过5个,并且最多有一人连成线的棋子个数为5。

【输入形式】

从控制台输入用来表示棋盘状态的数字0、1或2;每行输入19个数字,各数字之间以一个空格分隔,每行最后一个数字后没有空格;共输入19行表示棋盘状态的数字。

【输出形式】

若有人获胜,则先输出获胜人的棋子颜色(1表示白色棋子,2表示黑色棋子),然后输出英文冒号:,最后输出连成5个棋子连线的起始位置(棋盘横行自上往下、纵行自左往右从1开始计数,横行最小的棋子在棋盘上的横行数和纵行数作为连线的起始位置,两数字之间以一个英文逗号,作为分隔符)。
若没有人获胜,则输出当前同一颜色的棋子在同一条横行、纵行或斜线上连成最长线的棋子个数。

【输入样例1】

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 2 0 1 1 2 0 0 0 0 0 0 0
0 0 0 0 0 2 1 1 1 1 2 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 2 1 2 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1 0 2 2 0 0 0 0 0 0 0 0
0 0 0 0 0 2 0 1 0 0 2 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0 1 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

【输出样例1】

1:9,8

【输入样例2】

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 2 2 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

【输出样例2】

2


【样例说明】

在输入的样例1中,执白棋(数字1表示)的人已经获胜,连成5个棋子的起始位置在第9行第8列,所以输出1:9,8。
在输入的样例2中,还没有同一颜色的棋子连成5个,所以无人获胜;连成最长线的棋子个数为2,所以输出2。


參考代碼:

"""
Created on Sat Nov 10 19:07:27 2018

@author: Dina
"""

print_falg,max_count = 0,0
checkerboard=[]

for i in range(19):
    checkerboard.append(input().split())

for i in range(19):
    for j in range(19):    
        if checkerboard[i][j] != '0' :
            
            #检查 每行 是否有连续五个同一颜色的棋子            
            if i+1<19 and i+2<19  and i+3<19 and i+4<19:                
                if checkerboard[i][j] == checkerboard[i+1][j] and checkerboard[i][j] == checkerboard[i+2][j] and checkerboard[i][j] == checkerboard[i+3][j] and checkerboard[i][j] == checkerboard[i+4][j]:
                    print(checkerboard[i][j]+':'+str(i+1)+','+str(j+1))
                    print_falg = 1
                    break
                else:
                    count1 = 0
                    if checkerboard[i][j] == checkerboard[i+1][j] :
                        count1 +=1
                    if checkerboard[i][j] == checkerboard[i+2][j] :
                        count1 +=1
                    if checkerboard[i][j] == checkerboard[i+3][j] :
                        count1 +=1
                    if checkerboard[i][j] == checkerboard[i+4][j] :
                        count1 +=1                     
                    # 若 count1 大于 max_count 就赋值给 max_count
                    if count1 > max_count:                    
                         max_count = count1
                    
            #检查 每列 是否有连续五个同一颜色的棋子            
            if j+1<19 and j+2<19  and j+3<19 and j+4<19:
                if checkerboard[i][j] == checkerboard[i][j+1] and checkerboard[i][j] == checkerboard[i][j+2] and checkerboard[i][j] == checkerboard[i][j+3] and checkerboard[i][j] == checkerboard[i][j+4]:
                    print(checkerboard[i][j]+':'+str(i+1)+','+str(j+1))
                    print_falg = 1
                    break
                else:
                    count2 = 0
                    if checkerboard[i][j] == checkerboard[i][j+1] :
                        count2 +=1
                    if checkerboard[i][j] == checkerboard[i][j+2] :
                        count2 +=1
                    if checkerboard[i][j] == checkerboard[i][j+3] :
                        count2 +=1
                    if checkerboard[i][j] == checkerboard[i][j+4] :
                        count2 +=1
                    # 若 count2 大于 max_count 就赋值给 max_count
                    if count2 > max_count:
                        max_count = count2
                   
            #检查 斜线上 是否有连续五个同一颜色的棋子            
            if i+1<19 and i+2<19  and i+3<19 and i+4<19 and j+1<19 and j+2<19  and j+3<19 and j+4<19:
                if checkerboard[i][j] == checkerboard[i+1][j+1] and checkerboard[i][j] == checkerboard[i+2][j+2] and checkerboard[i][j] == checkerboard[i+3][j+3] and checkerboard[i][j] == checkerboard[i+3][j+4]:
                    print(checkerboard[i][j]+':'+str(i+1)+','+str(j+1))
                    print_falg = 1
                    break
                else:
                    count3 = 0
                    if checkerboard[i][j] == checkerboard[i+1][j+1] :
                        count3 +=1
                    if checkerboard[i][j] == checkerboard[i+2][j+2] :
                        count3 +=1
                    if checkerboard[i][j] == checkerboard[i+3][j+3] :
                        count3 +=1
                    if checkerboard[i][j] == checkerboard[i+4][j+4] :
                        count3 +=1
                    # 若 count3 大于 max_count 就赋值给 max_count
                    if count3 > max_count:
                        max_count = count3
 
#若没有人获胜,则输出当前同一颜色的棋子在同一条横行、纵行或斜线上连成最长线的棋子个数。                   
if print_falg == 0:
    print(max_count+1)

提交可通過:

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值