java实训扫雷小程序设计项目_扫雷小程序!Java的
/**
* @(#)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的相关推荐
- java实训心得感想30字,java实训心得体会感想
java实训心得体会感想 Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言.通过本次实训,受益很多,下面谈谈个人的心得体会.本文是java实训心得,希望对大家有帮助. java实训心得篇一 ...
- 2020年Java实训项目【GUI学生信息管理系统】目录
Java实训项目1:GUI学生信息管理系统 - 实训概述 Java实训项目2:GUI学生信息管理系统 - 系统概述 Java实训项目3:GUI学生信息管理系统 - 涉及知识点 Java实训项目4:GU ...
- Java实训学生信息_(java实训)学生信息管理系统.doc
您所在位置:网站首页 > 海量文档  > 计算机 > Java (java实训)学生信息管理系统.doc9页 本文档一 ...
- 计算机Java校内实训报告_计算机java实训总结的范本
计算机java实训总结的范本 这一期的实习,虽然实习的时间不长,但是总体上收获挺大的,学习中我不但有了学习成果的喜悦,而且自己也日渐成熟,有种说不出的喜悦.以下是我在这次实习中的一些感悟和体会: 1. ...
- java实训设想及建议_大学java实训总结.doc
大学java实训总结 大学java实训总结 篇一:Java实训心得 心得体会 此次只实训了短短的三周.虽说时间很短,但其中的每一天都使我收获很大.受益匪浅,它不但极大地加深了我对一些理论知识的理解,不 ...
- 攀枝花java培训班_千里IT之行,始于中软卓越 丨中软国际成都EEC举行攀枝花学院2016年JAVA实训开班仪式...
2016年6月27日上午9点30分,攀枝花学院2016年JAVA实训开班仪式在中软国际成都EEC13-4项目室举行:中软国际成都EEC技术总监谭岚.校企联合部经理陈莉.人才管理部主管何磊.人才服务部主 ...
- JAVA实训项目:银行网银系统管理平台(含源码)
JAVA实训项目:银行网银系统管理平台(含源码) 文章目录 JAVA实训项目:银行网银系统管理平台(含源码) 前言 一.项目功能需求描述以及相关技术的应用 相关技术应用 二.设计过程 系统流程图 1. ...
- java实训意义_java实习心得体会
通过java实习,我自身发生了重大的转变,我相信我会在JAVA开发这条路上走的更长更远,分享心得体会.下面是学习啦小编为大家收集整理的java实习心得体会,欢迎大家阅读. java实习心得体会篇1 经 ...
- 大一java实训报告1500字_JAVA实训报告
展开全部 1. 实训的题目及e69da5e6ba903231313335323631343130323136353331333238636637简介: 题目:java计算器应用程序 简介:通过本程序可 ...
最新文章
- Phantom.js维护者退出,项目的未来成疑
- 创新的缩略图展示javascript类库 - Kort.js
- 高一数学集合知识点整理_高一数学 | 高一数学函数图像知识点总结,实用!
- 五大算法之二--动态规划
- 微信十年,领取纪念勋章头像!
- 滚动电梯卡延期复制教学
- Hive微博数据统计分析
- 目前流行的、强大的基于Java的机器学习开发库精选
- 知识分享:进销存管理系统记录有效库存让销售更有保障
- 浅谈电费电价管理中预付费系统的完善措施与应用
- 消除transition闪屏
- “丧心病狂” kite
- 沉淀近900万+营销资产,天攻智投户外营销助力网易有道实现“品效双赢”
- 每月一书(202106):《刻意练习》(一万小时定律正确吗)
- java贪吃蛇(障碍物*咬尾巴)
- 多项目同时进行如何做好进度管理
- 小甲鱼主讲—P41—指针03
- 芯片的SD/MMC控制器以及SD卡介绍
- linux定时任务no crontab for root 解答
- vr模拟电力场景安全应急培训,电力安全教育培训新方法