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经典小游戏》

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

(0)

相关推荐

  • Java实现简单的扫雷小程序

    前两天看了个扫雷的视频,于是自己跟着做了下,感觉还不是很难. 初学Java的同学可以尝试自己操作下Java小程序 这样子才能提高自己的理解能力和编程水平 不用多说了,直接上代码吧! 具体代码操作如下: import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import

  • java实现扫雷游戏

    初学Java,写了一个扫雷代码来锻炼一下自己的代码能力. 一.代码思路 代码思路很重要,如果事先就想好了代码思路,那么写这一个代码肯定是事半功倍,比在哪里瞎打要强不知道多少. 经过思考,觉得可以创建一个二维数组来记录情况 未翻开的牌:(统一显示 █ ) 数组的值 代表 -1 雷 0 旁边没有雷 1 旁边有一个雷 以此类推 翻开的牌则: if(a[x][y] == 9) System.out.print("?"); if(a[x][y] == 10) System.out.print(&

  • Java语言实现的扫雷游戏(2)

    本文实例为大家分享了Java语言实现的扫雷游戏的第2部分代码,供大家参考,具体内容如下 在上一篇文章中,我们已经将扫雷的绘制了方格阵列并随机分配了炸弹的位置,接下来我们要将阵列全部覆盖上按钮.因为我们要通过按钮来获知当前方格的坐标,所以简单的Button按钮还无法满足我们的要求,所以,我们就自定义一个按钮的类,让它继承自Button类,但要给他加上行号和列号,这样我们就能直接通过按钮读取它的位置了 import javax.swing.JButton; public class MyButton

  • Java Swing实现扫雷小游戏

    swing设计扫雷心得,供大家参考,具体内容如下 最近学习swing学习之余做了一个小游戏:扫雷 1.前期设计 2.实现 其实完成这个游戏的核心就在于对数组的操纵,下面贴主要代码Main.java: package first; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.GridLayout; import java.awt.Image; import java.

  • java实现简单扫雷小游戏

    本文实例为大家分享了java实现扫雷游戏的具体代码,供大家参考,具体内容如下 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.GridLayout; import java.awt.Insets; import java.awt.Label; import java.awt.event.ActionEvent; import java.awt.event

  • java swing实现的扫雷游戏及改进版完整示例

    本文实例讲述了java swing实现的扫雷游戏及改进版.分享给大家供大家参考,具体如下: 版本1: package awtDemo; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JButton; import jav

  • java实现扫雷小游戏

    本文实例为大家分享了java实现扫雷小游戏的具体代码,供大家参考,具体内容如下 代码: package GUI; import java.util.Random; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.awt.BorderLayout; import java.awt.GridLayo

  • Java语言实现的扫雷游戏(1)

    Java类库中提供了用于GUI的swing开发工具包,我们可以利用swing设计出一些简单的经典小游戏,如扫雷,推箱子,俄罗斯方块等.接下来我就简单分享一下用Java设计扫雷游戏的思路与过程. 首先,我们要设计出扫雷的窗口界面,说白了,也就是在窗口上绘制出指定行数和列数的小方格.要在窗体上绘制方格,我们需要一个JPanel面板,所以我们定义类GamePanel让它继承自JPanel,然后我们在就可以这个类上绘制我们所要的信息了.然后,在类中,我们定义一些基本的变量,如行数,列数,雷的数量等等,方

  • java实现简单扫雷游戏

    本文实例为大家分享了java实现简单扫雷游戏的具体代码,供大家参考,具体内容如下 package com.test.swing; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JButton; import javax.

  • java实现扫雷游戏控制台版

    本文实例为大家分享了java实现扫雷游戏控制台版,供大家参考,具体内容如下 扫雷游戏 a.游戏的分析 在游戏中需要存在对象包含哪些. 格子对象(Grid): 属性:内容(content).状态(type) b.工程架构 设计工程包结构 bean:存放实体类 core:游戏核心类(游戏操作) test:扫雷玩的测试类 c.编写类 Grid(属性:content.type) Core类–游戏核心类(雷区创建.显示雷区.布雷.踩雷) Test类–测试类 d.核心类设计 1.格子对象创建方法定义 2.显

  • Java实现五子棋游戏(控制台版)

    本项目为大家分享了Java实现五子棋游戏的具体代码,供大家参考,具体内容如下 该项目为Java编程语言编写的五子棋游戏(控制台版),用到二维数组.for循环.if语句.while()语句.Scanner Until包,此项目主要是对数组的使用.该项目的功能有落子.输出棋盘.判断输赢. 代码条: package edu.qizi.gam; import java.util.Scanner; public class GobangTest { public static void main(Stri

  • 教你怎么用Java开发扫雷游戏

    一.效果图        二.实现思路 1.界面上可以点开的各种实际都是按钮,创建9行9列的二维数组,然后根据这个数组来创建JButton. 2.对应创建二维数组data,用来存取数据,0表示周围无雷,-1表示当前是雷,其他数字表示周围雷的数量. 3.对应创建二维数组state,用来存取按钮状态,0未打开,1 打开  2旗子  3 未知(控制显示对应的图标) 4.设置雷:随机行数 i 和列数 j,根据随机到 i.j 从二维数组data中取出对应的元素值,若值不为-1(不是雷),则将此元素data

  • Java实现扫雷游戏的代码分享

    目录 效果展示 主类:GameWin类 底层地图MapBottom类 顶层地图MapTop类 底层数字BottomNum类 初始化地雷BottomRay类 工具GameUtil类 总结 效果展示 主类:GameWin类 package com.sxt; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class

  • Java实现扫雷游戏详细代码讲解

    目录 效果展示 难度选择展示 游戏界面展示 代码展示 主类:GameWin类 底层地图MapBottom类 顶层地图MapTop类 底层数字BottomNum类 初始化地雷BottomRay类 工具GameUtil类 难度选择GameSelect类 项目结构 程序界面布局 总结 大家好!上一期我们使用GUI技术写了一个简单的扫雷小游戏,今天对这个Java应用程序更新迭代,增加了难度选择等功能,修复了已知的几个问题.成为初学者学习的好项目!Java实现扫雷小游戏[完整版] 效果展示 难度选择展示

  • java实现扫雷游戏入门程序

    本文实例为大家分享了java实现扫雷游戏入门程序的具体代码,供大家参考,具体内容如下 分析: 1.首先布一个10*10的雷阵,即二维数组map,每个地方都为0 2.再在雷阵中随机选取10个位置设置为雷,雷用-1表示,即map[i][j] = -1; 3.计算雷周围的数.这里有两种方法. 第一种是用一个二维数组保存所有雷的位置,然后遍历所有的雷,查看雷周围的8个位置,如果是值-1就不做++,如果值不是-1就做++. 第二种是遍历所有不为雷的地方,然后再计算它周围的雷的数目,周围的雷的数目就是该位置

  • C语言实现扫雷游戏简易版

    本文实例为大家分享了C语言实现扫雷游戏的简易版,供大家参考,具体内容如下 game.h #pragma once #include <stdio.h> #include <string.h> #include <time.h> #include <windows.h> #define ROW 12 #define COL 12 #define NUMS 20 #pragma warning(disable:4996) void Menu(); void Ga

  • Java贪吃蛇游戏完善版

    很认真的写的一个java版的贪吃蛇游戏,图形界面,支持菜单操作,键盘监听,可加速,减速,统计得分,设定运动速度,设定游戏背景颜色等!应该没有Bug了,因为全被我修改没了. 下面是项目各包及类的层次关系: 游戏的主要运行界面截图如下: 下面是部分代码,详细源码见此链接:贪吃蛇源码下载 Snake类: package com.huowolf.entities; import java.awt.Color; import java.awt.Graphics; import java.awt.Point

  • python实现简易五子棋游戏(控制台版)

    本文实例为大家分享了python实现简易五子棋游戏的具体代码,供大家参考,具体内容如下 运行效果: 完整代码+注释: finish = False # 游戏是否结束 flagNum = 1  # 当前下棋者标记 flagch = '*'  # 当前下棋者棋子 x = 0    # 当前棋子的横坐标 y = 0    # 当前棋子的纵坐标 print('---------五子棋游戏(控制台版)---------') # 棋盘初始化 checkerboard=[] for i in range(10

随机推荐