Java小游戏---扫雷

求职现状:简历投递了一百多家公司就几家回我,这几家基本是小伙子会英文吗,小伙子人力资源来不来,嘻嘻嘻。(摆烂)

在这里插入图片描述

demo用的是JDK17,没用到很复杂的ApI应该没有兼容性问题.

扫雷的核心思想有两个,一个是遮挡显示机制,一个是拓展周围没有危险的空格

思路和代码如下

在这里插入图片描述

在这里插入图片描述

 //点击就变为点击模块,且迷雾++
if (ShadowMate[xIntarr][yIntarr] == 0 && AnswerMate[xIntarr][yIntarr] == 0)//进行递归判断
{
    //判断是否可以递归
    ShowMore(ShadowMate, xIntarr, yIntarr);
} else if (ShadowMate[xIntarr][yIntarr] == 0 && AnswerMate[xIntarr][yIntarr] != -1
           && AnswerMate[xIntarr][yIntarr] != 0)//进行炸弹是否能完全显示判断
{
    ShadowMate[xIntarr][yIntarr] = 1;
    arr[xIntarr][yIntarr] = MapElement.Show;
    for (point point2 : pointSet) {
        Boolean ShowBoom = Boolean.TRUE;
        int pointStartX = point2.getX() - 1;
        //相对自身的9个格子内加1
        for (; pointStartX <= point2.getX() + 1; pointStartX++) {
            for (int pointStartY = point2.getY() - 1; pointStartY <= point2.getY() + 1; pointStartY++) {
                if (pointStartX < Row && pointStartX >= 0 && pointStartY < Col && pointStartY >= 0) {
                    //为中间时跳过
                    if (pointStartX == point2.getX() && pointStartY == point2.getY()) {
                        continue;
                    }
                    if (ShadowMate[pointStartX][pointStartY] == 0
                        && AnswerMate[pointStartX][pointStartY] != -1)//存在不完全显示但不为炸弹
                    {
                        ShowBoom = false;
                    }
                }
            }
        }
        if (ShowBoom)//周围都显示了
        {
            //显示该炸弹
            ShadowMate[point2.getX()][point2.getY()] = 1;
            arr[point2.getX()][point2.getY()] = MapElement.Show;
        }
    }

} else if (ShadowMate[xIntarr][yIntarr] == 0 && AnswerMate[xIntarr][yIntarr] == -1)//为炸弹 游戏结束
{
    //游戏结束
    //JOptionPane.showMessageDialog(this, "摸到炸弹,游戏结束");
}
  private void CalculateAnswer(int[][] answerMate) {
        //以point为中心,对周围不是炸弹的数字进行数字增加
        for (point point : pointSet) {
            int pointStartX = point.getX() - 1;
            //相对自身的9个格子内加1
            for (; pointStartX <= point.getX() + 1; pointStartX++) {
                for (int pointStartY = point.getY() - 1; pointStartY <= point.getY() + 1; pointStartY++) {
                    if (pointStartX < Row && pointStartX >= 0 && pointStartY < Col && pointStartY >= 0) {
                        if (AnswerMate[pointStartX][pointStartY] != -1) {
                            AnswerMate[pointStartX][pointStartY]++;
                        }
                    }
                }
            }
        }
    }

private void ShowMore(int[][] shadowMate, int xIntarr, int yIntarr) {

        if (shadowMate[xIntarr][yIntarr] == 0 && AnswerMate[xIntarr][yIntarr] == 0)//为其它数字时终止
        {
            ShadowMate[xIntarr][yIntarr] = 1;//标记已显示 可能会产生重复 也可以通过是否等于1进行判断冗余的递归
            arr[xIntarr][yIntarr] = MapElement.Show;//映射渲染
            System.out.println("第"+count+"次"+"打开了"+xIntarr+":"+yIntarr+"的格子");
            count++;
            int StartX = xIntarr - 1;
            for (; StartX <= xIntarr + 1; StartX++) {
                for (int StartY = yIntarr - 1; StartY <= yIntarr + 1; StartY++) {
                    //如果没有越界
                    if (StartX < Row && StartX >= 0 && StartY < Col && StartY >= 0) {
                        if (StartY == yIntarr || StartX == xIntarr)//只判断临近四格之间的十字架
                        {
                            //遍历1-9格,如果为空执行递归
                            if (AnswerMate[StartX][StartY] == 0) {
                                ShowMore(shadowMate, StartX, StartY);
                            }
                            //为不可见且不为炸弹的数值则显示
                            else if (AnswerMate[StartX][StartY] !=-1)
                            {
                                System.out.println("终止-----"+"第"+count+"次"+"打开了"+StartX+":"+StartY+"的格子");
                                count++;
                                ShadowMate[StartX][StartY] = 1;
                                arr[StartX][StartY] = MapElement.Show;
                            }
                        }
                    }
                }
            }
        }
    }
           }
                        }
                    }
                }
            }
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值