扫雷游戏java

前言

在我小的时候,电脑上有一款自带的游戏,每当打开电脑发现电脑没有网时,就会把这个游戏打开玩一玩,当时还不知道这个游戏是怎么玩的,而且这个游戏看起来非常单调无聊,所以直到现在通过网上查找资料才知道这个游戏的规则是什么,但我最近看着这个游戏的逻辑很简单,也想自己尝试着用代码敲一敲。

一、整体思路

扫雷游戏第一步,需要先确定雷区的长度和宽度,再确定雷区中地雷的个数。可以通过一个二维数组来实现,将二维数组中的所有数全部赋值为零,通过for循环来产生地雷,在数组中如果是地雷则值为-1,如果该值已经为-1了,则继续循环。通过这一操作我们可以把地雷的分布图给做出来。

再根据所得到的数组,通过对数组中的每个数进行访问,将每个数在二维数组中其他周围八个方格中有多少个地雷进行计数,如果该数组中的值为-1,则不需要进行操作,之后再把加起来的数填入该方格中,就能得到图像的内层图了。
图像建立好之后我们需要进行踩雷,插旗子或取旗子,打问号或去问号,三个操作。

踩雷有三种情况,一,如果踩到了方格在数组中的值为-1,则将所有的地雷全部显示出来,然后结束整个游戏。二,如果踩到了方格中的值为1,2,3,4,5,6,7,8就只需要显示该方格这个数就可以了。三,如果踩到的方格为0,则我们需要通过递归算法与计数这两步操作将其他周围方格为0全部显示出来并且它四周围绕的是不为0的方格。

插旗子和打问号都是两个一样的操作,选择一个在数组中的坐标,同时,我们可以建立一个新的数组,来记录这些坐标,当我们下一次通过踩地雷操作来访问这些坐标时,则会提示该坐标无法进行踩雷操作,而取旗子和去问号与插旗子和打问号操作相反,整体思路大致是这样。

二、递归算法与计数

这是我在做扫雷游戏这个过程中遇到的一个难点,就是将他周围的方格如果没有地雷全部都显示出来的操作。可以通过上下左右四个方向进行递归操作,从而来显示他周围所有的方格。但是递归算法如果不对他进行限制,那么,它将永无止境的进行下去,但是程序的递归深度总是有限的,所以,当程序运行到一定深度时,程序就会自动报错,因此,我们可以通过计数操作,来将这些已经递归过的方格排除掉,通过这样的操作就能够实现方格中空格和数的显示了。

具体代码如下

 private void chuli1(int H1,int H2){
        StringBuilder JJ;
        for(int i=H1-1;i<=H1+1;i++)
        {
            for(int j=H2-1;j<=H2+1;j++)
            {
                if(i>=0&&i=0&&j=0&&i=0&&j

三、代码的运行过程

四、整体代码

主程序代码:

import java.util.Scanner;
public class SaoLei {
    //雷区的长度
    private int L1;
    //雷区的宽度
    private int L2;
    //地雷的个数
    private int shuliang;
    //雷区图像1
    private int [][]A;
    //雷区图像2
    private String []tuixiang;
    //显示单元的个数
    private int geshu;
    //雷区图像3
    private int [][]zhongyao;
    //重要信息1
    private int JDK;
    //重要信息2
    private int JKK;
    //旗子的个数
    private int qizi;
    //问号的个数
    private int wenhao;
    //雷区长度和宽度的输入
    private void T1(){
        Scanner input=new Scanner(System.in);
        System.out.println("提示:雷区的长度和宽度的范围为[2,64],地雷的个数要小于雷区的总个数");
        System.out.print("请输入雷区的长度:");
        do {
            this.L1=input.nextInt();
            if(this.L1<=1)
            {
                System.out.println("输入雷区的长度不正确!");
                System.out.print("请重新输入:");
            }
            if(this.L1>64)
            {
                System.out.println("输入的雷区长度过大!");
                System.out.print("请重新输入:");
            }
        }while (this.L1<=1||this.L1>64);
        System.out.print("请输入雷区的宽度:");
        do {
            this.L2=input.nextInt();
            if(this.L2<=1)
            {
                System.out.println("输入雷区的宽度不正确!");
                System.out.print("请重新输入:");
            }
            if(this.L2>64)
            {
                System.out.println("输入的雷区宽度过大!");
                System.out.print("请重新输入:");
            }
        }while (this.L2<=1||this.L2>64);
        System.out.print("请输入地雷的个数:");
        do {
            this.shuliang=input.nextInt();
            if(this.shuliang<=0||this.shuliang>=this.L1*this.L2)
            {
                System.out.println("输入地雷的个数不正确!");
                System.out.print("请重新输入:");
            }
        }while (this.shuliang<=0||this.shuliang>=this.L1*this.L2);
        tuixiang=new String[this.L2];
        geshu=0;
        zhongyao=new int[L2][L1];
        qizi=0;
        wenhao=0;
        JDK=0;
        JKK=0;
    }
    //地雷的随机分布
    private void T2(){
        A=new int[this.L2][this.L1];
        int B,C;
        for(int i=0;i3)
                {
                    System.out.println("输入错误!");
                    System.out.print("请重新输入:");
                }
            }while (A<1||A>3);
            if(A==1)
            {
                do {
                    System.out.println("请玩家选择如下操作");
                    System.out.print("""
                        1.插旗子
                        2.取旗子
                        3.退出
                        """);
                    do {
                        AA=input.nextInt();
                        if(AA<1||AA>3)
                        {
                            System.out.println("输入错误!");
                            System.out.print("请重新输入:");
                        }
                        if(AA==2&&qizi==0)
                        {
                            System.out.println("该雷区没有旗子可取!");
                            System.out.println("请重新输入:");
                        }
                        if(AA==1&&qizi==L1*L2)
                        {
                            System.out.println("该区域的旗子已经被插满了!");
                            System.out.println("请重新输入:");
                        }
                    }while ((AA<1||AA>3)||(AA==2&&qizi==0)||(AA==1&&qizi==L1*L2));
                    if(AA==1)
                    {
                        do{
                            T12(B);
                            if(tuixiang[B[0]-1].charAt(B[1]-1)==' ')
                            {
                                System.out.println("该区域没有地雷!");
                                System.out.print("请重新输入:");
                            }
                            if(tuixiang[B[0]-1].charAt(B[1]-1)==' ')
                            {
                                System.out.println("该区域已经插了旗子了!");
                            }
                            if(tuixiang[B[0]-1].charAt(B[1]-1)=='1'||tuixiang[B[0]-1].charAt(B[1]-1)=='2'||tuixiang[B[0]-1].charAt(B[1]-1)=='3'||tuixiang[B[0]-1].charAt(B[1]-1)=='4'||tuixiang[B[0]-1].charAt(B[1]-1)=='5'||tuixiang[B[0]-1].charAt(B[1]-1)=='6'||tuixiang[B[0]-1].charAt(B[1]-1)=='7'||tuixiang[B[0]-1].charAt(B[1]-1)=='8')
                            {
                                System.out.println("该区域没有地雷!");
                                System.out.print("请重新输入:");
                            }
                        }while(tuixiang[B[0]-1].charAt(B[1]-1)==' '||tuixiang[B[0]-1].charAt(B[1]-1)==' '||tuixiang[B[0]-1].charAt(B[1]-1)=='1'||tuixiang[B[0]-1].charAt(B[1]-1)=='2'||tuixiang[B[0]-1].charAt(B[1]-1)=='3'||tuixiang[B[0]-1].charAt(B[1]-1)=='4'||tuixiang[B[0]-1].charAt(B[1]-1)=='5'||tuixiang[B[0]-1].charAt(B[1]-1)=='6'||tuixiang[B[0]-1].charAt(B[1]-1)=='7'||tuixiang[B[0]-1].charAt(B[1]-1)=='8');
                        T6(B);
                        T8();
                    }
                    else
                    if(AA==2)
                    {
                        do{
                            T12(B);
                            if(tuixiang[B[0]-1].charAt(B[1]-1)!=' ')
                            {
                                System.out.println("该区域没有旗子!");
                            }
                        }while(tuixiang[B[0]-1].charAt(B[1]-1)!=' ');
                        T13(B);
                        T8();
                    }
                    else
                    {
                        T8();
                        break;
                    }
                }while(true);
            }
            else
            if(A==2)
            {
                do {
                    System.out.println("请玩家选择如下操作");
                    System.out.print("""
                        1.打问号
                        2.去问号
                        3.退出
                        """);
                    do {
                        AAA=input.nextInt();
                        if(AAA<1||AAA>3)
                        {
                            System.out.println("输入错误!");
                            System.out.print("请重新输入:");
                        }
                        if(AAA==2&&wenhao==0)
                        {
                            System.out.println("该雷区没有问号!");
                            System.out.println("请重新输入:");
                        }
                        if(AAA==1&&wenhao==L1*L2)
                        {
                            System.out.println("该区域的问号已经被填满了!");
                            System.out.println("请重新输入:");
                        }
                    }while ((AAA<1||AAA>3)||(AAA==2&&wenhao==0)||(AAA==1&&wenhao==L1*L2));
                    if(AAA==1)
                    {
                        do{
                            T12(B);
                            if(tuixiang[B[0]-1].charAt(B[1]-1)==' ')
                            {
                                System.out.println("该区域没有问号!");
                                System.out.print("请重新输入:");
                            }
                            if(tuixiang[B[0]-1].charAt(B[1]-1)=='?')
                            {
                                System.out.println("该区域已经有问号了!");
                            }
                            if(tuixiang[B[0]-1].charAt(B[1]-1)=='1'||tuixiang[B[0]-1].charAt(B[1]-1)=='2'||tuixiang[B[0]-1].charAt(B[1]-1)=='3'||tuixiang[B[0]-1].charAt(B[1]-1)=='4'||tuixiang[B[0]-1].charAt(B[1]-1)=='5'||tuixiang[B[0]-1].charAt(B[1]-1)=='6'||tuixiang[B[0]-1].charAt(B[1]-1)=='7'||tuixiang[B[0]-1].charAt(B[1]-1)=='8')
                            {
                                System.out.println("该区域没有问号!");
                                System.out.print("请重新输入:");
                            }
                        }while(tuixiang[B[0]-1].charAt(B[1]-1)==' '||tuixiang[B[0]-1].charAt(B[1]-1)=='?'||tuixiang[B[0]-1].charAt(B[1]-1)=='1'||tuixiang[B[0]-1].charAt(B[1]-1)=='2'||tuixiang[B[0]-1].charAt(B[1]-1)=='3'||tuixiang[B[0]-1].charAt(B[1]-1)=='4'||tuixiang[B[0]-1].charAt(B[1]-1)=='5'||tuixiang[B[0]-1].charAt(B[1]-1)=='6'||tuixiang[B[0]-1].charAt(B[1]-1)=='7'||tuixiang[B[0]-1].charAt(B[1]-1)=='8');
                        T7(B);
                        T8();
                    }
                    else
                    if(AAA==2)
                    {
                        do{
                            T16(B);
                            if(tuixiang[B[0]-1].charAt(B[1]-1)!='?')
                            {
                                System.out.println("该区域没有问号!");
                            }
                        }while(tuixiang[B[0]-1].charAt(B[1]-1)!='?');
                        T14(B);
                        T8();
                    }
                    else
                    {
                        T8();
                        break;
                    }
                }while (true);
            }
            else
            {
                T15(B);
                T9(B);
                T8();
                if(JKK==1)
                {
                    System.out.println("该区域被旗子占据!");
                    System.out.println("请将旗子去除在进行操作");
                }
                else
                if(JKK==2)
                {
                    System.out.println("该区域被问号占据!");
                    System.out.println("请将问号去除在进行操作");
                }
                JKK=0;
                if(JDK==0)
                {
                    T11();
                    if(geshu==L1*L2-shuliang)
                    {
                        System.out.println("恭喜玩家获得胜利^o^");
                    }
                    System.out.println("
");
                }
                else
                {
                    System.out.println("游戏失败!");
                    System.out.println("( ‵ ′) 炸弹!•••* ");
                    break;
                }
            }
        }
    }
    //揭开输入
    private int[] T15(int []B){
        Scanner input=new Scanner(System.in);
        do {
            System.out.print("请输入雷区的坐标:");
            B[0]=input.nextInt();
            B[1]=input.nextInt();
            if((B[0]>this.L2||B[0]<=0)||(B[1]>this.L1||B[1]<=0))
            {
                System.out.println("输入的坐标错误!");
            }
            else
            if(tuixiang[B[0]-1].charAt(B[1]-1)=='1'||tuixiang[B[0]-1].charAt(B[1]-1)=='2'||tuixiang[B[0]-1].charAt(B[1]-1)=='3'||tuixiang[B[0]-1].charAt(B[1]-1)=='4'||tuixiang[B[0]-1].charAt(B[1]-1)=='5'||tuixiang[B[0]-1].charAt(B[1]-1)=='6'||tuixiang[B[0]-1].charAt(B[1]-1)=='7'||tuixiang[B[0]-1].charAt(B[1]-1)=='8'||tuixiang[B[0]-1].charAt(B[1]-1)==' ')
            {
                System.out.println("该区域没有地雷!");
            }
        }while((B[0]>this.L2||B[0]<=0)||(B[1]>this.L1||B[1]<=0)||tuixiang[B[0]-1].charAt(B[1]-1)=='1'||tuixiang[B[0]-1].charAt(B[1]-1)=='2'||tuixiang[B[0]-1].charAt(B[1]-1)=='3'||tuixiang[B[0]-1].charAt(B[1]-1)=='4'||tuixiang[B[0]-1].charAt(B[1]-1)=='5'||tuixiang[B[0]-1].charAt(B[1]-1)=='6'||tuixiang[B[0]-1].charAt(B[1]-1)=='7'||tuixiang[B[0]-1].charAt(B[1]-1)=='8'||tuixiang[B[0]-1].charAt(B[1]-1)==' ');
        return B;
    }
    //旗子坐标输入
    private int[] T12(int []B){
        Scanner input=new Scanner(System.in);
        do {
            System.out.print("请输入旗子的坐标:");
            B[0]=input.nextInt();
            B[1]=input.nextInt();
            if((B[0]>this.L2||B[0]<=0)||(B[1]>this.L1||B[1]<=0))
            {
                System.out.println("输入的坐标错误!");
            }
            else
            if(tuixiang[B[0]-1].charAt(B[1]-1)=='1'||tuixiang[B[0]-1].charAt(B[1]-1)=='2'||tuixiang[B[0]-1].charAt(B[1]-1)=='3'||tuixiang[B[0]-1].charAt(B[1]-1)=='4'||tuixiang[B[0]-1].charAt(B[1]-1)=='5'||tuixiang[B[0]-1].charAt(B[1]-1)=='6'||tuixiang[B[0]-1].charAt(B[1]-1)=='7'||tuixiang[B[0]-1].charAt(B[1]-1)=='8'||tuixiang[B[0]-1].charAt(B[1]-1)==' ')
            {
                System.out.println("该区域没有地雷!");
            }
        }while((B[0]>this.L2||B[0]<=0)||(B[1]>this.L1||B[1]<=0)||tuixiang[B[0]-1].charAt(B[1]-1)=='1'||tuixiang[B[0]-1].charAt(B[1]-1)=='2'||tuixiang[B[0]-1].charAt(B[1]-1)=='3'||tuixiang[B[0]-1].charAt(B[1]-1)=='4'||tuixiang[B[0]-1].charAt(B[1]-1)=='5'||tuixiang[B[0]-1].charAt(B[1]-1)=='6'||tuixiang[B[0]-1].charAt(B[1]-1)=='7'||tuixiang[B[0]-1].charAt(B[1]-1)=='8'||tuixiang[B[0]-1].charAt(B[1]-1)==' ');
        return B;
    }
    //问号坐标输入
    private int[] T16(int []B){
        Scanner input=new Scanner(System.in);
        do {
            System.out.print("请输入旗子的坐标:");
            B[0]=input.nextInt();
            B[1]=input.nextInt();
            if((B[0]>this.L2||B[0]<=0)||(B[1]>this.L1||B[1]<=0))
            {
                System.out.println("输入的坐标错误!");
            }
            else
            if(tuixiang[B[0]-1].charAt(B[1]-1)=='1'||tuixiang[B[0]-1].charAt(B[1]-1)=='2'||tuixiang[B[0]-1].charAt(B[1]-1)=='3'||tuixiang[B[0]-1].charAt(B[1]-1)=='4'||tuixiang[B[0]-1].charAt(B[1]-1)=='5'||tuixiang[B[0]-1].charAt(B[1]-1)=='6'||tuixiang[B[0]-1].charAt(B[1]-1)=='7'||tuixiang[B[0]-1].charAt(B[1]-1)=='8'||tuixiang[B[0]-1].charAt(B[1]-1)==' ')
            {
                System.out.println("该区域没有地雷!");
            }
        }while((B[0]>this.L2||B[0]<=0)||(B[1]>this.L1||B[1]<=0)||tuixiang[B[0]-1].charAt(B[1]-1)=='1'||tuixiang[B[0]-1].charAt(B[1]-1)=='2'||tuixiang[B[0]-1].charAt(B[1]-1)=='3'||tuixiang[B[0]-1].charAt(B[1]-1)=='4'||tuixiang[B[0]-1].charAt(B[1]-1)=='5'||tuixiang[B[0]-1].charAt(B[1]-1)=='6'||tuixiang[B[0]-1].charAt(B[1]-1)=='7'||tuixiang[B[0]-1].charAt(B[1]-1)=='8'||tuixiang[B[0]-1].charAt(B[1]-1)==' ');
        return B;
    }
    //给雷区加旗帜
    private void T6(int []B){
        StringBuilder A;
        if(tuixiang[B[0]-1].charAt(B[1]-1)=='?')
        {
            wenhao--;
        }
        qizi++;
        A=new StringBuilder(tuixiang[B[0]-1]);
        A.setCharAt(B[1]-1,' ');
        tuixiang[B[0]-1]=A.toString();
    }
    //给雷区减旗帜
    private void T13(int []B){
        StringBuilder A;
        A=new StringBuilder(tuixiang[B[0]-1]);
        A.setCharAt(B[1]-1,' ');
        tuixiang[B[0]-1]=A.toString();
        qizi--;
    }
    //给图像加问号
    private void T7(int []B){
        StringBuilder A;
        if(tuixiang[B[0]-1].charAt(B[1]-1)==' ')
        {
            qizi--;
        }
        wenhao++;
        A=new StringBuilder(tuixiang[B[0]-1]);
        A.setCharAt(B[1]-1,'?');
        tuixiang[B[0]-1]=A.toString();
    }
    //给图像减问号
    private void T14(int []B){
        StringBuilder A;
        A=new StringBuilder(tuixiang[B[0]-1]);
        A.setCharAt(B[1]-1,' ');
        tuixiang[B[0]-1]=A.toString();
        wenhao--;
    }
    //揭开
    private void T9(int []B){
        StringBuilder JJ;
        int H1,H2;
        if(tuixiang[B[0]-1].charAt(B[1]-1)==' ')
        {
            JKK=1;
        }
        else
        if(tuixiang[B[0]-1].charAt(B[1]-1)=='?')
        {
            JKK=2;
        }
        else
        {
            if(A[B[0]-1][B[1]-1]==-1)
            {
                T15();
                JDK=1;
            }
            else
            {
                if(A[B[0]-1][B[1]-1]==0)
                {
                    H1=B[0]-1;
                    H2=B[1]-1;
                    chuli1(H1,H2);
                }
                else
                {
                    JJ=new StringBuilder(tuixiang[B[0]-1]);
                    JJ.setCharAt(B[1]-1,(char)(A[B[0]-1][B[1]-1]+48));
                    tuixiang[B[0]-1]=JJ.toString();
                    zhongyao[B[0]-1][B[1]-1]++;
                }
            }
        }
    }
    //处理1
    private void chuli1(int H1,int H2){
        StringBuilder JJ;
        for(int i=H1-1;i<=H1+1;i++)
        {
            for(int j=H2-1;j<=H2+1;j++)
            {
                if(i>=0&&i=0&&j=0&&i=0&&j=0&&j-1>=0)
                    {
                        if(A[i-1][j-1]==-1)
                        {
                            J++;
                        }
                    }
                    if(i-1>=0)
                    {
                        if(A[i-1][j]==-1)
                        {
                            J++;
                        }
                    }
                    if(i-1>=0&&j+1=0)
                    {
                        if(A[i][j-1]==-1)
                        {
                            J++;
                        }
                    }
                    if(j+1=0)
                    {
                        if(A[i+1][j-1]==-1)
                        {
                            J++;
                        }
                    }
                    if(i+1

测试代码

public class str1 {
    public static void main(String[] args) {
        SaoLei A=new SaoLei();
        A.asd();
    }
}

页面更新:2024-04-01

标签:递归   雷区   方格   旗子   游戏   地雷   数组   坐标   问号   操作

1 2 3 4 5

上滑加载更多 ↓
Top