在2D列表中从x到y进行索引的紧凑方式



我正在做思科NetAkad课程中的tictactoe项目:https://www.youtube.com/watch?v=7GDtI9SpGgU我不顾规定的项目要求玩游戏。我用了一个普通的列表:board=[1,2,3,4,5,6,7,8,9]程序工作,输出与项目要求的相同。

然而,项目要求特别规定使用2D列表:板=[[1,2,3],[4,5,6],[7,8,9]。当我想练习使用2D列表时,我重写了程序,发现它需要更多的行和更复杂的索引。

我的第一个问题是:在检查是否有赢家的函数中,2D列表是否可以只使用索引来检查是否有3个连续的";X〃;或";O〃;所有方向?如果是,如何?(我不认为像视频中那样,将大量的"if"与许多"and"相结合是有效的,并且使用索引可以很好地与普通列表配合使用(

作为一个初学者,我的措辞可能不清楚,所以这里是检查";X〃;已经获胜,低于我预期的水平:

if board[0][0:3].count("X") == 3 or board[1][0:3].count("X") == 3 
or board[2][0:3].count("X") == 3 or board[0:3][0].count("X") == 3 
or board[0:3][1].count("X") == 3 or board[0:3][2].count("X") == 3 
or board[0:3][0:3].count("X") == 3 or board[0:3][3::-1].count("X") == 3:
print("I won: you lost.")

索引[0][0:3]、[1][0:3]和[2][0:3]按预期工作(行(,表示获胜。但是,当程序运行时,[0:3][0]被读取为[0][0:3]。(检查立柱不起作用([0:3][0:3]和[0:3][3::-1]显然不起作用(对角线(。

第二个问题:有什么更好的方法来检查获胜者?

最后一个问题:在这种情况下,使用2D列表比使用普通列表有优势吗?

我提前感谢您的反馈。

您可以执行以下操作:

for key in ['X', 'O']:
temp = []
count = 0
for row in board:
if row.count(key) == 3:
count = 3
break
if key in row:
temp.append(row.index(key))
if count == 3 or (len(list(set(temp))) == 1 and len(temp) == 3) or temp in ([0,1,2], [2,1,0]):
print("I won: you lost. " + key + " wins")

解决方案的想法是获得内部列表中"X"位置的索引(索引的使用证明了根据您的最后一个问题选择"2D列表"[列表列表]的理由(。这是通过循环遍历井字的每个"行"的列表来完成的。我们将索引存储在变量"temp"中。

第一个条件检查一行是否有3'X,如果是,则中断保存count=3的for循环的执行。第二个条件是最有趣的,因为它将"X"的索引存储在行中。例如,当您在中间列中有X时,在循环结束时,temp将等于:

[2,2,2] if the tic-tac-toe was 
O-X-
O-X-O
-X-O

因此,如果"temp"列表中有一个唯一的数字([1,1,1]unique是1,[2,2,2]unique是2等(,那么就有赢家。这是由完成的

len(list(set(temp))) # (inside) Get unique values / Make it a list / Measure its length

如果长度为1,则存在唯一的位置。除此之外,为了考虑到tic-tac-toe未完全填充时运行的代码,我们检查len(temp) == 3。最后,我们使用条件的"temp in([0,1,2],[2,1,0]("部分来检查对角线匹配

"index[0:3][0]"无法按预期工作的原因是,第一个切片指向您在位置0处获取值的整个列表,即[1,2,3]。换句话说,board[0:3]等于board

由于潜在状态太少,只有8个获胜状态,我可能会直接评估所有状态:

gameboard = [
["x","-","-"],
["x","-","-"],
["x","-","-"]
]
possilbe_winning_states = [
[(0,0), (0,1), (0,2)],
[(1,0), (1,1), (1,2)],
[(2,0), (2,1), (2,2)],
[(0,0), (1,0), (2,0)],
[(0,1), (1,1), (2,1)],
[(0,2), (1,2), (2,2)],
[(0,0), (1,1), (2,2)],
[(0,2), (1,1), (2,0)]
]
for possilbe_winning_state in possilbe_winning_states:
squares = [gameboard[square[0]][square[1]] for square in possilbe_winning_state]
if squares.count("x") == 3:
print("X Win")
break
elif squares.count("o") == 3:
print("O Win")
break
else:
print("no winner yet")

最新更新