第一次写技术性的博客啊,本人菜鸟,如果哪里说的不够准确完善,欢迎大神前来点拨呀~
先放几张效果图吧~
这是我最近做的一个三阶魔方还原的小程序。
用的环境是VC++6.0,其中也大量运用了easyx库进行图形绘制等。
这次写程序深刻感受到了算法是程序的灵魂。当时写魔方算法的时候,准备了两种算法,:第一种,储存每一步的步骤,再逆序还原,这方法实现起来到不太难;第二种,想用传统层先法还原,这倒是真把我难倒了。本来想着魔方还原都是有公式的,还原起来用这现成公式的算法不就好了吗?但是,写起来才发现没那么简单,因为人脑进行判断时可以迅速处理所看到的色块信息,灵活的进行公式变换,而电脑却不像人那样思考。可能对人来说,层先法第一步,底层十字还原,不难做到,因为实现的方法多种多样,但正是这多种多样,让电脑判断时也需逐条分析。我当初一直想寻找复原十字通法而无果(本人其实是魔方菜鸟......),后来在某魔方大神的指导下依次判断每个棱块进行检测,遍历96种情况,或许方法不是最简捷的,但终于完成了底层十字的复原,这一步的完成可谓是历史性的啊,正所谓万事开头难嘛,完成了十字,之后依次是底层角块、侧棱、顶层棱块色相、顶层角块色相、顶层角块位置、顶层棱块位置,这些步骤结合魔方公式到比十字得心应手得多了。运用魔方公式的算法具体实现方法就不赘述了,就是根据魔方公式与程序有机结合啦。
首先,魔方的面是用的二维数组,并且运用了C++的类。
class Face
{
public:
Face();
COLORREF color;
void coordinate(int x1, int y1, int x2, int y2);
void coloring();
private:
int iX1, iY1; //立方体小块涂色坐标
int iX2, iY2; //展开图小块涂色坐标
};
Face::Face()
{
color = RGB(0, 250, 0); //初始化
}
void Face::coordinate(int x1, int y1, int x2, int y2)
{
iX1 = x1;
iY1 = y1;
iX2 = x2;
iY2 = y2;
}
void Face::coloring()
{
setfillstyle(0);
setfillcolor(color);
floodfill(iX1, iY1, RGB(233, 233, 233));
floodfill(iX2, iY2, RGB(233, 233, 233));
}
实例化了六个面:
Face F[3][3];
Face U[3][3];
Face R[3][3];
Face L[3][3];
Face D[3][3];
Face B[3][3];
接下来说说图形界面。首先是一个发光魔方的欢迎界面,点击“Rubik”(魔方)后即可进入,进入后分为图形显示界面和步骤显示操作界面。图形显示界面左下角有操作说明:
“你可以摁字母控制魔方转动:大写代表顺时针,小写代表逆时针。如:R r U u L l D d F f B b M m X x Y y Z z 按数字0可退出,按*逆序还原,按+传统还原”。
操作说明框具体实现代码如下:
//提示框
setcolor(RGB(255, 174, 201));
setbkmode(TRANSPARENT); //字体透明背景
setlinestyle(PS_SOLID, 10);
roundrect(50, 300, 450, 480, 50, 50); //圆角矩形
setcolor(RGB(192, 45, 204));
LOGFONT f;
gettextstyle(&f); // 获取当前字体设置
f.lfHeight = 30; // 设置字体高度为 30
<span style="color:#cc33cc;background-color: rgb(255, 255, 153);">_tcscpy(f.lfFaceName, _T("Ravie")); // 设置字体为“Ravie”
f.lfQuality = ANTIALIASED_QUALITY; // 设置输出效果为抗锯齿
settextstyle(&f); // 设置字体样式
outtextxy(140, 310, "Rubik's Cube");