Python:尝试编写connectfour:Winning条件的变体不会';停不下来
我一直在尝试为我的编程课编写connect four的变体。该电路板的尺寸为6x8。在我试图编程的变体中,获胜的条件是基本上构建一个L 这意味着表单的任何构造Python:尝试编写connectfour:Winning条件的变体不会';停不下来,python,arrays,for-loop,matrix,infinite-loop,Python,Arrays,For Loop,Matrix,Infinite Loop,我一直在尝试为我的编程课编写connect four的变体。该电路板的尺寸为6x8。在我试图编程的变体中,获胜的条件是基本上构建一个L 这意味着表单的任何构造 X X xx 是获胜的条件。 我一直在尝试创建一个函数,连续检查每一列中是否有相同的符号,以构建一对。以及一个对每行执行相同操作的函数。使用这两个函数,我将检查两对是否连续,因为无论如何组合垂直和水平对,它都将始终构建一个“L” 为了弄清楚我用的黑板 def ClearBoardSingle(): global Board
X
X
xx
是获胜的条件。
我一直在尝试创建一个函数,连续检查每一列中是否有相同的符号,以构建一对。以及一个对每行执行相同操作的函数。使用这两个函数,我将检查两对是否连续,因为无论如何组合垂直和水平对,它都将始终构建一个“L” 为了弄清楚我用的黑板
def ClearBoardSingle():
global Board
Board = [['0' for i in range(8)] for i in range(6)]
BoardPrint()
PlayerMoveSingle()
def BoardPrint():
global Board
global GameMoves
global PlayerTurn
global Player1Symbol
global Player2Symbol
print('\n\nMoves done: ' + str(GameMoves))
print('To Restart: R | To Quit: Q')
print('Valid choices: 1, 2, 3, 4, 5, 6, 7, 8')
if PlayerTurn == 0:
print('It\'s ' +str(Player1Symbol) + '\'s Turn')
if PlayerTurn == 1:
print('It\'s ' +str(Player2Symbol) + '\'s Turn')
print(Board[0])
print(Board[1])
print(Board[2])
print(Board[3])
print(Board[4])
print(Board[5])
对于我的界面,我正在使用
def ClearBoardSingle():
global Board
Board = [['0' for i in range(8)] for i in range(6)]
BoardPrint()
PlayerMoveSingle()
def BoardPrint():
global Board
global GameMoves
global PlayerTurn
global Player1Symbol
global Player2Symbol
print('\n\nMoves done: ' + str(GameMoves))
print('To Restart: R | To Quit: Q')
print('Valid choices: 1, 2, 3, 4, 5, 6, 7, 8')
if PlayerTurn == 0:
print('It\'s ' +str(Player1Symbol) + '\'s Turn')
if PlayerTurn == 1:
print('It\'s ' +str(Player2Symbol) + '\'s Turn')
print(Board[0])
print(Board[1])
print(Board[2])
print(Board[3])
print(Board[4])
print(Board[5])
我已经知道了如何在板内更改变量,我已经差不多完成了。我唯一不知道如何实施的是获胜的条件。我对行尝试了此函数:
def VerticalList(Column):
global Board
global Choice
global Row0
Column = int(Column)
Choice = int(Choice)
print(Column,' C')
while Column > 0:
for Board[Column][Choice] in range(Column):
Row0.append(Board[Column][Choice])
if Column ==6 or Column == -1:
break
else:
VerticalList(Column-1)
if Column ==0:
break
else:
continue
if Column == 0:
Column += 1
while Column < 5:
Column +=1
if Row0[Column] == Row0[Column-1]:
print('Pair')
else:
print('No Pair')
pass
else:
pass
def垂直调用列表(列):
全球董事会
全球选择
全局行0
列=int(列)
Choice=int(Choice)
打印(列“C”)
当列>0时:
对于范围(列)中的板[列][选择]:
行0.追加(板[列][选项])
如果列==6或列==-1:
打破
其他:
垂直校准师(第1列)
如果列==0:
打破
其他:
持续
如果列==0:
列+=1
当列<5时:
列+=1
如果第0行[列]==第0行[列-1]:
打印('对')
其他:
打印('无对')
通过
其他:
通过
但它进入了一个无止境的循环。我再也不知道如何实施获胜条件了。我将感谢任何形式的帮助或想法。如果您想让我发布整个代码或其他类型的代码片段,请索取它们
谢谢你的期待 很酷的问题,下面看起来有很多代码,但实际上不是。我还没有详细检查过,所以我不相信它没有发现假阳性,但它似乎找到了应该找到的L。我所做的主要工作是使用itertools.compositions来获取X位置的所有4个大小的组,然后检查它们是否与我期望的L的模式相似。在
check\u four\u group
中,我查看行和列之间的差异
from itertools import combinations
def disp_board(board):
for row in board:
print(row)
def check_winning(board):
winning = False
#Find all row,col positions of the X's
x_poses = [(i,j) for i in range(6) for j in range(8) if board[i][j] == 'X']
#Loop through every combination of four X's since it takes four to make the 'L'
for group in combinations(x_poses,4):
if(check_four_group(group)):
winning = True
break
return winning
def check_four_group(group):
rows,cols = zip(*[(r,c) for r,c in group])
row_diffs = [rows[i+1]-rows[i] for i in range(len(rows)-1)]
col_diffs = [cols[i+1]-cols[i] for i in range(len(cols)-1)]
#Uncomment this to print the row and col diffs
#print(row_diffs)
#print(col_diffs)
# Finds:
# X
# X
# X X
if row_diffs == [1,1,0] and col_diffs == [0,0,1]:
return True
# Finds:
# X
# X
# X X
elif row_diffs == [1,1,0] and col_diffs == [0,-1,1]:
return True
# Finds:
# X X
# X
# X
elif row_diffs == [0,1,1] and col_diffs == [1,0,0]:
return True
# Finds:
# X X
# X
# X
elif row_diffs == [0,1,1] and col_diffs == [1,-1,0]:
return True
# Otherwise it's not there at all (not thinking about horizontal L's but could add that)
else:
return False
#Test case 1
def test_case_1():
board = [['0' for i in range(8)] for i in range(6)]
board[2][1] = 'X'
board[2][2] = 'X'
board[3][1] = 'X'
board[4][1] = 'X'
return board
#Test case 2
def test_case_2():
board = [['0' for i in range(8)] for i in range(6)]
board[2][1] = 'X'
board[2][0] = 'X'
board[3][1] = 'X'
board[4][1] = 'X'
return board
#Test case 3
def test_case_3():
board = [['0' for i in range(8)] for i in range(6)]
board[1][0] = 'X'
board[2][0] = 'X'
board[3][0] = 'X'
board[3][1] = 'X'
return board
#Test case 4
def test_case_4():
board = [['0' for i in range(8)] for i in range(6)]
board[1][2] = 'X'
board[2][2] = 'X'
board[3][2] = 'X'
board[3][1] = 'X'
return board
##################
#Start of program#
##################
board = test_case_1()
#board = test_case_2()
#board = test_case_3()
#board = test_case_4()
disp_board(board)
if check_winning(board):
print('Victory')
else:
print('Keep playing')
哇,听起来就像是我遇到的CS101问题,当内存以MBis度量时,你的代码格式正确吗?可能只是剪切粘贴错误,所以?代码缩进会影响变量范围。我在另一个文件中编程了获胜条件,所以我不会意外地弄乱我的游戏代码。我尝试了我的“游戏”,它工作正常,但由于我还没有实现获胜条件,游戏只有在所有字段都被填充时才会结束(本例中为48)。@No7ExQ请格式化您的代码变量/函数名()。哦,是的,我昨天做了,谢谢您的提醒(:好的,非常感谢,我会首先尝试理解:P,然后在我的游戏中实现它。如果有任何错误,我会让你不断更新。很抱歉花了这么长时间给你更新,但我认为我应该在使用它之前理解代码(:所以在理解后,我为水平L添加了获胜选项,然后将所有内容都添加到我的游戏代码中。这很有效!!所以先生让我免于数小时的绝望和严重的头痛。太棒了!添加水平L做得很好!