扫雷递归代码java_Java利用递归实现扫雷

本文介绍了一个使用Java实现的扫雷游戏代码。该程序通过二维数组记录雷区状态,并使用递归方法实现在点击空白区域时的连锁反应。游戏包含随机布雷、玩家交互及胜利失败判断等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package 扫雷;

import java.math.*;

import java.util.Scanner;

public class 扫雷 {

//记录翻开次数

static int k=0;

//两个数组

//给玩家看的

static int [][] map=new int[22][22];

//用来保存数据

static int [][] bomb=new int[22][22];

//传染,递归,即遇见空白向周围扩散

public static void cr(int x,int y){

if(x-1>=0&y-1>=0){

if(map[x-1][y-1]==999){

if(bomb[x-1][y-1]==0){

map[x-1][y-1]=bomb[x-1][y-1];

k++;

cr(x-1,y-1);

}

else{

map[x-1][y-1]=bomb[x-1][y-1];

k++;

}

}

if(map[x-1][y]==999){

if(bomb[x-1][y]==0){

map[x-1][y]=bomb[x-1][y];

k++;

cr(x-1,y);

}

else{

map[x-1][y]=bomb[x-1][y];

k++;

}

}

if(map[x-1][y+1]==999){

if(bomb[x-1][y+1]==0){

map[x-1][y+1]=bomb[x-1][y+1];

k++;

cr(x-1,y+1);

}

else{

map[x-1][y+1]=bomb[x-1][y+1];

k++;

}

}

if(map[x][y-1]==999){

if(bomb[x][y-1]==0){

map[x][y-1]=bomb[x][y-1];

k++;

cr(x,y-1);

}

else{

map[x][y-1]=bomb[x][y-1];

k++;

}

}

if(map[x][y+1]==999){

if(bomb[x][y+1]==0){

map[x][y+1]=bomb[x][y+1];

k++;

cr(x,y+1);

}

else{

map[x][y+1]=bomb[x][y+1];

k++;

}

}

if(map[x+1][y-1]==999){

if(bomb[x+1][y-1]==0){

map[x+1][y-1]=bomb[x+1][y-1];

k++;

cr(x+1,y-1);

}

else{

map[x+1][y-1]=bomb[x+1][y-1];

k++;

}

}

if(map[x+1][y]==999){

if(bomb[x+1][y]==0){

map[x+1][y]=bomb[x+1][y];

k++;

cr(x+1,y);

}

else{

map[x+1][y]=bomb[x+1][y];

k++;

}

}

if(map[x+1][y+1]==999){

if(bomb[x+1][y+1]==0){

map[x+1][y+1]=bomb[x+1][y+1];

k++;

cr(x+1,y+1);

}

else{

map[x+1][y+1]=bomb[x+1][y+1];

k++;

}

}

}

}

public static void main(String[] args) {

//将map中间部分设为999

for(int i=0;i<22;i++){

for(int j=0;j<22;j++){

map[i][j]=999;

}

}

//随机产生40个雷,并对周围数加一

for(int i=0;i<41;i++){

int m=(int)Math.round((Math.random()*(20-1)+1));

int n=(int)Math.round((Math.random()*(20-1)+1));

if(bomb[m][n]==9){

i--;

continue;

}

bomb[m][n]=9;

if(bomb[m-1][n-1]!=9){

bomb[m-1][n-1]=bomb[m-1][n-1]+1;

}

if(bomb[m-1][n]!=9){

bomb[m-1][n]=bomb[m-1][n]+1;

}

if(bomb[m-1][n+1]!=9){

bomb[m-1][n+1]=bomb[m-1][n+1]+1;

}

if(bomb[m][n-1]!=9){

bomb[m][n-1]=bomb[m][n-1]+1;

}

if(bomb[m][n+1]!=9){

bomb[m][n+1]=bomb[m][n+1]+1;

}

if(bomb[m+1][n-1]!=9){

bomb[m+1][n-1]=bomb[m+1][n-1]+1;

}

if(bomb[m+1][n]!=9){

bomb[m+1][n]=bomb[m+1][n]+1;

}

if(bomb[m+1][n+1]!=9){

bomb[m+1][n+1]=bomb[m+1][n+1]+1;

}

}

//将map,bomb周围设为10

for(int i=0;i<22;i++){

if(i==0){

for(int j=0;j<22;j++){

map[i][j]=10;

bomb[i][j]=10;

}

}

if(i==21)

{

for(int j=0;j<22;j++){

map[i][j]=10;

bomb[i][j]=10;

}

}

map[i][0]=10;

map[i][21]=10;

bomb[i][0]=10;

bomb[i][21]=10;

}

//把bomb输出,这便于程序员试验程序,真正游戏没有这一步

for(int i=0;i<22;i++){

for(int j=0;j<22;j++){

System.out.print(bomb[i][j]+"  ");

}

System.out.print("\n");

}

//游戏开始

for(;;){

//输出界面

for(int i=0;i<22;i++){

for(int j=0;j<22;j++){

if(map[i][j]>=10&map[i][j]<999){

System.out.print("+ ");

}

if(map[i][j]==999){System.out.print("? ");}

if(map[i][j]<9){

System.out.print(map[i][j]+" ");

}

}

System.out.print("\n");

}

//请用户输入坐标

Scanner input=new Scanner(System.in);

System.out.println("Please key in the y:");

int x=input.nextInt();

System.out.println("Please key in the x:");

int y=input.nextInt();

//如果是雷

if(bomb[x][y]==9){

//把所有雷的位置传给map

for(int i=0;i<21;i++){

for(int j=0;j<21;j++){

if(bomb[i][j]==9){

map[i][j]=bomb[i][j];

}

}

}

//显示map

for(int i=0;i<22;i++){

for(int j=0;j<22;j++){

if(map[i][j]>=10&map[i][j]<999){

System.out.print("+ ");

}

if(map[i][j]==999){System.out.print("? ");}

if(map[i][j]==9){

System.out.print("* ");

}

if(map[i][j]<9){

System.out.print(map[i][j]+" ");

}

}

System.out.print("\n");

}

System.out.println("You die!");

System.out.println("Game over!");

//退出程序

System.exit(0);

}

else{

//如果是空格

if(bomb[x][y]==0){

map[x][y]=bomb[x][y];

k++;

//调用递归,传递参数为x,y,即为用户所输入

cr(x,y);

}

//不是空格

else{

k++;

map[x][y]=bomb[x][y];

}

}

//如果翻开了360个格子

if(k==360){

//输出map

for(int i=0;i<22;i++){

for(int j=0;j<22;j++){

if(map[i][j]>=10&map[i][j]<999){

System.out.print("+ ");

}

if(map[i][j]==999){System.out.print("? ");}

if(map[i][j]<9){

System.out.print(map[i][j]+" ");

}

}

System.out.print("\n");

}

System.out.println("You win!");

//end

break;

}

}

}

}

posted on

2017-07-28 22:24

cggwz

阅读(325)

评论(0)

编辑

收藏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值