-2

我自己已经在寻找解决方案,也许我什么也没找到,或者我什至无法识别正确的解决方案。

我已经完成了这门课程的作业并且代码可以工作,但是当我将它放入代码测试器(课程所需)时,我收到以下消息:

合并([4])预期 [4] 但收到(异常:IndexError)“列表索引超出范围”在第 16 行,在合并中

我怎样才能摆脱这个错误?顺便说一句,这是创建游戏“2048”的尝试,其中非零数字必须向左移动,并且相同的数字将结合起来产生双倍的价值。

2 0 2 4 应该变成 4 4 0 0

这是我的代码:

    def merge(line):
        """
        Function that merges a single row or column in 2048.
        """
        new_list = line
        for x in line:
            if x == 0:
                line.remove(0)
                line.append(0)
        if new_list[0] == new_list[1]:
            new_list[0] = new_list[0] * 2
            new_list.pop(1)
            new_list.append(0)
        else:
            pass
        if new_list[1] == new_list[2]:
            new_list[1] = new_list[1] * 2
            new_list.pop(2)
            new_list.append(0)
        else:
            pass
        if new_list[2] == new_list[3]:
            new_list[2] = new_list[2] * 2
            new_list.pop(3)
            new_list.append(0)
        else:
            pass
        return new_list
        return []

    #test
    print '2, 0, 2, 4 becomes', merge([2, 0, 2, 4])
4

2 回答 2

0

如果问题是这行代码:

if new_list[1] == new_list[2]:

我想这是由于您使用的测试仪的问题。更具体地说,即使输入错误,它也会测试你的代码,比如一个空数组。因此,您可以尝试在输入上插入一些控件,如下所示:

if len(line) === 0: # it checks if the array is empty

此外,超过16num的建议,我建议你删除return [],因为这行代码是无法访问的。

于 2017-08-03T12:55:51.660 回答
0

如果代码有效并且您只想处理可以通过使用 try 和 except 来完成的错误。

这是一个示例,其中 merge() 被调用了 3 次,第二次调用时没有足够的数字使函数工作,这会触发 IndexError,然后传递该错误,以便代码可以继续运行。

def merge(line):
#Function that merges a single row or column in 2048.
    try:
        new_list = line
        for x in line:
            if x == 0:
                line.remove(0)
                line.append(0)
        if new_list[0] == new_list[1]:
            new_list[0] = new_list[0] * 2
            new_list.pop(1)
            new_list.append(0)
        else:
            pass
        if new_list[1] == new_list[2]:
            new_list[1] = new_list[1] * 2
            new_list.pop(2)
            new_list.append(0)
        else:
            pass
        if new_list[2] == new_list[3]:
            new_list[2] = new_list[2] * 2
            new_list.pop(3)
            new_list.append(0)
        else:
            pass
        return new_list
        return []
    except IndexError:
        #print('index error')
        pass


#test
print('2, 0, 2, 4 becomes', merge([2, 0, 2, 4]))
print('2, 0, 2 triggers an index error, which is passed and the code keeps running', merge([2, 0, 2]))
print('2, 0, 2, 4 becomes', merge([2, 0, 2, 4]))
于 2017-08-03T13:09:54.977 回答