//棋子
public class Chess {
private boolean isBoomb=false;
private int id;//下标 //点击方法
public int click(IChessBoard cb) {
if (isBoomb) {
System.out.println("触雷");
return -1;
} //获取自己的所有邻居,把自己的ID传过去,然后进行判断每个邻居是否是炸弹
ArrayList<Chess> neig = cb.getNei(id); //cb.getNei();回调函数
int cnt = 0;
for (Chess c : neig) {
if (c.isBoomb) {
cnt++;//如果是雷
}
}
//
return cnt;
} //构造方法
public Chess(int id) {
this.id = id;
} public boolean isBoomb() {
return isBoomb;
} public void setBoomb(boolean boomb) {
isBoomb = boomb;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
}
}
 /**
* //得到一个参数,把此参数的所有邻居放到数组里
*
* @author liuwenlong
* @create 2020-07-21 13:57:14
*/
//棋盘类
@SuppressWarnings("all")
public class ChessBoard implements IChessBoard {
private ArrayList<Chess> board = new ArrayList<>();//构造一个随机数的地雷画板
private int maxx;
private int miny;
private int boomNum; public ChessBoard(int maxx, int miny, int boomNum) {
this.maxx = maxx;
this.miny = miny;
this.boomNum = boomNum;
initBoard();//初始化要调用一下
} //-------------------------------------
//获取一个棋子
public Chess getChess(int x, int y) {
return getChess(y * maxx + x);
} public Chess getChess(int id) {
return board.get(id);
}
//----------------------------------- public int getBoomNum() {
return boomNum;
} public void setBoomNum(int boomNum) {
this.boomNum = boomNum;
} public int getMaxx() {
return maxx;
} public void setMaxx(int maxx) {
this.maxx = maxx;
} public int getMiny() {
return miny;
} public void setMiny(int miny) {
this.miny = miny;
} public void initBoard() {
//构造棋子
for (int i = 0; i < (maxx * miny); i++) {
board.add(new Chess(i)); //在棋子构造方法内使用static自增
} //生成一些雷
//生成15个不重复的随机数,ArrayList<Integer> mineIds = 。。
// mineIds = ChessBoard.getRandom(mineIds, 0, maxx * miny);
// for (int i = 0; i < boomNum; i++) { //使用foreach
// board.[i].setBoomb(true);
// //board.get(i).setBoomb(true);
// }
ArrayList<Integer> mineIds = getRandom(0, 99, 15);
// for (int i = 0; i < boomNum; i++) {
// board.get(i).setBoomb(true);
// }
for (int i : mineIds) {
board.get(i).setBoomb(true);
}
} // int id = y*maxx+x;下标
public void showBoard() {
for (int i = 0; i < maxx; i++) {
String line = "";
for (int j = 0; j < maxx; j++) {
int id = i * maxx + j;
Chess c = board.get(id);
if (c.isBoomb()) {
line += 1 + " ";
} else {
line += 0 + " ";
}
}
System.out.println(line);
}
} /**
* 随机生成 N--M,N个不重复随机数 使用ArrayList
*
* @param startRange 起始数字
* @param endRange 终止数字
* @param count 个数
*/
public static ArrayList<Integer> getRandom(int startRange, int endRange, int count) {
ArrayList<Integer> arr = new ArrayList<>();
for (int i = 0; i < count; i++) {
arr.add(((int) (Math.random() * (endRange - startRange + 1) + startRange)));
for (int j = 0; j < i; j++) {
if (arr.get(i) == arr.get(j)) {
arr.remove(i);
i--;
break;
}
}
}
return arr;
} //给一个下标,算出该id周围所有邻居
@Override
public ArrayList<Chess> getNei(int id) { //根据下标转换坐标
//整除 id/maxx--y坐标
//取余 id%max --x 坐标
int x0 = id % maxx;
int y0 = id / maxx; //邻居列表
ArrayList<Chess> nei = new ArrayList<>();
for (int ydlt = -1; ydlt < 2; ydlt++) {
int y = y0 + ydlt;
if (y < 0 || y >= miny) { //miny
continue;
}
for (int xdlt = -1; xdlt < 2; xdlt++) {
int x = x0 + xdlt;
if (x < 0 || x >= maxx || (xdlt == 0 && ydlt == 0)) {
continue;
} //这个棋子是邻居,根据坐标换成下标
int cid = y * maxx + x;
nei.add(board.get(cid));
}
}
return nei;
} public ArrayList<Chess> getNei(int x, int y) { return getNei(y * maxx + x); //坐标转下标
}
}
 /**
* @author liuwenlong
* @create 2020-07-21 14:01:38
*/
@SuppressWarnings("all")
public interface IChessBoard {
//告诉我哪一个棋子
public ArrayList<Chess> getNei(int id);
}
 /**
* @author liuwenlong
* @create 2020-07-21 14:28:09
*/
@SuppressWarnings("all")
public class Test {
public static void main(String[] args) {
ChessBoard cb = new ChessBoard(10, 10, 15);
cb.showBoard();
System.out.println("点击的'X'坐标为:");
int x = new Scanner(System.in).nextInt();
System.out.println("点击的'Y'坐标为:");
int y = new Scanner(System.in).nextInt();
int number = cb.getChess(x, y).click(cb);
if (number>=0){
System.out.println("共有"+number+"个雷");
}
}
}

Java模拟实现扫雷功能的更多相关文章

  1. Java基础面试操作题:线程同步代码块 两个客户往一个银行存钱,每人存三十次一次存一百。 模拟银行存钱功能,时时银行现金数。

    package com.swift; public class Bank_Customer_Test { public static void main(String[] args) { /* * 两 ...

  2. java模拟浏览器包selenium整合了htmlunit,火狐浏览器,IE浏览器,opare浏览器驱

    //如果网页源码中有些内容是js渲染过来的,那你通过HttpClient直接取肯定取不到,但是这些数据一般都是通过异步请求传过来的(一般都是通过ajax的get或者post方式).那么你可以通过火狐浏 ...

  3. 使用Java模拟一个简单的Dos学生成绩管理系统:

    使用Java模拟学生成绩管理系统... ------------------- 学生成绩管理系统:需要实现的功能:1.录入学生的姓名和成绩2.显示列表.列表中包括学生姓名与成绩3.显示最高分.最低分的 ...

  4. 浏览器与服务器交互原理以及用java模拟浏览器操作v

    浏览器应用服务器JavaPHPApache * 1,在HTTP的WEB应用中, 应用客户端和服务器之间的状态是通过Session来维持的, 而Session的本质就是Cookie, * 简单的讲,当浏 ...

  5. Java 基本数据类型 sizeof 功能

    Java 基本数据类型 sizeof 功能 来源 https://blog.csdn.net/ithomer/article/details/7310008 Java基本数据类型int     32b ...

  6. ListView模拟微信好友功能

    ListView模拟微信好友功能 效果图: 分析: 1.创建listView 2.创建数据 3.创建适配器 将数据放到呈现数据的容器里面. 将这个容器(带数据)连接适配器. 其实是直接在我们自己写的a ...

  7. TCP模拟QQ聊天功能

    需求: 模拟qq聊天功能:实现客户端与服务器(一对一)的聊天功能,客户端首先发起聊天,输入的内容在服务器端和客户端显示,然后服务器端也可以输入信息,同样信息在客户端和服务端显示. 提示: 客户端 1) ...

  8. java模拟post请求发送json

    java模拟post请求发送json,用两种方式实现,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: package main ...

  9. java 模拟qq源码

    java 模拟qq源码: http://files.cnblogs.com/files/hujunzheng/QQ--hjzgg.zip

随机推荐

  1. C#设计模式之1-工厂方法模式

    工厂方法模式(Factory Method Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/389 访问 ...

  2. 从0写一个Golang日志处理包

    WHY 日志概述 日志几乎是每个实际的软件项目从开发到最后实际运行过程中都必不可少的东西.它对于查看代码运行流程,记录发生的事情等方面都是很重要的. 一个好的日志系统应当能准确地记录需要记录的信息,同 ...

  3. 如何实现字符串转换成整数(实现atoi内置函数)?

    题目描述 输入一个由数字组成的字符串,把它转换成整数并输出.例如:输入字符串"123",输出整数123. 给定函数原型int StrToInt(const char *str) , ...

  4. vue跳转页面问题记录

    跳转到别的页面带参数 const space = this.pageHelperspace['search'] = this.searchconst query_params = Object.ass ...

  5. Python+Pytest+Allure+Git+Jenkins接口自动化框架

    Python+Pytest+Allure+Git+Jenkins接口自动化框架 一.接口基础 接口测试是对系统和组件之间的接口进行测试,主要是效验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系. ...

  6. Java callback回调

    package com.callback; public interface CSCallBack { public void process(String status); } package co ...

  7. Linux环境下安装MySQL数据库

    Linux安装mysql服务分两种安装方法: (1).源码安装,优点是安装包比较小,只有十多M,缺点是安装依赖的库多,安装编译时间长,安装步骤复杂容易出错: (2).使用官方编译好的二进制文件安装,优 ...

  8. Java数据结构——双端队列

    双端队列(Deque)双端队列是指允许两端都可以进行入队和出队操作的队列,其元素的逻辑结构仍是线性结构.将队列的两端分别称为前端和后端,两端都可以入队和出队.Deque继承自Queue接口,Deque ...

  9. await,async 我要把它翻个底朝天,这回你总该明白了吧

    一:背景 1. 讲故事 await,async 这玩意的知识点已经被人说的烂的不能再烂了,看似没什么好说的,但我发现有不少文章还是从理论上讲述了这两个语法糖的用法,懂得还是懂,不懂的看似懂了过几天又不 ...

  10. javascript 查找属性的过程

     当执行 一个对象赋值操作的时候  js引擎会怎样处理呢??? 例如  有个foo对象  ,要进行这个操作 foo.a=2 1, 首先会在foo对象中查找,如果不存在a属性,就会去原型链上面找,如果原 ...