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

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语言华容...

    C++实现的数字华容道游戏源码,C++大作业基于QT的图形化数字华容道游戏源码

    在计算机领域,利用编程语言实现数字华容道的游戏,既能够锻炼逻辑思维,又能够深入理解编程技术。本文将对基于C++和QT库实现的数字华容道游戏源码进行解析,旨在为学习者提供一个深入理解C++编程、图形界面设计和...

    易语言 华容道 源代码

    《易语言华容道源代码解析》 易语言,一种以中文编程为特色的编程语言,旨在降低编程的门槛,让更多的非计算机专业人员也能轻松掌握编程技能。华容道,一款经典的逻辑游戏,通过移动棋子,帮助曹操从华容道逃出。将...

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

    数字华容道是一种基于数字排列的益智游戏,源自经典的实体版华容道,现在已经被移植到网页上,使得更多人能够随时随地享受这种挑战智力的游戏。网页版数字华容道通常采用滑动方块的形式,目标是通过移动数字方块,使...

    c++的华容道解法

    【C++华容道解法】是一个利用C++编程语言实现的华容道游戏解决方案。华容道,源自中国的传统智力游戏,玩家需通过移动棋盘上的棋子,帮助曹操从棋盘的一端(通常是最下方)顺利移动到另一端(通常是最上方),在规定...

    C语言 华容道源代码

    这个C语言版本的华容道游戏包含八个不同难度级别的关卡,为玩家提供了丰富的挑战。 源代码中的文件主要分为以下几个部分: 1. **winlay.c**:可能包含了关于游戏界面布局和窗口管理的函数,如窗口创建、显示和事件...

    华容道解法程序2.0发布了(VB6.0版本)

    《华容道解法程序2.0:VB6.0版本深度解析》 华容道,这个古老的中国益智游戏,以其独特的策略性和趣味性深受玩家喜爱。在信息技术日新月异的今天,将传统游戏与编程技术相结合,无疑为华容道带来了新的生命。本文将...

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

    Java语言实现华容道游戏(横刀立马)是一项有趣且具有挑战性的编程任务,它将经典的游戏玩法与编程技巧相结合,让玩家在控制台上体验到华容道的乐趣。在这个项目中,我们将深入探讨如何利用Java的基本语法、数据结构...

    华容道算法进阶版

    《华容道算法进阶版》 华容道,源于中国的传统益智游戏,历史悠久,深受人们喜爱。在数字化时代,华容道游戏被赋予了新的生命,演变为计算机科学中的算法挑战。这个进阶版的华容道算法,不仅保留了原游戏的趣味性,...

    c#实现三国华容道的求解路线与窗体路线演示

    本文将深入探讨如何使用C#编程语言,实现华容道的求解算法及动态演示功能。 首先,我们要了解华容道的基本规则。游戏面板上,各个棋子代表三国时期的人物,目标是通过移动棋子,让曹操从起点到达出口。游戏的关键...

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

    本项目采用Python语言,结合pygame库,成功实现了华容道游戏的数字化版本,并且包含了解密算法,可以在Linux和Windows操作系统上运行,具有较高的可移植性和实用性。 Python是一种广泛使用的高级编程语言,以其简洁...

    java课设华容道小游戏

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

    一个快速解算华容道程序

    《华容道游戏快速解算程序解析》 华容道,源自中国的一种古典益智游戏,以其独特的棋盘布局和挑战性的解谜过程深受玩家喜爱。在这个数字化的时代,一款名为"一个快速解算华容道程序"的软件应运而生,它能够高效地...

    简单的华容道算法c++实现

    本文将深入探讨如何用C++语言实现一个简单的华容道求解算法,尽管该实现可能效率较低,但有助于理解基础的搜索策略。 首先,我们需要建立华容道棋盘的模型。通常,华容道棋盘是一个二维矩阵,其中包含不同大小的...

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

    总的来说,《华容道(最终版)_华容道》是C语言编程技术的一个优秀实例,展示了如何用编程语言来实现一个经典游戏,并提供了挑战玩家思维的娱乐体验。无论是对于学习C语言的初学者还是寻求提高编程技能的开发者,研究...

    C++(MFC)华容道自动求解

    而利用C++编程语言和MFC(Microsoft Foundation Classes)库开发的华容道自动求解程序,则为玩家提供了更加便捷的解谜体验。本文将详细解析这一程序的核心技术和实现方法。 首先,我们要理解C++作为一款强大的面向...

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

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

    华容道算法简洁版

    华容道算法简洁版,

    c#华容道v2.0

    本文将深入探讨使用C#编程语言开发的“华容道V2.0”版本,该版本是基于VS2010环境编写的,不仅修复了原有的错误,而且对游戏算法进行了优化,提升了玩家的使用体验。 首先,我们来看看C#语言在游戏开发中的应用。C#...

    c语言华容道小游戏完整源码

    c语言华容道小游戏完整源码 华容道游戏说明: 编译环境:Visual C++ 6.0,EasyX 2014冬至版 最后修改:2015-3-14 操作方式:操作方式:鼠标单击要移动的棋子后再点击棋子即可移动,将曹操移动到出口处,过关。 ...

Global site tag (gtag.js) - Google Analytics