java实现扫雷游戏控制台版
程序员文章站
2023-12-31 18:06:40
本文实例为大家分享了java实现扫雷游戏控制台版,供大家参考,具体内容如下扫雷游戏a、游戏的分析在游戏中需要存在对象包含哪些。格子对象(grid):属性:内容(content)、状态(type)b、工...
本文实例为大家分享了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经典小游戏》
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。