Java模拟实现扫雷功能
//棋子
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模拟实现扫雷功能的更多相关文章
- Java基础面试操作题:线程同步代码块 两个客户往一个银行存钱,每人存三十次一次存一百。 模拟银行存钱功能,时时银行现金数。
package com.swift; public class Bank_Customer_Test { public static void main(String[] args) { /* * 两 ...
- java模拟浏览器包selenium整合了htmlunit,火狐浏览器,IE浏览器,opare浏览器驱
//如果网页源码中有些内容是js渲染过来的,那你通过HttpClient直接取肯定取不到,但是这些数据一般都是通过异步请求传过来的(一般都是通过ajax的get或者post方式).那么你可以通过火狐浏 ...
- 使用Java模拟一个简单的Dos学生成绩管理系统:
使用Java模拟学生成绩管理系统... ------------------- 学生成绩管理系统:需要实现的功能:1.录入学生的姓名和成绩2.显示列表.列表中包括学生姓名与成绩3.显示最高分.最低分的 ...
- 浏览器与服务器交互原理以及用java模拟浏览器操作v
浏览器应用服务器JavaPHPApache * 1,在HTTP的WEB应用中, 应用客户端和服务器之间的状态是通过Session来维持的, 而Session的本质就是Cookie, * 简单的讲,当浏 ...
- Java 基本数据类型 sizeof 功能
Java 基本数据类型 sizeof 功能 来源 https://blog.csdn.net/ithomer/article/details/7310008 Java基本数据类型int 32b ...
- ListView模拟微信好友功能
ListView模拟微信好友功能 效果图: 分析: 1.创建listView 2.创建数据 3.创建适配器 将数据放到呈现数据的容器里面. 将这个容器(带数据)连接适配器. 其实是直接在我们自己写的a ...
- TCP模拟QQ聊天功能
需求: 模拟qq聊天功能:实现客户端与服务器(一对一)的聊天功能,客户端首先发起聊天,输入的内容在服务器端和客户端显示,然后服务器端也可以输入信息,同样信息在客户端和服务端显示. 提示: 客户端 1) ...
- java模拟post请求发送json
java模拟post请求发送json,用两种方式实现,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: package main ...
- java 模拟qq源码
java 模拟qq源码: http://files.cnblogs.com/files/hujunzheng/QQ--hjzgg.zip
随机推荐
- leetcode刷题笔记-3. 无重复字符的最长子串(java实现)
题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "ab ...
- C++ 对象的初始化
目录 默认初始化 默认构造函数(default constructor) 构造函数初始值列表(cosntructor initializer list) 直接初始化和拷贝初始化 拷贝构造函数(copy ...
- CheckList:ACL 2020 Best Paper
Beyond Accuracy: Behavior Testing of NLP Models with CheckList. Marco Tulio Ribeiro, Tongshuang Wu, ...
- jQuery的事件与 动画
什么是事件: 事件的本质是委托. Jquery的 方法: $().css(); $().click(); 等等. 鼠标的事件: 区别在于:mouseover与mouseout再进入或离开后会执行这两个 ...
- Hydra's plan
省选前的计划,实时更新(不知道能不能把挖的坑填完呢qwq) 链接
- Windows10 + Ubuntu 20.04 LTS 双系统安装 (UEFI + GPT)(图文,多图预警)
版权声明:本文为CSDN博主「ZChen1996」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/ZChen1 ...
- 二叉搜索树 [四边形不等式优化区间dp]
二叉搜索树 [四边形不等式优化区间dp] 题目描述 有 \(n\) 个结点,第 \(i\) 个结点的权值为 \(i\) . 你需要对它们进行一些操作并维护一些信息,因此,你需要对它们建立一棵二叉搜索树 ...
- [源码解析] 当 Java Stream 遇见 Flink
[源码解析] 当 Java Stream 遇见 Flink 目录 [源码解析] 当 Java Stream 遇见 Flink 0x00 摘要 0x01 领域 1.1 Flink 1.2 Java St ...
- Windows下搭载虚拟机以及环境安装
前言 最近回到家中进行赛前自主提升 模拟赛考虑到考试环境是NOI Linux 而大多数同学电脑环境为Windows 有同学想要模拟真实考试环境 但是NOI Linux的系统过于"阉割版&qu ...
- Federated Optimization for Heterogeneous Networks
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:1812.06127v3 [cs.LG] 11 Jul 2019 目录: Abstract 1 Introduction 2 ...