Java利用递归实现扫雷
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;
}
}
}
}
Java利用递归实现扫雷的更多相关文章
- java利用递归实现汉诺塔算法
package 汉诺塔; //引入Scanner包,用于用户输入 import java.util.Scanner; public class 汉诺塔算法 { public static void m ...
- Java 利用递归删除文件以及文件夹
直接上代码: /** * 递归删除 文件/文件夹 * * @param file */ public static void deleteFile(File file) { System.out.pr ...
- JAVA利用递归的方法删除一个文件夹以及文件夹下所有的子文件
public static boolean deleteFolder(String url) { File file = new File(url); if (!file.exists()) { re ...
- java作业利用递归解决问题
第一题 利用递归求组合数 设计思想 (1)首先根据公式求,利用递归完成阶乘函数的初始化,并且通过调用阶乘,实现公式计算 (2)递推方法,根据杨辉三角的特点,设置二维数组,从上到下依次保存杨辉三角所得数 ...
- java 中递归的实现 以及利用递归方法实现汉诺塔
今天说下java语言中比较常见的一种方法,递归方法. 递归的定义 简单来说递归的方法就是"自己调用自己",通过递归方法往往可以将一个大问题简单化,最终压缩到一个易于处理的程度.对于 ...
- 利用递归,反射,注解等,手写Spring Ioc和Di 底层(分分钟喷倒面试官)了解一下
再我们现在项目中Spring框架是目前各大公司必不可少的技术,而大家都知道去怎么使用Spring ,但是有很多人都不知道SpringIoc底层是如何工作的,而一个开发人员知道他的源码,底层工作原理,对 ...
- 关于java的递归写法,经典的Fibonacci数的问题
经典的Fibonacci数的问题 主要想展示一下迭代与递归,以及尾递归的三种写法,以及他们各自的时间性能. public class Fibonacci { /*迭代*/ public static ...
- java利用JDK调用并执行js源码
前言: 不同开发语言之间具有通用性,更具有协作调用的可能.有时候对于一些场景会有调用js的需求,因此下面展示了一个java利用自身JDK调用js函数的demo,供感兴趣的朋友参考. js函数文件 ex ...
- Java利用Preferences设置个人偏好
Java利用Preferences设置个人偏好 Preferences的中文意思即偏好或喜好的意思,也就是说同一个程序在每次运行完后,可以通过Preferences来记录用户的偏好,下次启动时,程序会 ...
随机推荐
- JS在严格模式和非严格模式的区别
若想在严格模式下使用JS,需要在文件的第一行加上“use strict”,在实际开发中,常常将“use strict”加入到闭包的内部 具体是: 整个脚本中使用:在这个JavaScript文件开头写' ...
- elk6快速安装
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch [elasticsearch-6.x] name=Elasticsear ...
- php的三种CLI常量:STDIN,STDOUT,STDERR
PHP CLI(command line interface)中,有三个系统常量,分别是STDIN.STDOUT.STDERR,代表文件句柄. 应用一: <?php while($line = ...
- SOA与微服务的区别
乍一看: 1.SOA更抽象. 2. SOA是拆分服务后,用ECS等手段,将服务组合调度. 微服务则是拆分服务后组合成各种业务. https://blog.csdn.net/HeatDeath/arti ...
- 【go】http实验
实验1:上手篇 package main import ( "net/http" //"fmt" "os" ) func proxyFunc ...
- 《基于Nginx的中间件架构》学习笔记---2.nginx的优点以及nginx的安装
[优势] 优势1:IO多路复用和epoll模型(详见总结知识) 优势2:轻量级(1.功能模块少:只保留了一些核心代码 2.代码模块化) 优势3:CPU亲和 这里的CPU亲和指的是:是一种把cp ...
- war包内更新文件
感谢@这个博客提供的分享 亲测有效,原文: 1.如果要替换的文件直接在war包的根目录(一级目录)下,直接使用jar uvf命令替换即可 如:替换a.war中b.xml文件 jar uvf a.war ...
- jQuery跳转到页面指定位置
@参考博客 var t = $("#id").offset().top;// 获取需要跳转到标签的top值 //$(window).scrollTop(t);// 跳转到指定位置 ...
- es6问答
1. 箭头函数的特点 *箭头函数this的指向是定义时所在的对象,而不是使用时所在的对象: * 箭头函数不能做构造函数 * 不能使用argument对象 *不能使用yield命令 2.let cons ...
- 解决Eclipse添加新server时无法选择Tomcat7的问题
在Eclipse中创建了一个Web工程后,需要将该工程部署到Tomcat中进行发布.有时就会遇到在New Server对话框中选择了Tomcat 6/7后却无法单击“Next”按钮的问题,如下图所示: ...