Java 设计拼图

Java 设计拼图,java,algorithm,puzzle,Java,Algorithm,Puzzle,我计划开发一款拼图游戏。 现在我已经有了图像和图像片段,所以我们不需要算法来将图像分割成片段 在UI端有两个部分 第一部分包含随机顺序的断开图像 第二部分包含完整图像的轮廓。用户需要将剪切图像拖放到轮廓图像上 我不确定如何在轮廓图像上匹配这些片段? 关于算法或起始点有什么想法吗?我想数据结构很简单-每个和平都会指向它的邻居,并保持实际的形状来显示 在应用程序的人机界面上-您的开发环境是什么? 如果是windows,我会选择c#和winforms,甚至更好的wpf。 如果是unix,您必须征求其他

我计划开发一款拼图游戏。 现在我已经有了图像和图像片段,所以我们不需要算法来将图像分割成片段

在UI端有两个部分

  • 第一部分包含随机顺序的断开图像
  • 第二部分包含完整图像的轮廓。用户需要将剪切图像拖放到轮廓图像上
  • 我不确定如何在轮廓图像上匹配这些片段?
    关于算法或起始点有什么想法吗?

    我想数据结构很简单-每个和平都会指向它的邻居,并保持实际的形状来显示

    在应用程序的人机界面上-您的开发环境是什么? 如果是windows,我会选择c#和winforms,甚至更好的wpf。
    如果是unix,您必须征求其他人的意见,因为我在这方面不是专家。

    对于规则形状,您可以使用矩阵。我建议将此作为第一种方法。划分拼图就像定义矩阵的X,Y维度一样简单。对于每一块,你有一系列的四个值,每边一个,表示它是平的、指向的还是指向的。这将给你一个非常经典的拼图游戏设置

    这些部件的实际外观成为了一个严格的GUI问题。现在,对于第一稿,我建议使用完美的正方形。在任何GUI框架中,获取图像的矩形位都应该很容易

    要进行成型,您需要一系列模板。这些将成为应用于图像的遮罩。每个遮罩都会剪掉图像的一小部分来制作你的作品。您可能需要动态创建遮罩,以便使其适合拼图。首先从简单的三角形连接开始。一旦你有了这项工作,你可以做数学得到漂亮的球根连接器形状。在GUI框架中查找“剪辑”和“掩码”

    如果您希望制作不符合一般矩阵布局的不规则多边形,那么您需要做更多的工作。这就是为什么我建议首先使用正方形作为一个很好的示例。现在您需要深入研究图论和分区。拿起一些关于3D编程的书——专注于算法,就像他们一直在做分区一样。尽管我不会怀疑是否有一本书有这个确切的主题


    玩得开心。

    允许用户将每件物品拖动到轮廓区域。允许工件以90度增量旋转

    备选案文1: 如果一块在整个拼图中的位置正确,角度正确,并连接到另一块,则通过一些用户反馈将其捕捉到位。拼图的外侧边缘可以算作与边缘块的连接

    备选案文2: 组装拼图时,相邻拼图块是相邻的拼图块。当拼图拼图拼在一起时,它们仍然有相同的邻居。每个拼图块(边缘块除外)有四个相邻部分

    如果一个工件靠近它的一个相邻工件,且与该相邻工件成正确的角度,则将其捕捉到另一个工件上。然后将两个(或更多)工件作为一个整体拖拽,就像拖拽单个工件一样。这将允许用户在任何区域组装拼图的子部分,就像使用物理拼图一样,并将子部分彼此连接起来

    您可以检查正在移动到其四个相邻位置的工件,以查看它们是否足够近,可以咬合在一起。如果一个工件的正确边缘与相邻工件的正确边缘足够接近,且角度相同,则它们匹配

    有几种方法可以检查相对位置。一种方法是暂时旋转正在测试的工件的坐标,使其竖直,然后将其所有所需邻居的坐标也暂时旋转到相同的角度。(对所有旋转使用相同的旋转中心。)然后您可以轻松测试它们是否足够接近以匹配。如果用户正在拖动部件,则需要检查部件中的每条不匹配边

    备选方案2更复杂、更现实。选项1可以通过省略片段的旋转,并使每个片段从一开始就具有适当的角度来进一步简化。

    1)如何将图像分解为随机多边形

    看来你已经弄明白了这一部分。(from:“现在我已经有了图像和图像片段,所以我们不需要算法将图像分割成片段。”)

    2) 什么样的数据结构可以解决这个问题

    您可以在示例中创建一个类似Scribble类的类片段,您的片段将是片段类的对象数组。 因此,您将有两个数组, (i) 实际图像块数组 (二)图像块轮廓阵列

    因此,每当您将一块拖放到图像的完整轮廓上时,它将检查图像块对象是否超过80%,以及实际图像块的ID(块对象的成员变量)与图像块轮廓是否匹配,然后您在正确的位置获得了正确的块

    3) 用户界面实现


    签出。

    您可以创建“拼图瓷砖”类对象的数组

    每个这样的磁贴都有一个图像和一个整数
    每次移动后,检查整数是否正确排序,表示:
    123
    456
    789

    您可以为返回布尔值的函数创建一个函数


    注意:我目前正在C#下开发,这就是为什么在C#下可能最容易实现这个概念的原因,特别是在C#下,尽管其他平台几乎不需要对此进行任何修改。

    这些片段是规则正方形还是随机多边形?“如何执行任务X?”太模糊了。如果你遇到了一个特定的问题,请改为询问。碎片将是随机多边形好的,因此具体问题将是:1)如何将图像分解为随机多边形2)什么样的数据结构可以解决问题3)UI实现