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