/**

* @(#)Block.java

*该类用于创建Block对象,将其放到游戏区的每个格子里面,里面存放着该“格子”的一些属性:

* *************************

* ——1. String name -->是雷时,存入“雷”

* 属性 ——|-2. boolean boo -->是雷时,为true,否则为false。我称为“雷性”

* ——3. int number -->用于存储周边,九回宫格内周边八个方格内的雷数

* *************************

* ——1. void setName(String name) -->设置name

* |-2. void setNumber(int i) -->设置周边雷数

* 方法 ——|-3. int getNumber() -->得到周边雷数

* |-4. String getName() -->得到name

* |-5. boolean isMine() -->判断雷性

* ——6. void setIsMine(boolean boo) -->设置雷性

* ***********************

*

* @author 宋俊林

* @version 1.00 2009/4/25

*/

public class Block {

String name; //是雷时,存入“雷”

int number; //用于存储周边,九回宫格内周边八个方格内的雷数

boolean boo = false; //是雷时,为true,否则为false。我称为“雷性”

//设置name

public void setName(String name){

this.name = name;

}

//得到name

public String getName(){

return name;

}

//设置周边雷数

public void setNumber(int i){

this.number = i;

}

//得到周边雷数

public int getNumber(){

return number;

}

//设置雷性

public void setIsMine(boolean boo){

this.boo = boo;

}

//判断雷性

public boolean isMine(){

return boo;

}

}

/**

* @(#)MineFrame.java

*

* 该类是主窗体类,该类将以Block类的实例和BlockView类的实例作为成员,并负责二者之间的交互

*

* @author 宋俊林

* @version 1.00 2009/4/25

*/

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class MineFrame extends JFrame implements ActionListener{

JButton reStart;

Block block[][];

BlockView blockView[][];

LayMines lay;

int row=10,colum=12,mineCount=22;

int colorSwitch = 0;

JPanel pCenter,pNorth;

public MineFrame() {

reStart = new JButton("重新开始"); //做一个restart按钮

pCenter = new JPanel(); //中心主游戏区面板

pNorth = new JPanel(); //上部控制面板

pNorth.setBackground(Color.gray);

block = new Block[row][colum];

for(int i=0;i

for(int j=0;j

block[i][j]=new Block();

}

}

lay = new LayMines();

lay.layMinesForBlock(block,mineCount);

blockView = new BlockView[row][colum];

pCenter.setLayout(new GridLayout(row,colum));

for(int i=0;i

for(int j=0;j

blockView[i][j] = new BlockView(); //实例化一个blockView数组

blockView[i][j].setName(block[i][j].getName());

pCenter.add(blockView[i][j]);

blockView[i][j].getBlockCover().addActionListener(this); //给每一小格添加监听器

}

}

reStart.addActionListener(this); //给reStart添加监听器

pNorth.add(reStart); //将组件添加到窗口中

add(pNorth,BorderLayout.NORTH);

add(pCenter,BorderLayout.CENTER);

setSize(200,232);

setVisible(true);

//pack();

addWindowListener(new WindowAdapter(){ //添加窗口关闭事件的监听

public void windowClosing(WindowEvent e){

System.exit(0);

}

});

validate();

}

public void actionPerformed(ActionEvent e){

JButton source = (JButton)e.getSource();

if(source!=reStart){

int m = -1,n=-1;

for(int i=0;i

for(int j=0;j

//判断事件对象,如果是格子[i][j],则翻开,并将该对象存储到[m][n]

if(source==blockView[i][j].getBlockCover()){

m = i;

n = j;

break;

}

}

}

if(block[m][n].isMine()){

for(int i=0;i

for(int j=0;j

//如果[m][n]是雷,则游戏停止,移除所有格子的事件监听,按钮动作失效

//同时翻开所有是雷的按钮

blockView[i][j].getBlockCover().removeActionListener(this);

if(block[i][j].isMine())

blockView[i][j].seeBlockName();

}

}

}else{

if(block[m][n].getNumber()>0)

blockView[m][n].seeBlockName();

else{

//如果所采处雷数为0,则翻开周边

if(block[m][n].getNumber()==0){

for(int k=Math.max(m-1,0);k<=Math.min(m+1,row-1);k++){

for(int t=Math.max(n-1,0);t<=Math.min(n+1,colum-1);t++){

blockView[k][t].seeBlockName();

}

}

}

}

}

}

if(source==reStart){

for(int i=0;i

for(int j=0;j

block[i][j].setIsMine(false);

}

}

lay.layMinesForBlock(block,mineCount);

for(int i=0;i

for(int j=0;j

blockView[i][j].setName(block[i][j].getName());

blockView[i][j].seeBlockCover();

blockView[i][j].getBlockCover().addActionListener(this);

}

}

}

}

public static void main(String args[]){

new MineFrame();

}

}

/**

* @(#)BlockView.java

*

* 该类是为Block类创建视图,注意,要实现扫雷效果,则需要将试图分为两层,表层是按钮,底层是标签,

* 所以要用到CardLayout布局。另外,想在一个个格子里面放多各元件,得考虑用Panel容器,所以该视图类

* 继承自Panel

*

* @author 宋俊林

* @version 1.00 2009/4/25

*/

import java.awt.*;

import javax.swing.*;

public class BlockView extends JPanel {

JLabel blockName;

JButton blockCover;

CardLayout card;

BlockView(){ //在构造器中初始化各属性

card = new CardLayout();

setLayout(card);

blockName = new JLabel();

blockCover = new JButton();

add("cover",blockCover); //将blockCover添加到层面板

add("name",blockName); //将blockname添加到层面板

}

public void setName(String name){ //设置blockName的text

blockName.setText(name);

}

public String getName(){ //得到blockName的text

return blockName.getText();

}

public void seeBlockName(){ //显示blockName

card.show(this,"name");

validate();

}

public void seeBlockCover(){ //显示blockCover

card.show(this,"cover");

validate();

}

public JButton getBlockCover(){ //得到blockCover

return blockCover;

}

}

/**

* @(#)LayMines.java

*

* * 我感觉这个类时扫雷的算法核心,只要搞定这个类,其他都不是问题,该类只有一个主方法

* *---> void layMinesForBlock(Block block[][],int mineCount)

* * 其中:

* * 1.参数block[][]数组存放着整个游戏区的方格的block对象,一个方格对应一个

* * 同时,用二维数组也为实现扫描周边的九回宫格统计雷数提供支持

* * 2.参数mineCount来存放你想生成的类的个数

* * 3.这里还用到了集合LinkedList,来存储block[][]中的所有block对象,

*

*

* @author 宋俊林

* @version 1.00 2009/4/25

*/

import java.util.LinkedList;

public class LayMines {

public void layMinesForBlock(Block block[][],int mineCount){

int row = block.length;

int column = block[0].length;

LinkedList list = new LinkedList(); //创建list(用到范型)

for(int i=0;i

for(int j=0;j

list.add(block[i][j]); //利用循环,将block都加到列表list里

}

}

while(mineCount>0){

int size = list.size();

int randomIndex=(int)(Math.random()*size); //生产随机数,将这些随机数对应的block对象的属性设为是雷的属性

Block b = list.get(randomIndex); //根据随机数,取对应的block对象

b.setName("雷"); //将name设为‘雷’

b.setIsMine(true); //将雷性设为true

list.remove(randomIndex); //将list中是雷的节点删除,以免设置雷重复

mineCount--;

}

for(int i=0;i

for(int j=0;j

if(!block[i][j].isMine()){ //如果block[i][j]不是雷是执行下面的统计操作,扫描周边

int mineNumber = 0;

/**

* 我感觉下面是核心的核心,扫描周围的八个(但是在游戏区的边界上,可能不足八个格子),所以这里扫描是就得处理边界问题

*这里为防止越界,用的是比较大小取值的方法,很精妙“Math.max(j-1,0)”;下面是扫描图:

* [———————————————————————————]

* [(i-1,j-1)|(i-1,j)|(i-1,j+1)]

* [———————————————————————————]

* [ (i,j-1) | (i,j) | (i,j+1)]

* [———————————————————————————]

* [(i+1,j-1)|(i+i,j)|(i+1,j+1)]

* [———————————————————————————]

*/

for(int k=Math.max(i-1,0);k<=Math.min(i+1,row-1);k++){

for(int t=Math.max(j-1,0);t<=Math.min(j+1,column-1);t++){

if(block[k][t].isMine()){

mineNumber++;

}

}

}

block[i][j].setName(""+mineNumber); //将name存为number后边会进行显示

block[i][j].setNumber(mineNumber); //将周边的雷数存入number中

}

}

}

}

}

java实训扫雷小程序设计项目_扫雷小程序!Java的相关推荐

  1. java实训心得感想30字,java实训心得体会感想

    java实训心得体会感想 Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言.通过本次实训,受益很多,下面谈谈个人的心得体会.本文是java实训心得,希望对大家有帮助. java实训心得篇一 ...

  2. 2020年Java实训项目【GUI学生信息管理系统】目录

    Java实训项目1:GUI学生信息管理系统 - 实训概述 Java实训项目2:GUI学生信息管理系统 - 系统概述 Java实训项目3:GUI学生信息管理系统 - 涉及知识点 Java实训项目4:GU ...

  3. Java实训学生信息_(java实训)学生信息管理系统.doc

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspJava (java实训)学生信息管理系统.doc9页 本文档一 ...

  4. 计算机Java校内实训报告_计算机java实训总结的范本

    计算机java实训总结的范本 这一期的实习,虽然实习的时间不长,但是总体上收获挺大的,学习中我不但有了学习成果的喜悦,而且自己也日渐成熟,有种说不出的喜悦.以下是我在这次实习中的一些感悟和体会: 1. ...

  5. java实训设想及建议_大学java实训总结.doc

    大学java实训总结 大学java实训总结 篇一:Java实训心得 心得体会 此次只实训了短短的三周.虽说时间很短,但其中的每一天都使我收获很大.受益匪浅,它不但极大地加深了我对一些理论知识的理解,不 ...

  6. 攀枝花java培训班_千里IT之行,始于中软卓越 丨中软国际成都EEC举行攀枝花学院2016年JAVA实训开班仪式...

    2016年6月27日上午9点30分,攀枝花学院2016年JAVA实训开班仪式在中软国际成都EEC13-4项目室举行:中软国际成都EEC技术总监谭岚.校企联合部经理陈莉.人才管理部主管何磊.人才服务部主 ...

  7. JAVA实训项目:银行网银系统管理平台(含源码)

    JAVA实训项目:银行网银系统管理平台(含源码) 文章目录 JAVA实训项目:银行网银系统管理平台(含源码) 前言 一.项目功能需求描述以及相关技术的应用 相关技术应用 二.设计过程 系统流程图 1. ...

  8. java实训意义_java实习心得体会

    通过java实习,我自身发生了重大的转变,我相信我会在JAVA开发这条路上走的更长更远,分享心得体会.下面是学习啦小编为大家收集整理的java实习心得体会,欢迎大家阅读. java实习心得体会篇1 经 ...

  9. 大一java实训报告1500字_JAVA实训报告

    展开全部 1. 实训的题目及e69da5e6ba903231313335323631343130323136353331333238636637简介: 题目:java计算器应用程序 简介:通过本程序可 ...

最新文章

  1. Phantom.js维护者退出,项目的未来成疑
  2. 创新的缩略图展示javascript类库 - Kort.js
  3. 高一数学集合知识点整理_高一数学 | 高一数学函数图像知识点总结,实用!
  4. 五大算法之二--动态规划
  5. 微信十年,领取纪念勋章头像!
  6. 滚动电梯卡延期复制教学
  7. Hive微博数据统计分析
  8. 目前流行的、强大的基于Java的机器学习开发库精选
  9. 知识分享:进销存管理系统记录有效库存让销售更有保障
  10. 浅谈电费电价管理中预付费系统的完善措施与应用
  11. 消除transition闪屏
  12. “丧心病狂” kite
  13. 沉淀近900万+营销资产,天攻智投户外营销助力网易有道实现“品效双赢”
  14. 每月一书(202106):《刻意练习》(一万小时定律正确吗)
  15. java贪吃蛇(障碍物*咬尾巴)
  16. 多项目同时进行如何做好进度管理
  17. 小甲鱼主讲—P41—指针03
  18. 芯片的SD/MMC控制器以及SD卡介绍
  19. linux定时任务no crontab for root 解答
  20. vr模拟电力场景安全应急培训,电力安全教育培训新方法

热门文章

  1. 一个提升客户服务小技巧—反馈表单
  2. JET NFT 彰显不凡 热烈庆祝2022世界区块链JET NFT高峰论坛圆满落幕
  3. python msgpack_菜鸟世界 -python序列化第2篇---msgpack
  4. 做虾皮跨境电商前期需要投入多少资金?详细介绍
  5. 116、对移动端开发的了解
  6. web版本 开源压测工具_免费压测工具
  7. 通达OA v11.3 以下版本 任意文件上传加文件包含导致命令执行漏洞在线实验环境
  8. 禁用不安全的http方法
  9. Android开发图片开源系列框架
  10. 学习Python的三种境界