老师讲的扫雷小游戏,因为基础还不扎实,所以还写不出扫雷游戏,大家可以看看尝试去写写。
————————————————————————————————————
//测试类
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;
}
}