Python华容道 代码修改 简单!急

题目要求:用Python编写一个华容道小游戏。
所遇问题:输入7时不触发反应。且当游戏完成后程序无法识别完成并停止。觉得问题可能出在用**扩住的地方。判断条件和判断所放置的地方都有问题。求高人指点修改。急!!
下面是我的代码:

def main(tiles):
    int_tiles = []
    for x in tiles.split(","):
        if x:
            num = int(x)
        else:
            num = 0
        int_tiles.append(num)
    n = len(int_tiles)
    size = int(n ** 0.5)
    first_line = "┌───" + "─┬───" * (size - 1) + "─┐"
    print(first_line)
    for i in range(size):
        row = ""
        for j in range(size):
            number = int_tiles[i * size + j]
            if number == 0:
                row_str = "    "
            elif number < 10:
                row_str = "  " + str(number) + " "
            else:
                row_str = " " + str(number) + " "
            row += "│" + row_str
        row += "│"
        print(row)
        if i != size - 1:
            print("├───" + "─┼───" * (size - 1) + "─┤")
    print("└───" + "─┴───" * (size - 1) + "─┘")
    counter = 0
    game=False
    while game is not True:
        user_input = input("Your move: ")
        if user_input == "quit":
            print(f"{user_input} is valid.")
            break
        elif not user_input.isdigit():
            print(f"{user_input} is not valid. Try again.")
        else:
            user_input = int(user_input)
            if user_input not in int_tiles:
                print(f"{user_input} is not valid. Try again.")
            else:
                position_blank = int_tiles.index(0)
                position_a = int_tiles.index(user_input)
                position_blank_row = position_blank // size
                position_blank_column = position_blank % size
                position_a_row = position_a // size
                position_a_column = position_a % size
                if position_blank_row == position_a_row:
                    if position_blank_column - position_a_column == 1 or position_a_column - position_blank_column == 1:
                        print(f"{user_input} is valid.")
                        counter += 1
                        choice_tile = position_a
                        empty = 0
                        int_tiles[position_blank] = int_tiles[position_a]
                        int_tiles[position_a] = empty
                        new_board = ",".join([str(tile) for tile in int_tiles])
                        main(new_board)
                    **if sorted(int_tiles) == list(range(0, len(int_tiles))):
                        print(f"You won in {counter} moves. Congratulations!")
                        game=True**
                    else:
                        print(f"{user_input} is not valid. Try again.")
                elif position_blank_column == position_a_column:
                    if position_a_row - position_blank_row == 1 or position_blank_row - position_a_row == 1:
                        print(f"{user_input} is valid.")
                        counter += 1
                        choice_tile = position_a
                        empty = 0
                        int_tiles[position_blank] = int_tiles[position_a]
                        int_tiles[position_a] = empty
                        new_board = ",".join([str(tile) for tile in int_tiles])
                        main(new_board)
                    **if sorted(int_tiles) == list(range(0, len(int_tiles))):
                        print(f"You won in {counter} moves. Congratulations!")
                        game=True**
main("1,2,3,4,5,6,7,8,9,10,12,,13,14,11,15")

你的代码有几个小问题,我运行后发现的

第一,你的显示内容,是用递归显示的,这会造成很严重的问题,比如胜利时,会出现多次输出,每多走一步,就会多一次输出

第二,输出控制,你需要加上 sys 的一个方法,避免出现输入信息无反应 sys.stdout.flush(),可以参考我的文章

至于需要正确代码,那还得等会,我没调试完



import sys
import random

def show(tiles):
    n = len(tiles)
    size = int(n ** 0.5)
    first_line = "┌───" + "─┬───" * (size - 1) + "─┐"
    print(first_line)
    for i in range(size):
        row = ""
        for j in range(size):
            number = tiles[i * size + j]
            if number == 99:
                row_str = "    "
            elif number < 10:
                row_str = "  " + str(number) + " "
            else:
                row_str = " " + str(number) + " "
            row += "│" + row_str
        row += "│"
        print(row)
        if i != size - 1:
            print("├───" + "─┼───" * (size - 1) + "─┤")
    print("└───" + "─┴───" * (size - 1) + "─┘")
def main(tiles):
    int_tiles = []
    for x in tiles.split(","):
        if x:
            num = int(x)
        else:
            num = 99
        int_tiles.append(num)
    n = len(int_tiles)
    size = int(n ** 0.5)
    counter = 0
    game=False
    #random.shuffle(int_tiles)
    show(int_tiles)
    while game is not True:
        if sorted(int_tiles) == int_tiles:
            print(f"You won in {counter} moves. Congratulations!")
            game=True
            break
        sys.stdout.flush()
        user_input = input("Your move: ")
        if user_input == "quit":
            print(f"{user_input} is valid.")
            break
        elif not user_input.isdigit():
            print(f"{user_input} is not valid. Try again.")
            continue
        else:
            user_input = int(user_input)
            if user_input not in int_tiles:
                print(f"{user_input} is not valid. Try again.")
                continue
            else:
                position_blank = int_tiles.index(99)
                position_a = int_tiles.index(user_input)
                position_blank_row = position_blank // size
                position_blank_column = position_blank % size
                position_a_row = position_a // size
                position_a_column = position_a % size
                if position_blank_row != position_a_row and position_a_column != position_blank_column:
                    print('invalid row and col')
                if position_blank_row == position_a_row:
                    if position_blank_column - position_a_column == 1 or position_a_column - position_blank_column == 1:
                        print(f"{user_input} is valid.")
                        counter += 1
                        choice_tile = position_a
                        empty = 99
                        int_tiles[position_blank] = int_tiles[position_a]
                        int_tiles[position_a] = empty
                        show(int_tiles)
                    else:
                        print('invalid row')
                elif position_blank_column == position_a_column:
                    if position_a_row - position_blank_row == 1 or position_blank_row - position_a_row == 1:
                        print(f"{user_input} is valid.")
                        counter += 1
                        choice_tile = position_a
                        empty = 99
                        int_tiles[position_blank] = int_tiles[position_a]
                        int_tiles[position_a] = empty
                        show(int_tiles)
                    else:
                        print('invalid col')
main("1,2,3,4,5,6,7,8,9,10,12,,13,14,11,15")

题主可以先说一下正确答案是哪些步骤吗?或者最终结束时是什么样的,不然不容易判断你的代码的问题

我跑了下你的题目,输入7的时候因为是无法移动所以没有任何输出,如果你非要输出,其实也是可以改进的。

我不太清楚,最终获胜的条件是什么?
是blank的位置变成0? 还是最终的顺序变成0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15。
逻辑看起来是没问题的,也可以运行,只是你得找对路径。

只要知道了获胜的条件,我们就可以让选手获胜了,目前的判定是不对的

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7527983
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:python学习33:遍历列表,元组,字典,字符串
  • 除此之外, 这篇博客: Python全栈(二)数据结构和算法之7.选择排序、插入排序和希尔排序的实现中的 算法分析: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    1.选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多**(n-1)**次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。
    2.选择排序是不稳定的。选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等 的元素后面,那么交换后稳定性就被破坏了。举个例子,序列5 8 5 2 9,第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。

  • 您还可以看一下 jeevan老师的Python量化交易,大操手量化投资系列课程之内功修炼篇课程中的 讲师简介,量化交易介绍及自动化交易演示小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^