aauto华容道开发

以前摆摊时卖过智力玩具,华容道是其中之一,觉得非常有意思,后来自觉易语言,就用易语言实现了电脑算法。现在学习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


猜你喜欢

转载自blog.csdn.net/jjgtmgx/article/details/40451803