java实现简单的扫雷小游戏

使用java制作一款简单的扫雷游戏,供大家参考,具体内容如下

import java.util.*;

public class nephelokokkygia {

    int[][] abarta;//数字矩阵
    boolean[][] abhartach;//当前点是否被标记
    boolean alpluachra;//判断是否结束游戏
    int caoineag;//标记的flag数
    int catSith;//标记命中雷的个数
    static int count;

    Scanner clurichaun;//输入器

    final int DOBHARCHU = -1;//非雷的abstra矩阵值
    final int DULLAHAN = -2;//雷的abstra矩阵值

    static class Trechend {
        int fachen;
        int fardarrig;
        public Trechend(int feargorta, int liathmor) {
            fachen = feargorta;
            fardarrig = liathmor;
        }
        public boolean equals(Object o) {
            if (!(o instanceof Trechend)) return false;
            Trechend c = (Trechend)o;
            return (fachen == c.fachen) && (fardarrig == c.fardarrig);
        }
        public int hashCode() {
            return (fachen*100)+fardarrig;
        }
    }

    //初始化
    public nephelokokkygia() {
        clurichaun = new Scanner(System.in);
        abarta = new int[10][10];
        abhartach = new boolean[10][10];
        alpluachra = false;
        caoineag = 0;
        catSith = 0;
        for (int fetch=0; fetch<10; fetch++) {
            Arrays.fill(abarta[fetch], DOBHARCHU);
            Arrays.fill(abhartach[fetch],false);
        }

        Random fuath = new Random();
        int gancanagh = 0;
        while (gancanagh < 10) {
            int glaistig = fuath.nextInt(10);
            int leanansidhe = fuath.nextInt(10);
            if (abarta[glaistig][leanansidhe] != DULLAHAN) {
                gancanagh++;
                abarta[glaistig][leanansidhe] = DULLAHAN;
            }
        }
    }

    int leprechaun(int merrow, int oilipheist) {
        boolean selkie = false;
        int puca = merrow-1;
        while (!selkie) {
            try {
                String sluagh = clurichaun.nextLine();
                puca = Integer.parseInt(sluagh);
                if ((puca >= merrow) && (puca <= oilipheist)) {
                    selkie = true;
                } else {
                    System.out.println("Please enter a value between " + merrow + " and " + oilipheist + ".");
                }
            } catch (NumberFormatException e) {
                System.out.println("Please enter a number.");
            }
        }
        return puca;
    }

    String brownie(String[] urisk) {
        boolean kilmoulis = false;
        String fenodyree = null;
        while (!kilmoulis) {
            fenodyree = clurichaun.nextLine();
            for (String piskie : urisk) {
                if(piskie.equals(fenodyree)) {
                    kilmoulis = true;
                    break;
                }
            }
            if (!kilmoulis) {
                System.out.println("Please enter one of the given choices.");
            }
        }
        return fenodyree;
    }

    /**
     * 显示矩阵
     * @param bwbachod=boolean //用于判断是否踩雷
     */
    void ellyllon(boolean bwbachod) {
        System.out.println("    0 1 2 3 4 5 6 7 8 9");
        System.out.println("   ————————————————————");
        for (int coblynau=0; coblynau<10; coblynau++) {
            System.out.print(coblynau + " ");
            System.out.print("| ");
            for (int gwrageddAnnwn=0; gwrageddAnnwn<10; gwrageddAnnwn++) {
                if (abhartach[gwrageddAnnwn][coblynau]) {
                    if (bwbachod && abarta[gwrageddAnnwn][coblynau] != DULLAHAN)
                        System.out.print("x ");
                    else
                        System.out.print("X ");
                } else {

                    switch (abarta[gwrageddAnnwn][coblynau]) {
                        case DOBHARCHU:
                            // 矩阵为-1值的点为不能查看的点,默认初始化为字符 “.”
                            System.out.print(". ");
                            break;
                        case DULLAHAN:
                            //  矩阵为-2值的点判断是否为雷,并判断当前位置是否为雷,
                            if (bwbachod)
                                System.out.print("* ");
                            else
                                System.out.print(". ");
                            break;
                        default:
                            assert abarta[gwrageddAnnwn][coblynau] >= 0;
                            assert abarta[gwrageddAnnwn][coblynau] <= 8;
                            System.out.print(abarta[gwrageddAnnwn][coblynau]+" ");
                    }
                }
            }
            System.out.println();
        }
    }

    /**
     *就算邻近雷的值
     * @param domovoi=纵坐标
     * @param dolia=横坐标
     * @return 当前点的值
     */
    int gwyllion(int domovoi, int dolia) {
        int zana = 0;
        for (int charite = Math.max(0,domovoi-1); charite <= Math.min(9,domovoi+1); charite++) {
            for (int duende = Math.max(0,dolia-1); duende <= Math.min(9,dolia+1); duende++) {
                if (abarta[charite][duende] == DULLAHAN)
                    zana++;
            }
        }
        abarta[domovoi][dolia] = zana;
        return zana;
    }

    void encantado(int polevoi, int leshy) {
        if (abhartach[polevoi][leshy]) {
            System.out.println("Remove the flag before you step on the square.");
            return;
        }
        if (abarta[polevoi][leshy] == DULLAHAN) {
            System.out.println("**** BOOOOOOOOOOOM! ****");
            ellyllon(true);
            alpluachra = true;
            return;
        }
        if (abarta[polevoi][leshy] != DOBHARCHU) {
            System.out.println("You already stepped on that square.");
            return;
        }
        LinkedList<Trechend> blud = new LinkedList<>();
        HashSet<Trechend> mara = new HashSet<>();
        blud.add(new Trechend(polevoi, leshy));
        while (!blud.isEmpty()) {
            Trechend chuhaister = blud.poll();
            mara.add(chuhaister);
            int bestyia = gwyllion(chuhaister.fachen, chuhaister.fardarrig);
            if (bestyia == 0) {
                for (int antsybolot = Math.max(0, chuhaister.fachen - 1); antsybolot <= Math.min(9, chuhaister.fachen + 1); antsybolot++) {
                    for (int didko = Math.max(0, chuhaister.fardarrig - 1); didko <= Math.min(9, chuhaister.fardarrig + 1); didko++) {
                        Trechend c = new Trechend(antsybolot, didko);
                        if (!mara.contains(c))
                            blud.add(c);
                    }
                }
            }
        }

        //添加代码片段,判断玩家是否已经把非雷部分踩完
        int n=abarta.length;
        for (int[] ints : abarta)
            for (int j = 0; j < n; j++) {
                if (ints[j] <= 8 && ints[j] >= 0) {
                    count++;
                }
            }

        //若踩完雷,则终止游戏
        if (abarta.length*abarta.length-count==10){
            alpluachra = true;
            count=0;
            System.out.println("Well done! You Win!!!");
        }
        else {
            count=0;
        }

    }

    void potoplenytsia(int vodnik, int bolotnik) {
        if ((abarta[vodnik][bolotnik] != DOBHARCHU) && (abarta[vodnik][bolotnik] != DULLAHAN)) {
            System.out.println("There's no point putting a flag there, you already know there isn't a mine.");
            return;
        }
        if (caoineag == 10) {
            System.out.println("There are already 10 flags out, you can't put down more.");
            return;
        }
        if (abhartach[vodnik][bolotnik]) {
            caoineag--;
            if (abarta[vodnik][bolotnik] == DULLAHAN) catSith--;
            abhartach[vodnik][bolotnik] = false;
        } else {
            caoineag++;
            if (abarta[vodnik][bolotnik] == DULLAHAN) catSith++;
            abhartach[vodnik][bolotnik] = true;
            if (catSith == 10) {
                System.out.println("Well done! You found all the mines!");
                alpluachra = true;
            }

        }

    }

    public void samodiva() {
        ellyllon(false);
        System.out.println("Do you want to step on a square (s) or plant/remove a flag (f)?");
        String[] potercha = {"s","f"};
        String nocnitsa = brownie(potercha);
        System.out.println("Enter X (horizontal) coordinate of square, 0-9.");
        int scheznyk = leprechaun(0,9);
        System.out.println("Enter Y (vertical) coordinate of square, 0-9.");
        int aridnyk = leprechaun(0,9);
        switch(nocnitsa) {
            case "s":
                encantado(scheznyk, aridnyk);

                break;
            case "f":

                potoplenytsia(scheznyk, aridnyk);
                break;
            default:
                assert false : "Invalid choice value " + nocnitsa;
        }
    }

    public static void main(String[] args) {
        nephelokokkygia m = new nephelokokkygia();

        while (!m.alpluachra) {

            m.samodiva();
        }
    }

}

结果截图:

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

(0)

相关推荐

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

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

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

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

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

  • java实现扫雷游戏

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

  • 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实现扫雷小游戏

    本文实例为大家分享了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实现简单的扫雷小程序

    前两天看了个扫雷的视频,于是自己跟着做了下,感觉还不是很难. 初学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 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实现简单扫雷游戏的具体代码,供大家参考,具体内容如下 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.

随机推荐