题目要求:用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。
逻辑看起来是没问题的,也可以运行,只是你得找对路径。
只要知道了获胜的条件,我们就可以让选手获胜了,目前的判定是不对的
不知道你这个问题是否已经解决, 如果还没有解决的话:1.选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多**(n-1)**次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。
2.选择排序是不稳定的。选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等 的元素后面,那么交换后稳定性就被破坏了。举个例子,序列5 8 5 2 9,第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。