使用Java實現(xiàn)三種等級的掃雷游戲(完整版)
一、效果展示
初級難度

中級難度

高級難度

測試界面

二、項目介紹
項目背景
掃雷是一款大眾類的益智小游戲。根據(jù)點擊格子出現(xiàn)的數(shù)字找出所有非雷格子,同時避免踩雷,踩到一個雷即全盤皆輸。這款游戲有著很長的歷史,從掃雷被開發(fā)出來到現(xiàn)在進行了無數(shù)次的優(yōu)化,這款游戲通過簡單的玩法,加上一個好看的游戲界面,每一處的細節(jié)都體現(xiàn)了掃雷的魅力。
功能分析
完成 難度選擇,雷隨機生成,數(shù)字生成,左右鍵翻開 等功能實現(xiàn)
游戲四種狀態(tài): 難度選擇、游戲狀態(tài)、游戲勝利、游戲失敗
游戲難度: 初級、中級、高級(不同難度對應不同的雷區(qū)大小和雷數(shù)量)
游戲核心: 二維數(shù)組 的相關操作
其他: 窗口繪制、界面規(guī)劃、操作計數(shù)、重新開始。
三、代碼展示
圖形界面設計(gui包)
主類:AppWindows類
AppWindow類負責創(chuàng)建游戲的主窗口,該類含有main方法,程序從該類開始執(zhí)行。
package ch8.gui;
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import ch8.view.MineArea;
import ch8.view.ShowRecord;
public class AppWindow extends JFrame implements MenuListener,ActionListener{
JMenuBar bar;
JMenu fileMenu;
JMenu gradeOne,gradeTwo,gradeThree;//掃雷級別
JMenuItem gradeOneList,gradeTwoList,gradeThreeList;//初,中,高級英雄榜
MineArea mineArea=null; //掃雷區(qū)域
ShowRecord showHeroRecord=null; //查看英雄榜
public AppWindow(){
bar=new JMenuBar();
fileMenu=new JMenu("掃雷游戲");
gradeOne=new JMenu("初級");
gradeTwo=new JMenu("中級");
gradeThree=new JMenu("高級");
gradeOneList=new JMenuItem("初級英雄榜");
gradeTwoList=new JMenuItem("中級英雄榜");
gradeThreeList=new JMenuItem("高級英雄榜");
gradeOne.add(gradeOneList);
gradeTwo.add(gradeTwoList);
gradeThree.add(gradeThreeList);
fileMenu.add(gradeOne);
fileMenu.add(gradeTwo);
fileMenu.add(gradeThree);
bar.add(fileMenu);
setJMenuBar(bar);
gradeOne.addMenuListener(this);
gradeTwo.addMenuListener(this);
gradeThree.addMenuListener(this);
gradeOneList.addActionListener(this);
gradeTwoList.addActionListener(this);
gradeThreeList.addActionListener(this);
mineArea=new MineArea(9,9,10,gradeOne.getText());//創(chuàng)建初級掃雷區(qū)
add(mineArea,BorderLayout.CENTER);
showHeroRecord=new ShowRecord();
setBounds(300,100,500,450);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
validate();
}
public void menuSelected(MenuEvent e){
if(e.getSource()==gradeOne){
mineArea.initMineArea(9,9,10,gradeOne.getText());
validate();
}
else if(e.getSource()==gradeTwo){
mineArea.initMineArea(16,16,40,gradeTwo.getText());
validate();
}
else if(e.getSource()==gradeThree){
mineArea.initMineArea(22,30,99,gradeThree.getText());
validate();
}
}
public void menuCanceled(MenuEvent e){}
public void menuDeselected(MenuEvent e){}
public void actionPerformed(ActionEvent e){
if(e.getSource()==gradeOneList){
showHeroRecord.setGrade(gradeOne.getText());
showHeroRecord.showRecord();
}
else if(e.getSource()==gradeTwoList){
showHeroRecord.setGrade(gradeTwo.getText());
showHeroRecord.showRecord();
}
else if(e.getSource()==gradeThreeList){
showHeroRecord.setGrade(gradeThree.getText());
showHeroRecord.showRecord();
}
}
public static void main(String args[]){
new AppWindow();
}
}
用戶操作設計(data包)
Block類
package ch8.data;
import javax.swing.ImageIcon;
public class Block {
String name; //名字,比如"雷"或數(shù)字
int aroundMineNumber; //如果不是類,此數(shù)據(jù)是周圍雷的數(shù)目
ImageIcon mineIcon; //雷的圖標
public boolean isMine=false; //是否是雷
boolean isMark=false; //是否被標記
boolean isOpen=false; //是否被挖開
ViewForBlock blockView; //方塊的視圖
public void setName(String name) {
this.name=name;
}
public void setAroundMineNumber(int n) {
aroundMineNumber=n;
}
public int getAroundMineNumber() {
return aroundMineNumber;
}
public String getName() {
return name;
}
public boolean isMine() {
return isMine;
}
public void setIsMine(boolean b) {
isMine=b;
}
public void setMineIcon(ImageIcon icon){
mineIcon=icon;
}
public ImageIcon getMineicon(){
return mineIcon;
}
public boolean getIsOpen() {
return isOpen;
}
public void setIsOpen(boolean p) {
isOpen=p;
}
public boolean getIsMark() {
return isMark;
}
public void setIsMark(boolean m) {
isMark=m;
}
public void setBlockView(ViewForBlock view){
blockView = view;
blockView.acceptBlock(this);
}
public ViewForBlock getBlockView(){
return blockView ;
}
}
LayMines類
package ch8.data;
import java.util.LinkedList;
import javax.swing.ImageIcon;
public class LayMines {
ImageIcon mineIcon;
public LayMines() {
mineIcon=new ImageIcon("掃雷圖片/mine.gif");
}
public void initBlock(Block [][] block){
for(int i=0;i<block.length;i++) {
for(int j=0;j<block[i].length;j++)
block[i][j].setIsMine(false);
}
}
public void layMinesForBlock(Block [][] block,int mineCount){ //在雷區(qū)布置mineCount個雷
initBlock(block); //先都設置是無雷
int row=block.length;
int column=block[0].length;
LinkedList<Block> list=new LinkedList<Block>();
for(int i=0;i<row;i++) {
for(int j=0;j<column;j++)
list.add(block[i][j]);
}
while(mineCount>0){ //開始布雷
int size=list.size(); // list返回節(jié)點的個數(shù)
int randomIndex=(int)(Math.random()*size);
Block b=list.get(randomIndex);
b.setIsMine(true);
b.setName("雷");
b.setMineIcon(mineIcon);
list.remove(randomIndex); //list刪除索引值為randomIndex的節(jié)點
mineCount--;
}
for(int i=0;i<row;i++){ //檢查布雷情況,標記每個方塊周圍的雷的數(shù)目
for(int j=0;j<column;j++){
if(block[i][j].isMine()){
block[i][j].setIsOpen(false);
block[i][j].setIsMark(false);
}
else {
int mineNumber=0;
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].setIsOpen(false);
block[i][j].setIsMark(false);
block[i][j].setName(""+mineNumber);
block[i][j].setAroundMineNumber(mineNumber); //設置該方塊周圍的雷數(shù)目
}
}
}
}
}
PeopleScoutMine類
package ch8.data;
import java.util.Stack;
public class PeopleScoutMine {
public Block [][] block; //雷區(qū)的全部方塊
Stack<Block> notMineBlock; //存放一個方塊周圍區(qū)域內(nèi)不是雷的方塊
int m,n ; //方塊的索引下標
int row,colum; //雷區(qū)的行和列
int mineCount; //雷的數(shù)目
public PeopleScoutMine(){
notMineBlock = new Stack<Block>();
}
public void setBlock(Block [][] block,int mineCount){
this.block = block;
this.mineCount = mineCount;
row = block.length;
colum = block[0].length;
}
public Stack<Block> getNoMineAroundBlock(Block bk){//得到方塊bk附近區(qū)域不是雷的方塊
notMineBlock.clear();
for(int i=0;i<row;i++) { //尋找bk在雷區(qū)block中的位置索引
for(int j=0;j<colum;j++) {
if(bk == block[i][j]){
m=i;
n=j;
break;
}
}
}
if(!bk.isMine()) { //方塊不是雷
show(m,n); //見后面的遞歸方法
}
return notMineBlock;
}
public void show(int m,int n) {
if(block[m][n].getAroundMineNumber()>0&&block[m][n].getIsOpen()==false){
block[m][n].setIsOpen(true);
notMineBlock.push(block[m][n]); //將不是雷的方塊壓棧
return;
}
else if(block[m][n].getAroundMineNumber()==0&&block[m][n].getIsOpen()==false){
block[m][n].setIsOpen(true);
notMineBlock.push(block[m][n]); //將不是雷的方塊壓棧
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++)
show(k,t);
}
}
}
public boolean verifyWin(){
boolean isOK = false;
int number=0;
for(int i=0;i<row;i++) {
for(int j=0;j<colum;j++) {
if(block[i][j].getIsOpen()==false)
number++;
}
}
if(number==mineCount){
isOK =true;
}
return isOK;
}
}
RecordOrShowRecord類
package ch8.data;
import java.sql.*;
public class RecordOrShowRecord{
Connection con;
String tableName ;
int heroNumber = 3; //英雄榜顯示的最多英雄數(shù)目
public RecordOrShowRecord(){
try{Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
}
catch(Exception e){}
}
public void setTable(String str){
tableName = "t_"+str;
connectDatabase();//連接數(shù)據(jù)庫
try {
Statement sta = con.createStatement();
String SQL="create table "+tableName+
"(p_name varchar(50) ,p_time int)";
sta.executeUpdate(SQL);//創(chuàng)建表
con.close();
}
catch(SQLException e) {//如果表已經(jīng)存在,將觸發(fā)SQL異常,即不再創(chuàng)建該表
}
}
public boolean addRecord(String name,int time){
boolean ok = true;
if(tableName == null)
ok = false;
//檢查time是否達到標準(進入前heroNumber名),見后面的verifyScore方法:
int amount = verifyScore(time);
if(amount >= heroNumber) {
ok = false;
}
else {
connectDatabase(); //連接數(shù)據(jù)庫
try {
String SQL ="insert into "+tableName+" values(?,?)";
PreparedStatement sta = con.prepareStatement(SQL);
sta.setString(1,name);
sta.setInt(2,time);
sta.executeUpdate();
con.close();
ok = true;
}
catch(SQLException e) {
ok = false;
}
}
return ok;
}
public String [][] queryRecord(){
if(tableName == null)
return null;
String [][] record = null;
Statement sql;
ResultSet rs;
try {
sql=
con.createStatement
(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
String str = "select * from "+tableName+" order by p_time ";
rs=sql.executeQuery(str);
boolean boo =rs.last();
if(boo == false)
return null;
int recordAmount =rs.getRow();//結果集中的全部記錄
record = new String[recordAmount][2];
rs.beforeFirst();
int i=0;
while(rs.next()) {
record[i][0] = rs.getString(1);
record[i][1] = rs.getString(2);
i++;
}
con.close();
}
catch(SQLException e) {}
return record;
}
private void connectDatabase(){
try{
String uri ="jdbc:derby:record;create=true";
con=DriverManager.getConnection(uri); //連接數(shù)據(jù)庫,如果不存在就創(chuàng)建
}
catch(Exception e){}
}
private int verifyScore(int time){
if(tableName == null)
return Integer.MAX_VALUE ;
connectDatabase(); //連接數(shù)據(jù)庫
Statement sql;
ResultSet rs;
int amount = 0;
String str =
"select * from "+tableName+" where p_time < "+time;
try {
sql=con.createStatement();
rs=sql.executeQuery(str);
while(rs.next()){
amount++;
}
con.close();
}
catch(SQLException e) {}
return amount;
}
}
ViewForBlock接口
package ch8.data;
public interface ViewForBlock {
public void acceptBlock(Block block);//確定是哪個方塊的視圖
public void setDataOnView(); //設置視圖上需要顯示的數(shù)據(jù)
public void seeBlockNameOrIcon();//顯示圖標方塊上的名字或
public void seeBlockCover(); //顯示視圖上負責遮擋的組件
public Object getBlockCover(); //得到視圖上的遮擋組件
}
游戲視圖設計(view包)
BlockView類
package ch8.view;
import javax.swing.*;
import java.awt.*;
import ch8.data.*;
public class BlockView extends JPanel implements ViewForBlock{
JLabel blockNameOrIcon; //用來顯示Block對象的name、number和mineIcon屬性
JButton blockCover; //用來遮擋blockNameOrIcon.
CardLayout card; //卡片式布局
Block block ; //被提供視圖的方塊
BlockView(){
card=new CardLayout();
setLayout(card);
blockNameOrIcon=new JLabel("",JLabel.CENTER);
blockNameOrIcon.setHorizontalTextPosition(AbstractButton.CENTER);
blockNameOrIcon.setVerticalTextPosition(AbstractButton.CENTER);
blockCover=new JButton();
add("cover",blockCover);
add("view",blockNameOrIcon);
}
public void acceptBlock(Block block){
this.block = block;
}
public void setDataOnView(){
if(block.isMine()){
blockNameOrIcon.setText(block.getName());
blockNameOrIcon.setIcon(block.getMineicon());
}
else {
int n=block.getAroundMineNumber();
if(n>=1)
blockNameOrIcon.setText(""+n);
else
blockNameOrIcon.setText(" ");
}
}
public void seeBlockNameOrIcon(){
card.show(this,"view");
validate();
}
public void seeBlockCover(){
card.show(this,"cover");
validate();
}
public JButton getBlockCover(){
return blockCover;
}
}
MineArea類
package ch8.view;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import ch8.data.*;
import java.util.Stack;
public class MineArea extends JPanel implements ActionListener,MouseListener{
JButton reStart;
Block [][] block; //雷區(qū)的方塊
BlockView [][] blockView; //方塊的視圖
LayMines lay; //負責布雷
PeopleScoutMine peopleScoutMine; //負責掃雷
int row,colum,mineCount,markMount;//雷區(qū)的行數(shù)、列數(shù)以及地雷個數(shù)和用戶給出的標記數(shù)
ImageIcon mark; //探雷作的標記
String grade; //游戲級別
JPanel pCenter,pNorth; //布局用的面板
JTextField showTime,showMarkedMineCount; //顯示用時和探雷作的標記數(shù)目(不一定是雷哦)
Timer time; //計時器
int spendTime=0; //掃雷的用時
Record record; //負責記錄到英雄榜
PlayMusic playMusic; //負責播放雷爆炸的聲音
public MineArea(int row,int colum,int mineCount,String grade) {
record = new Record(); //負責保存成績到英雄榜
reStart=new JButton("重新開始");
mark=new ImageIcon("掃雷圖片/mark.png"); //探雷標記
time=new Timer(1000,this); //計時器,每個一秒觸發(fā)ActionEvent事件一次
showTime=new JTextField(5);
showMarkedMineCount=new JTextField(5);
showTime.setHorizontalAlignment(JTextField.CENTER);
showMarkedMineCount.setHorizontalAlignment(JTextField.CENTER);
showMarkedMineCount.setFont(new Font("Arial",Font.BOLD,16));
showTime.setFont(new Font("Arial",Font.BOLD,16));
pCenter=new JPanel();
pNorth=new JPanel();
lay=new LayMines(); //創(chuàng)建布雷者
peopleScoutMine = new PeopleScoutMine(); //創(chuàng)建掃雷者
initMineArea(row,colum,mineCount,grade); //初始化雷區(qū),見下面的initMineArea方法
reStart.addActionListener(this);
pNorth.add(new JLabel("剩余雷數(shù)(千萬別弄錯啊):"));
pNorth.add(showMarkedMineCount);
pNorth.add(reStart);
pNorth.add(new JLabel("用時:"));
pNorth.add(showTime);
setLayout(new BorderLayout());
add(pNorth,BorderLayout.NORTH);
add(pCenter,BorderLayout.CENTER);
playMusic = new PlayMusic(); //負責播放觸雷爆炸的聲音
playMusic.setClipFile("掃雷圖片/mine.wav");
}
public void initMineArea(int row,int colum,int mineCount,String grade){
pCenter.removeAll();
spendTime=0;
markMount=mineCount;
this.row=row;
this.colum=colum;
this.mineCount=mineCount;
this.grade=grade;
block=new Block[row][colum];
for(int i=0;i<row;i++){
for(int j=0;j<colum;j++)
block[i][j]=new Block();
}
lay.layMinesForBlock(block,mineCount); //布雷
peopleScoutMine.setBlock(block,mineCount); //準備掃雷
blockView=new BlockView[row][colum]; //創(chuàng)建方塊的視圖
pCenter.setLayout(new GridLayout(row,colum));
for(int i=0;i<row;i++) {
for(int j=0;j<colum;j++) {
blockView[i][j]=new BlockView();
block[i][j].setBlockView(blockView[i][j]); //方塊設置自己的視圖
blockView[i][j].setDataOnView(); //將block[i][j]的數(shù)據(jù)放入視圖
pCenter.add(blockView[i][j]);
blockView[i][j].getBlockCover().addActionListener(this);//注冊監(jiān)視器
blockView[i][j].getBlockCover().addMouseListener(this);
blockView[i][j].seeBlockCover(); //初始時蓋住block[i][j]的數(shù)據(jù)信息
blockView[i][j].getBlockCover().setEnabled(true);
blockView[i][j].getBlockCover().setIcon(null);
}
}
showMarkedMineCount.setText(""+markMount);
repaint();
}
public void setRow(int row){
this.row=row;
}
public void setColum(int colum){
this.colum=colum;
}
public void setMineCount(int mineCount){
this.mineCount=mineCount;
}
public void setGrade(String grade) {
this.grade=grade;
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()!=reStart&&e.getSource()!=time) {
time.start();
int m=-1,n=-1;
for(int i=0;i<row;i++) { //找到單擊的方塊以及它的位置索引
for(int j=0;j<colum;j++) {
if(e.getSource()==blockView[i][j].getBlockCover()){
m=i;
n=j;
break;
}
}
}
if(block[m][n].isMine()) { //用戶輸?shù)粲螒?
for(int i=0;i<row;i++) {
for(int j=0;j<colum;j++) {
blockView[i][j].getBlockCover().setEnabled(false);//用戶單擊無效了
if(block[i][j].isMine())
blockView[i][j].seeBlockNameOrIcon(); //視圖顯示方塊上的數(shù)據(jù)信息
}
}
time.stop();
spendTime=0; //恢復初始值
markMount=mineCount; //恢復初始值
playMusic.playMusic(); //播放類爆炸的聲音
}
else { //掃雷者得到block[m][n]周圍區(qū)域不是雷的方塊
Stack<Block> notMineBlock =peopleScoutMine.getNoMineAroundBlock(block[m][n]);
while(!notMineBlock.empty()){
Block bk = notMineBlock.pop();
ViewForBlock viewforBlock = bk.getBlockView();
viewforBlock.seeBlockNameOrIcon();//視圖顯示方塊上的數(shù)據(jù)信息
System.out.println("ookk");
}
}
}
if(e.getSource()==reStart) {
initMineArea(row,colum,mineCount,grade);
repaint();
validate();
}
if(e.getSource()==time){
spendTime++;
showTime.setText(""+spendTime);
}
if(peopleScoutMine.verifyWin()) { //判斷用戶是否掃雷成功
time.stop();
record.setGrade(grade);
record.setTime(spendTime);
record.setVisible(true); //彈出錄入到英雄榜對話框
}
}
public void mousePressed(MouseEvent e){ //探雷:給方塊上插一個小旗圖標(再次單擊取消)
JButton source=(JButton)e.getSource();
for(int i=0;i<row;i++) {
for(int j=0;j<colum;j++) {
if(e.getModifiers()==InputEvent.BUTTON3_MASK&&
source==blockView[i][j].getBlockCover()){
if(block[i][j].getIsMark()) {
source.setIcon(null);
block[i][j].setIsMark(false);
markMount=markMount+1;
showMarkedMineCount.setText(""+markMount);
}
else{
source.setIcon(mark);
block[i][j].setIsMark(true);
markMount=markMount-1;
showMarkedMineCount.setText(""+markMount);
}
}
}
}
}
public void mouseReleased(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseClicked(MouseEvent e){}
}
PlayMusic類
package ch8.view;
import java.net.URI;
import java.net.URL;
import java.io.File;
import java.applet.Applet;
import java.applet.AudioClip;
public class PlayMusic implements Runnable {
String musicName;
Thread threadPlay;
AudioClip clip = null;
public PlayMusic(){
threadPlay = new Thread(this);
}
public void run() {
clip.play();
}
public void playMusic(){
threadPlay = new Thread(this);
try{
threadPlay.start();
}
catch(Exception exp) {}
}
public void setClipFile(String name){
musicName = name;
if(musicName == null)
musicName = "掃雷圖像/mine.wav";
File file=new File(musicName);
try { URI uri=file.toURI();
URL url=uri.toURL();
clip=Applet.newAudioClip(url);
}
catch(Exception ee){}
}
}
Record類
package ch8.view;
import javax.swing.*;
import java.awt.event.*;
import ch8.data.RecordOrShowRecord;
public class Record extends JDialog implements ActionListener{
int time=0;
String grade=null;
String key=null;
String message=null;
JTextField textName;
JLabel label=null;
JButton confirm,cancel;
public Record(){
setTitle("記錄你的成績");
this.time=time;
this.grade=grade;
setBounds(100,100,240,160);
setResizable(false);
setModal(true);
confirm=new JButton("確定");
cancel=new JButton("取消");
textName=new JTextField(8);
textName.setText("匿名");
confirm.addActionListener(this);
cancel.addActionListener(this);
setLayout(new java.awt.GridLayout(2,1));
label=new JLabel("輸入您的大名看是否可上榜");
add(label);
JPanel p=new JPanel();
p.add(textName);
p.add(confirm);
p.add(cancel);
add(p);
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
}
public void setGrade(String grade){
this.grade=grade;
}
public void setTime(int time){
this.time=time;
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==confirm){
String name = textName.getText();
writeRecord(name,time);
setVisible(false);
}
if(e.getSource()==cancel){
setVisible(false);
}
}
public void writeRecord(String name,int time){
RecordOrShowRecord rd = new RecordOrShowRecord();
rd.setTable(grade);
boolean boo= rd.addRecord(name,time);
if(boo){
JOptionPane.showMessageDialog
(null,"恭喜您,上榜了","消息框", JOptionPane.WARNING_MESSAGE);
}
else {
JOptionPane.showMessageDialog
(null,"成績不能上榜","消息框", JOptionPane.WARNING_MESSAGE);
}
}
}
ShowRecord類
package ch8.view;
import java.awt.*;
import javax.swing.*;
import ch8.data.RecordOrShowRecord;
public class ShowRecord extends JDialog {
String [][] record;
JTextArea showMess;
RecordOrShowRecord rd;//負責查詢數(shù)據(jù)庫的對象
public ShowRecord() {
rd = new RecordOrShowRecord();
showMess = new JTextArea();
showMess.setFont(new Font("楷體",Font.BOLD,15));
add(new JScrollPane(showMess));
setTitle("顯示英雄榜");
setBounds(400,200,400,300);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
public void setGrade(String grade){
rd.setTable(grade);
}
public void setRecord(String [][]record){
this.record=record;
}
public void showRecord() {
showMess.setText(null);
record = rd.queryRecord();
if(record == null ) {
JOptionPane.showMessageDialog
(null,"沒人上榜呢","消息框", JOptionPane.WARNING_MESSAGE);
}
else {
for(int i =0 ;i<record.length;i++){
int m = i+1;
showMess.append("\n英雄"+m+":"+record[i][0]+" "+"成績:"+record[i][1]);
showMess.append("\n--------------------------------");
}
setVisible(true);
}
}
}
四、代碼測試
這里我們創(chuàng)建test包,實現(xiàn)AppTest類來進行代碼的測試,代碼如下:
package ch8.test;
import ch8.data.*;
import java.util.Stack;
public class AppTest {
public static void main(String [] args) {
Block block[][] = new Block[5][10]; //雷區(qū)
for(int i=0;i<block.length;i++) {
for(int j = 0;j<block[i].length;j++) {
block[i][j] = new Block();
}
}
LayMines layMines = new LayMines(); //布雷者
PeopleScoutMine peopleScoutMine = new PeopleScoutMine(); //掃雷者
layMines.layMinesForBlock(block,10); //在雷區(qū)布雷
System.out.println("雷區(qū)情況:");
intputShow(block);
peopleScoutMine.setBlock(block,10); //準備掃雷
Stack<Block> stack = peopleScoutMine.getNoMineAroundBlock(block[0][0]);//掃雷
if(block[0][0].isMine()){
System.out.println("我的天啊,踩著地雷了啊");
return;
}
System.out.println("掃雷情況:");
intputProcess(block,stack);
System.out.println("成功了嗎:"+peopleScoutMine.verifyWin());
if(block[3][3].isMine()){
System.out.println("我的天啊,踩著地雷了啊");
return;
}
stack = peopleScoutMine.getNoMineAroundBlock(block[3][3]);//掃雷
System.out.println("掃雷情況:");
intputProcess(block,stack);
System.out.println("成功了嗎:"+peopleScoutMine.verifyWin());
}
static void intputProcess(Block [][] block,Stack<Block> stack){
int k = 0;
for(int i=0;i<block.length;i++) {
for(int j = 0;j<block[i].length;j++){
if(!stack.contains(block[i][j])&&block[i][j].getIsOpen()==false){
System.out.printf("%2s","■ "); //輸出■表示未挖開方塊
}
else {
int m = block[i][j].getAroundMineNumber();//顯示周圍雷的數(shù)目
System.out.printf("%2s","□"+m);
}
}
System.out.println();
}
}
static void intputShow(Block [][] block){
int k = 0;
for(int i=0;i<block.length;i++) {
for(int j = 0;j<block[i].length;j++){
if(block[i][j].isMine()){
System.out.printf("%2s","#"); //輸出#表示是地雷
}
else {
int m = block[i][j].getAroundMineNumber();//顯示周圍雷的數(shù)目
System.out.printf("%2s",m);
}
}
System.out.println();
}
}
}
五、項目結構

六、設計總結
本次項目設計是通過 Java語言編制一個掃雷游戲,Java語言是當今較為流行的網(wǎng)絡編程語言,它具有面向?qū)ο?、跨平臺、分布應用等特點。這次設計,還有利于加深對 Java課程的進一步了解,也可以鞏固所學 Java語言基本知識,增進 Java語言編輯基本功,拓寬常用類庫的應用。采用面向?qū)ο笏枷氲某绦?,鍛煉了面向?qū)ο蟮脑O計能力,使編程者通過該教學環(huán)節(jié)與手段,把所學課程及相關知識加以融會貫通,全面掌握 Java語言的編程思想及面向?qū)ο蟪绦蛟O計的方法。
總結
到此這篇關于使用Java實現(xiàn)三種等級的掃雷游戲的文章就介紹到這了,更多相關Java實現(xiàn)掃雷游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java實現(xiàn)學生信息管理系統(tǒng)(使用數(shù)據(jù)庫)
這篇文章主要為大家詳細介紹了Java實現(xiàn)學生信息管理系統(tǒng),使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01
SpringBoot的父級依賴:spring-boot-starter-parent詳解
SpringBoot通過父級依賴spring-boot-starter-parent實現(xiàn)項目快速構建,它依賴于spring-boot-dependencies來統(tǒng)一管理項目中的依賴版本,省去了手動指定版本信息的麻煩,這種機制不僅規(guī)定了默認的Java版本和編碼格式2024-09-09
Java中FileWriter的用法及wirte()重載方法詳解
這篇文章主要介紹了Java中FileWriter的用法及wirte()重載方法詳解,FileWriter是Java編程語言中的一個類,用于將字符寫入文件,它提供了一種簡單而方便的方式來創(chuàng)建、打開和寫入文件,通過使用FileWriter,我們可以將字符數(shù)據(jù)寫入文本文件,需要的朋友可以參考下2023-10-10

