滑动拼图任务

时间:2009-08-03 11:39:23

标签: c#

我是C#的相对新手而且完全卡住了!对于学校作业,我需要制作一个滑动拼图,其中使用空格按顺序重新排列编号的拼贴,即

[1] [2] [3]

[4] [5] [6]

[7] [8] [ ] 

我不知道从哪里开始。

8 个答案:

答案 0 :(得分:11)

无论应用程序如何使用(Winforms UI,控制台,Web或其他),您都需要关注如何构建此类应用程序。首先考虑一下你需要做什么:

你需要

  • 管理拼图状态的引擎
    • 引擎必须能够重置拼图
    • 引擎必须能够在不进入无法解决状态的情况下加扰拼图
    • 引擎必须能够执行移动
    • 引擎必须能够检测拼图是否已解决
  • 用户界面(控制台,Web或桌面)
    • 从引擎中获取状态并显示它
    • 让用户重新开始
    • 为用户提供移动
    • 显示谜题已解决(并祝贺用户如此)。

在初学者级别,我会从引擎开始。您将需要编写一个包含数据的C#类。有关如何使用该语言的信息,请参阅C#教程,我将专注于此处的问题:

enigne需要抓住这个难题。我们有9个字段和8个瓷砖。所以我们可能只使用长度为9的固定数组。数组中的每个条目都是一个描述图块的数字。 1是tile 1,2是tile 2,依此类推到tile 8.我们用0来描述空tile。

然后你需要实现移动的方法。您可以随时尝试将瓷砖从上,右,下或左移动到空槽中。哪一个是空的瓷砖?我们的数组中包含0。

的条目

所以让我们向上,向下,向左,向右写四种方法来实现这些动作。让我们关注“向上”,将瓷砖从上部插槽移动到空插槽中。我们可以假设我们的数组映射到拼图如下:

0 1 2
3 4 5
6 7 8

因此,如果数组包含“7 6 5 3 0 1 2 4 8”,那么这个谜题将会是

7 6 5
3 _ 1
2 4 8

up方法现在需要在数组中找到“0”并将其与上面行中的值进行交换:

如果“0”在上排(数组索引0,索引1或索引2),则没有上行,“up”抛出异常。它无法运作。

如果“0”在另一个索引i上,则索引“在”上方i将是索引i-3。所以我们在数组中交换索引i和索引i-3的值。

你可以类似地实现“左”,“右”和“下”方法。看看有关如何为您的软件编写测试用例的所谓“单元测试”软件。 (NunitMBUnit

最后在拼图类中构建一个方法或属性,在解决时检查数组内容的顺序是否为“1 2 3 4 5 6 7 8 0”。

现在你有一个实现逻辑的益智类。

作为最后一步(但仍然很重要),您现在需要阅读有关如何构建UI的Winforms或WPF教程。但是现在你应该已经对C#有足够的了解,可以找到&阅读教程并完成它。

答案 1 :(得分:1)

我会使用域驱动设计来解决这个问题。专注于设计一些代表问题域中实体的类 - 所以我可能有Puzzle,Tile和EmptySpace类,也许还有Wall或Block类。当您可以使用单元测试推动磁贴时,请查看将GUI放在顶部。

答案 2 :(得分:1)

从UML图表开始,定义拼图所需的类,例如开始你可能需要

  • 游戏类
  • 瓷砖类
  • 等...

然后定义每个类所需的属性和行为。例如,对于tile类,

  • 数字枚举/标识符
  • 移动方法
  • 等...

一旦您对UML图表感到满意,就开始编写代码来实现设计

答案 3 :(得分:0)

  

我不知道从哪里开始!

一本关于WinForms或WPF的书将是一个很好的开始。试试thisthis

这里没有人会为你做一个你想要的应用程序代码,如果有的话 - 你会学到什么?

答案 4 :(得分:0)

首先问自己几个问题,例如:您将如何存储数字以及如何重新排列它们。然后编写几个测试来测试代码。例如。编写一个测试用例,验证您可以交换两个数字。看看TDD如何做到这一点。

另外,想想如何呈现董事会。这是控制台应用程序还是GUI?控制台更容易,但不那么花哨。

答案 5 :(得分:0)

假设您要创建桌面应用程序,请尝试研究winforms,按钮,单击事件和设置按钮文本。

一个快速谷歌买了这个:

http://www.codeproject.com/KB/game/slidingpuzzle.aspx

此时可能有太多细节,但应该让你开始。

答案 6 :(得分:0)

您应该首先决定如何使用c#对象表示位置。例如一个数组。这样您就可以开始为TDD编写用例。

然后你应该看看代码中是否可以确定位置是否合法(每个合法号码只有一个牌,一个“丢失”牌)。

然后你应该能够在代码中确定是否已达到最终位置(这可能不是必需的,但......)

然后你应该开始开发能够保持这种表现形式并确定合法行动的东西。

然后你应该将实现扩展到接受移动并确定新位置的东西。

答案 7 :(得分:0)

这很可能根本不适用于你的任务,但我无法帮助自己......;)

您可以将瓷砖网格存储为19位整数。这是绘制网格的方式:

public static void DrawGrid(int grid) {
   string display = " 12345678";
   for (int i = 9; i > 0; i--) {
      Console.Write("{0}{1}", display[grid % i], i % 3 == 1 ? "\r\n" : "");
      display = display.Remove(grid % i, 1);
      grid /= i;
   }
}

图块以数字形式存储在具有可变基数的数字中。第一个数字是基数9,因为它有8个可能的值。第二个数字是基数8,因为它有7个可能的值(第一个值不能在第二个位置重复),依此类推。

这个网格:

1 2 3
4 5 6
7 8

表示为此值,并使用上述方法绘制:

int grid = 1+9*(1+8*(1+7*(1+6*(1+5*(1+4*(1+3*1))))));
DrawGrid(grid);

移动部件当然有点复杂......;)