三阶魔方还原程序心得

第一次写技术性的博客啊,本人菜鸟,欢迎大神前来点拨呀~这是我最近做的一个三阶魔方还原的小程序。用的环境是VC++6.0,其中也大量运用了easyx库进行图形绘制等。这次写程序深刻感受到了算法是程序的灵魂。当时写魔方算法的时候,准备了两种算法,:第一种,储存每一步的步骤,再逆序还原,这方法实现起来到不太难;第二种,想用传统层先法还原,这倒是真把我难倒了.....首先,魔方的面是用的二维数组,并且运用了C++的类......接下来说说图形界面......在这里总结一下调色的三种方法......对了
摘要由CSDN通过智能技术生成

第一次写技术性的博客啊,本人菜鸟,如果哪里说的不够准确完善,欢迎大神前来点拨呀~微笑

先放几张效果图吧~

这是我最近做的一个三阶魔方还原的小程序。

用的环境是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");
  • 27
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值