iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java如何实现扫雷游戏程序
  • 425
分享到

java如何实现扫雷游戏程序

2023-07-01 00:07:14 425人浏览 薄情痞子
摘要

本篇内容介绍了“java如何实现扫雷游戏程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!分析:首先布一个10*10的雷阵,即二维数组map

本篇内容介绍了“java如何实现扫雷游戏程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

分析:

首先布一个10*10的雷阵,即二维数组map,每个地方都为0

再在雷阵中随机选取10个位置设置为雷,雷用-1表示,即map[i][j] = -1;

计算雷周围的数。这里有两种方法。

  第一种是用一个二维数组保存所有雷的位置,然后遍历所有的雷,查看雷周围的8个位置,如果是值-1就不做++,如果值不是-1就做++。

  第二种是遍历所有不为雷的地方,然后再计算它周围的雷的数目,周围的雷的数目就是该位置的值。

(个人认为第一种方法比较好一点,时间复杂度小一些。如果雷阵比较大,比如50*50,那么第二种方法明显比第一种要慢很多)

还有一点值得注意的是,在产生雷的位置的随机数的时候,要避免产生的随机数产生重复的问题。

我们将雷阵的每一个地方都标号,如图:

java如何实现扫雷游戏程序

 我们用一个一维数组来保存雷阵的每一个位置的标号indexs = [0,1,2,3.....,97,98,99].

然后产生随机数的范围为[0,100),例如第一次产生随机数为22,那么这个数即为上图标号为22的地方,然后indexs数组里的indexs[22]保存indexs数组的最后一个数即indexs[22]=99;下一次产生随机数的时候的范围就为[0,99),此时indexs[]数组里就没有22这个数,也就不会有重复的问题。

第一种计算雷的周围的位置的方法的代码如下:

import java.util.Random; public class Miner_1 {    private static int[][] map;    private static Random ran = new Random();    private static int[] indexs;    private static int[][] minePos;//用于保存所有雷的位置    private static int x = 10;//c表示行数    private static int y = 10;//c表示列数    private static int n = 10;//n表示雷数     public static void main(String[] args) {        init();//初始化        arrange();//布雷        calMines();//计算雷周围        disp();    }     private static void init() {        map = new int[x][y];        indexs = new int[x * y];        for (int i = 0; i < indexs.length; i++) {            indexs[i] = i;        }        minePos = new int[n][2];    }     private static void arrange() {        int cnt = 0;        while (cnt < n) {            int index = creatIndex(indexs.length - cnt);            int r = index / map[0].length;            int c = index % map[0].length;            map[r][c] = -1;            //记录雷的位置            minePos[cnt][0] = r;            minePos[cnt][1] = c;            cnt++;        }    }        //该方法用于产生雷位置的随机数    private static int creatIndex(int right) {        int index = ran.nextInt(right);        int value = indexs[index];        indexs[index] = indexs[right - 1];        return value;    }     private static void calMines() {        //遍历每一个雷        for (int i = 0; i < minePos.length; i++) {            int r = minePos[i][0];            int c = minePos[i][1];            //调用函数查看雷的周围            for (int j = r - 1; j <= r + 1; j++) {                for (int k = c - 1; k <= c + 1; k++) {                    if (checkIndex(j, k) && map[j][k] != -1) {                        map[j][k]++;                    }                }            }        }    }     private static boolean checkIndex(int r, int c) {        return (r >= 0 && r < map.length) && (c >= 0 && c < map[r].length);    }     private static void disp() {        for (int i = 0; i < map.length; i++) {            for (int j = 0; j < map[i].length; j++) {                System.out.printf("%-3D", map[i][j]);            }            System.out.println();        }    }}

第二种遍历每一个不为雷的地方然后计算周围有多少个雷,如果没有雷,该位置就为0,如果有一个雷,该位置就+1,代码如下

import java.util.Random; public class Miner2 {    private static int[][] map;    private static int[] indexs;//为雷的位置编号     private static Random ran;//随机数类,调用产生随机数     public static void main(String[] args) {        init();//初始化雷阵 假设10*10        arrange();//布雷 假设为10个雷        calmine();//计算雷数        disp();//打印    }     private static void init() {        ran = new Random();        map = new int[10][10];        indexs = new int[100];        for (int i = 0; i < indexs.length; i++) {            indexs[i] = i;        }    }     //布雷 10个    private static void arrange() {        int cnt = 0;        while (cnt < 10) {            int index = creatIndex(indexs.length - cnt);//生成雷序列随机数            int r = index / 10;            int c = index % 10;            map[r][c] = -1;            cnt++;        }    }     //此方法为生成雷位置的随机数 并且避免重复    private static int creatIndex(int right) {        int index = ran.nextInt(right);        int value = indexs[index];        indexs[index] = indexs[right - 1];        return value;    }     //遍历每一个不是雷的地方 计算周围的雷数    private static void calmine() {        for (int i = 0; i < map.length; i++) {            for (int j = 0; j < map[i].length; j++) {                if (map[i][j] != -1) {                    map[i][j] = calRound(i, j);                }            }        }    }     private static int calRound(int r, int c) {        int cnt = 0;        for (int i = r - 1; i <= r + 1; i++) {            for (int j = c - 1; j <= c + 1; j++) {                if (checkIndex(i, j) && map[i][j] == -1) {                    cnt++;                }            }        }        return cnt;    }     private static boolean checkIndex(int r, int c) {        return (r >= 0 && r < 10) && (c >= 0 && c < 10);    }     private static void disp() {        for (int i = 0; i < map.length; i++) {            for (int j = 0; j < map[i].length; j++) {                System.out.printf("%3d", map[i][j]);            }            System.out.println();        }    }}

“java如何实现扫雷游戏程序”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: java如何实现扫雷游戏程序

本文链接: https://www.lsjlt.com/news/331976.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作