Java模拟实现扫雷功能

 1 //棋子
 2 public class Chess {
 3     private boolean isBoomb=false;
 4     private int id;//下标
 5 
 6     //点击方法
 7     public int click(IChessBoard cb) {
 8         if (isBoomb) {
 9             System.out.println("触雷");
10             return -1;
11         }
12 
13         //获取自己的所有邻居,把自己的ID传过去,然后进行判断每个邻居是否是炸弹
14         ArrayList<Chess> neig = cb.getNei(id);  //cb.getNei();回调函数
15         int cnt = 0;
16         for (Chess c : neig) {
17             if (c.isBoomb) {
18                 cnt++;//如果是雷
19             }
20         }
21         //
22         return cnt;
23     }
24 
25 
26     //构造方法
27     public Chess(int id) {
28         this.id = id;
29     }
30 
31     public boolean isBoomb() {
32         return isBoomb;
33     }
34 
35     public void setBoomb(boolean boomb) {
36         isBoomb = boomb;
37     }
38 
39     public int getId() {
40         return id;
41     }
42 
43     public void setId(int id) {
44         this.id = id;
45     }
46 }
  1 /**
  2  * //得到一个参数,把此参数的所有邻居放到数组里
  3  *
  4  * @author liuwenlong
  5  * @create 2020-07-21 13:57:14
  6  */
  7 //棋盘类
  8 @SuppressWarnings("all")
  9 public class ChessBoard implements IChessBoard {
 10     private ArrayList<Chess> board = new ArrayList<>();//构造一个随机数的地雷画板
 11     private int maxx;
 12     private int miny;
 13     private int boomNum;
 14 
 15     public ChessBoard(int maxx, int miny, int boomNum) {
 16         this.maxx = maxx;
 17         this.miny = miny;
 18         this.boomNum = boomNum;
 19         initBoard();//初始化要调用一下
 20     }
 21 
 22     //-------------------------------------
 23     //获取一个棋子
 24     public Chess getChess(int x, int y) {
 25         return getChess(y * maxx + x);
 26     }
 27 
 28     public Chess getChess(int id) {
 29         return board.get(id);
 30     }
 31     //-----------------------------------
 32 
 33     public int getBoomNum() {
 34         return boomNum;
 35     }
 36 
 37     public void setBoomNum(int boomNum) {
 38         this.boomNum = boomNum;
 39     }
 40 
 41     public int getMaxx() {
 42         return maxx;
 43     }
 44 
 45     public void setMaxx(int maxx) {
 46         this.maxx = maxx;
 47     }
 48 
 49     public int getMiny() {
 50         return miny;
 51     }
 52 
 53     public void setMiny(int miny) {
 54         this.miny = miny;
 55     }
 56 
 57     public void initBoard() {
 58         //构造棋子
 59         for (int i = 0; i < (maxx * miny); i++) {
 60             board.add(new Chess(i));  //在棋子构造方法内使用static自增
 61         }
 62 
 63         //生成一些雷
 64         //生成15个不重复的随机数,ArrayList<Integer> mineIds = 。。
 65 //        mineIds = ChessBoard.getRandom(mineIds, 0, maxx * miny);
 66 //        for (int i = 0; i < boomNum; i++) {  //使用foreach
 67 //            board.[i].setBoomb(true);
 68 //            //board.get(i).setBoomb(true);
 69 //        }
 70         ArrayList<Integer> mineIds = getRandom(0, 99, 15);
 71 //        for (int i = 0; i < boomNum; i++) {
 72 //            board.get(i).setBoomb(true);
 73 //        }
 74         for (int i : mineIds) {
 75             board.get(i).setBoomb(true);
 76         }
 77     }
 78 
 79     // int id = y*maxx+x;下标
 80     public void showBoard() {
 81         for (int i = 0; i < maxx; i++) {
 82             String line = "";
 83             for (int j = 0; j < maxx; j++) {
 84                 int id = i * maxx + j;
 85                 Chess c = board.get(id);
 86                 if (c.isBoomb()) {
 87                     line += 1 + " ";
 88                 } else {
 89                     line += 0 + " ";
 90                 }
 91             }
 92             System.out.println(line);
 93         }
 94     }
 95 
 96 
 97     /**
 98      * 随机生成 N--M,N个不重复随机数  使用ArrayList
 99      *
100      * @param startRange 起始数字
101      * @param endRange   终止数字
102      * @param count      个数
103      */
104     public static ArrayList<Integer> getRandom(int startRange, int endRange, int count) {
105         ArrayList<Integer> arr = new ArrayList<>();
106         for (int i = 0; i < count; i++) {
107             arr.add(((int) (Math.random() * (endRange - startRange + 1) + startRange)));
108             for (int j = 0; j < i; j++) {
109                 if (arr.get(i) == arr.get(j)) {
110                     arr.remove(i);
111                     i--;
112                     break;
113                 }
114             }
115         }
116         return arr;
117     }
118 
119 
120     //给一个下标,算出该id周围所有邻居
121     @Override
122     public ArrayList<Chess> getNei(int id) {
123 
124         //根据下标转换坐标
125         //整除 id/maxx--y坐标
126         //取余 id%max  --x 坐标
127         int x0 = id % maxx;
128         int y0 = id / maxx;
129 
130         //邻居列表
131         ArrayList<Chess> nei = new ArrayList<>();
132         for (int ydlt = -1; ydlt < 2; ydlt++) {
133             int y = y0 + ydlt;
134             if (y < 0 || y >= miny) {  //miny
135                 continue;
136             }
137             for (int xdlt = -1; xdlt < 2; xdlt++) {
138                 int x = x0 + xdlt;
139                 if (x < 0 || x >= maxx || (xdlt == 0 && ydlt == 0)) {
140                     continue;
141                 }
142 
143                 //这个棋子是邻居,根据坐标换成下标
144                 int cid = y * maxx + x;
145                 nei.add(board.get(cid));
146             }
147         }
148         return nei;
149     }
150 
151 
152     public ArrayList<Chess> getNei(int x, int y) {
153 
154         return getNei(y * maxx + x); //坐标转下标
155     }
156 }
1 /**
2  * @author liuwenlong
3  * @create 2020-07-21 14:01:38
4  */
5 @SuppressWarnings("all")
6 public interface IChessBoard {
7     //告诉我哪一个棋子
8     public ArrayList<Chess> getNei(int id);
9 }
 1 /**
 2  * @author liuwenlong
 3  * @create 2020-07-21 14:28:09
 4  */
 5 @SuppressWarnings("all")
 6 public class Test {
 7     public static void main(String[] args) {
 8         ChessBoard cb = new ChessBoard(10, 10, 15);
 9         cb.showBoard();
10         System.out.println("点击的'X'坐标为:");
11         int x = new Scanner(System.in).nextInt();
12         System.out.println("点击的'Y'坐标为:");
13         int y = new Scanner(System.in).nextInt();
14         int number = cb.getChess(x, y).click(cb);
15         if (number>=0){
16             System.out.println("共有"+number+"个雷");
17         }
18     }
19 }

 

posted @ 2020-07-21 19:09  勤快的懒羊羊  阅读(430)  评论(0编辑  收藏  举报