大连中软国际实训

春节倒计时

2020年春节时间:2020年1月25日 星期六 农历正月初一

2020年春节已经过去

110 天 6 时 4 分 38 秒

爆竹声中一岁除,春风送暖入屠苏。

—— 王安石《元日》

正题

10月7号下午一点到达大连,这也是我第一次去大连。

话不多说,此次实训的项目是扫雷小游戏,共用时两天。所用编程软件Eclipse,编程语言java,整体游戏分为三大类Block(方块),Mypanel(面板),TestMain(测试)。下面附上三大类代码加部分注释。

核心算法:

  1. 制造二维数组,然后随机生成一定数量的随机数(认为是雷,赋值给对应的数组位置),要求在二维数组范围内,后台数据二维数组的每个元素,使用一个对象,需要保存当前格子的几种状态。
  2. 循环后台数据二维数组,每循环一次,找到它周围的8个格子,统计雷的个数,然后给当前这个格子赋值(最终值为雷的个数)。
  3. 最核心的算法:点一个空白格子时,会自动翻开周围空白。当点击一个格子时,找到周围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

个人团队所做 仅供参考 有疑问下方留言

由于时间问题 我们没有涉及更多菜单功能 只是体现扫雷游戏的内部设计规则
南国旧梦i

南国旧梦i

出生于苏北小镇 习惯了一个人坐在电脑前 喜欢一个人听着音乐 梦想着一天有一趟说走就走的旅行·······目前过着大学生活,开始了程序人生。

2 Comments

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>