Programming Classic 15 Puzzle in Python



我是Python的新手,并试图在Python中实现经典15个难题的非GUI版本。

当前我有代码,该代码随机生成一个包含其他4个列表的列表,每个列表包含1到16个数字(我使用16作为空白空间。)

这是生成列表的一个示例:

[['11', '14', '01', '16'], ['02', '13', '09', '06'], ['04', '05', '03', '07'], ['10', '15', '12', '08']]

我的问题是:

  1. 实现函数以切换两个图块位置的最佳方法是什么是否并且仅当它们彼此相邻时?
  2. 我的嵌套方法是表示拼图板的最佳方法吗?
  3. 是一种功能或面向对象的方法吗?我认为每个瓷砖都可以用作移动方法表示为对象。

这就是我目前拥有的:

#!/usr/bin/env python3
import random

class game:
    def __init__(self, array):
        self.array = array
        print (array)
    def objects(self):
        self.objects = []
        for i in self.array:
            if len(str(i)) == 1:
                i = '0'+str(i)
                self.objects.append(i)
            else:
                i = str(i)
                self.objects.append(i)
        print (self.objects)
    def grid(self):
        self.grid = [[], [], [], []]
        for eachrow in range(4):
            print ("row number", eachrow)

     for eachobject in range(4):
            print ("this is a list of objects before popping:n{0}".format(self.objects))
            k = random.randint(0, len(self.objects)-1)
            print (k)
            self.grid[eachrow].append(self.objects.pop(k))
            print (self.grid)

def main():
    array = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
    test = game(array)
    test.objects()
    test.grid()
if __name__ == "__main__":
    main()

将您的大问题分为许多小问题,并且更容易推理。

您是否想实现人类玩游戏的程序?

如果您想询问相邻的瓷砖,我建议一种有用的实现方法,即给出一个正方形,为您提供了一个列表。

也许您可能还需要一种方法,可以告诉您当前可以移动哪些图块(/交换)。

也许也告诉您一个瓷砖离家有多远。

tiles_to_correct()方法可以使用它来告诉您仍需要移动多少瓷砖到正确的位置(即离家不在0)。当tiles_to_correct()返回0时,finished()可能会返回true。

实施所有这些可能至少可能会帮助您考虑并努力编写完成程序,即使它们没有直接帮助。

2D列表应该在获得工作程序时表示问题。在尝试优化速度之前,我会选择这一点。不过,我不会为瓷砖使用字符串,我会使用数字,可能是0-15。如果您想将板显示给玩家,它很容易编写输出代码,如果您希望显示1-16,则将1添加到数字。

回答您的第三个问题:

是一种功能或面向对象的方法更好吗?我在想每个瓷砖可以用移动方法表示为对象。

我认为您应该根据要实现的目标考虑每种方法。

如果您想要清晰的设计,则可能需要用代表问题的每个实体(瓷砖,游戏,空图等)的对象对问题进行建模。但是,这可能不是最佳性能系统,因为您可能会创建许多间接。但是您也可能会获得可重复性,模块化等。

另一方面,如果要专注于数据和算法,则应使用命令式方法(使用Python的功能性调味)。如前所述,这可能会更快,因为它删除了许多间接层。

基于您所说的(几句话),我会朝OOP方向朝着。

当然,您可以使用面向对象的编程并执行可怕的代码。您可以使用命令率并创建缓慢的程序。以正确的方式做事取决于您。

最新更新