[aardio] 用plus控件制作一个简单的拼图游戏

By mr_mao at 2024-12-04 • 0人收藏 • 255人看过

image.png


拼图俄罗斯方块、贪吃蛇等小游戏曾经很流行,但现在很少有人玩了,练练手而已~

import win.ui;
/*DSG{{*/
var winform = win.form(text="拼图小游戏";right=847;bottom=455)
winform.add(
plus={cls="plus";left=16;top=16;right=640;bottom=440;db=1;dl=1;dr=1;dt=1;edge=1;foreRepeat="expand";linearGradient=2;notify=1;z=1};
plus2={cls="plus";left=648;top=16;right=832;bottom=128;dr=1;dt=1;frame=1;notify=1;repeat="scale";z=4};
static={cls="static";left=648;top=184;right=840;bottom=224;align="center";center=1;color=8388736;db=1;dr=1;dt=1;font=LOGFONT(h=-24;weight=700);transparent=1;z=2};
static2={cls="static";text="计步器";left=648;top=160;right=832;bottom=192;align="center";center=1;color=8421504;dr=1;dt=1;transparent=1;z=3};
static3={cls="static";left=640;top=184;right=840;bottom=224;align="center";center=1;color=8388736;dr=1;dt=1;font=LOGFONT(h=-24;weight=700);transparent=1;z=5};
static4={cls="static";left=664;top=240;right=832;bottom=280;align="center";center=1;color=255;dr=1;dt=1;font=LOGFONT(h=-21;name='微软雅黑';weight=700);notify=1;transparent=1;z=6};
static5={cls="static";left=648;top=272;right=832;bottom=312;align="center";center=1;color=255;dr=1;dt=1;font=LOGFONT(h=-21;name='微软雅黑';weight=700);notify=1;transparent=1;z=7}
)
/*}}*/

x_cellNum, y_cellNum = 3,   3 //要切成的横向、竖向方块数量
gameEnd = false  //标记是否结束
isCheat = false  //标记是否作弊

import inet.http;
var path2bitmap = function(path){
    if(path){
        var bmp = gdip.bitmap(path)
        var w, h = bmp.width,   bmp.height;
        return bmp,w,h; 
    }
}

var shuffedBitmap2Arr = function(bmp,x_cellNum, y_cellNum,cellW, cellH){
    if(bmp==null) return ; 
    var cells = bmp.split(x_cellNum, y_cellNum) //返回图像数组
    table.pop(cells,1)   //弹出最后面的小图片,为了下一步替换为空白小方块
    var s_imgs = table.map(cells,function(v,k,result){
        result[k] = {id = k; value = v} //**改为二维数组,加个id字段用来判断是否复位
    })
    table.shuffle(s_imgs);  //打乱顺序
    
    blankImg = gdip.bitmap(cellW, cellH);   //生成一个空白图片
    blankCellIndex = x_cellNum * y_cellNum; 
    table.push(s_imgs, {id = blankCellIndex; value = blankImg}); 
    return s_imgs; 
}

var arr2bitmap =function(bmp,arr,imgW, imgH,x_cellNum, y_cellNum,cellW, cellH){
    if(bmp==null) return ; 
    if(#arr){
        var g = bmp.getGraphics().clear()
        for (y = 1; y_cellNum; 1) {
            for (x = 1; x_cellNum; 1) {
                var index = (y - 1) * x_cellNum + x;
                g.fastDrawBitmap(img_cells[index].value, (x - 1) * cellW: 1, (y - 1) * cellH: 1);
            }
        }
    }
}

var loadandshowImage = function(imgPath){
    if(!imgPath) return; 
    winform.plus2.background = imgPath //预览图

    bmp, imgW, imgH = path2bitmap(imgPath);
    cellW, cellH = math.ceil(bmp.width / x_cellNum),    math.ceil(bmp.height / y_cellNum);
    img_cells =  shuffedBitmap2Arr(bmp,x_cellNum, y_cellNum,cellW, cellH)
    
    var bmp2 = gdip.bitmap(imgW, imgH)
    arr2bitmap(bmp2,img_cells,imgW, imgH,x_cellNum, y_cellNum,cellW, cellH); 
    winform.plus.foreground =bmp2//显示
}

var cellRECTs = {}
winform.plus.adjust = function(cx, cy, wParam) {
    table.clear(cellRECTs)
    var cellW2 = cx / x_cellNum;
    var cellH2 = cy / y_cellNum;
    for (y = 1; y_cellNum; 1) {
        for (x = 1; x_cellNum; 1) {
            var l = (x - 1) * cellW2: 1;
            var t = (y - 1) * cellH2: 1;
            var w = l + cellW2;
            var h = t + cellH2;
            table.push(cellRECTs, ::RECT(l, t, w, h));
        }
    }
};

//在plus控件中点击鼠标左键
winform.plus.onMouseDown = function(wParam, lParam) {
    if(gameEnd) return; 
    var x, y = win.getMessagePos(lParam);
    for (i = 1; #cellRECTs; 1) {
        //确定鼠标所在的方块
        if (cellRECTs[i].contains(x, y) == true) {
            //如果上下左右有一个方位是空白方块
            if ( ((i + 1) == blankCellIndex && i % x_cellNum != 0/*确保i+1方块不折行*/)
                    || ((i - 1) == blankCellIndex && (i - 1) % x_cellNum != 0/*确保i-1方块不折行*/)
                    || (i - x_cellNum) == blankCellIndex
                    || (i + x_cellNum) == blankCellIndex) {

                //交换方块图片
                img_cells[blankCellIndex].value = img_cells[i].value;
                img_cells[blankCellIndex].id = img_cells[i].id;
                img_cells[i].value = blankImg;
                img_cells[i].id = blankCellIndex;
                blankCellIndex = i; //重新标识空白图像的index

                //重新绘图,并显示在plus中
                arr2bitmap(owner.foreground,img_cells,imgW, imgH,x_cellNum, y_cellNum,cellW, cellH); 
                owner.redraw();

                //增加计数
                var totalStep = tonumber(winform.static.text): 0;
                totalStep++;
                winform.static.text = tostring(totalStep);
                
                //检查是否拼接成功
                var correctNum = 1
                for(i=1;#img_cells;1){
                    if(img_cells[i].id == i) correctNum++
                }
                if(correctNum == #img_cells) {
                    gameEnd = true
                    win.msgbox("拼图成功,你赢了~","提示",,winform.hwnd,5000)
                    winform.plus.foreground = winform.plus2.background
                    //更新输赢提示
                    winform.static4.text = "恭喜~ 你赢了!"
                    if(isCheat==false){
                    	select(totalStep) {
                    		case   0;100 { winform.static5.text = "★★★★★"}
                    		case 101;200 { winform.static5.text = "★★★★"}
                    		case 201;300 { winform.static5.text = "★★★"}
                    		case 301;400 { winform.static5.text = "★★"}
                    		else { winform.static5.text = "★"}
                    	}
                    }
                }
            }
        }
    }
}

//-------------------------------------
//作弊(彩蛋) -- ctrl+鼠标右键
winform.plus.wndproc = function(hwnd,message,wParam,lParam){
    if(gameEnd) return; //已经拼正确了
    select( message ) { 
        case 0x205/*_WM_RBUTTONUP*/{
            if(ctrlDown==false) return; 
            //鼠标右键弹起,下面获取坐标
            var x,y = win.getMessagePos(lParam);
            for (i = 1; #cellRECTs; 1) {
                //确定鼠标所在的方块
                if (cellRECTs[i].contains(x, y) == true) {
                    //如果点击的不是空白图像,开始作弊
                    if(i !=blankCellIndex ){
                        isCheat = true;
                        //交换方块图片
                        img_cells[blankCellIndex].value = img_cells[i].value;
                        img_cells[blankCellIndex].id = img_cells[i].id;
                        img_cells[i].value = blankImg; img_cells[i].id = blankCellIndex;
                        blankCellIndex = i; //重新标识空白图像的index
        
                        //重新绘图,并显示在plus中
                        arr2bitmap(owner.foreground,img_cells,imgW, imgH,x_cellNum, y_cellNum,cellW, cellH); 
                        owner.redraw();

                        //检查是否拼接成功
                        var correctNum = 1
                        for(i=1;#img_cells;1){
                            if(img_cells[i].id == i) correctNum++
                        }
                        if(correctNum == #img_cells) {
                            gameEnd = true
                            win.msgbox("拼图成功,你赢了~","提示",,winform.hwnd,5000)
                            winform.plus.foreground = winform.plus2.background
                            winform.static4.text = "恭喜~ 你赢了!"
                        }
                    }
                }
            }   
        }
    }
}

//利用winform自带事件-捕获全局键盘按键
winform.isDialogMessage = function(hwnd,msg){
    if( msg.message == 0x100/*_WM_KEYDOWN*/){
        if( msg.wParam == 0x11/*_VK_CONTROL*/){ 
            ctrlDown = true
            return true;
        }
    }    
    ctrlDown = false
    return win.isDialogMessage(hwnd,msg);
}
//-------------------------------------

//启动程序时,默认加载一张网络图片
var url = "http://www.v3wall.com/wallpaper/1920_1200/1004/1920_1200_20100408125616386089.jpg";
loadandshowImage(url)

//点击预览图,打开一张新的图片
import fsys.dlg;
winform.plus2.oncommand = function(id,event){
    var imgPath = fsys.dlg.open("图片格式文件|*.jpg;*.bmp;*.png;*.gif")
    if(imgPath){
        loadandshowImage(imgPath)
        winform.static.text = "" //清空计步器
        gameEnd = false;  isCheat = false
        winform.static4.text = "" //隐藏胜利提示
		winform.static5.text = ""
    }
}

//初始化一些控件的状态
winform.plus.backgroundColor = 0xffff8bbb8; //plus控件设置背景色
winform.static4.text = ""; winform.static5.text = ""

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


3 个回复 | 最后更新于 24 天前
2024-12-04   #1

2025-01-03   #2

这个不能保证能拼成吧

24 天前   #3

都放假了了吧

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...