一个简单的控制台Rubik的立方体在C(无需解决,只设计)

所以,作为初学者,这个项目给了我一个偏头痛。 当然,我不是要求任何完整的代码,我想了解逻辑和我的选择。

在大学里,我们已经涵盖(或将涵盖)的C编程主题不超过动态数组。 我们可以使用结构,函数,数组,指针而不是类,因为这是C,而不是C ++。

我很擅长解决方案,但不是谜题。 我试过的是制作一个带有6个整数的立方体结构 (代表边),然后制作一个立方体数组。

我能做的另一件事就是制作一个[6] [3] [3]数组,但我认为这会让它变得太复杂? 总结一下我的要求,

要求

  • 控制台应用
  • 没有花哨的图形或任何东西
  • 没有解决方案
  • 简单的工作立方体
  • 可以初始化为用户输入

等级:业余

这是正确的方法吗? 你怎么认为我应该轮换一条线? 再次,不需要代码,如果你能解释主要的逻辑,我应该如何分解代码甚至伪代码,这将是伟大的。

你认为我应该使用立方体rubik[3][3][3]制作一个完整的立方体,还是处理像cube face[3][3]这样的cube face[3][3]

我将添加您需要的任何额外信息,以帮助解决我的问题。

编辑 – 附加信息:这是我的立方体数组(这里的编辑器搞砸了一些缩进):

 int cube[6][3][3] = {{{1,1,1},{1,1,1},{1,1,1}}, {{2,2,2},{2,2,2},{2,2,2}}, {{3,3,3},{3,3,3},{3,3,3}}, {{4,4,4},{4,4,4},{4,4,4}}, {{5,5,5},{5,5,5},{5,5,5}}, {{6,6,6},{6,6,6},{6,6,6}} }; 

您所描述的任何一个选项都可以完成这项任务。 你如何用逻辑分解它实际上取决于对你最有意义的东西。 可能有帮助的是写下一个列表,列出rubix多维数据集具有哪些function并重新排列,直到您有办法表示对象的每个部分。 你的arrays想法是一个很好的开始。

… [6] [3] [3]arrays,但我认为这太复杂了?

我觉得这很有意义,实际上是解决问题的简单方法。 我的建议是滚动它并尝试它。

一个立方体可以用

 int tile[6][3][3]; 

第一个索引是立方体的面

第二个和第三个表示行和列

数组的值是颜色(0-5)


可以在立方体上执行的动作是6个面中的一个面顺时针旋转90°(因此有6种可能的动作)。

任何其他的lecit动作可以由上面的序列表示。


为了完整性,即使没有被问到,解决这个难题的最简单方法是暴力尝试所有可能的移动顺序,直到找到解决方案。 但这会导致内存和处理器的使用效率非常低下。 由于解决方案通常在20次移动中找到,最坏的情况会导致尝试大约1.0E14移动……

网络有很多拼图解决方案算法……

您可以尝试在视觉上拍摄,基本上一个立方体有6个面,每边有9个小方块(或9x9arrays)。

这本书有一些关于如何代表一个的有趣想法。

//代码太长,所以它分为2部分。

1部分

这应该工作:(我知道它很长,并没有评论很多,但主要的想法是有持有字符的地方持有人u-up,f-front,d-down,b-back,l-left和r-right。他们可以使用移动方法移动。对于侧面和面部有两种移动方法。之后,一切都用绘制方法绘制。

 static void Move(ref char b0, ref char b1, ref char b2, ref char b3, ref char b4, ref char b5, ref char b6, ref char b7, ref char b8, ref char b9, ref char b10, ref char b11) { char m = b11; b11 = b10; b10 = b9; b9 = b8; b8 = b7; b7 = b6; b6 = b5; b5 = b4; b4 = b3; b3 = b2; b2 = b1; b1 = b0; b0 = m; } static void MoveSide(ref char b0, ref char b1, ref char b2, ref char b3) { char m = b3; b3 = b2; b2 = b1; b1 = b0; b0 = m; } static void Color(char p) { switch (p) { case 'u': Console.ForegroundColor = ConsoleColor.White; break; case 'f': Console.ForegroundColor = ConsoleColor.Green; break; case 'd': Console.ForegroundColor = ConsoleColor.Yellow; break; case 'b': Console.ForegroundColor = ConsoleColor.Blue; break; case 'l': Console.ForegroundColor = ConsoleColor.Magenta; break; case 'r': Console.ForegroundColor = ConsoleColor.Red; break; } } 

#第2部分

 static void Move(ref char b0, ref char b1, ref char b2, ref char b3, ref char b4, ref char b5, ref char b6, ref char b7, ref char b8, ref char b9, ref char b10, ref char b11) { char m = b11; b11 = b10; b10 = b9; b9 = b8; b8 = b7; b7 = b6; b6 = b5; b5 = b4; b4 = b3; b3 = b2; b2 = b1; b1 = b0; b0 = m; } static void MoveSide(ref char b0, ref char b1, ref char b2, ref char b3) { char m = b3; b3 = b2; b2 = b1; b1 = b0; b0 = m; } static void Color(char p) { switch (p) { case 'u': Console.ForegroundColor = ConsoleColor.White; break; case 'f': Console.ForegroundColor = ConsoleColor.Green; break; case 'd': Console.ForegroundColor = ConsoleColor.Yellow; break; case 'b': Console.ForegroundColor = ConsoleColor.Blue; break; case 'l': Console.ForegroundColor = ConsoleColor.Magenta; break; case 'r': Console.ForegroundColor = ConsoleColor.Red; break; } }