aardio 写的 扫雷 小游戏

import win.ui;

/*DSG{{*/

mainForm = win.form(text="扫雷";right=494;bottom=556;bgcolor=12632256;border="dialog frame";max=false)

mainForm.add(

button={cls="button";text="开始";left=320;top=13;right=375;bottom=36;z=8};

button3={cls="button";text="随机";left=396;top=10;right=463;bottom=39;z=7};

crs={cls="edit";text="行数";left=102;top=11;right=156;bottom=35;edge=1;num=1;z=4};

ls={cls="edit";text="雷数";left=241;top=13;right=295;bottom=37;edge=1;num=1;z=6};

map={cls="plus";left=5;top=43;right=489;bottom=527;bgcolor=15780518;clipBk=false;edge=1;notify=1;z=1};

static={cls="static";text="行/列:";left=51;top=14;right=103;bottom=39;transparent=1;z=3};

static3={cls="static";text="最大雷数:";left=171;top=14;right=236;bottom=35;transparent=1;z=5};

sts={cls="static";text="Static";left=3;top=527;right=491;bottom=553;border=1;db=1;dl=1;dr=1;edge=1;transparent=1;z=2}

)

/*}}*/

import win.timer;

import math;

mtimer=win.timer(mainForm);

math.randomize();

var dflag=false;//画图标志位

var mflag=true;//随机标志位

var map={};//初始图表

var slm={};//已选中图表id

var crs=24;//行列数

var lei=math.floor(crs*crs/6);//雷数  .floor下取整,.ceil 上取整

var tlei={};//雷 位id

var ylei={};//已排出 雷 位id

var tspace={};//空 位id

var step=20;//步长

mainForm.crs.text=crs;

mainForm.ls.text=lei;

var argb={//0xAARRGGBB

red=0xFFFF0000;

green=0xFF00FF00;

blue=0xFF0000FF;

yellow=0xFFFFFF00;

black=0xFF000000;

white=0xFFFFFFFF;

};//定义几个常用 色

showlei=function(mp,flag=true){//显示雷的位置

if(flag)

{

for(i=1;#tlei;1){

selmap(mp,tlei[i],argb.black);

}

} else {

for(i=1;#tlei;1){

unselmap(mp,tlei[i]);

}

}

}//显示 所有雷

toxyline=function(mp,x,y,dx,dy,cl=0xFFFFFFFF){

import gdip;

var gph = gdip.graphics(mp) 

var penrect = gdip.pen( cl, 1, 2/*_GdipUnitPixel*/ );//笔

gph.smoothingMode = 4/*_GdipSmoothingModeAntiAlias*/ ; //加上抗锯齿功能

gph.drawBezier(x,y,math.random(x,dx),math.random(y,dy),dx,dy);

}//没用得上

tadd=function(t,id,f=false){//f 默认过滤重复值

if(type(t)=="table"){

if(f){table.push(t,id);}

else{if(!table.find(t,id)){table.push(t,id);}}

}

}//

deltoo=function(tb,z=true){//删除table重复值,默认只保留非0值

var rtn={};

if(type(tb)=="table"){

for(i=1;#tb;1){

if(!table.find(rtn,tb[i])){

if(z){if(tb[i]!=0) table.push(rtn,tb[i]);}

else{table.push(rtn,tb[i]);}

}

}

}

return(rtn);

}

testlei=function(cid){//测试当前是否为雷

/*

4 9 2

3 5 7

8 1 6

*/

var rtn=0;

if(table.find(tlei,cid)){rtn=9;};//当前是雷

return(rtn);

}

testcr=function(cid){//测试四周 雷 ID,并存入table返回

var leiRangle={};

var leiBit={cid-crs-1,cid-crs,cid-crs+1,//上面

cid-1,cid+1,//中间

cid+crs-1,cid+crs,cid+crs+1//下面

};

if(cid<=crs){//第一行

leiBit[1]=0;

leiBit[2]=0;

leiBit[3]=0;

}

if(cid>(crs*(crs-1))){//最后一行

leiBit[6]=0;

leiBit[7]=0;

leiBit[8]=0;

}

if(cid%crs==1){//第一列

leiBit[1]=0;

leiBit[4]=0;

leiBit[6]=0;

}

if(cid%crs==0){//最后一列

leiBit[3]=0;

leiBit[5]=0;

leiBit[8]=0;

}

for(i=1;#leiBit;1){

if(testlei(leiBit[i])){tadd(leiRangle,leiBit[i]);}

}

return(leiRangle);

}

testspace=function(mp,cid){//测试四周 非雷 ID,并存入table返回,

var leiRangle={};

var leiBit={cid-crs-1,cid-crs,cid-crs+1,//上面

cid-1,cid+1,//中间

cid+crs-1,cid+crs,cid+crs+1//下面

};

if(cid<=crs){//第一行

leiBit[1]=0;

leiBit[2]=0;

leiBit[3]=0;

}

if(cid>(crs*(crs-1))){//最后一行

leiBit[6]=0;

leiBit[7]=0;

leiBit[8]=0;

}

if(cid%crs==1){//第一列

leiBit[1]=0;

leiBit[4]=0;

leiBit[6]=0;

}

if(cid%crs==0){//最后一列

leiBit[3]=0;

leiBit[5]=0;

leiBit[8]=0;

}

selmap(mp,cid,argb.white);

var tl=testcr(cid);

if(#tl){drawtext(mp,map[cid],#tl,12,argb.blue);}

for(i=1;#leiBit;1){

tl=testcr(leiBit[i]);

//import console;

if(leiBit[i]!=0){//没有超出地图范围

if(#tl>0 and #tl<9){//周围没有雷,或不全是雷

if(!testlei(leiBit[i]) and !table.find(ylei,leiBit[i])){//显示周围雷数

//console.log(leiBit[i]);

selmap(mp,leiBit[i],argb.white);

tadd(leiRangle,leiBit[i]);

drawtext(mp,map[leiBit[i]],#tl,12,argb.blue);

}

} else {

if(!testlei(leiBit[i]) and !table.find(slm,leiBit[i]) and !table.find(ylei,leiBit[i])){//未知区域且不是雷

selmap(mp,leiBit[i],argb.white);

tadd(leiRangle,testspace(mp,leiBit[i]));

}

}

}

}

return(leiRangle);

}

doudong=function(wf){//窗口抖动

var ox=wf.left;

var oy=wf.top;

var oh=wf.height;

var ow=wf.width;

for(i=1;2;1){

for(j=1;4;1){

wf.left=ox-j;

wf.top=oy-i;

wf.height=oh+i;

wf.width=ow+j;

sleep(100);

}

wf.left=ox;

wf.top=oy;

wf.height=oh;

wf.width=ow;

}

redraw(wf.map,,argb.black);

}//被雷炸得乱动

initmap=function(mp,ca=3){//ca<=10,大于10无变化

var xx;

crs=tonumber(mainForm.crs.text);

lei=tonumber(mainForm.ls.text);

map={};

slm={};

var mid=1;

tlei={};

ylei={};

tspace={};

mp.width=mp.height;

step=math.floor(mp.width-5)/(crs);

//fm.width=crs*step+4;

//fm.height=crs*step+4;

for(i=1;crs*step-step+1;step){// row*step-step+1

for(j=1;crs*step-step+1;step){// col*step-step+1

tadd(map,{j+ca,i+ca,j+step-ca,i+step-ca,"hz"++mid,mid,0});//x,y,w,h,name,id,flag=0

mid++;

}

}

for(i=1;lei;1){//初始化 雷 位

xx=math.random(1,mid-1);

tadd(tlei,xx);//雷位不能大于最大格子数

}

mainForm.sts.text="最大雷数:"++ lei++"  已布置雷数:"++ #tlei++ "";

} //初始化地图

drawup=function(mp,md,cl=0xFF0000FF){//左 上 影

drawrect(mp,{md[1]-2,md[2]-2,md[3],md[4]},cl);

}

drawdown=function(mp,md,cl=0xFF000000){// 右 下 影

drawrect(mp,{md[1],md[2],md[3]+2,md[4]+2},cl);

}

redraw=function(fm,argb1=0xFAFF0000,argb2=0xFA0000FF){

for(i=1;#map;1){//drawup drawdown,着色不同显示的立体效果不一样

if(map[i][7]!=0) {

drawup(fm,map[i],argb.black);

drawdown(fm,map[i],argb.yellow);

drawrect(fm,map[i],argb2);

}

else {

drawup(fm,map[i],argb.black);

drawdown(fm,map[i],argb.yellow);

drawrect(fm,map[i],argb1);

}

}

}//重画地图

drawrect=function(mp,xx,rgbs=0xFAFF0000,flag=true){//画矩形,xx为数组={x,y,w,h} ,mp为窗体或控件,fl:true空心或false实心

    import gdip;

var graphics = gdip.graphics(mp) 

var penrect = gdip.pen( rgbs, 1, 2/*_GdipUnitPixel*/ );//笔

    graphics.drawRectangle( penrect, xx[1],xx[2],xx[3]-xx[1],xx[4]-xx[2]);

    if(flag){

    var brush = gdip.solidBrush(rgbs);

    graphics.fillRectangle( brush, xx[1]+1,xx[2]+1,xx[3]-xx[1]-1,xx[4]-xx[2]-1);

    brush.delete();

    }

penrect.delete();

}  //画矩形

drawtext=function(mp,xx,tt,ss,rgbs=0xFF000000,align=1,valign=1){//xx文字区域{x,y,dx,dy},tt文字,ss大小

import gdip;

    var graphics = gdip.graphics(mp)//图形对象graphics(可以看作是画板)

graphics.smoothingMode = 4/*_GdipSmoothingModeAntiAlias*/ ; //加上抗锯齿功能

var pentxt = gdip.pen( rgbs, 1,2/*_GdipUnitPixel*/ );//创建画笔,画笔pen只能画一个轮廓(画线描边)

var brushtxt = gdip.solidBrush(rgbs);//创建刷子,画刷可以对一个东西进行填充(刷子)

family = gdip.family( "Verdana"  ); ////创建FontFamily字体

strformat = gdip.stringformat ( );//创建stringFormat

strformat.align =align;//1/*_StringAlignmentCenter*/; //设置样式 水平居中

strformat.lineAlign =valign;// 1/*_StringAlignmentCenter*/ ; //设置样式 垂直居中

rclayout = ..gdip.RECTF(xx[1],xx[2],xx[3]-xx[1]-1,xx[4]-xx[2]-1);//设置文字区域

path = gdip.path(); //创建一个文字路径

path.startFigure();

path.addstring( tt, family, 1/*_GdipFontStyleBold*/, ss, rclayout, strformat);

graphics.fillPath( brushtxt, path)//fillPath填充路径

//graphics.drawPath( pen, path)//drawPath描边

//删除所有GDI+对象 

brushtxt.delete();

pentxt.delete() ;

strformat.delete();

family.delete();

path.delete(); 

} //写字

testxy=function(mx,my){

var id=0;

for(i=1;table.count(map);1){

  if(mx>=map[i][1]&&mx<=map[i][3]&&my>=map[i][2]&&my<=map[i][4]){

  id=tonumber(map[i][6]);

  }

}

return(id);

} //测试 ID

selmap=function(mp,d,rrgbs=0xFA0000FF,trgbs=0x0022ff22){//选中

drawrect(mp,map[d],rrgbs);

tadd(slm,d);

map[d][7]=1;

}//点选

unselmap=function(mp,d,oargb=0xFAFF0000){

drawrect(mp,map[d],oargb);

map[d][7]=0;

}//取消选择

getid=function(nm){

  var id=0;

  for(i=1;#map;1){

  if(nm==map[i][5]){id=map[i][6];}

  }

    return (id);

} //根据名称反查ID

hoho=function(mp){

if(#ylei==#tlei and #ylei+#slm==#map){

dflag=false;

drawrect(mp,{50,90,430,170},argb.blue);

drawtext(mp,{60,110,430,150},"You Are NO.1!",45,argb.yellow);

}

}

gameover=function(fm,mp,mid){

selmap(mp,mid,argb.black);

showlei(mp);

doudong(fm);

drawrect(mp,{70,80,430,170},argb.blue);

drawtext(mp,{70,110,430,130},"Game Over!!",45,argb.yellow);

dflag=false;

}

initline=function(graphics,ps=2,pm=2){

//import gdip;

    var gh=graphics;//gdip.graphics(mp);

var pen=gdip.pen( 0xFF009900,ps/* 2*/, pm /* 2=_GdipUnitPixel*/ );

var icrs=crs*step+1;

for(i=1;icrs;step){

gh.drawLine(pen,i,1,i,icrs);

gh.drawLine(pen,1,i,icrs,i);

}

pen.delete();

}//画背景线

mainForm.onActivate = function(state,hwndOther,minimized){

if(state && dflag){//防止画布变成空白

redraw(mainForm.map);

}

}//窗口恢复显示

mainForm.map.onMouseDown = function(wParam,lParam){

var x,y = win.getMessagePos(lParam);

if( wParam & 0x1/*_MK_LBUTTON*/ ){

var mid =testxy(x,y) ;

if(mid!=0 && dflag){

if(testlei(mid)){//踩雷了,游戏结束。

gameover(mainForm,mainForm.map,mid);

}

else{

if(!table.find(slm,mid) and !table.find(ylei,mid)){//如果不是已经翻开的

var xspace=testspace(mainForm.map,mid);

hoho(owner);

}

}

}

}

}//鼠标左键点击

mainForm.map.onMouseMove = function(wParam,lParam){

mainForm.sts.text="已发现雷数:"++#ylei++"  已发现非雷数:"++#slm++"  共有雷数:"++#tlei++"  总格子数:"++#map++"";

}//鼠标移动

mainForm.button3.oncommand = function(id,event){

if(mflag){

mtimer.setInterval(100);

mtimer.enable();

mflag=false;

owner.text="停止";

} else {

//mtimer.setInterval(0);

mtimer.disable();

mflag=true;

owner.text="随机";

}

}//开启随机屏保

mtimer.onTimer = function(){

var sl=math.random(1,#map);

var argbx=tonumber(string.format("0x%2X%2X%2X%2X",math.random(0,255),math.random(0,255),math.random(0,255),math.random(1,255)));

mainForm.sts.text=argbx;

selmap(mainForm.map,sl,argbx);

var usl=math.random(1,#slm);

unselmap(mainForm.map,slm[usl]);

}  //屏保。。

mainForm.map.onDrawContent = function(graphics,rc,txtColor,rcContent,foreColor){

if(dflag){

initline(graphics);

}

}//前景刷新

mainForm.button.oncommand = function(id,event){

var cr=tonumber(mainForm.crs.text);

var l=tonumber(mainForm.ls.text);

if(cr>24||cr<3) {

mainForm.crs.setFocus(0,-1);

return ;

}

if(l>math.floor(cr*cr/6)){ mainForm.ls.setFocus(0,-1);return ; }

dflag=true;//允许画画

initmap(mainForm.map);//初始化图块

mainForm.map.redraw();//画线

redraw(mainForm.map);//画块

}

/*

mainForm.map.onMouseDoubleClick = function(wParam,lParam){

//var x,y = win.getMessagePos(lParam);

if(dflag){

showlei(mainForm.map);

}

}//显示所有雷

*/

mainForm.map.wndproc = function(hwnd,message,wParam,lParam){

var x,y = win.getMessagePos(lParam);

if(wParam & 0x2/*_MK_RBUTTON*/){

var mid=testxy(x,y);

if(mid!=0 and dflag){

//mainForm.sts.text=wParam;

var yx=table.find(ylei,mid);

if(yx){

table.removeByValue(ylei,mid);

drawrect(owner,map[mid],argb.red);

} else {

drawtext(owner,map[mid],'@',11,argb.black);

tadd(ylei,mid);

hoho(owner);

}

}

}

//无返回值则继续调用默认回调函数

}//标记 雷位

mainForm.crs.onChange = function(){

if(owner.onModified)owner.onModified(true);

crs=tonumber(owner.text);

mainForm.ls.text=math.floor(crs*crs/6);

}//地图 行 列

initmap(mainForm.map);

mainForm.show();

dflag=true;//窗体完全载入并显示后,设置为true,然后重画窗体内容

mainForm.map.redraw();

redraw(mainForm.map);

return win.loopMessage();

 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容