分享拼图游戏源码

By admin at 2020-01-11 • 0人收藏 • 363人看过

感谢 aardio培训群: 巴克队长 分享源代码

image.png

import fonts.fontAwesome
import fsys
import math
import win.ui;
/*DSG{{*/
var winform = win.form(text="快乐拼图";right=1182;bottom=808)
winform.add(
bk={cls="plus";left=6;top=203;right=606;bottom=803;bgcolor=15780518;dl=1;dt=1;z=1};
btFromLocal={cls="plus";text="从图库加载";left=957;top=5;right=1064;bottom=32;bgcolor=12639424;dl=1;dt=1;iconStyle={align="left";font=LOGFONT(name='FontAwesome');padding={left=5}};iconText='\uF26C';notify=1;z=6};
btFromWeb={cls="plus";text="从网络获取";left=1070;top=5;right=1177;bottom=32;bgcolor=12639424;dl=1;dt=1;iconStyle={align="left";font=LOGFONT(name='FontAwesome');padding={left=5}};iconText='\uF26B';notify=1;z=7};
btLastOne={cls="plus";left=6;top=2;right=206;bottom=202;bgcolor=12639424;border={color=-4144960;width=1};dl=1;dt=1;notify=1;z=2};
btStart={cls="plus";text="开始拼图";left=379;top=146;right=606;bottom=202;bgcolor=12639424;dl=1;dt=1;iconStyle={align="left";font=LOGFONT(name='FontAwesome')};notify=1;z=3};
cbbLevel={cls="combobox";left=266;top=177;right=373;bottom=200;dl=1;dt=1;edge=1;items={"简单";"一般";"困难"};mode="dropdownlist";z=10};
etHistory={cls="plus";left=214;top=2;right=606;bottom=144;align="left";bgcolor=10789024;border={color=-6250332;width=1};dl=1;dt=1;editable=1;forecolor=15793151;iconColor=65535;iconStyle={align="left";font=LOGFONT(h=-16;name='FontAwesome')};iconText='\uF091战绩';multiline=1;paddingLeft=50;valign="top";z=11};
etPath={cls="plus";text="D:\Users\Desktop\照片";left=627;top=5;right=949;bottom=30;align="left";bgcolor=10789024;dl=1;dt=1;editable=1;forecolor=15793151;iconColor=65535;iconStyle={align="left";font=LOGFONT(h=-16;name='FontAwesome');padding={left=2}};iconText='\uF07B 路径';paddingBottom=1;paddingLeft=60;paddingRight=1;paddingTop=1;textPadding={left=2;top=3};z=5};
etSteps={cls="plus";text="0";left=214;top=146;right=375;bottom=173;bgcolor=10789024;border={color=-6250332;width=1};dl=1;dt=1;forecolor=15793151;iconColor=65535;iconStyle={align="left";font=LOGFONT(h=-16;name='FontAwesome');padding={left=2}};iconText='\uF29D步数';paddingLeft=50;z=8};
static1={cls="plus";left=214;top=175;right=375;bottom=202;bgcolor=10789024;border={color=-6250332;width=1};dl=1;dt=1;forecolor=15793151;iconColor=65535;iconStyle={align="left";font=LOGFONT(h=-16;name='FontAwesome')};iconText='\uF11B难度';paddingLeft=50;z=9};
stlc={cls="static";text="local";left=626;top=40;right=1172;bottom=803;dl=1;dt=1;notify=1;transparent=1;z=4}
)
/*}}*/

math.randomize()
winform.cbbLevel.selIndex=1;

import web.form
var wb = web.form(winform.stlc)

//只要是web窗体external内的成员,都可以从网页上调用
wb.external = { 
    showImg = function (path){
        path = string.replace(path,"^<@file:///@>","")
        winform.bk.background=path
        winform.msgbox("图像以更新,要立即开始新游戏,请点击开始")
    }
}

var _html =/*
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <style type="text/css">
    html,body{ height:100%; margin:0; } 
    img {width:200px;height:200px;margin=125px;}
    </style> 
    
</head>
<body> 
*/

//从本地加载
winform.btFromLocal.oncommand = function(id,event){
    var path = io.exist(winform.etPath.text)
    if(!path or !fsys.isDir(path)){ //不存在路径或者不是目录,则返回
    	winform.msgboxErr("设定的目录不存在,或者不是目录","路径错误")
    	return ; 
    }
    var html = _html
	fsys.enum( path, {"*.png";"*.jpg";"*.bmp";"*.jpeg"},
		function(dir,filename,fullpath,findData){ 
			if(filename)	html = string.concat(html,`<img border="2" src="`,fullpath,`" onclick='external.showImg(this.src)' >`)
		} 
		,false/*如果此参数为false则忽略子目录*/
	);
	wb.html = string.concat(html,`</body></html>`)	
}

//从网络加载图片
import web.rest.client
var client = web.rest.client()
var getBingPic=client.api("https://bing.ioliu.cn/?p={page}","GET",lambda(r) string.map(r,`\<img.+?src=\"(\S+?)\"\>`) )
winform.btFromWeb.oncommand = function(id,event){
	var page = math.random(1,100)
	var list = getBingPic[page]()
    var html = _html
	for(i=1;#list;1) html = string.concat(html,`<img border="2" src="`,list[i],`" onclick='external.showImg(this.src)' >`)
	wb.html = string.concat(html,`</body></html>`)	
}

//难度等级对应的plus尺寸
var size //3,4,5
var level ={
	简单=3; //3*3=9块,
	一般=4; //4*4
	困难=5; //5*5
}
//计算相邻块的位置,返回{左右上下}
var getNearPos=function(){
	var left = winform.pic1.unFixId -1
	var right = winform.pic1.unFixId +1
	var top = winform.pic1.unFixId-size
	var bottom = winform.pic1.unFixId+size
	var max = size*size
	return table.map({left;right;top;bottom},function(v,k,result){ //仅保留有效的位置
				if(v>0 and v<= max) table.push(result,v) 
			}) ; 
}

//与空白块pic1交换位置
var swap=function(picClicked){
	var nearPos = getNearPos()
	var picCount = size*size
	var countStep=true
	if(!picClicked){//打乱顺序时是没有这个参数的,故此要从相邻位置中随机一个随机选取一个
		var ind = math.random(1,picCount)
		picClicked = winform["pic"++ ind]
 		countStep = false
	}
	if(countStep) winform.etSteps.text += 1 //修改步数,打乱时不记录
	if( table.find(nearPos, picClicked.unFixId ) ){
		//交换编号
		var temid = picClicked.unFixId 
		picClicked.unFixId=winform.pic1.unFixId
		winform.pic1.unFixId = temid
		
		var rc1=winform.pic1.getRect()
		var rc2=picClicked.getRect()
		winform.pic1.setRect(rc2)
		picClicked.setRect(rc1)				
	}
}

//打乱顺序
var randomSwitch=function(picList){
	//先把左上角第一个块设置为空块
	winform.btLastOne.background = picList[1]
	winform.pic1.background = null
	
    var picCount = size*size
	for(i=1;picCount*10;1) swap()		//依次重复打乱10次	
	winform.msgbox("顺序已打乱,可以开始了")
}

//按难度生成plus控件,并随机分配小图片
var creatPlus=function(picList){
    var rect = winform.bk.getRect(true) //获取背景图片的位置
    var w,h=rect.width()/size,rect.height()/size
    winform.bk.show(false) //隐藏背景
    winform.btLastOne.setRect({left=6;right=6+w;top=203-h;bottom=203})//调整保留块的大小
    
    //调整下 winform.btLastOne的尺寸
    var t={} //临时序号
    for(row=1;size;1){//总的图片数量
        for(col=1;size;1){
            var index = (row-1)*size + col
        	var frdName = "pic"++index
			winform.add([frdName]={fixId=index;cls="plus";left=1;top=1;right=2;bottom=2;border={color=-4144960;width=2};db=0.85;dr=0.9;dt=0.03;notify=1;z=2};)
			var rc = table.clone(rect)
			rc.left += (col-1) * w
			rc.right = rc.left + w
			rc.top += (row-1) * h
			rc.bottom = rc.top + h
			winform[frdName].setRect(rc,true)
			winform[frdName].unFixId = index
			winform[frdName].background = picList[index] 
			winform[frdName].oncommand = function(id,event){
				swap(owner) //点击时交换
			}
        }
    }
}

//复位
var reset=function(){
	winform.etSteps.text=0
	//删除所有已经存在的控件
	for(name,ctrl in winform.eachControl("plus") ) if(string.startWith(name,"pic")) winform[name].close()
	winform.bk.show(true)
	winform.btLastOne.background=null
}

//开始运行
winform.btStart.oncommand = function(id,event){
    var bitmap = winform.bk.getBackground() //返回背景图像,返回值为gdip.bitmap对象,背景色返回null
    if(!bitmap){
    	winform.msgboxErr("尚未设定图片")
    	return ; 
    }
	reset()
	
	size=level[[winform.cbbLevel.text]] : 4 //默认普通难度
    var pics = bitmap.split(size,size)
	
	//获取图片并分割
	creatPlus(pics) 	//按难度生成plus控件,并随机分配小图片
	randomSwitch(pics) //打乱顺序
}

//最后一块,检测是否拼图成功
winform.btLastOne.oncommand = function(id,event){
	if(winform.pic1.unFixId==1){ //第一块为空白时才动作,否则不动		
		//检查是否已经完成
		var isok=true
		for(name,ctrl in winform.eachControl("plus") ){
			if(string.startWith(name,"pic")){
				isok = isok and (winform[name].fixId ==winform[name].unFixId) //所有的序号都对上了就证明完成了
				if(!isok) return ;//不对的话,不再继续判断 
			}
		}
		//成功,则空白块与当前块获取当前块的图片
		winform.pic1.setBackground(owner.getBackground().saveToBuffer())
		winform.etHistory.editBox.print(tostring(time(,"%Y-%m-%d %H:%M:%S")),winform.cbbLevel.text,winform.etSteps.text)
		reset()
		winform.msgbox("恭喜成功")
	}		
}

winform.show();
win.loopMessage();


登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前正在学aardio+halcon机器视觉.
Sciter中文在线文档Sciter在线学习文档
本 站 主 站:Stm32cube中文网
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
aardio在线手册Aardio在线手册
C大Aardio论坛:Aar爱好者论坛
简码教程网:简码编程
AARDIO语言QQ群:70517368
赞助商:才仁机械
下载站:非凡软件站
Loading...