import win.ui;
/*DSG{{*/
mainForm = win.form(text="貪吃蛇";right=561;bottom=588;bgcolor=32960;border="dialog frame")
mainForm.add(
map={cls="plus";left=13;top=13;right=549;bottom=549;bgcolor=33023;clipBk=false;edge=1;notify=1;z=1};
qzmap={cls="plus";left=22;top=15;right=558;bottom=551;clipBk=false;edge=1;notify=1;transparent=1;z=2};
start={cls="button";text="開 始";left=64;top=552;right=146;bottom=579;border=1;db=1;dl=1;z=3};
sts={cls="static";text="狀態(tài)欄";left=180;top=556;right=506;bottom=577;align="center";border=1;db=1;dl=1;dr=1;font=LOGFONT(weight=700);transparent=1;z=4}
)
/*}}*/
import math;//數(shù)學(xué)運算庫
import win.ui.accelerator;//窗體快捷鍵庫
//import win.timer;//定時器庫
math.randomize();//隨機種子
var dflag=false;//畫圖標志位
var map={};//地圖表id
var slm={};//墻圖表id
var wayline={};//蛇身id
var food={id=30,n=3};//食物{id,n};
var crs=26;//線 列數(shù)
var rs=26;//線 行數(shù)
var step=20;//地圖步長
var curid=1;//頭 id
var ss=1;//向右走
setwh=function(){//設(shè)置畫圖區(qū)域
mainForm.map.top=10;
mainForm.map.left=10;
mainForm.map.width=mainForm.width-35;
mainForm.map.height=mainForm.height-90;
mainForm.qzmap.top=mainForm.map.top;
mainForm.qzmap.left=mainForm.map.left;
mainForm.qzmap.width=mainForm.map.width;
mainForm.qzmap.height=mainForm.map.height;
}
var argb={//0xAARRGGBB
red=0xFFFF0000;
green=0xFF00FF00;
blue=0xFF0000FF;
yellow=0xFFFFFF00;
orange=0xFF800000;
black=0xFF000000;
white=0xFFFFFFFF;
targb=0x00000000;//透明色
};//定義幾個常用 色
buildfood=function(){//隨機食物
var cid=math.random(1,crs*rs);
while(table.find(slm,cid) or table.find(wayline,cid)){
cid=math.random(1,crs*rs);
}
food.id=cid;
food.n=math.random(2,5);
}
showfood=function(mp){
buildfood();
drawcircle(mp,{map[food.id][1]+3,map[food.id][2]+3},8,argb.blue,false);
drawtext(mp,map[food.id],food.n-1,9,argb.yellow);
}
tadd=function(t,id,f=false){//f 默認過濾重復(fù)值
if(type(t)=="table"){
if(f){table.push(t,id);}
else{if(!table.find(t,id)){table.push(t,id);}}
}
}
initmap=function(mp){//初始化
map={};
slm={};
hids={};
wayline={};
var mid=1;
step=20;
if(mp){
crs=math.floor((mp.width-10)/step);
rs=math.floor((mp.height-15)/step);
}
for(i=1;rs*step;step){//初始化地圖
for(j=1;crs*step;step){
tadd(map,{7+j,7+i,step-4,step-4,mid,0});//left,top,width,height,id,stay
mid++;
}
}
for(i=1;crs;1){//四邊墻
if(!table.find(map,i)){tadd(slm,i);}//第一行
if(!table.find(map,crs*(rs-1)+i)){tadd(slm,crs*(rs-1)+i);}//最后一行
}
for(i=1;rs;1){
if(!table.find(map,crs*i)){tadd(slm,crs*i);}//最后的一列
if(!table.find(map,crs*(i-1)+1)){tadd(slm,crs*(i-1)+1);}//第一列
}
while(table.find(slm,curid)){//蛇頭
curid=math.floor(math.random(crs+1,#map-crs-1));
}
map[curid][6]=1;//可向右走
table.push(wayline,curid);
} //初始化地圖
testlei=function(cid){//測試當(dāng)前是否為雷
if(table.find(slm,cid) || table.find(wayline,cid)){return true;};//當(dāng)前是墻
return(false);
}
showmap=function(mp){//畫出圍墻
for(i=1;#slm;1){
drawrect(mp,map[slm[i]],argb.orange);
}
}
redraw=function(mp){//刷新
if(dflag){
for(i=1;#slm;1){//墻
drawrect(mp,map[slm[i]],argb.orange);
}
drawcur(mp);//畫蛇身
}
}
drawcur=function(mp){//畫蛇身
var tt;
if(!testlei(curid+ss)){
map[curid][6]=ss;
curid=curid+ss;
drawcircle(mp,{map[curid][1]+3,map[curid][2]+3},8,argb.orange);
for(i=1;#wayline+1;1){//比身體多一節(jié),用于清除尾部痕跡
tt=tonumber(wayline[i]);
if(testlei(tt)){
drawcircle(mp,{map[tt][1]+3,map[tt][2]+3},8,argb.orange+i*0xf0f/3,false);
//drawtext(mp,map[tt],#wayline-i,9,argb.yellow)
if(!testlei(wayline[i]+map[tt][6])){
wayline[i]=wayline[i]+map[tt][6];
}
if(tt==(wayline[#wayline]-map[tt][6])){//清除尾煙兒
hidecur(mp,tt);
map[tt][6]=0;
}
}
}
}
}
hidecur=function(mp,cid=0){//遮蓋尾部
/**
var graphics=gdip.graphics(mp);
var x=map[curid][1]-0.5;
var y=map[curid][2]-0.5;
? ? //graphics.compositingMode = 1/*_CompositingModeSourceCopy*/;//切換為替換繪圖模式
? ? graphics.smoothingMode = 4/*_GdipSmoothingModeAntiAlias*/ ; //為了圓形畫的平滑自然,加上抗鋸齒功能
? ? var brush = gdip.solidBrush(); //創(chuàng)建一個透明刷子
? ? var hpen=gdip.pen(0xffff800,1,2);
graphics.drawRectangle(hpen, x,y,17.5,17.5);
graphics.fillRectangle(brush, x,y,17.5,17.5);
//graphics.fillEllipse(brush, x,y,17,17);//用透明刷子擦除中心圓形
brush.delete();
hpen.delete();
//graphics.compositingMode = 0/*_CompositingModeSourceOver*///恢復(fù)為疊加繪圖模式
**/
if(cid!=0){
drawrect(mp,map[cid],0xffff8000);
}
}
drawcircle=function(mp,cid,r=8,color=0xFF000000,qz=true){//默認半徑為8 畫頭
var x=cid[1]+5;
var y=cid[2]+5;
var brush = gdip.solidBrush(color);
var graphics=gdip.graphics(mp);
graphics.smoothingMode = 4/*_GdipSmoothingModeAntiAlias*/ ; //為了圓形畫的平滑自然,加上抗鋸齒功能
graphics.fillEllipse(? brush, x-r,y-r,r*2,r*2);//畫圓形、或橢圓
if(qz){//眼睛和嘴,哈哈哈。。。
if(color!=argb.white){brush=gdip.solidBrush(argb.white);}
else{brush=gdip.solidBrush(argb.black);}
graphics.fillEllipse(brush,x-r/4,y+r/3,r/2,r/5);//嘴
graphics.fillEllipse(brush,x-r/2,y-r/3,r/3,r/6);//左眼
graphics.fillEllipse(brush,x+r/3,y-r/3,r/3,r/6);//右眼
}
brush.delete();
}
drawrect=function(mp,cid,trgbs=0xFAFF0000,flag=true){//畫矩形,xx為數(shù)組={x,y,w,h} ,mp為窗體或控件,fl:true空心或false實心
? ? import gdip;
var graphics = gdip.graphics(mp);
var penrect = gdip.pen( trgbs, 1, 2/*_GdipUnitPixel*/ );//筆
? ? graphics.drawRectangle( penrect,cid[1],cid[2],cid[3],cid[4]);
? ? if(flag){
? ? var brush = gdip.solidBrush(trgbs);
? ? graphics.fillRectangle( brush, cid[1],cid[2],cid[3],cid[4]);
? ? brush.delete();
? ? }
penrect.delete();
}? //畫矩形
drawtext=function(mp,xx,tt,tss,rgbs=0xFF000000,align=1,valign=1){//xx文字區(qū)域{x,y,w,h},tt文字,ss大小
import gdip;
? ? var graphics = gdip.graphics(mp)//圖形對象graphics(可以看作是畫板)
graphics.smoothingMode = 4/*_GdipSmoothingModeAntiAlias*/ ; //加上抗鋸齒功能
var pentxt = gdip.pen( rgbs, 1,2/*_GdipUnitPixel*/ );//創(chuàng)建畫筆,畫筆pen只能畫一個輪廓(畫線描邊)
var brushtxt = gdip.solidBrush(rgbs);//創(chuàng)建刷子,畫刷可以對一個東西進行填充(刷子)
family = gdip.family( "Verdana"? ); ////創(chuàng)建FontFamily字體
strformat = gdip.stringformat();//創(chuàng)建stringFormat
strformat.align =align;//1/*_StringAlignmentCenter*/; //設(shè)置樣式 水平居中
strformat.lineAlign =valign;// 1/*_StringAlignmentCenter*/ ; //設(shè)置樣式 垂直居中
rclayout = ..gdip.RECTF(xx[1],xx[2],xx[3],xx[4]);//設(shè)置文字區(qū)域
path = gdip.path(); //創(chuàng)建一個文字路徑
path.startFigure();
path.addstring( tt, family, 1/*_GdipFontStyleBold*/, tss, rclayout, strformat);
graphics.fillPath( brushtxt, path)//fillPath填充路徑
//graphics.drawPath( pen, path)//drawPath描邊
//刪除所有GDI+對象?
brushtxt.delete();
pentxt.delete() ;
strformat.delete();
family.delete();
path.delete();?
} //寫字
gameover=function(mp){//勝利 提示
dflag=false;
var wx=(mp.width-390)/2;
var wy=(mp.height-100)/2;
drawrect(mp,{wx,wy,390,100},argb.blue);
drawtext(mp,{wx+10,wy,380,100},"天呢 你 撞墻了",45,argb.yellow);
}
startgame=function(){//游戲開始
setwh();
initmap(mainForm.map);
dflag=true;//窗體完全載入并顯示后,設(shè)置為true,然后重畫窗體內(nèi)容
ss=-ss;//反方向走,防止一直提示游戲結(jié)束
mainForm.map.redraw();//畫線
showmap(mainForm.map);
showfood(mainForm.qzmap);
}
initline=function(graphics,ps=2,pm=2){//畫背景線和標位點
? ? var gh=graphics;
var pen=gdip.pen( argb.black,ps/* 2*/, pm /* 2=_GdipUnitPixel*/ );
var icrs=crs*step+1;
var irs=rs*step+1;
gh.drawRectangle(pen,4,4,icrs+3,irs+3);
for(i=1;icrs;step){
gh.drawLine(pen,i+5,5,i+5,irs+5);
}
for(i=1;irs;step){
gh.drawLine(pen,5,i+5,icrs+5,i+5);
}
pen.delete();
}//畫背景線
addfood=function(t,cid,n){//吃
var x={};
for(i=1;n;1){
table.push(x,cid);
}
for(i=1;#t;1){
tadd(x,t[i]);
}
t=x;
return(t);
}
var goxy=function(){//移動
if(!testlei(curid+ss)){
drawcur(mainForm.qzmap);
//redraw(mainForm.qzmap);
} else {
if(table.find(wayline,curid+ss) && curid+ss==wayline[2]){
ss=-ss;
} else {
gameover(mainForm.qzmap);
}
}//撞墻了或咬到自己了。。。
if(curid==food.id){//吃到食物
wayline=addfood(wayline,curid,food.n);
buildfood();
showfood(mainForm.qzmap);
}
}
var winhotkey = win.ui.accelerator({//測試按鍵,控制走動方向。
? ? {
? ? ? ? vkey =0x26/*_VK_UP*/ ;
? ? ? ? oncommand = function(){//"上";
ss=-crs;
};
? ? };
? ? {
? ? ? ? vkey =0x28/*_VK_DOWN*/;
? ? ? ? oncommand = function(){//"下";
ss=crs
};
? ? };
? ? {
? ? ? ? vkey = 0x25/*_VK_LEFT*/;
? ? ? ? oncommand = function(){//"左";
ss=-1
};
? ? };
? ? {
? ? ? ? vkey =0x27/*_VK_RIGHT*/;
? ? ? ? oncommand = function(){//"右";
ss=1
};
? ? };
? ? //想斜著跑就按下 Ctrl鍵
? ? {
? ? ? ? ctrl = true;
? ? ? ? vkey =0x26/*_VK_UP*/ ;
? ? ? ? oncommand = function(){//左上
ss=-crs-1;
};
? ? };
? ? {
? ? ? ? ctrl = true;
? ? ? ? vkey =0x28/*_VK_DOWN*/;
? ? ? ? oncommand = function(){//右下
ss=crs+1
};
? ? };
? ? {
? ? ? ? ctrl = true;
? ? ? ? vkey = 0x25/*_VK_LEFT*/;
? ? ? ? oncommand = function(){//左下
ss=crs-1;
};
? ? };
? ? {
? ? ? ? ctrl = true;
? ? ? ? vkey =0x27/*_VK_RIGHT*/;
? ? ? ? oncommand = function(){//右上
ss=-crs+1;
};
? ? };
},mainForm );//
mainForm.onActivate = function(state,hwndOther,minimized){
if(state && dflag){//防止畫布變成空白
mainForm.qzmap.redraw();
redraw(mainForm.qzmap);
}
}//窗口恢復(fù)顯示
mainForm.onPosChanged = function(flags,hwndInsertAfter,x,y,cx,cy){
setwh();
mainForm.map.redraw();
showmap(mainForm.qzmap);
}
mainForm.setInterval(//計時器
function(){
if(dflag){goxy();}
},200
)
mainForm.map.onDrawContent = function(graphics,rc,txtColor,rcContent,foreColor){
if(dflag){
setwh();
initline(graphics);
}
}//前景刷新
mainForm.start.oncommand = function(id,event){// 開始
startgame();
}
mainForm.sts.text="點擊 上 下 左 右鍵來控制方向";
mainForm.show();
startgame();
return win.loopMessage();