java实现扫雷游戏控制台版

 更新时间:2020年04月23日 11:30:22   作者:Leslie木叶  
这篇文章主要为大家详细介绍了java实现扫雷游戏控制台版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java实现扫雷游戏控制台版,供大家参考,具体内容如下

扫雷游戏

a、游戏的分析

在游戏中需要存在对象包含哪些。
格子对象(Grid):
属性:内容(content)、状态(type)

b、工程架构

设计工程包结构
bean:存放实体类
core:游戏核心类(游戏操作)
test:扫雷玩的测试类

c、编写类

Grid(属性:content、type)
Core类–游戏核心类(雷区创建、显示雷区、布雷、踩雷)
Test类–测试类

d、核心类设计

1、格子对象创建方法定义
2、显示雷区方法定义
3、布雷方法定义

随机数工具:

Random r=new Random();
//获得整数类型的随机数
int x=r.nextInt(参数);参数表示随机值范围–>9

4、八个方向对象的方法定义

Point类:java中提供的坐标对象类 x,y

5、设置雷数的方法

通过遍历所有格子对象获取雷数的添加

6、踩雷

递归调用:在一个类的方法中实现当前方法调用自己的操作方式
1)、通过传入一个坐标获取当前坐标位置的格子对象内容,判断内容的类型完成游戏操作
1)、内容为雷 -->游戏结束
2)、内容位数字 -->显示当前格子内容
3)、内容为空白 -->通过当前位置实现空白的辐射操作(递归调用)

7、游戏胜利

1)、方法的返回类型
2)、test类中循环的结构(break)

扫雷实体类

package minersgame.bean;
/**
 * 格子实体类
 * @author 木叶
 *拥有格子的内容和状态属性
 */

public class Grid {
 //定义格子的私有属性
 private char content;
 private boolean type;
 public char getContent() {
 return content;
 }
 public void setContent(char content) {
 this.content = content;
 }
 public boolean isType() {
 return type;
 }
 public void setType(boolean type) {
 this.type = type;
 }

}

核心代码

package minersgame.core;

import java.awt.Point;
import java.util.Random;
import minersgame.bean.Grid;
/**
 * 游戏核心类
 * @author 木叶
 *包含游戏核心的功能:雷区制定、布雷实现、踩雷操作、显示雷区、获取方向、设置雷数、踩雷、显示胜利
 */
public class Core {

 //定义一个存放格子对象的二维数组完成雷区的保存
 Grid[][] grid=new Grid[9][9];
 //定义雷数的属性
 int count=10;
 int count2 = count;
 //定义一个属性获取当前状态
 public boolean state=true;
 //定义一个创建格子对象的方法,完成雷区中所有格子对象的创建
 public void createGrid() {
 //通过二维数组实现每个下标中添加格子对象
 for(int i=0;i<grid.length;i++) {
 for(int j=0;j<grid[i].length;j++) {
 //创建格子对象完成二维数组下标数据存放
 grid[i][j]=new Grid();
 //设置格子对象中的属性内容
 grid[i][j].setContent(' ');
 grid[i][j].setType(false); 
 }
 }
 }
 //定义一个布雷的方法
 public void setMines() {
 //定义随机数工具
 Random r=new Random();
 //通过随机方式获取随机坐标
 do {
 //获得x坐标
 int x=r.nextInt(9);
 //获得y坐标
 int y=r.nextInt(9);
 //判断当前随机位置的格子对象内容是否为雷,如果是雷就进入下次循环
 if(grid[x][y].getContent()!='*') {
 //通过x和y获得当前位置的格子对象
 grid[x][y].setContent('*');
 //实现数量自减
 count--;
 } 
 
 }while(count>0) ;
 
 }

 //定义显示雷区的方法
 public void show() {
 //通过遍历二维数组获得所有的格子个数
 System.out.println("xy 0 1 2 3 4 5 6 7 8");
 for(int i=0;i<grid.length;i++) {
 System.out.print(i+" ");
 for(int j=0;j<grid[i].length;j++){
 //
 if(grid[i][j].isType() ){
 System.out.print(grid[i][j].getContent()+" "); 
 }else {
 System.out.print("■ ");
 }
 }
 System.out.println();
 }
 } 
//定义坐标获取的方法 --获得8个方向的坐标对象方法 
 public Point[] getPoint(int x,int y) {//超过一个以上的返回要用数组
 //定义一个坐标对象数组
 Point[] point=new Point[8];
 //左边
 point[0]=new Point(x-1,y);
 //左上
 point[1]=new Point(x-1,y-1);
 //上边
 point[2]=new Point(x,y-1);
 //右上
 point[3]=new Point(x+1,y-1);
 //右边
 point[4]=new Point(x+1,y);
 //右下
 point[5]=new Point(x+1,y+1);
 //下边
 point[6]=new Point(x,y+1);
 //左下
 point[7]=new Point(x-1,y+1);
 return point;
 }

//定义一个设置雷数的方法
 public void setMinesNumber() {
 //通过循环获得所有的格子对象
 for(int i=0;i<grid.length;i++) {
 for(int j=0;j<grid[i].length;j++) {
 //定义一个统计类属的变量
 int sum=0;
 //判断当前格子对象内容是否为雷,如果是雷就进入下次获取,否则完成雷数统计
 if(grid[i][j].getContent()!='*') {
 //通过当前的坐标获取八个方向坐标对象
 Point[] p=this.getPoint(i, j);
 //通过坐标对象数组获取对应下标格子对象
 for(int k=0;k<p.length;k++) {
 //获得每个坐标对象
 Point point=p[k];
 //通过判断过去的8个方向位置是否越界
 if(point.x>=0&&point.x<9&&point.y>=0&&point.y<9) {
 //通过当前方向坐标获取位置上的格子对象
 if( grid[point.x][point.y].getContent()=='*') {
 sum++;//雷数自增
 } 
 }
 }
 //通过雷数统计变量确定是否有雷存在,如果有就将当前
 //雷数添加到当前位置的格子对象中
 if(sum>0) {
 //在当前格子对象中添加雷数
 grid[i][j].setContent((char)(48+sum));
 } 
 }
 }
 }
 } 
 //定义一个踩雷踩雷
 public void stampMine(int x,int y) {
 //开启当前格子状态为打开
 grid[x][y].setType(true);
 //判断当前坐标位置的格子内容是否为雷,如果是雷就结束否则就继续
 if(grid[x][y].getContent()!='*') {
 //判断当前格子对象是否为数字,如果为数字就不操作
 if(grid[x][y].getContent()==' ') {
 //获得当前格子周围8个方向的坐标对象
 Point[] p=this.getPoint(x, y);
 //循环遍历8个方向获得对应的格子对象
 for(int k=0;k<p.length;k++) {
 //分别获得的方向对象
 Point point=p[k];
 //判断是否越界
 if(point.x>=0&&point.x<9&&point.y>=0&&point.y<9) {
 /**
 * 判断当前坐标对象对应的格子对象内容是否为空格,
 * 如果是空格实现递归调用,如果是数字就开启当前格子
 */
 if(grid[point.x][point.y].getContent()==' '&&grid[point.x][point.y].isType()==false) {
 //当前格子为空格的情况
 this.stampMine(point.x, point.y);
 }else {
 //当前格子为数字的情况
 grid[point.x][point.y].setType(true);
 }
 }
 } 
 } 
 }else {
 System.out.println("踩雷了,游戏结束!!!");
 //修改游戏状态
 state=false;
 //显示出所有格子
 for(int i=0;i<grid.length;i++) {
 for(int j=0;j<grid[i].length;j++) {
 grid[i][j].setType(true);
 }
 }
 } 
 } 
 //定义一个游戏胜利的方法
 public boolean getVictory(){
 //为打开格子数
 int number=0;
 //使用循环得出格子总数
 //使用循环得出打开格子总数
 for(int i=0;i<grid.length;i++) {
 for(int j=0;j<grid[i].length;j++) {
 if(!grid[i][j].isType()) {
 number++;
 }
 }
 }
 //判断未打开鸽子数师傅等于雷数,是则预习成功,不是进入下次
 if(number==count2) {
 for(int i=0;i<grid.length;i++) {
 for(int j=0;j<grid[i].length;j++) {
 grid[i][j].setType(true);
 }
 }
 System.out.println("游戏胜利!!!扫雷成功!!!");
 return false;
 }else {
 return true;
 }
 } 
}

测试类

package minersgame.test;

import java.util.Scanner;

import minersgame.core.Core;

public class Test {
 public static void main(String[] args) {
 /*
 * 实现游戏核心
 */
 //获得游戏核心类对象
 Core c=new Core();
 c.createGrid();
 c.setMines();
 //显示
 c.show();
 //添加雷数
 c.setMinesNumber();
 Scanner scan=new Scanner(System.in);
 while(c.state){
 System.out.println("请输入X坐标:");
 int x=scan.nextInt();
 System.out.println("请输入Y坐标:");
 int y=scan.nextInt();
 //调用踩雷方法
 c.stampMine(x, y);
 //显示雷区方法
 c.show();
 //判断是否游戏胜利
 if(c.getVictory()) { 
 }else {
 c.show();
 break;
 }
 }
 }
}

更多精彩游戏,请参考专题《java经典小游戏》

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • springboot项目中实现访问druid内置监控页面

    springboot项目中实现访问druid内置监控页面

    这篇文章主要介绍了springboot项目中实现访问druid内置监控页面的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • mybatisplus实现自动创建/更新时间的项目实践

    mybatisplus实现自动创建/更新时间的项目实践

    Mybatis-Plus提供了自动填充功能,可以通过实现MetaObjectHandler接口来实现自动更新时间的功能,本文就来介绍一下mybatisplus实现自动创建/更新时间的项目实践,感兴趣的可以了解下
    2024-01-01
  • Java文件拒绝访问问题及解决

    Java文件拒绝访问问题及解决

    这篇文章主要介绍了Java文件拒绝访问问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java锁竞争导致sql慢日志原因分析

    Java锁竞争导致sql慢日志原因分析

    这篇文章主要介绍了Java锁竞争导致sql慢的日志原因分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-11-11
  • Mybatis拦截器注解@Intercepts与@Signature注解使用

    Mybatis拦截器注解@Intercepts与@Signature注解使用

    本文主要介绍了Mybatis拦截器注解@Intercepts与@Signature注解使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • Java GraphQL数据加载器批处理的实现详解

    Java GraphQL数据加载器批处理的实现详解

    GraphQL 数据加载器是优化 GraphQL API 的关键组件,旨在解决臭名昭著的 N+1 查询问题,在本中,我们将深入研究其批处理功能,感兴趣的小伙伴可以了解下
    2023-12-12
  • springboot集成测试最小化依赖实践示例

    springboot集成测试最小化依赖实践示例

    这篇文章主要为大家介绍了springboot集成测试最小化依赖实践示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Java实现提取QSV文件视频内容

    Java实现提取QSV文件视频内容

    QSV是一种加密的视频文件格式。是爱奇艺公司研发的一种视频文件格式,这篇文章主要为大家介绍了如何利用Java实现提取QSV文件视频内容,感兴趣的可以了解一下
    2023-03-03
  • Java 随机取字符串的工具类

    Java 随机取字符串的工具类

    随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串、数字。或者随即生成一个不定长度的数字、或者进行一个模拟的随机选择等等。Java提供了最基本的工具,可以帮助开发者来实现这一切
    2014-01-01
  • Java微信分享接口开发详解

    Java微信分享接口开发详解

    这篇文章主要为大家详细介绍了Java微信分享接口开发的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04

最新评论