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

中級(jí)難度

高級(jí)難度

測(cè)試界面

二、項(xiàng)目介紹
項(xiàng)目背景
掃雷是一款大眾類(lèi)的益智小游戲。根據(jù)點(diǎn)擊格子出現(xiàn)的數(shù)字找出所有非雷格子,同時(shí)避免踩雷,踩到一個(gè)雷即全盤(pán)皆輸。這款游戲有著很長(zhǎng)的歷史,從掃雷被開(kāi)發(fā)出來(lái)到現(xiàn)在進(jìn)行了無(wú)數(shù)次的優(yōu)化,這款游戲通過(guò)簡(jiǎn)單的玩法,加上一個(gè)好看的游戲界面,每一處的細(xì)節(jié)都體現(xiàn)了掃雷的魅力。
功能分析
完成 難度選擇,雷隨機(jī)生成,數(shù)字生成,左右鍵翻開(kāi) 等功能實(shí)現(xiàn)
游戲四種狀態(tài): 難度選擇、游戲狀態(tài)、游戲勝利、游戲失敗
游戲難度: 初級(jí)、中級(jí)、高級(jí)(不同難度對(duì)應(yīng)不同的雷區(qū)大小和雷數(shù)量)
游戲核心: 二維數(shù)組 的相關(guān)操作
其他: 窗口繪制、界面規(guī)劃、操作計(jì)數(shù)、重新開(kāi)始。
三、代碼展示
圖形界面設(shè)計(jì)(gui包)
主類(lèi):AppWindows類(lèi)
AppWindow類(lèi)負(fù)責(zé)創(chuàng)建游戲的主窗口,該類(lèi)含有main方法,程序從該類(lèi)開(kāi)始執(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;//掃雷級(jí)別
JMenuItem gradeOneList,gradeTwoList,gradeThreeList;//初,中,高級(jí)英雄榜
MineArea mineArea=null; //掃雷區(qū)域
ShowRecord showHeroRecord=null; //查看英雄榜
public AppWindow(){
bar=new JMenuBar();
fileMenu=new JMenu("掃雷游戲");
gradeOne=new JMenu("初級(jí)");
gradeTwo=new JMenu("中級(jí)");
gradeThree=new JMenu("高級(jí)");
gradeOneList=new JMenuItem("初級(jí)英雄榜");
gradeTwoList=new JMenuItem("中級(jí)英雄榜");
gradeThreeList=new JMenuItem("高級(jí)英雄榜");
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)建初級(jí)掃雷區(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();
}
}
用戶操作設(shè)計(jì)(data包)
Block類(lèi)
package ch8.data;
import javax.swing.ImageIcon;
public class Block {
String name; //名字,比如"雷"或數(shù)字
int aroundMineNumber; //如果不是類(lèi),此數(shù)據(jù)是周?chē)椎臄?shù)目
ImageIcon mineIcon; //雷的圖標(biāo)
public boolean isMine=false; //是否是雷
boolean isMark=false; //是否被標(biāo)記
boolean isOpen=false; //是否被挖開(kāi)
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類(lèi)
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個(gè)雷
initBlock(block); //先都設(shè)置是無(wú)雷
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){ //開(kāi)始布雷
int size=list.size(); // list返回節(jié)點(diǎn)的個(gè)數(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é)點(diǎn)
mineCount--;
}
for(int i=0;i<row;i++){ //檢查布雷情況,標(biāo)記每個(gè)方塊周?chē)睦椎臄?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è)置該方塊周?chē)睦讛?shù)目
}
}
}
}
}
PeopleScoutMine類(lèi)
package ch8.data;
import java.util.Stack;
public class PeopleScoutMine {
public Block [][] block; //雷區(qū)的全部方塊
Stack<Block> notMineBlock; //存放一個(gè)方塊周?chē)鷧^(qū)域內(nèi)不是雷的方塊
int m,n ; //方塊的索引下標(biāo)
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); //見(jià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類(lèi)
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ù)庫(kù)
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是否達(dá)到標(biāo)準(zhǔn)(進(jìn)入前heroNumber名),見(jiàn)后面的verifyScore方法:
int amount = verifyScore(time);
if(amount >= heroNumber) {
ok = false;
}
else {
connectDatabase(); //連接數(shù)據(jù)庫(kù)
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();//結(jié)果集中的全部記錄
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ù)庫(kù),如果不存在就創(chuàng)建
}
catch(Exception e){}
}
private int verifyScore(int time){
if(tableName == null)
return Integer.MAX_VALUE ;
connectDatabase(); //連接數(shù)據(jù)庫(kù)
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);//確定是哪個(gè)方塊的視圖
public void setDataOnView(); //設(shè)置視圖上需要顯示的數(shù)據(jù)
public void seeBlockNameOrIcon();//顯示圖標(biāo)方塊上的名字或
public void seeBlockCover(); //顯示視圖上負(fù)責(zé)遮擋的組件
public Object getBlockCover(); //得到視圖上的遮擋組件
}
游戲視圖設(shè)計(jì)(view包)
BlockView類(lèi)
package ch8.view;
import javax.swing.*;
import java.awt.*;
import ch8.data.*;
public class BlockView extends JPanel implements ViewForBlock{
JLabel blockNameOrIcon; //用來(lái)顯示Block對(duì)象的name、number和mineIcon屬性
JButton blockCover; //用來(lái)遮擋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類(lèi)
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; //負(fù)責(zé)布雷
PeopleScoutMine peopleScoutMine; //負(fù)責(zé)掃雷
int row,colum,mineCount,markMount;//雷區(qū)的行數(shù)、列數(shù)以及地雷個(gè)數(shù)和用戶給出的標(biāo)記數(shù)
ImageIcon mark; //探雷作的標(biāo)記
String grade; //游戲級(jí)別
JPanel pCenter,pNorth; //布局用的面板
JTextField showTime,showMarkedMineCount; //顯示用時(shí)和探雷作的標(biāo)記數(shù)目(不一定是雷哦)
Timer time; //計(jì)時(shí)器
int spendTime=0; //掃雷的用時(shí)
Record record; //負(fù)責(zé)記錄到英雄榜
PlayMusic playMusic; //負(fù)責(zé)播放雷爆炸的聲音
public MineArea(int row,int colum,int mineCount,String grade) {
record = new Record(); //負(fù)責(zé)保存成績(jī)到英雄榜
reStart=new JButton("重新開(kāi)始");
mark=new ImageIcon("掃雷圖片/mark.png"); //探雷標(biāo)記
time=new Timer(1000,this); //計(jì)時(shí)器,每個(gè)一秒觸發(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ū),見(jiàn)下面的initMineArea方法
reStart.addActionListener(this);
pNorth.add(new JLabel("剩余雷數(shù)(千萬(wàn)別弄錯(cuò)啊):"));
pNorth.add(showMarkedMineCount);
pNorth.add(reStart);
pNorth.add(new JLabel("用時(shí):"));
pNorth.add(showTime);
setLayout(new BorderLayout());
add(pNorth,BorderLayout.NORTH);
add(pCenter,BorderLayout.CENTER);
playMusic = new PlayMusic(); //負(fù)責(zé)播放觸雷爆炸的聲音
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); //準(zhǔn)備掃雷
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]); //方塊設(shè)置自己的視圖
blockView[i][j].setDataOnView(); //將block[i][j]的數(shù)據(jù)放入視圖
pCenter.add(blockView[i][j]);
blockView[i][j].getBlockCover().addActionListener(this);//注冊(cè)監(jiān)視器
blockView[i][j].getBlockCover().addMouseListener(this);
blockView[i][j].seeBlockCover(); //初始時(shí)蓋住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);//用戶單擊無(wú)效了
if(block[i][j].isMine())
blockView[i][j].seeBlockNameOrIcon(); //視圖顯示方塊上的數(shù)據(jù)信息
}
}
time.stop();
spendTime=0; //恢復(fù)初始值
markMount=mineCount; //恢復(fù)初始值
playMusic.playMusic(); //播放類(lèi)爆炸的聲音
}
else { //掃雷者得到block[m][n]周?chē)鷧^(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); //彈出錄入到英雄榜對(duì)話框
}
}
public void mousePressed(MouseEvent e){ //探雷:給方塊上插一個(gè)小旗圖標(biāo)(再次單擊取消)
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類(lèi)
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類(lèi)
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("記錄你的成績(jī)");
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,"成績(jī)不能上榜","消息框", JOptionPane.WARNING_MESSAGE);
}
}
}
ShowRecord類(lèi)
package ch8.view;
import java.awt.*;
import javax.swing.*;
import ch8.data.RecordOrShowRecord;
public class ShowRecord extends JDialog {
String [][] record;
JTextArea showMess;
RecordOrShowRecord rd;//負(fù)責(zé)查詢數(shù)據(jù)庫(kù)的對(duì)象
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,"沒(méi)人上榜呢","消息框", JOptionPane.WARNING_MESSAGE);
}
else {
for(int i =0 ;i<record.length;i++){
int m = i+1;
showMess.append("\n英雄"+m+":"+record[i][0]+" "+"成績(jī):"+record[i][1]);
showMess.append("\n--------------------------------");
}
setVisible(true);
}
}
}
四、代碼測(cè)試
這里我們創(chuàng)建test包,實(shí)現(xiàn)AppTest類(lèi)來(lái)進(jìn)行代碼的測(cè)試,代碼如下:
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); //準(zhǔn)備掃雷
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","■ "); //輸出■表示未挖開(kāi)方塊
}
else {
int m = block[i][j].getAroundMineNumber();//顯示周?chē)椎臄?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();//顯示周?chē)椎臄?shù)目
System.out.printf("%2s",m);
}
}
System.out.println();
}
}
}
五、項(xiàng)目結(jié)構(gòu)

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

