A__v__A 2023-04-23 21:26 采纳率: 100%
浏览 138
已结题

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")
  • 写回答

4条回答 默认 最新

  • 文盲老顾 WEB应用领新星创作者 2023-04-23 21:54
    关注

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

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

    第二,输出控制,你需要加上 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")
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月26日
  • 已采纳回答 4月23日
  • 创建了问题 4月23日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。