以前摆摊时卖过智力玩具,华容道是其中之一,觉得非常有意思,后来自觉易语言,就用易语言实现了电脑算法。现在学习AAUTO,当然也要再实现一次,目的是为了学习好AAUTO,好了,不说费话,先上要用的图片
接下来是Hrd库:
//华容道
namespace Hrd;
import math;
import gdip;
import table;
//人物图片
tabBmp={
[0]='/res/bmp/空格.bmp';
[1]='/res/bmp/曹操.bmp';
[2]='/res/bmp/关羽.bmp';
[3]='/res/bmp/张飞.bmp';
[4]='/res/bmp/赵云.bmp';
[5]='/res/bmp/马超.bmp';
[6]='/res/bmp/黄忠.bmp';
[7]='/res/bmp/赵云横.bmp';
[8]='/res/bmp/马超横.bmp';
[9]='/res/bmp/兵.bmp';
}
//阵法列表,后期可以做增加
tabZf={
['横刀立马']={3;1;-1;4;-3;-1;-1;-4;6;2;-2;5;-6;9;9;-5;9;0;0;9};
['屯兵东路']={4;3;1;-1;-4;-3;-1;-1;9;9;2;-2;9;9;6;5;0;0;-6;-5};
['兵临曹营']={9;1;-1;9;9;-1;-1;9;3;2;-2;4;-3;6;5;-4;0;-6;-5;0};
['齐头并进']={3;1;-1;4;-3;-1;-1;-4;9;9;9;9;6;2;-2;5;-6;0;0;-5};
['兵分三路']={9;1;-1;9;3;-1;-1;4;-3;2;-2;-4;5;9;9;6;-5;0;0;-6};
['将拥曹营']={3;1;-1;4;-3;-1;-1;-4;0;6;5;0;9;-6;-5;9;9;2;-2;9};
['天罗地网']={0;1;-1;0;9;-1;-1;9;3;4;6;5;-3;-4;-6;-5;9;2;-2;9};
['层层设防']={3;1;-1;9;-3;-1;-1;9;7;-7;9;9;5;2;-2;6;-5;0;0;-6};
['插翅难飞']={3;1;-1;6;-3;-1;-1;-6;9;7;-7;9;9;8;-8;9;0;2;-2;0};
}
//按阵法名取阵法数据
getZfs=function(zfname){
if(tabZf[zfname]){
return table.clone(tabZf[zfname]);
}
return table.clone(tabZf['横刀立马']);
}
//取得画红线的高度和宽度
getHW=function(人物){
select(人物) {
case 0,9 {
return 58,58;
}
case 1 {
return 118,118;
}
case 3,4,5,6 {
return 58,118;
}
case 2,7,8 {
return 118,58;
}
else {
return 0,0;
}
}
}
//取鼠标点击的人物位置x,y,和人物编号
getMouseInfo=function(i,j,阵法){
if(i && j && i>0 && i<=5 && j>0 && j<=5){
if(阵法[(j-1)*4+i]>-1){
return i,j,阵法[(j-1)*4+i]
}else{
if(i>1){
if(阵法[(j-1)*4+i-1]==-阵法[(j-1)*4+i]){
return i-1,j,阵法[(j-1)*4+i-1]
}
}
if(j>1){
if(阵法[(j-2)*4+i]==-阵法[(j-1)*4+i]){
return i,j-1,阵法[(j-2)*4+i]
}
}
if(i>1 && j>1){
if(阵法[(j-2)*4+i-1]==-阵法[(j-1)*4+i]){
return i-1,j-1,阵法[(j-2)*4+i-1]
}
}
}
}
return 0,0,-1;
}
//刷新画板
drawHrd=function(阵法,graphics,selected,selectx,selecty,selectr){
import win;
for(i=1;4;1){
for(j=1;5;1){
if(阵法[(j-1)*4+i]>-1){
var bmp = gdip.bitmap(tabBmp[阵法[(j-1)*4+i]]);
graphics.drawImageRect(bmp,(i-1)*60,(j-1)*60,bmp.width,bmp.height);
bmp.dispose();
}
/** //此处调试时写出位置和人物编号
var brush = gdip.solidBrush(0xFFFF0000);
//创建FontFamily
var family = gdip.family("宋体");
//创建stringFormat
var strformat = gdip.stringformat ( );
//设置样式
strformat.align = 0/*_GdipStringAlignmentNear*/;
//创建Font
var curFont = family.createFont( 11,2/*_GdipFontStyleItalic*/, 2/*_GdipUnitPixel*/)
//设置文字抗据齿
graphics.smoothingMode = 4/*_GdipSmoothingModeAntiAlias*/ ;
//消除走样,且边作平滑处理
graphics.textRenderingHint = 3/*_GdipTextRenderingHintAntiAliasGridFit*/;
rclayout = gdip.RECTF();
rclayout.x = (i-1)*60
rclayout.y = (j-1)*60
rclayout.width = 50 //在这里指的是宽度
rclayout.height = 20 //在这里指的是高度
graphics.drawString(i+":"+j+":"+阵法[(j-1)*4+i],curFont,rclayout, strformat,brush)
**/
}
}
if(selected){//选择红线
var re,Pen = gdip.CreatePen1( 0xFFFF0000, 3, 2/*_GdipUnitPixel*/ );
graphics.drawRectangle( Pen, (selectx-1)*60, (selecty-1)*60, getHW(selectr))
}
}
//判断能否移动,能移动则阵法变动
moverw=function(x,y,selectx,selecty,selectr,zf){
阵法=table.clone(zf);
select(selectr) {
case 9 {//兵
if((selecty==y && selectx-1==x)//可左移
|| (selecty==y && selectx+1==x)//可右移
|| (selecty-1==y && selectx==x)//可上移
|| (selecty+1==y && selectx==x)//可下移
){
tmp=阵法[(selecty-1)*4+selectx];
阵法[(selecty-1)*4+selectx]=阵法[(y-1)*4+x];
阵法[(y-1)*4+x]=tmp;
return true,阵法;
}
}
case 1 {//曹操
if(selecty+2=y && 阵法[(selecty+1)*4+selectx]==0 && 阵法[(selecty+1)*4+selectx+1]==0){//可下移
阵法[(selecty+1)*4+selectx]=阵法[(selecty)*4+selectx]
阵法[(selecty+1)*4+selectx+1]=阵法[(selecty)*4+selectx+1]
阵法[(selecty)*4+selectx]=阵法[(selecty-1)*4+selectx]
阵法[(selecty)*4+selectx+1]=阵法[(selecty-1)*4+selectx+1]
阵法[(selecty-1)*4+selectx+1]=0
阵法[(selecty-1)*4+selectx]=0
return true,阵法;
}
if(selecty-1=y && 阵法[(selecty-2)*4+selectx]==0 && 阵法[(selecty-2)*4+selectx+1]==0){//可上移
阵法[(selecty-2)*4+selectx]=阵法[(selecty-1)*4+selectx]
阵法[(selecty-2)*4+selectx+1]=阵法[(selecty-1)*4+selectx+1]
阵法[(selecty-1)*4+selectx]=阵法[(selecty)*4+selectx]
阵法[(selecty-1)*4+selectx+1]=阵法[(selecty)*4+selectx+1]
阵法[(selecty)*4+selectx]=0
阵法[(selecty)*4+selectx+1]=0
return true,阵法;
}
if(selectx-1=x && 阵法[(selecty-1)*4+selectx-1]==0 && 阵法[(selecty)*4+selectx-1]==0){//可左移
阵法[(selecty-1)*4+selectx-1]=阵法[(selecty-1)*4+selectx]
阵法[(selecty-1)*4+selectx]=阵法[(selecty-1)*4+selectx+1]
阵法[(selecty-1)*4+selectx+1]=0
阵法[(selecty)*4+selectx-1]=阵法[(selecty)*4+selectx]
阵法[(selecty)*4+selectx]=阵法[(selecty)*4+selectx+1]
阵法[(selecty)*4+selectx+1]=0
return true,阵法;
}
if(selectx+2=x && 阵法[(selecty-1)*4+selectx+2]==0 && 阵法[(selecty)*4+selectx+2]==0){//可右移
阵法[(selecty-1)*4+selectx+2]=阵法[(selecty-1)*4+selectx+1]
阵法[(selecty-1)*4+selectx+1]=阵法[(selecty-1)*4+selectx]
阵法[(selecty-1)*4+selectx]=0
阵法[(selecty)*4+selectx+2]=阵法[(selecty)*4+selectx+1]
阵法[(selecty)*4+selectx+1]=阵法[(selecty)*4+selectx]
阵法[(selecty)*4+selectx]=0
return true,阵法;
}
}
case 3,4,5,6 {//张赵马黄
if((selecty+2==y && selectx==x)){//可下移
阵法[(selecty+1)*4+selectx]=阵法[(selecty)*4+selectx]
阵法[(selecty)*4+selectx]=阵法[(selecty-1)*4+selectx];
阵法[(selecty-1)*4+selectx]=0;
return true,阵法;
}
if((selecty-1==y && selectx==x)){//可上移
阵法[(selecty-2)*4+selectx]=阵法[(selecty-1)*4+selectx];
阵法[(selecty-1)*4+selectx]=阵法[(selecty)*4+selectx];
阵法[(selecty)*4+selectx]=0;
return true,阵法;
}
if((selectx-1==x
&& 阵法[(selecty-1)*4+selectx-1]==0
&& 阵法[(selecty)*4+selectx-1]==0)){//可左移
阵法[(selecty-1)*4+selectx-1]=阵法[(selecty-1)*4+selectx]
阵法[(selecty)*4+selectx-1]=阵法[(selecty)*4+selectx]
阵法[(selecty-1)*4+selectx]=0;
阵法[(selecty)*4+selectx]=0;
return true,阵法;
}
if((selectx+1==x
&& 阵法[(selecty-1)*4+selectx+1]==0
&& 阵法[(selecty)*4+selectx+1]==0)){//可右移
阵法[(selecty-1)*4+selectx+1]=阵法[(selecty-1)*4+selectx]
阵法[(selecty)*4+selectx+1]=阵法[(selecty)*4+selectx]
阵法[(selecty-1)*4+selectx]=0;
阵法[(selecty)*4+selectx]=0;
return true,阵法;
}
}
case 2,7,8 {//关赵横马横
if((selecty==y && selectx-1==x)){//可左移
阵法[(y-1)*4+x]=阵法[(selecty-1)*4+selectx];
阵法[(selecty-1)*4+selectx]=阵法[(selecty-1)*4+selectx+1];
阵法[(selecty-1)*4+selectx+1]=0;
return true,阵法;
}
if((selecty==y && selectx+2==x)){//可右移
阵法[(y-1)*4+x]=阵法[(selecty-1)*4+selectx+1];
阵法[(selecty-1)*4+selectx+1]=阵法[(selecty-1)*4+selectx];
阵法[(selecty-1)*4+selectx]=0;
return true,阵法;
}
if((selecty+1==y
&& 阵法[(selecty)*4+selectx]==0
&& 阵法[(selecty)*4+selectx+1]==0)){//可下移
阵法[(selecty)*4+selectx]=阵法[(selecty-1)*4+selectx]
阵法[(selecty)*4+selectx+1]=阵法[(selecty-1)*4+selectx+1]
阵法[(selecty-1)*4+selectx]=0;
阵法[(selecty-1)*4+selectx+1]=0;
return true,阵法;
}
if((selecty-1==y
&& 阵法[(selecty-2)*4+selectx]==0
&& 阵法[(selecty-2)*4+selectx+1]==0)){//可上移
阵法[(selecty-2)*4+selectx]=阵法[(selecty-1)*4+selectx]
阵法[(selecty-2)*4+selectx+1]=阵法[(selecty-1)*4+selectx+1]
阵法[(selecty-1)*4+selectx]=0;
阵法[(selecty-1)*4+selectx+1]=0;
return true,阵法;
}
}
else {//其它不移动
return false,阵法;
}
}
return false,阵法;
}
//判断是否成功:曹操到14就是成功了。
isOk=function(阵法){
return 阵法[14]==1;
}
//阵法到文本,将图形阵法的相同类型合并,减少搜索广度和深度
zftostring=function(阵法){
var re="";
for(i=1;#阵法;1){
select(阵法[i]) {
case 0 {
re=re++"0";
}
case 1 {
re=re++"1";
}
case 3,4,5,6 {
re=re++"3"
}
case 2,7,8 {
re=re++"2";
}
case 9{
re=re++"9"
}
}
}
return re;
}
//回索计算结果
getJgTab=function(tabJg,zfwb){
var jg={};
while(tabJg[zfwb]){
table.insert(jg,tabJg[zfwb].w);
zfwb=tabJg[zfwb].f;
}
return jg;
}
//电脑计算走法
autoJs=function(阵法){
import win;
var tabJg={};//保存链表为回找用
tabJg[zftostring(阵法)]={w=阵法;f=null};
var dqc={};
table.push(dqc,阵法);
var xyc={};
var cs=1;
while(cs<300){//最多搜索300步
for(k,v in dqc){//1
for(i=1;4;1){//2
for(j=1;5;1){//3
if(v[(j-1)*4+i]==0){//空格出现,判断上下左右能否移动到此位置
if(i>1){//左边能否移动到空格
var a1,a2,a3=getMouseInfo(i-1,j,v);
var ok,jg=moverw(i,j,a1,a2,a3,v);
if(ok){//可以移动
var jgwb=zftostring(jg);
if(tabJg[jgwb]){//如果已经走过的,剪枝
//win.msgbox("剪枝")
}else{//没有走过的加入到表里
//win.msgbox("生长")
table.push(xyc,table.clone(jg));
tabJg[zftostring(jg)]={w=table.clone(jg);f=zftostring(v)};
if(isOk(jg)){//8
return true,getJgTab(tabJg,jgwb);
}//8
}
}//6
}//5
if(i<4){//右边能否移动到空格
var a1,a2,a3=getMouseInfo(i+1,j,v);
var ok,jg=moverw(i,j,a1,a2,a3,v);
if(ok){//6
var jgwb=zftostring(jg);
if(tabJg[jgwb]){//7
//win.msgbox("剪枝")
}else{
//win.msgbox("生长")
table.push(xyc,table.clone(jg));
tabJg[zftostring(jg)]={w=table.clone(jg);f=zftostring(v)};
if(isOk(jg)){//8
return true,getJgTab(tabJg,jgwb);
}//8
}
}//6
}//5
if(j>1){//上面能否移动到空格
var a1,a2,a3=getMouseInfo(i,j-1,v);
var ok,jg=moverw(i,j,a1,a2,a3,v);
if(ok){//6
var jgwb=zftostring(jg);
if(tabJg[jgwb]){//7
//win.msgbox("剪枝")
}else{
//win.msgbox("生长")
table.push(xyc,table.clone(jg));
tabJg[zftostring(jg)]={w=table.clone(jg);f=zftostring(v)};
if(isOk(jg)){//8
return true,getJgTab(tabJg,jgwb);
}//8
}
}//6
}//5
if(j<5){//下面能否移动到空格
var a1,a2,a3=getMouseInfo(i,j+1,v);
var ok,jg=moverw(i,j,a1,a2,a3,v);
if(ok){//6
var jgwb=zftostring(jg);
if(tabJg[jgwb]){//7
//win.msgbox("剪枝")
}else{
//win.msgbox("生长")
table.push(xyc,table.clone(jg));
tabJg[zftostring(jg)]={w=table.clone(jg);f=zftostring(v)};
if(isOk(jg)){//8
return true,getJgTab(tabJg,jgwb);
}//8
}
}//6
}//5
}//4
}//3
}//3
}//1
cs++;
if(!xyc){//没路走了
return false,null;
}else{//将下层要搜索的进入当前层,清空下一层,为下一步搜索作准备
dqc=table.clone(xyc);
xyc={};
}
}
return false,null;
}
/**intellisense()
Hrd.getHW(.(人物)=取画选择线的高宽
Hrd.getMouseInfo(.(x坐标,y坐标,阵法)=鼠标点击转换成人物位置x,y,和人物编号
Hrd.drawHrd(.(阵法,graphics,selected,selectx,selecty,selectr)=刷新画板
Hrd.moverw=(.(x,y,selectx,selecty,selectr,阵法)=移动人物
Hrd.getZfs=(.(zfname)=取阵法列表
Hrd.isOk=(.(阵法)=判断阵法是否成功
Hrd.autoJs=(.(阵法)=电脑计算返回1是否有解,返回2为走法的table
end intellisense**/
再上主窗口源码:
import win.ui;
import win.ui.menu;
import table;
import win.cur;
import Hrd;
/*DSG{{*/
var winform = ..win.form(text="华容道";right=403;bottom=339;border="dialog frame";max=false;parent=...)
winform.add(
listbox={cls="listbox";left=14;top=33;right=137;bottom=316;bgcolor=16777215;edge=1;items={};z=2};
plus={cls="plus";left=145;top=10;right=386;bottom=311;border=1;notify=1;z=1};
static2={cls="static";text="阵法选择";left=16;top=9;right=127;bottom=31;font=LOGFONT( h=-20;weight=700 );notify=1;transparent=1;z=3}
)
/*}}*/
//创建弹出菜单
winform.popmenu = win.ui.popmenu(winform);
winform.popmenu.add('电脑计算',function(id){
var ok,tabs=Hrd.autoJs(阵法);
if(ok){
//开始演示
winform.plus.disabled=true;
selected=false;
for(k,v in tabs){
Hrd.drawHrd(v,graphics,selected,selectx,selecty,selectr);
win.delay(500);
}
winform.plus.disabled=false;
}else{
win.msgbox("电脑也解不出来");
}
} )
var menu = win.ui.menu(winform);//创建主菜单
menu.addTable({
{ "游戏";
{
{ "重新开始";
function(id){
init();
}
};
{ "退出程序";
function(id){
winform.close();
}
}
}
};
{"工具";
winform.popmenu
};
{"关于";function(){
win.msgboxTimeout('作者:江西九江MGX\r\n论谈ID[美女勿近]\r\nAAUTO第一个程序\r\n感谢【AAUTO】',"关于[华容道]",3000);
}
}
});
//初始化阵法列表
for(k,v in Hrd.tabZf){
winform.listbox.add(k);
}
//选择阵法
winform.listbox.oncommand = function(id,event){
if( event == 0x1/*_LBN_SELCHANGE*/ ){
if(winform.listbox.selText){
selected=false;
阵法=Hrd.getZfs(winform.listbox.selText);
Hrd.drawHrd(阵法,graphics,selected,selectx,selecty,selectr);
}
}
}
//移动时改变光标
winform.plus.onMouseMove = function(wParam,lParam){
x,y,r=Hrd.getMouseInfo(::LOWORD(lParam),::HIWORD(lParam),阵法);
if(r==0){
win.cur.setCur(win.cur.load(32649/*_IDC_HAND*/));
}else {
win.cur.endCur();
}
}
//被点击时处理移动
winform.plus.onMouseClick = function(wParam,lParam){
i=math.ceil(::LOWORD(lParam)/60)
j=math.ceil(::HIWORD(lParam)/60)
x,y,r=Hrd.getMouseInfo(i,j,阵法);
if(selected){
if(r==0){
selected=false;
var kyd;
kyd,阵法=Hrd.moverw(x,y,selectx,selecty,selectr,阵法);
}else {
selected=true;
selectx,selecty,selectr=x,y,r;
}
}else{
if(r==0){
selected=false;
}else {
selected=true;
selectx,selecty,selectr=x,y,r;
}
}
Hrd.drawHrd(阵法,graphics,selected,selectx,selecty,selectr);
if(Hrd.isOk(阵法)){
win.msgbox('打开金笼飞彩凤,\r\n斩断铁索走蛟龙!\r\n您成功让曹操逃出华容道')
}
}
winform.listbox.wndproc = function(hwnd,message,wParam,lParam){
select( message ) {
case 0x205/*_WM_RBUTTONUP*/{
var x,y = win.getMessagePos();
var item = winform.listbox.hitTest(x,y,true);
if( item ){
if(winform.listbox.selIndex == item){
winform.popmenu.popup(x,y,true);
}
}
}
}
}
//初始化
init= function(){
selected=false;//默认未选中
selectx,selecty,selectr=0,0,-1;
graphics =gdip.graphics(winform.plus);
阵法=Hrd.getZfs(winform.listbox.selText);
Hrd.drawHrd(阵法,graphics,selected,selectx,selecty,selectr);
}
winform.show()
init();
win.loopMessage();
return winform;
源码下载地址: http://download.csdn.net/download/jjgtmgx/8080201