JAVA小游戏之扫雷的源代码

来源:互联网 发布:python正则表达式知乎 编辑:程序博客网 时间:2024/06/06 05:37

老师讲的扫雷小游戏,因为基础还不扎实,所以还写不出扫雷游戏,大家可以看看尝试去写写。

————————————————————————————————————//测试类package com.titan.test;import java.util.Scanner;import com.titan.core.Game;public class Test1 {public static void main(String[] args) { //获得游戏核心类的对象 Game g=new Game(); //调用添加格子对象的方法3 g.addGrid(); //布雷方法调用 g.setMine(); //添加雷数的调用 g.setNumber();  Scanner s=new Scanner(System.in); g.paint(); while(true){ System.out.println("请输入X坐标"); int x=s.nextInt(); System.out.println("请输入Y坐标"); int y=s.nextInt(); g.stamp(x, y); //调用绘制界面的方法 g.paint(); } }}————————————————————————————————————//游戏核心类package com.titan.core;import java.awt.Point;import java.util.Random;import com.titan.bean.Grid;/** * 游戏核心类 * @author Administrator * 雷区(游戏界面) */public class Game {//定义一个存放格子对象的二维数组Grid[][] grid=new Grid[9][9];//定义一个存放雷数的属性int count=10;//定义一个随机数工具的属性Random r=new Random();//添加格子对象到二维数组中public void addGrid(){//通过循环的方式来为二维数组中添加格子对象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].setState(false);//设置坐标grid[i][j].setPoint(new Point(i,j));}}}//创建一个绘制游戏界面的方法public void paint(){for(int i=0;i<grid.length;i++){for(int j=0;j<grid[i].length;j++){if(grid[i][j].isState()){System.out.print(grid[i][j].getContent()+" ");}else{System.out.print("■ ");}}System.out.println();}}//添加一个布雷的方法public void setMine(){int i=0;//通过循环的方式来获得10个格子对象do{//获得一个随机的行坐标int x=r.nextInt(9); //获得一个随机的列坐标int y=r.nextInt(9);//判断当前随机位置的格子内容是否是雷,如果不是就布雷if(grid[x][y].getContent()!='*'){//获得当前坐标位置的格子对象grid[x][y].setContent('*');i++;}}while(i<count);}//获得当前坐标位置的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 setNumber(){//遍历所有的格子对象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()=='*'){//结束当前的循环,进入下一次循环continue;}else{//进入当前位置的8个方向的扫描Point[] point=getPoint(i, j);//通过循环遍历来获得当前坐标的方向对象for(int k=0;k<point.length;k++){//定义一个坐标对象来获得当前循环到的坐标Point p=point[k];if(p.x>=0 && p.y>=0 && p.x<9 && p.y<9){//判断当前有效范围内的格子是否是雷if(grid[p.x][p.y].getContent()=='*'){sum++;}}}}//判断雷数的计数器是否发生改变,如果改变就将值填充到//当前坐标的格子当中if(sum>0){grid[i][j].setContent((char)(48+sum));}}}}//踩雷public void stamp(int x,int y){//判断当前位置是否存在雷if(grid[x][y].getContent()=='*'){System.out.println("游戏结束");}else{//将当前的格子内容状态改成已打开grid[x][y].setState(true);//判断当前的格子内容必须是空格的时候才执行辐射if(grid[x][y].getContent()==' '){//获得当前格子的8个方向坐标对象Point[] point=getPoint(x,y);//循环遍历获得每个方向的对象for(int k=0;k<point.length;k++){Point p=point[k];//判断当前坐标对象是否越界if(p.x>=0 && p.y>=0 && p.x<9 && p.y<9){//判断当前方向的格子内容是否为空格,如果为空格//就执行辐射操作  --递归调用if(grid[p.x][p.y].getContent()==' ' && grid[p.x][p.y].isState()==false){stamp(p.x,p.y);}else if(grid[p.x][p.y].getContent()!=' '){//如果当前位置为数字就将数字显示出来grid[p.x][p.y].setState(true);}}}}}}}————————————————————————————————————//格子类package com.titan.bean;import java.awt.Point;/** * 格子类 * @author Administrator * 格子的内容、格子的状态、格子的坐标 */public class Grid {//格子内容char content;//格子状态boolean state;//格子的坐标Point point;public char getContent() {return content;}public void setContent(char content) {this.content = content;}public boolean isState() {return state;}public void setState(boolean state) {this.state = state;}public Point getPoint() {return point;}public void setPoint(Point point) {this.point = point;} }


原创粉丝点击