春节倒计时
2020年春节时间:2020年1月25日 星期六 农历正月初一
2020年春节已经过去
110 天
6 时
4 分
38 秒
爆竹声中一岁除,春风送暖入屠苏。
—— 王安石《元日》
正题
10月7号下午一点到达大连,这也是我第一次去大连。
话不多说,此次实训的项目是扫雷小游戏,共用时两天。所用编程软件Eclipse,编程语言java,整体游戏分为三大类Block(方块),Mypanel(面板),TestMain(测试)。下面附上三大类代码加部分注释。
核心算法:
- 制造二维数组,然后随机生成一定数量的随机数(认为是雷,赋值给对应的数组位置),要求在二维数组范围内,后台数据二维数组的每个元素,使用一个对象,需要保存当前格子的几种状态。
- 循环后台数据二维数组,每循环一次,找到它周围的8个格子,统计雷的个数,然后给当前这个格子赋值(最终值为雷的个数)。
- 最核心的算法:点一个空白格子时,会自动翻开周围空白。当点击一个格子时,找到周围8个格子对应的位置,重复使用当前方法(函数)即可。
Block类
import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class Block { private int x;//块的x轴坐标 private int y;//块的y轴坐标 //判断是否被翻开 false未翻开 true翻开 public boolean flip = false; public int v = 0; //方块的状态0~8显示的是对应的数字 9代表雷 public int category; private int i; //有参构造 public Block(int x, int y) { super(); this.x = x; this.y = y; } public static Image a; public static Image num[] = new Image[9]; public static Image fl[] = new Image[3]; public static Image lei; public static Image qi; private static BufferedImage wen; private static BufferedImage hlei; static{ try{ a=ImageIO.read(new File("images/flag0.jpg")); for(int i = 0;i < 9;i++){ num[i] = ImageIO.read(new File("images/"+i+".jpg")); } lei = ImageIO.read(new File("images/bomb4.jpg")); hlei = ImageIO.read(new File("images/bomb0.jpg")); qi = ImageIO.read(new File("images/flag1.jpg")); wen = ImageIO.read(new File("images/flag2.jpg")); }catch (IOException e) { e.printStackTrace(); } } //块中的画图方法 public void draw(Graphics arg0) { if(flip){ if(category == 9){ arg0.drawImage(lei,x,y,51,51,null); arg0.drawImage(hlei,x,y,51,51,null); } if(category>=0 && category<= 8){ arg0.drawImage(num[category],x,y,51,51,null); } } else{ if(v%3 == 0){ arg0.drawImage(a,x,y,51,51,null); } if(v%3 == 1){ arg0.drawImage(qi,x,y,51,51,null); } if(v%3 == 2){ arg0.drawImage(wen,x,y,51,51,null); } } } }
Mypanel类
import java.awt.Graphics; import java.awt.Image; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.File; import javax.imageio.ImageIO; import javax.swing.JPanel; public class Mypanel extends JPanel{ public int row = 9; public int col = 9; public Block blocks[][]; public Mypanel(){ //块的操作 init(); addMouseListener(new MouseListener() { private Object qi; @Override public void mouseReleased(MouseEvent arg0) { } @Override public void mousePressed(MouseEvent arg0) { } @Override public void mouseExited(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseEntered(MouseEvent arg0) { } @Override public void mouseClicked(MouseEvent arg0) { int y = arg0.getX()/51; int x = arg0.getY()/51; //点击鼠标左键 if(arg0.getButton() == arg0.BUTTON1){ System.out.println(x+" "+y); blocks[x][y].flip = true; if(blocks[x][y].category == 0){ filpAround(x,y);} if(blocks[x][y].category == 9){ for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { blocks[i][j].flip=true; } } } } //点击鼠标右键 if(arg0.getButton() == arg0.BUTTON3){ blocks[x][y].v++; } } private void filp1Around(int x, int y) { // TODO Auto-generated method stub } }); } private void filpAround(int x, int y) { //左上 if(x-1 >= 0 && y-1 >=0 && !blocks[x-1][y-1].flip){ blocks[x-1][y-1].flip = true; if(blocks[x-1][y-1].category == 0){ filpAround(x-1,y-1); } } //上 if(y-1 >=0 && !blocks[x][y-1].flip){ blocks[x][y-1].flip = true; if(blocks[x][y-1].category == 0){ filpAround(x,y-1); } } //右上 if(x+1 <= 8 && y-1 >=0 && !blocks[x+1][y-1].flip){ blocks[x+1][y-1].flip = true; if(blocks[x+1][y-1].category == 0){ filpAround(x+1,y-1); } } //左 if(x-1 >=0 && !blocks[x-1][y].flip){ blocks[x-1][y].flip = true; if(blocks[x-1][y].category == 0){ filpAround(x-1,y); } } //右 if(x+1 <= 8 && !blocks[x+1][y].flip){ blocks[x+1][y].flip = true; if(blocks[x+1][y].category == 0){ filpAround(x+1,y); } } //左下 if(x-1 >=0 && y+1 <= 8 && !blocks[x-1][y+1].flip){ blocks[x-1][y+1].flip = true; if(blocks[x-1][y+1].category == 0){ filpAround(x-1,y+1); } } //下 if( y+1 <= 8 && !blocks[x][y+1].flip){ blocks[x][y+1].flip = true; if(blocks[x][y+1].category == 0){ filpAround(x,y+1); } } //右下 if(x+1 <= 8 && y+1 <= 8 && !blocks[x+1][y+1].flip){ blocks[x+1][y+1].flip = true; if(blocks[x+1][y+1].category == 0){ filpAround(x+1,y+1); } } } private void init() { //给每个块进行初始化 blocks = new Block[row][col]; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { //给每一个块设置x轴和y轴的坐标 blocks[i][j] = new Block(j*51,i*51); } } //设置随机雷 10个雷 for (int i = 0; i < 10; i++) { int x = (int)(Math.random()*9); int y = (int)(Math.random()*9); if(blocks[x][y].category != 9){ blocks[x][y].category = 9; } } //设置非雷数字 //① 2个for目的 找 81个块 for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { //② 保证当前位置一定不是雷 if(blocks[i][j].category != 9){ //左上 判断i-1和j-1 满足条件 并且 他是雷 的情况 if(i-1>=0 && j-1>=0 && blocks[i-1][j-1].category == 9){ blocks[i][j].category++; } //上 if(j-1>=0 && blocks[i][j-1].category == 9){ blocks[i][j].category++; } //右上 if(i+1<=8 && j-1>=0 && blocks[i+1][j-1].category == 9){ blocks[i][j].category++; } //左 if(i-1>=0 && blocks[i-1][j].category == 9){ blocks[i][j].category++; } //右 if(i+1<=8 && blocks[i+1][j].category == 9){ blocks[i][j].category++; } //左下 if(i-1>=0 && j+1<=8 && blocks[i-1][j+1].category == 9){ blocks[i][j].category++; } //下 if(j+1<=8 && blocks[i][j+1].category == 9){ blocks[i][j].category++; } //右下 if(i+1<=8 && j+1<=8 && blocks[i+1][j+1].category == 9){ blocks[i][j].category++; } } } } } //显示数组 /* * for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { //print在一行输出 * System.out.print(blocks[i][j].category+" "); } System.out.println(); * //println换行输出 } * 此处为数组显示 除去注释符 可在eclipse内显示数组情况 * } */ //画图 把每一个块都画到面板上 @Override public void paint(Graphics arg0) { super.paint(arg0); //画图 图片 横轴 纵轴 宽 高 //arg0.drawImage(a, 61, 30, 51, 51, null); for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { blocks[i][j].draw(arg0); } } } //开启一个线程让画板一直重绘 public void start(){ new Thread(){ public void run(){ while(true){ repaint(); try{ Thread.sleep(10); }catch (InterruptedException e) { e.printStackTrace(); } } }; }.start(); } }
TestMain类
import java.awt.EventQueue; import javax.swing.JFrame; public class TestMain extends JFrame{ public static void main(String[] args) { EventQueue.invokeLater(new Runnable(){ public void run(){ try{ new TestMain(); }catch (Exception e){ e.printStackTrace(); } } }); } public TestMain(){ //窗口 setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(600, 500, 473, 495); //面板 Mypanel jpanel = new Mypanel(); jpanel.setLayout(null); jpanel.start(); jpanel.setBounds(900, 900, 600,600); //获取面板内容 setContentPane(jpanel); } }
上述代码要将images文件夹放在项目目录内部
images文件下载地址: https://www.lanzous.com/i6s1lef
个人团队所做 仅供参考 有疑问下方留言
由于时间问题 我们没有涉及更多菜单功能 只是体现扫雷游戏的内部设计规则
留下你的评论
*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>
2 Comments
你晚上睡觉翻身的样子真可爱
你个大zz