用C++Builder5.0设计九宫排字游戏

来源: 作者: 2007-10-24 出处:pcdog.com

下一页 1 2 3 4 

  摘要:

  九宫排字问题(又称八数码问题)是人工智能当中有名的难题之一。问题是在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";
}


更多内容请看PCdog.com--C/C++相关文章  程序设计  游戏策划专题
下一页 1 2 3 4 
上一篇:C++Builder 编程指南1
下一篇:在C++Builder中自定义预览窗口