- 关 键 词:
- c++builder
- 人工智能
摘要:
九宫排字问题(又称八数码问题)是人工智能当中有名的难题之一。问题是在3×3方格盘上,放有八个数码,剩下第九个为空,每一空格其上下左右的数码可移至空格。问题给定初始位置和目标位置,要求通过一系列的数码移动,将初始位置转化为目标位置。
本文介绍用C++Builder5.0编写九宫排字问题游戏。游戏规则是,动态产生初始状态,由初始状态出发,不断地在空格上下左右的数码移至空格,若能排出目标状态,则成功。引言:
九宫排字问题(又称八数码问题)是人工智能当中有名的难题之一。问题是在3×3方格盘上,放有八个数码,剩下第九个为空,每一空格其上下左右的数码可移至空格。问题给定初始位置和目标位置,要求通过一系列的数码移动,将初始位置转化为目标位置.
九宫排字问题不是任何情况下都是有解的,我们可以把一个状态,自左至右,自上而下地用一维数组表示成(a1,a2,a3,a4,a5,a6,a7,a8)(空格跳过),而相应的位置也按同样的顺序排列,那么,如果在位置iaj,则说存在一个逆序,若逆序总数为偶数,则称相应的状态为偶状态,逆序总数为奇数,则称相应的状态为奇状态。
很明显,空格横向移动时,逆序总数无变化,而空格纵向移动时,逆序总数改变-2、0或2,因此,在任何情况下,奇状态和偶状态不可能相互转换。
九宫排字问题的求解方法,就是从初始状态出发,不断地空格上下左右的数码移至空格,将一个状态转化成其它状态,直到产生目标状态。如图二。
本文用C++Builder5.0编写九宫排字问题游戏。游戏规则是,动态产生初始状态,由初始状态出发,不断地空格上下左右的数码移至空格,若能排出目标状态,则成功。
图二、九宫排字问题的状态图
编程实现:
【第一步】选用C++Builder的菜单项“File|New Application”,创建一个工程。
【第二步】给项目加入九个Panel控件,一个MainMenu控件,两个Label控件,并各控件的安排如图三所示。
图三、各控件的安排
【第三步】按表一、二所示设置有些控件属性:
表一、控件及其属性
表二、菜单的设计
【第四步】Form1的OnCreate事件写入以下代码,其目的为:随机产生初始状态。图四为程序随机产生初始状态一览。
void __fastcall TForm1::FormCreate(TObject *Sender)
{
AnsiString my_RondomNum[9];
for(int i=0;i<9;i++)
{
REDO:
my_RondomNum[i]=IntToStr(random(9));
for(int j=0;j
{
if(my_RondomNum[i]==my_RondomNum[j])
{
goto REDO;
}
}
}
for(int i=0;i<9;i++)
{
if(my_RondomNum[i]=="0")
{
my_RondomNum[i]="";
break;
}
}
Panel1->Caption=my_RondomNum[0];
Panel2->Caption=my_RondomNum[1];
Panel3->Caption=my_RondomNum[2];
Panel4->Caption=my_RondomNum[3];
Panel5->Caption=my_RondomNum[4];
Panel6->Caption=my_RondomNum[5];
Panel7->Caption=my_RondomNum[6];
Panel8->Caption=my_RondomNum[7];
Panel9->Caption=my_RondomNum[8];
my_Count=0;
Label1->Caption="0";
}
相关专题
- 数字小键盘指法练习 (5501次浏览)
- 用WinSock控件编写网络聊天器 (2638次浏览)
- C++Builder注册表编程实例详解 (1568次浏览)
- C++ Builder VCL库函数简介 (1348次浏览)
- 在 C++ Builder中利用串行通信控件编程 (1213次浏览)
- C++ Builder中消息处理过程及应用 (1038次浏览)
- 将指定目录的结构装入TreeView中 (990次浏览)
- 用C++ Builder3 制作记事本 (818次浏览)
- Windows多线程间同步事件的控制方法 (787次浏览)
- C++Builder开发Web应用程序 (746次浏览)



