搜索3d点以查找是否连续

时间:2013-10-28 10:48:06

标签: python

我这样做是为了尝试提高我的技能一点,我正在尝试重新创造一个我多年前在学校无聊时想到的游戏。

基本上它有点像3D连接4,也应该翻转,所以如果你的空间意识不强,它会搞砸你的想法。我已经尝试在python中制作一个非常基本的显示器(我知道如何在maya中构建东西,而不是在python中,所以现在我会坚持使用垃圾设计,直到我得到它的工作),它也可以查找指出并放置它们。

然而,我实际上只是在阅读这些点以查找任何4行。我知道我可以将其全部输入,但我相信会有更好的方法。例如,每个角点可以去x,y,z,xy,xz,yz或xyz,我不指望有人为我做代码,但是如果你能告诉我一种计算方法而不打字,我将不胜感激每个可能的组合(我认为总共有76个,除非我错过任何一个)

如果不是对角线,我会做一个循环,但我不知道如何检查这些

干杯

到目前为止的代码在这里 -

#x(width),z(depth),y(height),playernum
points=[1,4,1,1],[2,1,3,1],[4,4,1,2],[3,4,1,2],[2,4,1,2],[1,1,2,1]

for j in range(1,5):
#set indent
spaces="        "
#draw top
print spaces + "________________"

#search points on certain level
validPointsY=[]
for point in points:
    if point[2]==5-j:
        validPointsY.append( point )
#draw middle
for i in range(1,5):

    #search points on certain row
    validPointsZ=[]
    for point in validPointsY:
        if point[1]==5-i:
            validPointsZ.append( point )

    #place points in correct box
    point1=" "
    point2=" "
    point3=" "
    point4=" "
    for point in validPointsZ:
        if point[0]==1:
            point1=str(point[3])
        if point[0]==2:
            point2=str(point[3])
        if point[0]==3:
            point3=str(point[3])
        if point[0]==4:
            point4=str(point[3])

    #remove one from space
    spaces = spaces[:-1]
    print spaces + "/ "+point1+" / "+point2+" / "+point3+" / "+point4+" /"
    spaces = spaces[:-1]
    print spaces + "/___/___/___/___/"

只是为了纪录,如果你无事可做,这场比赛很有趣,显然它不会看起来很棒,但哈哈

1 个答案:

答案 0 :(得分:1)

问题不需要优化(它足够小),所以“天真”的解决方案效果不错。您可以枚举所有可能的对齐,从每个可能的点开始并朝任何可能的方向前进:

for x in [1, 2, 3, 4]:
  for y in [1, 2, 3, 4]:
    for z in [1, 2, 3, 4]:
      # start of the alignment is given by (x, y, z).
      for dx in [-1, 0, +1]:
        for dy in [-1, 0, +1]:
          for dz in [-1, 0, +1]:
            # add (dx, dy, dz) for each successive point.
            # check that it makes a valid alignment first.
            if ((dx, dy, dz) != (0, 0, 0) and
                1 <= x + 3*dx <= 4 and
                1 <= y + 3*dy <= 4 and
                1 <= z + 3*dz <= 4):
              # that's a valid alignment.
              print (x, y, z), (x + 3*dx, y + 3*dy, z + 3*dz)

这打印152行,即2次76:从两端找到每个对齐。没关系。您可以将“打印”行替换为所有4个点都来自同一玩家的石头。