`
ideage
  • 浏览: 319020 次
社区版块
存档分类
最新评论

D语言版本的华容道

阅读更多

玩过华容道,也用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;
}

 

分享到:
评论
1 楼 funxue 2010-10-20  
请教楼主
Error: undefined identifier module base.Rect
是什么原因?谢谢

相关推荐

    c语言华容道源码.zip

    c语言华容道源码.zipc语言华容道源码.zipc语言华容道源码.zipc语言华容道源码.zipc语言华容道源码.zipc语言华容道源码.zipc语言华容道源码.zipc语言华容道源码.zipc语言华容道源码.zipc语言华容道源码.zipc语言华容...

    java语言实现华容道游戏 (横刀立马)

    控制台版本的java语言实现华容道游戏(横刀立马) 字数补丁字数补丁111

    不错的毕业设计、课程设计、练手c++语言项目:华容道.rar

    不错的毕业设计、课程设计、练手c++语言项目:华容道.rar 不错的毕业设计、课程设计、练手c++语言项目:华容道.rar 不错的毕业设计、课程设计、练手c++语言项目:华容道.rar 不错的毕业设计、课程设计、练手c++语言...

    网页版数字华容道,非常简单

    网页版数字华容道,非常简单

    华容道算法简洁版

    华容道算法简洁版,

    华容道(最终版)_华容道_

    华容道,数字华容道,C语言

    华容道游戏求解最少步骤C++

    华容道游戏求解最少步骤C++

    java课设华容道小游戏

    针对以上要求,开发一个小型的华容道小游戏,满足如下功能要求:1、设计一个华容道游戏界面;2、创建对象,代表华容道中的人物;3、通过鼠标来控制人物的移动;4、增加多个游戏难度。用户可以通过鼠标来控制人物的...

    华容道20连局

    一个由VB6开发的小游戏,是华容道的升级版,有文件关联方案,华容道游戏存档文件保存后,即可得到一个属于它的图标,当双击此存档文件时,自动打开华容道游戏,并把华容道界面改变为存档文件中的设置。此文件用到了...

    华容道的python实现(带解密算法)

    华容道游戏的python实现,基于pygame库,功能完善,linux、windows都可以运行,已经包含了华容道解密算法,工程没抄别人一句代码,绝不坑人,欢迎下载

    华容道 曹操 java

    这是一个关于华容道的小游戏 还不是很完善 可以玩一玩 就这么多吧

    基于JAVA的华容道设计

    用JAVA设计的华容道小游戏,挑战你的智慧

    tt7_华容道小程序_

    一个简单的华容道小程序,包含计时器和重置程序

    华容道基本功能c++实现

    华容道基本功能,简单的c++代码实现,适合初学者,需要学过数组等内容,以及一点点对结构的了解。主要是提供一个编程思路。

    2个Java华容道源码 附设计文档.rar

    2个Java华容道源码,附有文档资料和代码说明,对学习Java游戏不错。在本练习中,利用Java提供的一些库函数实现了三国中的经典游戏华容道的人物制作。  通过类的实例化技术,使用户理解面向对象的程序设计方法,...

    华容道素材及源码java实现 下载

    华容道素材及源码java实现 下载

    java游戏之华容道

    java游戏华容道,具体见博客http://blog.csdn.net/simon_world

    华容道素材及源码

    华容道素材及源码 .txt,java实现的华容道源码,非常的nice。

    华容道游戏源码C#

    C#华容道游戏的源代码,华容道游戏作为一个经典游戏,各部分设计都恰到好处,非常巧妙,因此成为世界游戏界的三大不可思议。华容道游戏源于三国时期著名的历史故事。东汉末年,曹操、孙权以及刘备在赤壁交战,结果...

    汽车华容道解法

    汽车华容道游戏解法,c++语言实现,属于课程作业。

Global site tag (gtag.js) - Google Analytics