为什么我的赢家检查功能不能正常工作?
Why my winner check function does not work correctly?
我正在开发 connect4 游戏,现在我正在检查获胜者部分,但是 winnercheck 功能无法正常工作。如何解决?
在 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, -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"
平局检查不应要求用户进行无效移动。您应该在最后一次有效移动完成后检测到平局。
我正在开发 connect4 游戏,现在我正在检查获胜者部分,但是 winnercheck 功能无法正常工作。如何解决? 在 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, -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"
平局检查不应要求用户进行无效移动。您应该在最后一次有效移动完成后检测到平局。