1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > JAVA程序设计——扫雷小游戏

JAVA程序设计——扫雷小游戏

时间:2020-10-20 09:37:45

相关推荐

JAVA程序设计——扫雷小游戏

项目简介

经典小游戏扫雷。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。左键打开方块,右键标记地雷。点击中间状态重置游戏,滚轮重新选择难度。

项目关键技术

java变量、java数据类型、判断语句、循环结构、数组、Java集合、简单窗口创建、图形图片绘制、双缓存技术、鼠标事件、awt抽象窗口工具包、部分复杂算法、GUI界面、面向对象程序设计等。

开发环境:jdk17

开发工具:IDEA

项目需求分析:

1.鼠标左键点击可翻开方块。

2.鼠标右键点击可标记地雷(插旗)。

3.点击到空白区域可使相连所有空白区域和数字区域被翻开。

4.鼠标滚轮键可返回难度选择页面。

5.标记所有的地雷即胜利,翻到地雷则失败。

功能架构图

功能截图演示部分

简单的难度选择页面

点到空白。

游戏失败

游戏胜利。

项目git地址及成员提交记录

Kotobukisir/MineSweeper: 课程设计 ()

代码展示

GameMine.java

package Main;import Control.Difficulty;import Display.Surface;import Display.LnnerLayer;import Util.Util;import javax.swing.*;import java.awt.*;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;public class GameMain extends JFrame {Image connect = null;Image caidan = null;//双缓存int width = 2* Util.LEI + Util.U_W * Util.LENGTH;int height = 4*Util.LEI + Util.U_H * Util.LENGTH;LnnerLayer LnnerLayer = new LnnerLayer();Surface Surface = new Surface();Difficulty difficulty = new Difficulty();boolean begin=false;void launch(){this.setVisible(true);if(Util.state==3)//难度选择窗口{this.setSize(500,350);}else//游戏窗口{this.setSize(width,height);}this.setLocationRelativeTo(null);this.setTitle("扫雷游戏");this.setDefaultCloseOperation(EXIT_ON_CLOSE);Util.time1=System.currentTimeMillis();this.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {super.mouseClicked(e);switch (Util.state){case 0:if(e.getButton()==1){Util.MOUSE_X = e.getX();Util.MOUSE_Y = e.getY();Util.LEFT = true;}if(e.getButton()==3){Util.MOUSE_X = e.getX();Util.MOUSE_Y = e.getY();Util.RIGHT = true;}case 1:case 2:if(e.getButton()==1){if(e.getX()>Util.LEI+Util.LENGTH*(Util.U_W/2)&&e.getX()<Util.LEI+Util.LENGTH*(Util.U_W/2)+Util.LENGTH&&e.getY()>Util.LEI&&e.getY()<Util.LEI+Util.LENGTH){LnnerLayer.restart();Surface.restart();Util.qi=0;Util.state=0;Util.time1=System.currentTimeMillis();}}if(e.getButton()==2){Util.state=3;begin = true;}break;case 3:if(e.getButton()==1){Util.MOUSE_X = e.getX();Util.MOUSE_Y = e.getY();begin = difficulty.SWnandu();}default:}}});while(true){repaint();begin();}}@Overridepublic void paint(Graphics g)//双缓冲绘制画布{if(Util.state==3){caidan = this.createImage(500,350);Graphics gImage = caidan.getGraphics();g.setColor(Color.LIGHT_GRAY);g.fillRect(0,0,500,350);difficulty.paintSelf(gImage);g.drawImage(caidan,0,0,null);}else{connect = this.createImage(width, height);Graphics huabi1 = connect.getGraphics();huabi1.setColor(Color.white);huabi1.fillRect(0, 0, width, height);LnnerLayer.paintSelf(huabi1);Surface.paintSelf(huabi1);g.drawImage(connect, 0, 0, null);}}public static void main(String[] args){GameMain gameMain = new GameMain();gameMain.launch();}public void begin()//重置{if(begin){begin=false;difficulty.SWnandu(Util.nandu);GameMain gameMain = new GameMain();dispose();Util.time1=System.currentTimeMillis();Surface.restart();LnnerLayer.restart();Util.qi=0;gameMain.launch();}}}

Util.java

package Util;import javax.swing.*;import java.awt.*;//工具类public class Util {public static int U_W = 30;public static int U_H = 30;//格子数public static int LEI = 40;//偏移public static int LENGTH = 40;//格子长度public static int LEI_MAX = 50;//雷public static int MOUSE_X;public static int MOUSE_Y;public static boolean LEFT=false;public static boolean RIGHT=false;public static int qi=0;//旗数public static int state = 3;//状态,0进行,1赢,2输,3选择难度public static int nandu;public static int[][] MINE = new int[U_W+2][U_H+2];//0无,-1雷,其余数字public static int[][] TOP = new int[U_W+2][U_H+2];//0遮盖,1旗帜,2错旗,-1空public static long time1;//开始时间public static long time2;//终止时间public static Image lei = Toolkit.getDefaultToolkit().getImage("D:/kecheng1/MineSweeper/Images/lei.png");public static Image top = Toolkit.getDefaultToolkit().getImage("D:/kecheng1/MineSweeper/Images/top.png");public static Image flag = Toolkit.getDefaultToolkit().getImage("D:D:/kecheng1/MineSweeper/Images/qi.png");public static Image death = Toolkit.getDefaultToolkit().getImage("D:/kecheng1/MineSweeper/images/death.png");public static Image ying = Toolkit.getDefaultToolkit().getImage("D:/kecheng1/MineSweeper/images/赢.png");public static Image shu = Toolkit.getDefaultToolkit().getImage("D:/kecheng1/MineSweeper/images/输.png");public static Image zhong = Toolkit.getDefaultToolkit().getImage("D:/kecheng1/MineSweeper/images/中.png");public static Image start = Toolkit.getDefaultToolkit().getImage("D:/kecheng1/MineSweeper/images/start.png");public static Image[] images = new Image[9];static{for(int i=1;i<=8;i++){images[i]=Toolkit.getDefaultToolkit().getImage("D:/kecheng1/MineSweeper/images/"+i+".png");}}public static void Word(Graphics g,String str,int x,int y,int size,Color color){g.setColor(color);g.setFont(new Font("宋体",Font.BOLD,size));g.drawString(str, x, y);}}

LnnerLayer

package Display;import java.awt.*;import Util.*;import Control.*;public class LnnerLayer {Mine Mine = new Mine();Num Num = new Num();{Mine.newlei();Num.newshuzi();}public void restart()//重置里层{for(int i = 1; i<= Util.U_W; i++){for(int j = 1; j<= Util.U_H; j++){Util.MINE[i][j]=0;}}Mine.newlei();Num.newshuzi();}public void paintSelf(Graphics g)//绘制里层{g.setColor(Color.black);for(int i = 0; i <= Util.U_W; i++)//绘制竖线{g.drawLine(Util.LEI+i* Util.LENGTH,3* Util.LEI,Util.LEI+i* Util.LENGTH,3* Util.LEI+ Util.U_H* Util.LENGTH);}for(int i = 0; i <= Util.U_H; i++)//绘制横线{g.drawLine(Util.LEI,3* Util.LEI+i* Util.LENGTH,Util.LEI+ Util.U_W* Util.LENGTH,3* Util.LEI+i* Util.LENGTH);}for(int i = 1; i <= Util.U_W; i++)//雷和数字的图片{for(int j = 1; j<= Util.U_H; j++){if(Util.MINE[i][j]==-1) {g.drawImage(Util.lei,Util.LEI + (i - 1) * Util.LENGTH + 1,Util.LEI * 3 + (j - 1) * Util.LENGTH + 1,Util.LENGTH + 2,Util.LENGTH + 2,null);}if(Util.MINE[i][j] >=0) {g.drawImage(Util.images[Util.MINE[i][j]],Util.LEI + (i - 1) * Util.LENGTH + 1,Util.LEI * 3 + (j - 1) * Util.LENGTH + 1,Util.LENGTH -2,Util.LENGTH -2,null);}}}Util.Word(g,""+(Util.LEI_MAX- Util.qi), Util.LEI,2* Util.LEI,30,Color.black);Util.Word(g,""+(Util.time2- Util.time1)/1000, Util.LEI+ Util.LENGTH*(Util.U_W)-10,2* Util.LEI,30,Color.black);//显示剩余雷数和剩余时间g.drawImage(Util.start,Util.LEI+ Util.LENGTH*(Util.U_W/2)-3,Util.LEI-3,Util.LENGTH+10,Util.LENGTH+10,null);switch (Util.state)//状态显示{case 0:g.drawImage(Util.zhong,Util.LEI+ Util.LENGTH*(Util.U_W/2)+3,Util.LEI,Util.LENGTH+2,Util.LENGTH+2,null);Util.time2=System.currentTimeMillis();break;case 1:g.drawImage(Util.ying,Util.LEI+ Util.LENGTH*(Util.U_W/2)+3,Util.LEI,Util.LENGTH+2,Util.LENGTH+2,null);break;case 2:g.drawImage(Util.shu,Util.LEI+ Util.LENGTH*(Util.U_W/2)+3,Util.LEI,Util.LENGTH+2,Util.LENGTH+2,null);break;}}}

Surface.java

package Display;import java.awt.*;import Util.*;import Control.*;public class Surface {public static void faillei()//失败显示所有雷{for(int i = 1; i<= Util.U_W; i++){for(int j = 0; j<= Util.U_H; j++){if(Util.MINE[i][j]==-1&& Util.TOP[i][j]!=1){Util.TOP[i][j]=-1;}if(Util.MINE[i][j]!=-1&& Util.TOP[i][j]==1){Util.TOP[i][j]=2;}}}}public void restart()//重写表层{for(int i = 1; i<= Util.U_W; i++){for(int j = 1; j<= Util.U_H; j++){Util.TOP[i][j]=0;}}}public static void kong(int x, int y)//空白翻开{if(Util.MINE[x][y]==0){for(int i=x-1;i<=x+1;i++){for(int j=y-1;j<=y+1;j++){if(Util.TOP[i][j]!=-1){if(Util.TOP[i][j]==1){Util.qi--;}Util.TOP[i][j] = -1;if(i>=1&&j>=1&&i<= Util.U_W&&j<= Util.U_H){kong(i,j);}}}}}}public void paintSelf(Graphics g)//绘制表层内容{g.setColor(Color.black);Mouse.logic();for(int i = 1; i <= Util.U_W; i++){for(int j = 1; j<= Util.U_H; j++){if(Util.TOP[i][j]==0) {g.drawImage(Util.top,Util.LEI + (i - 1) * Util.LENGTH + 1,Util.LEI * 3 + (j - 1) * Util.LENGTH + 1,Util.LENGTH + 2,Util.LENGTH + 2,null);}if(Util.TOP[i][j]==1) {g.drawImage(Util.flag,Util.LEI + (i - 1) * Util.LENGTH + 1,Util.LEI * 3 + (j - 1) * Util.LENGTH + 1,Util.LENGTH + 2,Util.LENGTH + 2,null);}if(Util.TOP[i][j]==2) {g.drawImage(Util.death,Util.LEI + (i - 1) * Util.LENGTH + 1,Util.LEI * 3 + (j - 1) * Util.LENGTH + 1,Util.LENGTH + 2,Util.LENGTH + 2,null);}}}}}

Difficult

package Control;import Util.Util;import java.awt.*;public class Difficulty {public boolean SWnandu() {if (Util.MOUSE_X > 100 && Util.MOUSE_X < 400) {if (Util.MOUSE_Y > 50 && Util.MOUSE_Y < 150) {Util.nandu = 1;Util.state = 0;return true;}if (Util.MOUSE_Y > 200 && Util.MOUSE_Y < 300) {Util.nandu = 2;Util.state = 0;return true;}}return false;}//判断点击public void paintSelf(Graphics g) {g.setColor(Color.black);g.drawRect(100, 50, 300, 100);Util.Word(g, "简单", 220, 100, 30, Color.black);g.drawRect(100, 200, 300, 100);Util.Word(g, "困难", 220, 250, 30, Color.black);}//绘制选项public void SWnandu(int nandu) {switch (nandu) {case 1:Util.LEI_MAX = 10;Util.U_W = 11;Util.U_H = 11;break;case 2:Util.LEI_MAX = 40;Util.U_W = 20;Util.U_H = 15;default:}}//难度}

Mine.java

package Control;import Util.*;public class Mine {int[] leis = new int[Util.LEI_MAX*2];int x,y;boolean can = true;public void newlei()//雷区生成{for (int i = 0; i < Util.LEI_MAX * 2; i = i + 2){x = (int) (Math.random() * Util.U_H +1);y = (int) (Math.random() * Util.U_W +1);for(int j=0;j<i;j=j+2)//判断重叠{if(x==leis[j]&&y==leis[j+1]){i=i-2;can = false;break;}}if(can){leis[i]=x;leis[i+1]=y;}can = true;}for(int i = 0; i< Util.LEI_MAX*2; i=i+2){Util.MINE[leis[i]][leis[i+1]]=-1;}}}

Mouse.java

package Control;import Util.Util;import Display.*;public class Mouse {static int L_x;static int L_Y;public static void logic()//接收判断鼠标{L_Y=0;L_x=0;if(Util.MOUSE_X> Util.LEI&& Util.MOUSE_Y>3* Util.LEI)//鼠标位置{L_x=(Util.MOUSE_X- Util.LEI)/ Util.LENGTH+1;L_Y=(Util.MOUSE_Y- Util.LEI*3)/ Util.LENGTH+1;}if(L_x>=1 && L_x<= Util.U_W && L_Y>=1 && L_Y<= Util.U_H){if (Util.LEFT) //翻{if(Util.TOP[L_x][L_Y]==0){Util.TOP[L_x][L_Y]=-1;}Surface.kong(L_x,L_Y);Util.LEFT = false;}if (Util.RIGHT)//插旗拔旗{if(Util.TOP[L_x][L_Y]==0){Util.TOP[L_x][L_Y]=1;Util.qi++;}else if(Util.TOP[L_x][L_Y]==1){Util.TOP[L_x][L_Y]=0;Util.qi--;}Util.RIGHT = false;}}VoD.fail();VoD.win();}}

Num.java

package Control;import Util.*;public class Num {public void newshuzi(){for (int i = 1; i <= Util.U_W; i++){for (int j = 1; j <= Util.U_H; j++){if(Util.MINE[i][j]==-1){for(int k=i-1;k<=i+1;k++){for(int l=j-1;l<=j+1;l++){if(Util.MINE[k][l]>=0){Util.MINE[k][l]++;}}}}}}}}

VoD.java

package Control;import Util.Util;import Display.Surface;public class VoD{public static boolean win()//胜利判断{int count=0;for(int i = 1; i<= Util.U_W; i++){for (int j = 1; j<= Util.U_H; j++){if(Util.TOP[i][j]!=-1){count++;}}}if(count== Util.LEI_MAX){Util.state=1;for (int i = 1; i <= Util.U_W; i++){for (int j = 1; j <= Util.U_H; j++){if(Util.TOP[i][j]==0){Util.TOP[i][j]=1;}}}return true;}return false;}public static boolean fail()//失败判断{if(Util.qi== Util.LEI_MAX){for(int i = 1; i<= Util.U_W; i++){for (int j = 1; j <= Util.U_H; j++){if(Util.TOP[i][j]==0){Util.TOP[i][j]=-1;}}}}for(int i = 1; i<= Util.U_W; i++){for(int j = 1; j<= Util.U_H; j++){if(Util.MINE[i][j]==-1&& Util.TOP[i][j]==-1){Util.state=2;Surface.faillei();return true;}}}return false;}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。