欢迎光临
我们一直在努力

我的第2个JAVA作品—-扫雷游戏-JSP教程,资料/其它

建站超值云服务器,限时71元/月

***************************编程思路*******************************

这个游戏大煎都很熟悉的,鼠标不断的点击雷盒,如果是雷,满盘皆输,如果不是雷

则打开当前雷盒,显示出周围雷的个数。如果这个雷盒周围一圈都不是雷,则应该将

周围的雷盒都打开,并依次按照上面的规则迭代循环下去,这个循环应该结束在遇到

含有雷的雷盒那里,或者所有的雷盒都已经探测完,编程的难点也就在这里,大家多

留意下bones_box类的鼠标左键点击事件和bones_triggers()过程,特别要注意

is_clicked这个布尔值,正是由于他的使用才使得迭代得以顺利进行

至于布雷,我是采用随即的方式,有人说微软的布雷很有讲究的,那个算法我就不知

道了,好象还是个很高深的数学难题,你们谁吃饱了没事就研究下吧

*******************************************************************/

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.border.*;

import java.util.*;

public class bones_game //游戏主类,初始化界面,生成雷区

{

public static int clicked_counter = 450;//计数器,减至0时表示扫雷成功结束

jframe mainframe;//主窗体

jbutton button_refresh;

bones_box bones_box[];//雷盒

public bones_game()//构造方法

{

int i;

bones_box = new bones_box[450];

button_refresh = new jbutton("重新开始游戏");

mainframe = new jframe("扫雷游戏");

mainframe.getcontentpane().setlayout(new borderlayout());

container box_grid = new container();

box_grid.setlayout(new gridlayout(15,30));

for (i = 0;i < 450;i++)//画出所有雷盒

{

bones_box[i] = new bones_box(i,this);

box_grid.add(bones_box[i]);

}

bones_sts_refresh();//刷新信息

mainframe.getcontentpane().add(button_refresh,borderlayout.north);

mainframe.getcontentpane().add(box_grid,borderlayout.center);

mainframe.pack();

mainframe.show();

mainframe.addwindowlistener(new windowadapter()

{

public void windowclosing(windowevent e){

system.exit(0);

}

});

button_refresh.addmouselistener(new mouseadapter()

{

public void mouseclicked(mouseevent e)

{

bones_sts_refresh();

}

});

}

public static void main(string[] argus)

{

new bones_game();//启动游戏

}

public void bones_sts_refresh()//刷新所有雷盒,布置信息

{

int i,j;

clicked_counter = 450;

for (i = 0;i < 450;i++)

{

bones_box[i].setenabled(true);

bones_box[i].is_clicked = false;

bones_box[i].setvisible(true);

bones_box[i].is_bone = false;

bones_box[i].number_of_real_bone = 0;

bones_box[i].flag = "";

bones_box[i].settext(" ");

bones_box[i].setborder(borderfactory.createbevelborder(bevelborder.raised,color.white,color.black));//初始状态为突起

bones_box[i].setbackground(color.gray);

}

for (i = 0;i < 90;i++)//随机布雷

{

bones_box[(int)(math.random() * 449)].is_bone = true;

}

for (i = 0;i < 450;i++)//依次统计每个雷盒周围雷的个数

{

if (bones_box[i].is_bone)//雷盒中有雷,不参与叠带,计数器自减

{

bones_game.clicked_counter–;

}

for (j = 0;j < 8;j++)

{

if (bones_box[i].bones_around[j] == 777)

{

continue;

}

if (bones_box[bones_box][i].bones_around[j]].is_bone)

{

bones_box[i].number_of_real_bone++;

}

}

//打开此代码,可以看看雷的分布情况

//if (bones_box[i].is_bone)

//{

// bones_box[i].settext("●");

//}

}

}

public void game_lose()

{

int type,k;

for (k = 0;k < 450;k++)

{

if (bones_box[k].is_bone)

{

bones_box[k].settext("●");

}

}

type=joptionpane.information_message;

joptionpane.showmessagedialog(mainframe,"很抱歉,你输了,谢谢!!!","提示信息",type);

bones_sts_refresh();

}

public void game_win()

{

int type;

type=joptionpane.information_message;

joptionpane.showmessagedialog(mainframe,"严重恭喜,你赢了,傻鸟!!!","提示信息",type);

bones_sts_refresh();

}

}

class bones_box extends jtextfield//雷盒类

{

public boolean is_clicked = false;//是否检查标志

public boolean is_bone = false;//是否是雷

public int bone_id;//雷盒标识号

public int[] bones_around;//周围雷盒的bone_id,以数组形式记录

public bones_game frame_handle;//游戏主类句柄

public int number_of_real_bone;//周围一圈雷的总数目

public string flag;//右键点击标识 "↑":标识为雷 "?":不确定状态 "":空

public bones_box(int i,bones_game handle)//构造方法

{

super();

this.bone_id = i;

//this.setenabled(false);

this.frame_handle = handle;

this.setcursor(frame_handle.mainframe.getcursor());

this.setforeground(color.cyan);

this.bones_around = find_bones_around();//获取周围雷盒的id,存入bones_around数组

this.addmouselistener(new mouseadapter()

{

public void mouseclicked(mouseevent e)

{

int j;

/*——————-双键齐下———————-

捕捉效果很差,稍有偏差就会引发下面的左键或右键事件,不知道大家

有没有比较好的能精确的捕捉这个事件的办法,象微软的那样,就算

指头没有同时击键,也能捕捉得到,如果找到,可以封装下面代码,并

在dev上告诉我一声

{

int k,li_num;

if (is_clicked)

{

for(k = 0,k < 8,k++)

{

if (frame_handle.bones_box[bones_around][k]].flag == "↑")

{

li_num++;

}

}

if (li_num == number_of_real_bone)

{

for (k = 0,k < 8,k++)

{

if (frame_handle.bones_box[bones_around][k]].flag == "↑")

{

continue;

}

if (frame_handle.bones_box[bones_around][k]].is_clicked)

{

continue;

}

if (frame_handle.bones_box[bones_around][k]].is_bone)//失败

{

frame_handle.game_lose();

return;

}

frame_handle.bones_box[bones_around][k]].setborder(borderfactory.createbevelborder(bevelborder.lowered,color.white,color.black));//雷盒凹下显示

frame_handle.bones_box[bones_around][k]].setbackground(color.white);

frame_handle.bones_box[bones_around][k]].setenabled(false);

frame_handle.bones_box[bones_around][k]].settext(integer.tostring(frame_handle.bones_box[bones_around][k]].number_of_real_bone));//提示周围有多少个雷

frame_handle.bones_box[bones_around][k]].is_clicked = true;//标记本雷盒以探测过,避免以后相互迭带产生无限循环

bones_game.clicked_counter–;

}

}

}

else

{

}

}

—————————————————-*/

if(e.getbutton()==e.button1)//左键点击

{

if (is_clicked)

{

return;

}

if(flag == "↑")//标识号为雷,点击直接返回

{

return;

}

if (is_bone)//是雷,提示游戏失败

{

frame_handle.game_lose();

return;

}

setborder(borderfactory.createbevelborder(bevelborder.lowered,color.white,color.black));//雷盒凹下显示

setbackground(color.white);

setenabled(false);

settext(integer.tostring(number_of_real_bone));//提示周围有多少个雷

is_clicked = true;//标记本雷盒以探测过,避免以后相互迭带产生无限循环

bones_game.clicked_counter–;

bones_triggers();//触发过程

if (bones_game.clicked_counter <= 0)

{

frame_handle.game_win();

}

}

if(e.getbutton()==e.button3)//右键

{

if (is_clicked)

{

return;

}

if (flag == "")

{

settext("↑");

flag = "↑";

return;

}

if (flag == "↑")

{

settext("?");

flag = "?";

return;

}

if (flag == "?")

{

settext("");

flag = "";

return;

}

}

}

});

}

public int[] find_bones_around()//根据自己的bone_id,找出周围一圈雷盒的id

{

int[] bones_around = new int[8];

int i,li_row,li_column;

li_row = bone_id / 30;

li_column = bone_id -li_row * 30;

bones_around[0] = li_column – 1 + (li_row – 1) * 30;

bones_around[1] = li_column + (li_row – 1) * 30;

bones_around[2] = li_column + 1 + (li_row – 1) * 30;

bones_around[3] = li_column + 1 + li_row * 30;

bones_around[4] = li_column + 1 + (li_row + 1) * 30;

bones_around[5] = li_column + (li_row + 1) * 30;

bones_around[6] = li_column – 1 + (li_row + 1) * 30;

bones_around[7] = li_column – 1 + li_row * 30;

if (li_column == 0)//第一列的特殊处理,因为他的左边为空,在此一律标记为777

{

bones_around[0] =777;

bones_around[6] = 777;

bones_around[7] = 777;

}

if (li_column == 29)//最后一列特殊处理,因为他的右边为空

{

bones_around[2] = 777;

bones_around[3] = 777;

bones_around[4] = 777;

}

for (i = 0;i < bones_around.length;i++)

{

if (bones_around[i] < 0 | bones_around[i] > 449)

{

bones_around[i] = 777;

}

}

return bones_around;

}

public void bones_triggers()//触发过程

{

int k;

boolean is_all_free = true;

for (k = 0;k < 8;k++)

{

if (bones_around[k] == 777)

{

continue;

}

if (frame_handle.bones_box[bones_around][k]].is_bone)

//判断周围是否全部不是雷,如果条件不成立,就没有自动触发周围雷盒的必要,留给玩家自己去踩

{

is_all_free = false;

break;

}

}

if (is_all_free)//条件成立,开始自动探测周围雷盒

{

for (k = 0;k < 8;k++)

{

if (bones_around[k] == 777)

{

continue;

}

if (frame_handle.bones_box[bones_around][k]].flag == "↑")//已标记为雷,跳过

{

continue;

}

if (frame_handle.bones_box[bones_around][k]].is_clicked)//已探测,跳过

{

continue;

}

bones_game.clicked_counter–;

frame_handle.bones_box[bones_around][k]].setenabled(false);

frame_handle.bones_box[bones_around][k]].setborder(borderfactory.createbevelborder(bevelborder.lowered,color.white,color.black));

frame_handle.bones_box[bones_around][k]].setbackground(color.white);

frame_handle.bones_box[bones_around][k]].settext(integer.tostring(frame_handle.bones_box[bones_around][k]].number_of_real_bone));

frame_handle.bones_box[bones_around][k]].is_clicked = true;

frame_handle.bones_box[bones_around][k]].bones_triggers();//迭代触发下去

}

}

}

}

/*——————————edited by 八神苍月 tools: editplus + jdk1.4.2——————————-*/

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 我的第2个JAVA作品—-扫雷游戏-JSP教程,资料/其它
分享到: 更多 (0)