如何解决为什么我的获胜者检查功能无法正常工作? 其他一些说明:
我正在开发 connect4 游戏,现在我正在检查获胜者部分,但获胜者检查功能无法正常工作。如何解决? 在pycharm编辑器中,它说即使使用了变量winner也没有使用。在垂直四位相同的数字之后,它不会打印谁是赢家。我不知道如何解决它。 谢谢!
from termcolor import colored
field = [[" "," "," "],[" "," "]]
def drawField(field):
for row in range(11):
if row % 2 == 0:
rowIndex = int(row / 2)
for column in range(13):
if column % 2 == 0:
columnIndex = int(column / 2)
if column == 12:
print(field[rowIndex][columnIndex])
else:
print(field[rowIndex][columnIndex],end="")
else:
print("|",end="")
else:
print("-------------")
def reset():
for i in range(6):
for b in range(7):
field[i][b] = " "
drawField(field)
Player = 1
def winnerCheck(characters):
maxSQ = 0
char = False
sq = 0
for i in characters:
if i != char:
char = i
sq = 1
else:
sq += 1
if sq > maxSQ:
maxChar = char
maxSQ = sq
if maxChar == "X" or maxChar == "O":
if maxSQ == 4:
winner = 0
if maxChar == "X":
winner = "1"
else:
winner = "2"
print("--------------------------------------")
print("| The winner is player",winner,end="")
print(" |")
print("--------------------------------------")
while True:
rowIndex = False
currentChoice = False
print("Player turn:",Player)
column = int(input("Please enter a column: ")) - 1
if column <= 6:
print(True)
else:
print("You can choose numbers only between 1 and 7 included!")
continue
if Player == 1:
for i in range(5,-1,-1):
if field[0][column] != " ":
print("This column is already filled up! You can't put here anymore!")
full = 0
for b in range(7):
if field[0][b] != " ":
full += 1
if full == 7:
print("There is no winner!")
reset()
break
else:
if field[i][column] != " ":
continue
else:
field[i][column] = colored("X","red")
drawField(field)
Player = 2
currentChoice = field[i][column]
rowIndex = i
break
else:
for i in range(5,-1):
if field[0][column] != " ":
print("This column is already filled up! You can't put here anymore!")
full = 0
for b in range(7):
if field[0][b] != " ":
full += 1
if full == 7:
print("There is no winner!")
reset()
break
else:
if field[i][column] != " ":
continue
else:
field[i][column] = colored("O","green")
drawField(field)
currentChoice = field[i][column]
Player = 1
rowIndex = i
break
characters = []
for i in range(6):
print(i)
characters.append(field[i][column])
print(characters)
winnerCheck(characters)
解决方法
主要问题在于这些代码行:
if maxChar == "X" or maxChar == "O":
再往下一点:
if maxChar == "X":
这些条件永远不会成立,因为您的字符永远不会是“X”或“O”,而是由调用 colored
生成的 ANSI 转义码,例如 '\x1b[31mX\x1b[0m'
这是代码的“模型”和“视图”方面的混淆。
最好的解决方法是不要将 colored()
的结果存储在您的 field
列表中。而是只存储简单的“X”和“O”值。然后在您的 drawField
函数中,执行必要的操作,为您的输出添加颜色。
所以改变:
field[i][column] = colored("X","red")
到
field[i][column] = "X"
并对colored("O","green")
的位置进行相同的更改。
然后在 drawField
处更改:
if column == 12:
print(field[rowIndex][columnIndex])
else:
print(field[rowIndex][columnIndex],end="")
到:
ch = field[rowIndex][columnIndex]
output = colored(ch,"red" if ch == "X" else "green")
if column == 12:
print(output)
else:
print(output,end="")
其他一些说明:
您的代码只会检测到垂直四排。目前,您只将有关一列的信息传递给 winnerCheck
。您需要扩展此功能以检测水平和对角线获胜...
有不必要的代码重复。就像 if Player == 1 .... else
构造中的两个块一样。您应该尝试将其设置为一个块,因为唯一的区别是您分配给 field[i][column]
的内容。
如评论中所述,您有一个无效的 winner=0
,因为您立即为其分配了不同的值。您可以一次性初始化 winner
:
winner = "1" if maxChar == "X" else "2"
平局检查不应要求用户进行无效移动。当最后一次有效移动完成时,您应该检测到平局。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。