飞扬彩球 V1.0
九江_美女勿近 2008年1月23日3时
2008年1月24日修正了点击分数区数组出界问题
其中声音及图片来自易语言的例程
美女勿近:“多普达手机上有一个彩球游戏,我用飞扬写了一个试试,请大家多多指教。点击选择,再击消除”。
请到EF论坛下载完整程序和源代码:http://bbs.dywt.com.cn/dispbbs.asp?boardID=148&ID=147131&page=1
(如果图片再仔细处理一下,界面会更美观)
以下是此游戏的核心EF源代码:
/*
飞扬彩球V1.0 九江_美女勿近 2008年1月23日3时
2008年1月24日修正了点击分数区数组出界问题
其中声音及图片来自易语言的例程
*/
引入 用户界面,工具;
公开 类 彩球 < 基类型 = 面板 >
{
用户界面.窗口场景 彩球场景;
整数[] 数据;
图片组 彩球图片;
位图 位图1;
掩码 掩码1;
逻辑 是否已选择;
整数 得分;
声音 选择声音;
声音 消除声音;
公开 初始化()
{
本对象.宽度 = 369 ;
本对象.高度 = 369 + 25 ;
本对象.左边 = 10 ;
本对象.顶边 = 10 ;
本对象.提高层次();
彩球场景 = 创建 窗口场景(本对象);
数据 = 创建 整数[ 9 ][ 9 ];
彩球图片 = 创建 图片组;
彩球图片.初始化( 39 , 39 ,真, 15 );
位图1 = 创建 位图;
掩码1 = 创建 掩码;
选择声音 = 创建 声音();
消除声音 = 创建 声音();
选择声音.创建( " 声音/选中.wav " );
消除声音.创建( " 声音/消除.wav " );
计次循环( 15 ,整数 x)
{
位图1.加载( " 图片/ " + (x + 1 ).到文本() + " .bmp " ,位图类型.BMP); // 调试时请把更改目录
彩球图片.添加(位图1,颜色.品红());
}
重来();
}
刷新面板()
{
彩球场景.画矩形( 0 , 0 , 369 , 369 );
计次循环( 8 , 整数 x)
{
彩球场景.画线( 0 ,x * 41 + 41 , 369 ,x * 41 + 41 );
彩球场景.画线(x * 41 + 41 , 0 ,x * 41 + 41 , 369 );
}
计次循环( 9 ,整数 x)
{
计次循环( 9 ,整数 y)
{
画图片(x,y);
}
}
彩球场景.画矩形( 0 , 370 , 100 , 20 );
彩球场景.画文本( " 得分: " + 得分.到文本(), 0 , 370 );
}
公开 重来()
{
数学运算.置随机数种子();
是否已选择 = 假;
得分 = 0 ;
计次循环( 9 ,整数 x)
{
计次循环( 9 ,整数 y)
{
数据[x][y] = 数学运算.取随机数() % 7 + 1 ;
}
}
刷新面板();
}
处理程序(整数 x,整数 y)
{
x /= 41 ;
y /= 41 ;
if (y > 8 )
{返回;}
if (数据[x][y] == 0 )
{返回;}
假如(是否已选择)
{
为 真:
已选择时处理(x,y);
为其他:
未选择时处理(x,y);
}
}
未选择时处理(整数 x,整数 y)
{
选择声音.播放(声音标记.异步);
数据[x][y] += 7 ;
画图片(x,y);
如果(x > 0 )
{
如果(数据[x - 1 ][y] == 数据[x][y] - 7 )
{
画图片(x - 1 ,y);
未选择时处理(x - 1 ,y);
}
}
如果(x < 8 )
{
如果(数据[x + 1 ][y] == 数据[x][y] - 7 )
{
画图片(x + 1 ,y);
未选择时处理(x + 1 ,y);
}
}
如果(y > 0 )
{
如果(数据[x][y - 1 ] == 数据[x][y] - 7 )
{
画图片(x,y - 1 );
未选择时处理(x,y - 1 );
}
}
如果(y < 8 )
{
如果(数据[x][y + 1 ] == 数据[x][y] - 7 )
{
画图片(x,y + 1 );
未选择时处理(x,y + 1 );
}
}
是否已选择 = 真;
}
已选择时处理(整数 x,整数 y)
{
如果(数据[x][y] > 7 )
{
如果(取多少被选择(x,y) > 1 )
{
消除声音.播放(声音标记.异步);
消球();
下落();
右移();
if (是否结束())
{界面程序.信息框( " 游戏结束!!! " );}
}
否则
{
数据[x][y] -= 7 ;
画图片(x,y);
是否已选择 = 假;
}
}
否则
{
取消选择();
未选择时处理( x, y);
}
}
整数 取多少被选择(整数 x,整数 y)
{
整数 n;
计次循环( 9 ,整数 i)
{
计次循环( 9 ,整数 j)
{
如果(数据[x][y] == 数据[i][j])
{n ++ ;}
}
}
返回 n;
}
取消选择()
{
计次循环( 9 ,整数 x)
{
计次循环( 9 ,整数 y)
{
如果(数据[x][y] > 7 )
{
数据[x][y] -= 7 ;
画图片(x,y);
}
}
}
}
消球()
{
整数 消球个数;
计次循环( 9 ,整数 x)
{
计次循环( 9 ,整数 y)
{
如果(数据[x][y] > 7 )
{
数据[x][y] = 0 ;
画图片(x,y);
消球个数 ++ ;
}
}
}
得分 += 消球个数 * (消球个数 + 1 );
彩球场景.画矩形( 0 , 370 , 100 , 20 );
彩球场景.画文本( " 得分: " + 得分.到文本(), 0 , 370 );
}
画图片(整数 x,整数 y)
{
如果(数据[x][y] == 0 )
{
位图1 = 彩球图片.取图片( 14 );
彩球场景.画位图(位图1,x * 41 + 1 ,y * 41 + 1 ,真);
}
否则
{
位图1 = 彩球图片.取图片(数据[x][y] - 1 );
彩球场景.画位图(位图1,x * 41 + 1 ,y * 41 + 1 ,真);
}
}
下落()
{
整数 i;
for (整数 x = 8 ;x >= 0 ;x -- )
{
for (整数 y = 8 ;y > 0 ;y -- )
{
if (数据[x][y] == 0 )
{
i = y - 1 ;
循环(数据[x][i] == 0 )
{
i -- ;
if (i < 0 )
{跳出;}
}
if (i >= 0 ) // 有下落的球
{
数据[x][y] <=> 数据[x][i];
画图片(x,y);
画图片(x,i);
}
}
}
}
}
最左边补球()
{
数学运算.置随机数种子();
整数 y = 数学运算.取随机数() % 9 + 1 ;
for (整数 x = 8 ;x >= y;x -- )
{
数据[ 0 ][x] = 数学运算.取随机数() % 7 + 1 ;
画图片( 0 ,x);
}
}
右移()
{
for (整数 x = 8 ;x >= 0 ;x -- )
{
if (是否整列为空(x))
{右移一列(x);}
}
}
右移一列(整数 列号)
{
if (列号 == 0 )
{最左边补球();}
else
{
if (列号 - 1 >= 0 )
{
if (是否整列为空(列号 - 1 ))
{右移一列(列号 - 1 );}
else
{
计次循环( 9 ,整数 x)
{
数据[列号][x] <=> 数据[列号 - 1 ][x];
画图片(列号,x);
画图片(列号 - 1 ,x);
}
}
}
}
}
逻辑 是否整列为空(整数 列)
{
计次循环( 9 ,整数 x)
{
if (数据[列][x] != 0 )
{返回 假;}
}
返回 真;
}
逻辑 是否结束()
{
计次循环( 9 ,整数 x)
{
计次循环( 9 ,整数 y)
{
if (数据[x][y] > 0 )
{
if (x > 0 )
{
if (数据[x][y] == 数据[x - 1 ][y])
{返回 假;}
}
if (x < 8 )
{
if (数据[x][y] == 数据[x + 1 ][y])
{返回 假;}
}
if (y > 0 )
{
if (数据[x][y] == 数据[x][y - 1 ])
{返回 假;}
}
if (y < 8 )
{
if (数据[x][y] == 数据[x][y + 1 ])
{返回 假;}
}
}
}
}
返回 真;
}
公开 事件处理 逻辑 绘画事件(绘画事件 事件)
{
刷新面板();
返回 真;
}
公开 事件处理 逻辑 鼠标左键被放开(鼠标左键被放开 事件)
{
处理程序(事件.横坐标(),事件.纵坐标());
返回 真;
}
}
飞扬彩球V1.0 九江_美女勿近 2008年1月23日3时
2008年1月24日修正了点击分数区数组出界问题
其中声音及图片来自易语言的例程
*/
引入 用户界面,工具;
公开 类 彩球 < 基类型 = 面板 >
{
用户界面.窗口场景 彩球场景;
整数[] 数据;
图片组 彩球图片;
位图 位图1;
掩码 掩码1;
逻辑 是否已选择;
整数 得分;
声音 选择声音;
声音 消除声音;
公开 初始化()
{
本对象.宽度 = 369 ;
本对象.高度 = 369 + 25 ;
本对象.左边 = 10 ;
本对象.顶边 = 10 ;
本对象.提高层次();
彩球场景 = 创建 窗口场景(本对象);
数据 = 创建 整数[ 9 ][ 9 ];
彩球图片 = 创建 图片组;
彩球图片.初始化( 39 , 39 ,真, 15 );
位图1 = 创建 位图;
掩码1 = 创建 掩码;
选择声音 = 创建 声音();
消除声音 = 创建 声音();
选择声音.创建( " 声音/选中.wav " );
消除声音.创建( " 声音/消除.wav " );
计次循环( 15 ,整数 x)
{
位图1.加载( " 图片/ " + (x + 1 ).到文本() + " .bmp " ,位图类型.BMP); // 调试时请把更改目录
彩球图片.添加(位图1,颜色.品红());
}
重来();
}
刷新面板()
{
彩球场景.画矩形( 0 , 0 , 369 , 369 );
计次循环( 8 , 整数 x)
{
彩球场景.画线( 0 ,x * 41 + 41 , 369 ,x * 41 + 41 );
彩球场景.画线(x * 41 + 41 , 0 ,x * 41 + 41 , 369 );
}
计次循环( 9 ,整数 x)
{
计次循环( 9 ,整数 y)
{
画图片(x,y);
}
}
彩球场景.画矩形( 0 , 370 , 100 , 20 );
彩球场景.画文本( " 得分: " + 得分.到文本(), 0 , 370 );
}
公开 重来()
{
数学运算.置随机数种子();
是否已选择 = 假;
得分 = 0 ;
计次循环( 9 ,整数 x)
{
计次循环( 9 ,整数 y)
{
数据[x][y] = 数学运算.取随机数() % 7 + 1 ;
}
}
刷新面板();
}
处理程序(整数 x,整数 y)
{
x /= 41 ;
y /= 41 ;
if (y > 8 )
{返回;}
if (数据[x][y] == 0 )
{返回;}
假如(是否已选择)
{
为 真:
已选择时处理(x,y);
为其他:
未选择时处理(x,y);
}
}
未选择时处理(整数 x,整数 y)
{
选择声音.播放(声音标记.异步);
数据[x][y] += 7 ;
画图片(x,y);
如果(x > 0 )
{
如果(数据[x - 1 ][y] == 数据[x][y] - 7 )
{
画图片(x - 1 ,y);
未选择时处理(x - 1 ,y);
}
}
如果(x < 8 )
{
如果(数据[x + 1 ][y] == 数据[x][y] - 7 )
{
画图片(x + 1 ,y);
未选择时处理(x + 1 ,y);
}
}
如果(y > 0 )
{
如果(数据[x][y - 1 ] == 数据[x][y] - 7 )
{
画图片(x,y - 1 );
未选择时处理(x,y - 1 );
}
}
如果(y < 8 )
{
如果(数据[x][y + 1 ] == 数据[x][y] - 7 )
{
画图片(x,y + 1 );
未选择时处理(x,y + 1 );
}
}
是否已选择 = 真;
}
已选择时处理(整数 x,整数 y)
{
如果(数据[x][y] > 7 )
{
如果(取多少被选择(x,y) > 1 )
{
消除声音.播放(声音标记.异步);
消球();
下落();
右移();
if (是否结束())
{界面程序.信息框( " 游戏结束!!! " );}
}
否则
{
数据[x][y] -= 7 ;
画图片(x,y);
是否已选择 = 假;
}
}
否则
{
取消选择();
未选择时处理( x, y);
}
}
整数 取多少被选择(整数 x,整数 y)
{
整数 n;
计次循环( 9 ,整数 i)
{
计次循环( 9 ,整数 j)
{
如果(数据[x][y] == 数据[i][j])
{n ++ ;}
}
}
返回 n;
}
取消选择()
{
计次循环( 9 ,整数 x)
{
计次循环( 9 ,整数 y)
{
如果(数据[x][y] > 7 )
{
数据[x][y] -= 7 ;
画图片(x,y);
}
}
}
}
消球()
{
整数 消球个数;
计次循环( 9 ,整数 x)
{
计次循环( 9 ,整数 y)
{
如果(数据[x][y] > 7 )
{
数据[x][y] = 0 ;
画图片(x,y);
消球个数 ++ ;
}
}
}
得分 += 消球个数 * (消球个数 + 1 );
彩球场景.画矩形( 0 , 370 , 100 , 20 );
彩球场景.画文本( " 得分: " + 得分.到文本(), 0 , 370 );
}
画图片(整数 x,整数 y)
{
如果(数据[x][y] == 0 )
{
位图1 = 彩球图片.取图片( 14 );
彩球场景.画位图(位图1,x * 41 + 1 ,y * 41 + 1 ,真);
}
否则
{
位图1 = 彩球图片.取图片(数据[x][y] - 1 );
彩球场景.画位图(位图1,x * 41 + 1 ,y * 41 + 1 ,真);
}
}
下落()
{
整数 i;
for (整数 x = 8 ;x >= 0 ;x -- )
{
for (整数 y = 8 ;y > 0 ;y -- )
{
if (数据[x][y] == 0 )
{
i = y - 1 ;
循环(数据[x][i] == 0 )
{
i -- ;
if (i < 0 )
{跳出;}
}
if (i >= 0 ) // 有下落的球
{
数据[x][y] <=> 数据[x][i];
画图片(x,y);
画图片(x,i);
}
}
}
}
}
最左边补球()
{
数学运算.置随机数种子();
整数 y = 数学运算.取随机数() % 9 + 1 ;
for (整数 x = 8 ;x >= y;x -- )
{
数据[ 0 ][x] = 数学运算.取随机数() % 7 + 1 ;
画图片( 0 ,x);
}
}
右移()
{
for (整数 x = 8 ;x >= 0 ;x -- )
{
if (是否整列为空(x))
{右移一列(x);}
}
}
右移一列(整数 列号)
{
if (列号 == 0 )
{最左边补球();}
else
{
if (列号 - 1 >= 0 )
{
if (是否整列为空(列号 - 1 ))
{右移一列(列号 - 1 );}
else
{
计次循环( 9 ,整数 x)
{
数据[列号][x] <=> 数据[列号 - 1 ][x];
画图片(列号,x);
画图片(列号 - 1 ,x);
}
}
}
}
}
逻辑 是否整列为空(整数 列)
{
计次循环( 9 ,整数 x)
{
if (数据[列][x] != 0 )
{返回 假;}
}
返回 真;
}
逻辑 是否结束()
{
计次循环( 9 ,整数 x)
{
计次循环( 9 ,整数 y)
{
if (数据[x][y] > 0 )
{
if (x > 0 )
{
if (数据[x][y] == 数据[x - 1 ][y])
{返回 假;}
}
if (x < 8 )
{
if (数据[x][y] == 数据[x + 1 ][y])
{返回 假;}
}
if (y > 0 )
{
if (数据[x][y] == 数据[x][y - 1 ])
{返回 假;}
}
if (y < 8 )
{
if (数据[x][y] == 数据[x][y + 1 ])
{返回 假;}
}
}
}
}
返回 真;
}
公开 事件处理 逻辑 绘画事件(绘画事件 事件)
{
刷新面板();
返回 真;
}
公开 事件处理 逻辑 鼠标左键被放开(鼠标左键被放开 事件)
{
处理程序(事件.横坐标(),事件.纵坐标());
返回 真;
}
}