python - 为什么我的获胜者检查功能无法正常工作?
问题描述
我正在开发 connect4 游戏,现在我正在检查获胜者,但获胜者检查功能无法正常工作。如何解决?在 pycharm 编辑器中,它说即使使用了变量获胜者也没有使用。在四个相同的数字垂直之后,它没有打印谁是赢家。我不知道如何解决它。谢谢!
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”,而是调用生成的 ANSI 转义码colored
,例如'\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"
平局检查不应要求用户做出无效的移动。您应该在进行最后一次有效移动时检测到平局。
推荐阅读
- android - 使用 Android MVVM,如何避免在回收器适配器中再次设置相同的数据?
- python-3.x - 如何使用 Ec2 实例运行 Lambda 函数
- ios - Swift UITableView GoTo Other Row 当在 viewWillAppear 中访问 tableView.reloadData()
- python - 无法使用 Python 连接到 Google Cloud API
- wordpress - 产品添加到购物车后如何更新迷你车
- c# - 基于现有存储库创建 .editorconfig 文件
- c# - 无法使 ONNX 模型的输入列名工作
- javascript - ExtJs 3.4 更新 XTemplate 中的数据
- python - python gspread 将 csv 导入特定的工作表
- node.js - 您如何将音频文件从客户端上传到后端以在对话流中进行音频检测