首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查是否有连续出现5次的字符

检查是否有连续出现5次的字符
EN

Stack Overflow用户
提问于 2019-09-27 09:50:37
回答 1查看 83关注 0票数 0

我正在做一个isWin函数,它检查是否有一个字符连续出现5次(水平、垂直或对角)。

我试过使用下面的代码:

代码语言:javascript
复制
#VERTICAL WIN
count = 0
for row in range(1,grid_height):
    print(row)
    for col in range(1,grid_width):
        print(col)
        if grid[row][col-2] == p_char:
            count += 1
            if count == 5:
                return True
        else:
            count = 0
            continue

#HORIZONAL WIN
count=0
for  col in range(0,grid_width):
    for row in range(0,grid_height):
        if grid[row][col-2] == p_char:
            count += 1
            if count == 5:
                return True
        else:
            count = 0
            continue

这就是我在我的主程序中放置它的地方:

代码语言:javascript
复制
def play():
     grid,grid_height,grid_width,p1_name,p1_char,p2_name,p2_char=getGameSettings()
    displayGrid(grid,grid_height,grid_width)
    print('WELCOME TO THE GAME!')

    playerA = Player(p1_name, PLAYING)
    playerB = Player(p2_name, WAITING)
    grid=[]

    for row in range(grid_height): # FOR ROW
        z =[]
        for col in range(grid_width): # FOR COLUMN
            z.append(" ")
        grid.append(z)

    numColFull = 0
    turn=0
    while turn < grid_height*grid_width:
        player = playerA
        if turn % 2 == 0 : #IF TURN IS AN ODD NUMBER, THEN IT IS player 1's turn, IF TURN IS EVEN, THEN IT IS player 2's turn
            p_char= p1_char
            player = playerA
            playerA.setState(PLAYING)
            playerB.setState(WAITING)
        else :
            p_char= p2_char
            player = playerB
            playerB.setState(PLAYING)
            playerA.setState(WAITING)

        print(".................................................. ")
        print("User to play : ", player.playerInfo() , " SEQ : ", str(turn)) # TO COUNT THE TOTAL NUMBER OF MOVES
        print(".................................................. ")

        if numColFull == grid_width: #THE isDRAW function but embedded into the main function
            # IF the numColFull is equal to gridwidth, it means that all of the columns has been occupied, meaning
            #that every space has already been occupied, thus, game is over. 
            print('........All spaces had been occupied...........')
            print('................THE GAME IS DRAW...............')
            print('.................GAME OVER.....................')
            break
        else:
            while True:
                try:
                    move=int(input('Enter your move: '))
                except ValueError:
                    print('Please enter a valid input.')
                if move < 1 or move > grid_width:
                    print('Please enter a valid input.')
                    continue
                break

            updateGrid(grid,grid_height-1,grid_width,move,p_char)

            while True:
                if grid[0][move-2] == p_char: #IF THE TOP ROW OF A COLUMN HAS A PIECE IN IT, IT MEANS ITS ALREADY FULL 
                    displayGrid(grid,grid_height, grid_width)
                    print('Column is full. Please choose another column for the next move.')
                    numColFull += 1
                    break
                elif isWin == True: #IF THE IF CONDITION DIDNT HOLD TRUE, THEN THE FUNCTION CONTINUES AS USUAL
                    print(player, 'WINS!!!')
                    ('.................GAME OVER.....................')
                else:    
                    displayGrid(grid,grid_height, grid_width)

                break #GOES BACK TO THE THE WHILE CONDITION

        turn += 1 #INCREMENTS 1 TO TURN SO IT WILL SWITCH BETWEEN BEING ODD AND EVEN

这是我的网格:

代码语言:javascript
复制
def displayGrid(grid,grid_height,grid_width): 
    for row in range(1,grid_height):
        #print(row) #for checking
        for col in range(grid_width):
            print("|", end="")
            print(str(grid[row-1][col-1]),end = "")
        print("|")
    print(" "+" ".join([str(i) for i in range(1, grid_width+1)]))
    return grid

def updateGrid(grid,grid_height,grid_width,move,p_char):
    for i in range(1,grid_height+1):
        print(i)
        #print(i) #ROW COUNTING STARTS FROM 1 
        if grid[grid_height-i][move-2] == " ":
            grid[grid_height-i][move-2]= p_char #REPLACES THE " " TO THE CURRENT PLAYER'S CHARACTER (p_char)
        else:
            continue
        break

    return grid
EN

回答 1

Stack Overflow用户

发布于 2019-09-27 10:03:11

我猜你是在写“五排”吧?但不管怎样,下面的代码应该可以工作:

代码语言:javascript
复制
def isWin():
    # Horizontal
    for i in range(grid_height):
        for j in range(grid_width - 4):
            if set(grid[i][j:j+5]) == {p_char}:
                return True
    # Vertical
    for i in range(grid_height - 4):
        for j in range(grid_width):
            if { grid[i+k][j] for k in range(5) } == {p_char}:
                return True
    # Diagonal
    for i in range(grid_height - 4):
        for j in range(grid_width - 4):
            if { grid[i+k][j+k] for k in range(5) } == {p_char}:
                return True
    return False

# Simplified
def isWin():
    return any(set(grid[i][j:j+5]) == {p_char} for i in range(grid_height) for j in range(grid_width - 4)) or \
           any({ grid[i+k][j] for k in range(5) } == {p_char} for i in range(grid_height - 4) for j in range(grid_width)) or \
           any({ grid[j+k][i+k] for k in range(5) } == {p_char} for i in range(grid_width - 4) for j in range(grid_width - 4))

因为set不能有重复项,所以使用像{ grid[j+k][i+k] for k in range(5) }这样的表达式会将5个连续的片段放入set中。如果有5个连续的p_char,则该集合将变为{p_char}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58126733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档