Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在reversi(python)中为计算机创建有效移动列表_Python_Reversi - Fatal编程技术网

在reversi(python)中为计算机创建有效移动列表

在reversi(python)中为计算机创建有效移动列表,python,reversi,Python,Reversi,我对编程比较陌生,所以请原谅这里缺少优雅的代码。这个程序有点复杂,但我已经到了我想完成它并看到结果的时候了。无论如何,在这个函数中,我试图为计算机创建一个有效移动列表 board是一个由64个项目组成的列表,两个项目列表中的每一个都代表一个项目 反向板 玩家是玩家的棋子,可以是“X”或“O”(在程序前面确定) 计算机是计算机的一部分,而计算机是相反的 第一步是收集电路板上当前空白的所有点(有效的\u列表)。接下来,我试着在每个点上循环,看看是否有相邻的点是玩家的棋子。如果是的话,我想收集所有

我对编程比较陌生,所以请原谅这里缺少优雅的代码。这个程序有点复杂,但我已经到了我想完成它并看到结果的时候了。无论如何,在这个函数中,我试图为计算机创建一个有效移动列表

  • board是一个由64个项目组成的列表,两个项目列表中的每一个都代表一个项目 反向板
  • 玩家是玩家的棋子,可以是“X”或“O”(在程序前面确定)
  • 计算机是计算机的一部分,而计算机是相反的
第一步是收集电路板上当前空白的所有点(有效的\u列表)。接下来,我试着在每个点上循环,看看是否有相邻的点是玩家的棋子。如果是的话,我想收集所有的点,这样在同一行(或列)中就有另一个计算机块。代码对我来说似乎有意义,但它给了我意想不到的结果。我只是想知道是否有人能猜出是什么导致了奇怪的结果(有效的清单1)

def comp_移动(板、播放器、计算机):
有效的_列表=[]
对于范围(8)内的xcoord:
对于范围(8)内的ycoord:
如果电路板[xcoord][ycoord]='':
有效的\u列表。追加([xcoord,ycoord])
复制=获取复制(板)
num_list=[-1,0,1,-1,1,-1,0,1]
num_list2=[-1,-1,0,0,1,1,1]
对于范围(8)中的num:
对于范围内的i(len(有效_列表)):
xcoord\u orig=有效的\u列表[i][0]
ycoord\u orig=有效的\u列表[i][1]
xcoord1=有效的列表[i][0]+num\u列表[num]
ycoord1=有效的列表[i][1]+num\u列表2[num]
#测试看周围是否有任何地方被玩家的棋子占据

如果0我无法从您的问题中完全理解,但从您的代码来看,您的有效_列表1将充满包含所有相同值(计算机原始坐标)的列表。我认为那不是你想要的

如果将
If move\u listi:
语句(其中i是move\u列表编号)替换为
valid\u list1+=move\u listi

例如:

# if move_list:  -- REMOVE THESE LINES
#     valid_list1.append([xcoord_orig, ycoord_orig])
valid_list1 += move_list
...

# if move_list1: -- REMOVE THESE LINES
#     valid_list1.append([xcoord_orig, ycoord_orig])
valid_list1 += move_list1
...

# Repeat for move_list2 - move_list7

再一次,我不能完全肯定你问的是什么。如果不是,请告诉我。有效的列表1将包含一个列表,其中有一个计算机部件在原始计算机部件的视线范围内。

我想将奥赛罗板表示为一个10x10,边缘有一行空方块。然后,不使用x和y坐标,而是将位置表示为单个值P=y*10+x,其中x和y从0到9。然后,num_列表和numlist2成为一个单独的列表,其中dir=[-11,-10,-9,-1,1,9,10,11]表示8个方向。通过查看线路板[p+dir[d]*距离],从位置p扫描线路板。现在Python没有数组,查看列表的第n项可能不是最有效的方法,但是无论您在2D中做什么,在1D中都会变得更简单。顺便说一句,因为你总是扫描相邻的或对角的方块,并且你只看下一个方块被对手或你自己的方块占据的距离,所以循环将自然终止于空方块的边界,你永远不必检查你是否跑出了棋盘的边缘。这并不能解决您的具体实现问题,但此实现将更容易调试:-)


在知道自己有四个输入的情况下,你如何编程,或者如果你想在其他输入中编程,以获得最佳有效的_移动

“给我意想不到的结果”?真正地你得详细解释一下。另外,将print语句(或函数)放入代码中以跟踪执行并显示中间结果非常非常有帮助。请(1)定义什么是意外的,(2)输入足够的打印语句以缩小问题范围,(3)在此基础上,发布包含实际问题的最少代码。您得到了什么结果,您期望得到什么?提供一些示例输入和输出将有助于缩小问题的范围。另外,如果这是家庭作业,你应该给它贴上这样的标签。你试过在上面使用调试器吗?代码太长,在粗略检查时无法发现错误。现在的诀窍是学习如何找出哪里出了问题。这个函数太长了。如果你把它分解成更小的步骤,你可以测试和验证每一个小部分。因此,从您的描述“如果任何相邻点是玩家的棋子”,这应该自然转化为一个if语句和一个函数“相邻点是玩家的棋子”。希望有帮助。为什么董事会有两个项目清单?这两项是什么?
# if move_list:  -- REMOVE THESE LINES
#     valid_list1.append([xcoord_orig, ycoord_orig])
valid_list1 += move_list
...

# if move_list1: -- REMOVE THESE LINES
#     valid_list1.append([xcoord_orig, ycoord_orig])
valid_list1 += move_list1
...

# Repeat for move_list2 - move_list7
import numpy

def ai_player(board, scores, turn, valid_moves):
    """
    Input:
        board: numpy array of the disks for each player, e.g.
               [[0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 1, 2, 0, 0, 0],
                [0, 0, 0, 2, 1, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0]]

               - 0 empty locations
               - 1 player 1's disks
               - 2 player 2's disks
        scores: list of score values - [0, 0]
        turn: integer turn counter (starts from 1)
        valid_moves: numpy array of valid disk locations, represented in row
                     column combinations:
                     e.g [[3, 5],   # row 3 - col 5
                          [5, 3],   # row 5 - col 3
                          [4, 2],   # etc.
                          [3, 4]]

    Return:
        disk loction index --> a numpy array or a list
                           --> a valid row - col combination to place a disk
                           --> location must be empty
                           --> location must have flanks

        e.g. if valid_moves = [[3, 5],   # row 3 - col 5
                               [5, 3],   # row 5 - col 3
                               [4, 2],   # etc.
                               [3, 4]]
             and you want to place a disk at location row 4, col 2 then you
             need to return [4, 2]
"""