玩过华容道,也用D练习下.
写的粗糙,请见谅.
import dfl.all;
import std.stdio;
import std.math;
import std.string;
class Block:Label
{
bool caps=false;
bool canMove = false;
huaForm pars;
Rect curRect,savRect;
int id;
int w =100;
this(int i,huaForm f,Color c,int px,int py,int lw,int lh)
{
id = i;
curRect = dfl.base.Rect(px,py,lw,lh);
savRect = curRect;
this.bounds = dfl.base.Rect(px*w+10, py*w+10, lw*w -10,lh*w -10);
this.parent = f;
pars = f;
this.text = format("x=%d,y=%d,w=%d,h=%d.",curRect.x,curRect.y,curRect.width,curRect.height);
this.backColor = c;
}
void Move(int px,int py)
{
//X: 0-3,Y: 0-4.
//writefln("initBloc,x:%d,y:%d.moveTo:x=%d,y=%d",this.left,this.top,px,py);
savRect = curRect;
double a,b;
a = px;
b = py;
px = cast(int)floor(a /100);
py = cast(int)floor(b /100);
if(py < 0 ) py =0;
if(px < 0 ) px =0;
if(py + curRect.height > 5) py = py -1;
if(px + curRect.width > 4) px = px -1;
if( py == curRect.y || px == curRect.x)
{
if( px == curRect.x)
{
if( py > curRect.y ) curRect.y++;
if( py < curRect.y ) curRect.y--;
}
if( py == curRect.y)
{
if( px > curRect.x ) curRect.x++;
if( px < curRect.x ) curRect.x--;
}
}
else
{
return;
}
//writefln("calc,x:%d,y:%d.",curRect.x,curRect.y);
if( pars.canMov(curRect,id) == false )
{
curRect = savRect;
return;
}
//save to current;
px = curRect.x;
py = curRect.y;
//writefln("initMove,x:%d,y:%d.",px,py);
this.top = py * w + 10;
this.left = px * w +10;
//writefln("caleMove,x:%d,y:%d.",this.left,this.top);
this.text = format("x=%d,y=%d,w=%d,h=%d.",curRect.x,curRect.y,curRect.width,curRect.height);
}
protected void onMouseDown(MouseEventArgs mea)
{
super.onMouseDown(mea);
caps = true;
//writefln("caps!");
}
}
Rect getRect(int px,int py,int w,int h)
{
double a,b;
a = px;
b = py;
px = cast(int)floor(a /100);
py = cast(int)floor(b /100);
if(py < 0 ) py =0;
if(px < 0 ) px =0;
if(py + h > 5) py = py -1;
if(px + w > 4) px = px -1;
return Rect(px,py,w,h);
}
class huaForm: dfl.form.Form
{
int w = 100;
static Block[10] blocks;
this()
{
this.text ="Chinese Sliding Block -HuaRongDao";
this.width = 4* w + 20;
this.height = 5* w + 60;
this.maximizeBox = false;
addBlock();
}
void addBlock()
{
blocks[0] = new Block(0,this,Color(255,0,0), 0,0,1,2);
blocks[1] = new Block(1,this,Color(255,255,0),1,0,2,2);
blocks[2] = new Block(2,this,Color(255,0,0), 3,0,1,2);
blocks[3] = new Block(3,this,Color(0,255,0), 0,2,1,2);
blocks[4] = new Block(4,this,Color(0,255,0), 3,2,1,2);
blocks[5] = new Block(5,this,Color(0,255,255),1,2,2,1);
blocks[6] = new Block(6,this,Color(0,0,255), 0,4,1,1);
blocks[7] = new Block(7,this,Color(0,0,255), 3,4,1,1);
blocks[8] = new Block(8,this,Color(0,0,255), 1,3,1,1);
blocks[9] = new Block(9,this,Color(0,0,255), 2,3,1,1);
}
protected void onMouseUp(MouseEventArgs mea)
{
super.onMouseUp(mea);
foreach(Block b;blocks)
{
if( canMove(Point(mea.x,mea.y)) == true && b.caps==true)
{
b.Move(mea.x,mea.y);
b.caps = false;
return;
}
}
}
bool canMov(Rect npt,int i)
{
foreach(int j,Block b;blocks)
{
if(i==j) continue;
Rect r = dfl.base.Rect(npt.x*w+10, npt.y*w+10, npt.width*w -10,npt.height*w -10);
if(r.contains(b.bounds.x,b.bounds.y)==true)
{
//writefln("Baohan:,x:%d,y:%d.ID:%d",b.curRect.x,b.curRect.y,b.id);
return false;
}
if(b.curRect.contains(npt) == true)
{
//writefln("beiBaohan:,x:%d,y:%d.ID:%d",b.curRect.x,b.curRect.y,b.id);
return false;
}
}
return true;
}
bool canMove(Point npt)
{
foreach(Block b;blocks)
{
if(b.bounds.contains(npt) == true) return false;
}
return true;
}
}
int main()
{
int result = 0;
try
{
Application.run(new huaForm());
}
catch(Object o)
{
msgBox(o.toString(), "Fatal Error", MsgBoxButtons.OK, MsgBoxIcon.ERROR);
result = 1;
}
return result;
}
分享到:
相关推荐
c语言华容道源码.zipc语言华容道源码.zipc语言华容道源码.zipc语言华容道源码.zipc语言华容道源码.zipc语言华容道源码.zipc语言华容道源码.zipc语言华容道源码.zipc语言华容道源码.zipc语言华容道源码.zipc语言华容...
控制台版本的java语言实现华容道游戏(横刀立马) 字数补丁字数补丁111
不错的毕业设计、课程设计、练手c++语言项目:华容道.rar 不错的毕业设计、课程设计、练手c++语言项目:华容道.rar 不错的毕业设计、课程设计、练手c++语言项目:华容道.rar 不错的毕业设计、课程设计、练手c++语言...
网页版数字华容道,非常简单
华容道算法简洁版,
华容道,数字华容道,C语言
华容道游戏求解最少步骤C++
针对以上要求,开发一个小型的华容道小游戏,满足如下功能要求:1、设计一个华容道游戏界面;2、创建对象,代表华容道中的人物;3、通过鼠标来控制人物的移动;4、增加多个游戏难度。用户可以通过鼠标来控制人物的...
一个由VB6开发的小游戏,是华容道的升级版,有文件关联方案,华容道游戏存档文件保存后,即可得到一个属于它的图标,当双击此存档文件时,自动打开华容道游戏,并把华容道界面改变为存档文件中的设置。此文件用到了...
华容道游戏的python实现,基于pygame库,功能完善,linux、windows都可以运行,已经包含了华容道解密算法,工程没抄别人一句代码,绝不坑人,欢迎下载
这是一个关于华容道的小游戏 还不是很完善 可以玩一玩 就这么多吧
用JAVA设计的华容道小游戏,挑战你的智慧
一个简单的华容道小程序,包含计时器和重置程序
华容道基本功能,简单的c++代码实现,适合初学者,需要学过数组等内容,以及一点点对结构的了解。主要是提供一个编程思路。
2个Java华容道源码,附有文档资料和代码说明,对学习Java游戏不错。在本练习中,利用Java提供的一些库函数实现了三国中的经典游戏华容道的人物制作。 通过类的实例化技术,使用户理解面向对象的程序设计方法,...
华容道素材及源码java实现 下载
java游戏华容道,具体见博客http://blog.csdn.net/simon_world
华容道素材及源码 .txt,java实现的华容道源码,非常的nice。
C#华容道游戏的源代码,华容道游戏作为一个经典游戏,各部分设计都恰到好处,非常巧妙,因此成为世界游戏界的三大不可思议。华容道游戏源于三国时期著名的历史故事。东汉末年,曹操、孙权以及刘备在赤壁交战,结果...
汽车华容道游戏解法,c++语言实现,属于课程作业。