⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 游戏之搞怪碰碰球.ef

📁 E语言飞扬版源码已修复了部分错误,需安装易语言飞扬才能运行.
💻 EF
字号:
引入 工具,用户界面;
枚举 方块类型 {行=9,列=9,图标边框=50,球0=0,球1=1,球2=2,球3=3,球4=4,球5=5,球6=6}

公开 类 计分面板<基类型=面板>
{
 	公开 窗口场景 场景;
 	公开 主窗口 父窗口;
 	编辑框 说明编辑框,得分编辑框;
 	文本 文本="游戏玩法:\n      把相同图形的放在一条直线上,可以是横向直线、竖向直线及斜直线,当每移动一个图形时,屏幕上会再生出三个球,当有5个及以上的图形连在一起时,可以被消掉得分。\n      当屏幕上的每一个空位都有球时,游戏结束。";
 	
	公开 事件处理 逻辑 创建完毕(创建完毕事件 事件)
	{
		场景=创建 窗口场景(本对象);

		// 创建游戏编辑框
		说明编辑框=创建 编辑框();
		说明编辑框.创建(本对象,-1,"",0,0,本对象.宽度()+10,160,(整数)编辑框风格.多行文本 | (整数)编辑框风格.文本只读,空,"说明编辑框");
		说明编辑框.清空();
		说明编辑框.写入文本(文本);
		
		得分编辑框=创建 编辑框();
		得分编辑框.创建(本对象,-1,"",50,400,50,20,(整数)编辑框风格.文本只读 | (整数)编辑框风格.居中对齐,空,"得分编辑框");
		返回(真);
	}

	公开 刷新界面(整数 编号1,整数 编号2,整数 编号3,整数 积分)
	{
		//画格子
		整数 i,x1,x2,y1,y2;
		计次循环(4,i)
		{
			x1 = 本对象.宽度()/3;
			y1 =200+i*50;
			x2 = 本对象.宽度()/3+50;
			y2 = y1;
			//画横线
			场景.画线(x1,y1,x2,y2);
		}
		计次循环(2,i)
		{
			x1=本对象.宽度()/3+i*50;
			y1=200;
			x2=x1;
			y2=200+50*3;
			//画纵线
			场景.画线(x1,y1,x2,y2);
		}
		场景.画文本("《次回》",45,180);
		//画球
		位图 位图 = 创建 位图();
		文本 位图名="球型/球"+(编号1).到文本()+".bmp";//更改此处文件夹名即可改变图形:图形要求48*48
		位图.加载(位图名, 位图类型.BMP);
		场景.画位图(位图,本对象.宽度()/3+1,200+1,真);
			
		位图名="球型/球"+(编号2).到文本()+".bmp";//更改此处文件夹名即可改变图形:图形要求48*48
		位图.加载(位图名, 位图类型.BMP);
		场景.画位图(位图,本对象.宽度()/3+1,200+50+1,真);
			
		位图名="球型/球"+(编号3).到文本()+".bmp";//更改此处文件夹名即可改变图形:图形要求48*48
		位图.加载(位图名, 位图类型.BMP);
		场景.画位图(位图,本对象.宽度()/3+1,200+100+1,真);
		//画得分
		场景.画文本("《得分》",45,380);
		得分编辑框.清空();
		得分编辑框.写入文本(积分.到文本());
	}
}
公开 类 游戏面板<基类型=面板>
{
 
 	公开 主窗口 父窗口;
 	公开 窗口场景 场景;
 	整数[] 格子数组;
 	坐标点[] 路径表,消球表;
 	整数 移动值,消球值;
 	游戏类 游戏;
 	整数 边=(整数)方块类型.图标边框;
 	公开 整数 编号1=0,编号2=0,编号3=0;
 	公开 整数 积分=0;

	公开 事件处理 逻辑 创建完毕(创建完毕事件 事件)
	{
		场景=创建 窗口场景(本对象);
		格子数组=创建 整数[10][10];
		路径表=创建 坐标点[0];
		消球表=创建 坐标点[0];
		游戏=创建 游戏类();
		格子数组=游戏.初始化游戏(格子数组);
		(编号1,编号2,编号3)=游戏.取编号();
		积分=0;
		返回(真);
	}
	
	//点击格子后的判断(首先获得格子坐标):
	公开 事件处理 逻辑 鼠标左键被放开(鼠标左键被放开 事件)
	{
		//获得格子坐标
		坐标点 点击位置=本对象.到客户区坐标(用户界面.辅助类.取鼠标位置());
		整数 行=点击位置.纵坐标()/边+1;
		整数 列=点击位置.横坐标()/边+1;
		//界面程序.信息框("行="+行.到文本()+"\n列="+列.到文本());//测试用,在每格输出当前格坐标值
		//当前格子有球处理?//当前格子无球处理?
		(格子数组,路径表,消球表,移动值,消球值)=游戏.运行游戏(格子数组,行,列);
		刷新界面();
		如果(游戏.取出球值()==真)
		{
			格子数组=游戏.随机出球(格子数组);
			(编号1,编号2,编号3)=游戏.取编号();
			(消球表,消球值)=游戏.取消球坐标();//取得可以消的球的坐标表
			如果(消球表.长度()>=5)//>=5时表示有可消球
			{
				//消球处理
				整数 x;
				计次循环(消球表.长度(),x)
				{
					格子数组[消球表[x].横坐标()][消球表[x].纵坐标()]=0;
				}
			}
			刷新界面();
		}
		如果(游戏.是否结束()==真)
		{
			界面程序.信息框("游戏结束!");
			格子数组=创建 整数[10][10];
			路径表=创建 坐标点[0];
			消球表=创建 坐标点[0];
			格子数组=游戏.初始化游戏(格子数组);
			积分=0;
			刷新界面();
		}
		返回(真);
	}

	公开 刷新界面()
	{
		父窗口.计分面板.刷新界面(编号1,编号2,编号3,积分);
		//画格子
		整数 i,x1,x2,y1,y2;
		整数 m,n,行,列,选中行,选中列,选中值;
		(选中行,选中列,选中值)=游戏.取选中值();
		计次循环(10,i)
		{
			x1 = 0;
			y1 = i*边;
			x2 = 9*边;
			y2 = y1;
			//画横线
			场景.画线(x1,y1,x2,y2);
			x1=i*边;
			y1=0;
			x2=x1;
			y2=9*边;
			//画纵线
			场景.画线(x1,y1,x2,y2);
		}
		//画移动效果
		如果(路径表.长度()>1)
		{
			计次循环(路径表.长度()-1,i)
			{
				文本 位图名="球型/球"+移动值.到文本()+".bmp";
				文本 位图名0="球型/球0.bmp";
				位图 位图 = 创建 位图();
				位图.加载(位图名0, 位图类型.BMP);
				x1=(路径表[i].纵坐标()-1)*边;y1=(路径表[i].横坐标()-1)*边;
				场景.画位图(位图,x1+1,y1+1,真);
				用户界面.辅助类.延时(20);
				位图.加载(位图名, 位图类型.BMP);
				x1=(路径表[i+1].纵坐标()-1)*边;y1=(路径表[i+1].横坐标()-1)*边;
				场景.画位图(位图,x1+1,y1+1,真);
				用户界面.辅助类.延时(20);
			}
		}
		路径表=创建 坐标点[0];
		//画消球效果
		文本 位图名="球型/球"+消球值.到文本()+".bmp";
		文本 位图名0="球型/球0.bmp";
		位图 位图 = 创建 位图();
		计次循环(3)
		{
			计次循环(消球表.长度(),i)
			{
				位图.加载(位图名0, 位图类型.BMP);
				x1=(消球表[i].纵坐标()-1)*边;y1=(消球表[i].横坐标()-1)*边;
				场景.画位图(位图,x1+1,y1+1,真);
			}
			用户界面.辅助类.延时(30);
			计次循环(消球表.长度(),i)
			{
				位图.加载(位图名, 位图类型.BMP);
				x1=(消球表[i].纵坐标()-1)*边;y1=(消球表[i].横坐标()-1)*边;
				场景.画位图(位图,x1+1,y1+1,真);
			}
			用户界面.辅助类.延时(30);
		}
		如果(消球表.长度()>=5)
		{
			积分=积分+(10+(消球表.长度()-5)*5);
		}
		消球表=创建 坐标点[0];
		//画球
		计次循环(9,m)
			计次循环(9,n)
			{
				行=m+1;列=n+1;
				x1=n*边;y1=m*边;
				位图 位图 = 创建 位图();
				文本 位图名="球型/球"+格子数组[行][列].到文本()+".bmp";//更改此处文件夹名即可改变图形:图形要求48*48
				位图.加载(位图名, 位图类型.BMP);
				场景.画位图(位图,x1+1,y1+1,真);
				//如果(行==选中行 && 列==选中列) 场景.画文本("OK",x1,y1);//做选中标记
				//场景.画文本("行"+行.到文本()+"列"+列.到文本(),x1,y1);//测试用,画格子坐标值
			}
		父窗口.计分面板.刷新界面(编号1,编号2,编号3,积分);
	}
}

公开 类 主窗口<基类型=窗口>
{
 
 	公开 窗口程序 父窗口;
 	公开 游戏面板 游戏面板;
 	公开 计分面板 计分面板;

	创建组件()
	{
		计分面板 = 创建 计分面板();
		计分面板.创建(本对象,9*(整数)方块类型.图标边框+1,0,宽度()-9*(整数)方块类型.图标边框+1,9*(整数)方块类型.图标边框+1, 0, "");
		计分面板.父窗口=本对象;
		游戏面板 = 创建 游戏面板();
		游戏面板.创建(本对象, 0, 0, 9*(整数)方块类型.图标边框+1, 9*(整数)方块类型.图标边框+1, 0, "");
		游戏面板.父窗口=本对象;
		
		创建状态条(2,0);
		//置状态文本("学习中... ... 2008.1.30 ",0);
		//置状态文本("http://xhome.5d6d.com",1);
	}

	公开 事件处理 逻辑 创建完毕(创建完毕事件 事件)
	{
		创建组件();
		返回(真);
	}

	公开 事件处理 逻辑 绘画事件(绘画事件 事件)
	{
		游戏面板.刷新界面();
		返回(真);
	}
}

公开 类 窗口程序<基类型="界面程序">
{
	公开 主窗口 主窗口1;

	公开 逻辑 初始化程序()
	{
		// 创建主窗口 
		主窗口1 = 创建 主窗口;

		如果(主窗口1.创建(空, "游戏之搞怪碰碰球", 0, 0, 600, 505, 
				(整数)窗口风格.显示系统菜单 | (整数)窗口风格.显示标题栏 | (整数)窗口风格.显示关闭按钮 | (整数)窗口风格.显示最小化按钮
				, "主窗口")  == 真)
		{
			主窗口1.居中(方位.双向);
			主窗口1.显示(真);
			主窗口1.父窗口=本对象;
			返回(真);
		}

		返回(假);
	}
}

公开 类 启动类
{
	公开 静态 启动()
	{
		(创建 窗口程序).启动();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -