A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© samove 中级黑马   /  2015-7-2 19:47  /  6416 人查看  /  87 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. <div class="blockcode"><blockquote><div class="blockcode"><blockquote><div class="blockcode"><blockquote><div class="blockcode"><blockquote>class JieMian {

  2.         private JieMian() {};

  3.         public static void Print(boolean[] lei, int[] guangBiao, int[] xianShi,
  4.                         int[] slw) {
  5.                 for (int i = 0, a = 0; i < 11; i++) // 局部变量 a 用来,判定光标的位置。
  6.                 {
  7.                         for (int ii = 0; ii < 11; ii++) {
  8.                                 if (i == 0 || i == 10) // 第一行与最后一行。
  9.                                 {
  10.                                         if (ii == 10) {
  11.                                                 System.out.println("■"); // 最后一行,( ,1) 换行
  12.                                         } else {
  13.                                                 System.out.print("■");
  14.                                         }
  15.                                 } else {
  16.                                         if (ii == 0) // 第一列
  17.                                         {
  18.                                                 System.out.print("■");
  19.                                         } else if (ii == 10) // 最后一列
  20.                                         {
  21.                                                 System.out.println("■");
  22.                                         } else // else 为中间部分。变量a从这部分开始计数。〓↓〓↓〓↓〓↓〓↓〓↓〓
  23.                                         {
  24.                                                 if (lei[a] == true) // 有雷
  25.                                                 {
  26.                                                         if (guangBiao[0] == a) // guangBiao==a,光标在的位置优先显示光标。
  27.                                                                 System.out.print("※");
  28.                                                         else {
  29.                                                                 if (xianShi[a] == -1) {
  30.                                                                         System.out.print("▲");
  31.                                                                 } else
  32.                                                                         System.out.print("□");
  33.                                                                 // System.out.print("●",0); //调试时,显示雷的位置。
  34.                                                         }
  35.                                                 } else if (lei[a] != true && slw[a] != 0) // 无雷,但附近有雷。
  36.                                                 {
  37.                                                         if (guangBiao[0] == a)
  38.                                                                 System.out.print("※");
  39.                                                         else {
  40.                                                                 if (xianShi[a] == -1) // 当xianShi[jiaoBiao]=-1,打开显示
  41.                                                                 {
  42.                                                                         System.out.print(slw[a]+""+slw[a]); // 显示附近雷的数目
  43.                                                                 } else
  44.                                                                         System.out.print("□"); // 默认用"□"隐藏。
  45.                                                         }
  46.                                                 } else // 空白处。
  47.                                                 {
  48.                                                         if (guangBiao[0] == a)
  49.                                                                 System.out.print("※");
  50.                                                         else {
  51.                                                                 if (xianShi[a] == -1)
  52.                                                                         System.out.print("  ");
  53.                                                                 else
  54.                                                                         System.out.print("□");
  55.                                                         }
  56.                                                 }
  57.                                                 a++;
  58.                                                 // 放在else中间部分,81个元素。当guangBiao与a的值对应时就打印"※"。〓↑〓↑〓↑〓↑〓↑〓↑〓↑〓↑
  59.                                         }
  60.                                 }
  61.                         }
  62.                 }
  63.                 System.out.println();
  64.         }
  65. }
复制代码

class FanWei {
        private FanWei() {}

        public static int[] getWASD(int jiDian) // jiDian→左右上下
        {
                int[] wasd = { 0, 0, 0, 0, 0, 0, 0, 0 };
                switch (jiDian) {
                case 0:
                        wasd[0] = 0; // 左上
                        wasd[1] = 0; // 上
                        wasd[2] = 0; // 右上
                        wasd[3] = 0; // 左
                        wasd[4] = 1; // 右
                        wasd[5] = 0; // 左下
                        wasd[6] = 9; // 下
                        wasd[7] = 10; // 右下
                        break;
                case 8:
                        wasd[0] = 0; // 左上
                        wasd[1] = 0; // 上
                        wasd[2] = 0; // 右上
                        wasd[3] = -1; // 左
                        wasd[4] = 0; // 右
                        wasd[5] = 8; // 左下
                        wasd[6] = 9; // 下
                        wasd[7] = 0; // 右下
                        break;
                case 72:
                        wasd[0] = 0; // 左上
                        wasd[1] = -9; // 上
                        wasd[2] = -8; // 右上
                        wasd[3] = 0; // 左
                        wasd[4] = 1; // 右
                        wasd[5] = 0; // 左下
                        wasd[6] = 0; // 下
                        wasd[7] = 0; // 右下
                        break;
                case 80:
                        wasd[0] = -10; // 左上
                        wasd[1] = -9; // 上
                        wasd[2] = 0; // 右上
                        wasd[3] = -1; // 左
                        wasd[4] = 0; // 右
                        wasd[5] = 0; // 左下
                        wasd[6] = 0; // 下
                        wasd[7] = 0; // 右下
                        break;
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                case 7:
                        wasd[0] = 0; // 左上
                        wasd[1] = 0; // 上
                        wasd[2] = 0; // 右上
                        wasd[3] = -1; // 左
                        wasd[4] = 1; // 右
                        wasd[5] = 8; // 左下
                        wasd[6] = 9; // 下
                        wasd[7] = 10; // 右下
                        break;
                case 73:
                case 74:
                case 75:
                case 76:
                case 77:
                case 78:
                case 79:
                        wasd[0] = -10; // 左上
                        wasd[1] = -9; // 上
                        wasd[2] = -8; // 右上
                        wasd[3] = -1; // 左
                        wasd[4] = 1; // 右
                        wasd[5] = 0; // 左下
                        wasd[6] = 0; // 下
                        wasd[7] = 0; // 右下
                        break;
                case 9:
                case 18:
                case 27:
                case 36:
                case 45:
                case 54:
                case 63:
                        wasd[0] = 0; // 左上
                        wasd[1] = -9; // 上
                        wasd[2] = -8; // 右上
                        wasd[3] = 0; // 左
                        wasd[4] = 1; // 右
                        wasd[5] = 0; // 左下
                        wasd[6] = 9; // 下
                        wasd[7] = 10; // 右下
                        break;
                case 17:
                case 26:
                case 35:
                case 44:
                case 53:
                case 62:
                case 71:
                        wasd[0] = -10; // 左上
                        wasd[1] = -9; // 上
                        wasd[2] = 0; // 右上
                        wasd[3] = -1; // 左
                        wasd[4] = 0; // 右
                        wasd[5] = 8; // 左下
                        wasd[6] = 9; // 下
                        wasd[7] = 0; // 右下
                        break;
                default:
                        wasd[0] = -10; // 左上
                        wasd[1] = -9; // 上
                        wasd[2] = -8; // 右上
                        wasd[3] = -1; // 左
                        wasd[4] = 1; // 右
                        wasd[5] = 8; // 左下
                        wasd[6] = 9; // 下
                        wasd[7] = 10; // 右下
                        break;
                }
                return wasd;
        }
}

class FuJin {
        private FuJin() {}

        public static void leiShu(int[] slw, int leiDian) {
                switch (leiDian) {
                case 0:
                        slw[leiDian + 1]++;
                        slw[leiDian + 9]++;
                        slw[leiDian + 10]++;
                        break;
                case 8:
                        slw[leiDian - 1]++;
                        slw[leiDian + 9]++;
                        slw[leiDian + 8]++;
                        break;
                case 72:
                        slw[leiDian + 1]++;
                        slw[leiDian - 9]++;
                        slw[leiDian - 8]++;
                        break;
                case 80:
                        slw[leiDian - 1]++;
                        slw[leiDian - 9]++;
                        slw[leiDian - 10]++;
                        break;
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                case 7:
                        slw[leiDian - 1]++;
                        slw[leiDian + 1]++;
                        slw[leiDian + 8]++;
                        slw[leiDian + 9]++;
                        slw[leiDian + 10]++;
                        break;
                case 73:
                case 74:
                case 75:
                case 76:
                case 77:
                case 78:
                case 79:
                        slw[leiDian - 1]++;
                        slw[leiDian + 1]++;
                        slw[leiDian - 8]++;
                        slw[leiDian - 9]++;
                        slw[leiDian - 10]++;
                        break;
                case 9:
                case 18:
                case 27:
                case 36:
                case 45:
                case 54:
                case 63:
                        slw[leiDian - 9]++;
                        slw[leiDian + 9]++;
                        slw[leiDian - 8]++;
                        slw[leiDian + 1]++;
                        slw[leiDian + 10]++;
                        break;
                case 17:
                case 26:
                case 35:
                case 44:
                case 53:
                case 62:
                case 71:
                        slw[leiDian - 9]++;
                        slw[leiDian + 9]++;
                        slw[leiDian - 10]++;
                        slw[leiDian - 1]++;
                        slw[leiDian + 8]++;
                        break;
                default:
                        slw[leiDian - 8]++;
                        slw[leiDian - 9]++;
                        slw[leiDian - 10]++;
                        slw[leiDian + 8]++;
                        slw[leiDian + 9]++;
                        slw[leiDian + 10]++;
                        slw[leiDian - 1]++;
                        slw[leiDian + 1]++;
                        break;
                } // 对雷附近雷数分析↑↑↑↑↑↑

                return ;
        }
}

class Move {
        private Move() {};

        // 用变量“guangBiao”的值(0~80),定义光标应移动到的位置。
        public static void upW(boolean[] lei, int[] guangBiao, int[] xianShi,
                        int[] slw){
                if (guangBiao[0] < 9)
                        guangBiao[0] += 72;
                else
                        guangBiao[0] -= 9;
        }

        public static void leftA(boolean[] lei, int[] guangBiao, int[] xianShi,
                        int[] slw) {
                if (guangBiao[0] == 0)
                        guangBiao[0] = 80;
                else
                        guangBiao[0] -= 1;
        }

        public static void downS(boolean[] lei, int[] guangBiao, int[] xianShi,
                        int[] slw) {
                if (guangBiao[0] > 71)
                        guangBiao[0] -= 72;
                else
                        guangBiao[0] += 9;
        }

        public static void rightD(boolean[] lei, int[] guangBiao, int[] xianShi,
                        int[] slw) {
                if (guangBiao[0] == 80)
                        guangBiao[0] = 0;
                else
                        guangBiao[0] += 1;
        }
}

class Victory {
        private Victory() {};

        public static void print() {
                for (int i = 0, a = 0; i < 11; i++) {
                        for (int ii = 0; ii < 11; ii++) {
                                if (i == 0 || i == 10) // 第一行与最后一行。
                                {
                                        if (ii == 10) {
                                                System.out.println("■"); // 最后一列,( ,1) 换行
                                        } else {
                                                System.out.print("■");
                                        }
                                } else {
                                        if (ii == 0) // 第一列
                                        {
                                                System.out.print("■");
                                        } else if (ii == 10) // 最后一列
                                        {
                                                System.out.println("■");
                                        } else // else 为中间部分。变量a从这部分开始计数。〓↓〓↓〓↓〓↓〓↓〓↓〓
                                        {
                                                switch (a % 9) {
                                                case 0:
                                                case 8:
                                                        System.out.print("★");
                                                        break;
                                                case 1:
                                                        System.out.print("我");
                                                        break;
                                                case 2:
                                                        System.out.print("爱");
                                                        break;
                                                case 3:
                                                        System.out.print("北");
                                                        break;
                                                case 4:
                                                        System.out.print("京");
                                                        break;
                                                case 5:
                                                        System.out.print("天");
                                                        break;
                                                case 6:
                                                        System.out.print("安");
                                                        break;
                                                case 7:
                                                        System.out.print("门");
                                                        break;
                                                default:
                                                        break;
                                                }
                                                a++; // 变量 a 记录中间81个元素。〓↑〓↑〓↑〓↑〓↑〓↑〓↑〓↑
                                        }
                                }

                        }
                }
        }
}

代码太长,没发成功,楼下补下。游戏规则基本同电脑扫雷,另:按“w、a、s、d”移动光标,按“y”踩非雷区,按“l”找到并标记雷,标记出十个雷胜利。

评分

参与人数 3技术分 +1 黑马币 +18 收起 理由
芬芬老师 + 1 很给力! 补上啦~~~
098ASD + 12 淡定
1014914737 + 6 很给力!

查看全部评分

87 个回复

倒序浏览
class Select {
        private Select() {}

        public static void caseSS(boolean[] lei, int[] guangBiao, int[] xianShi,
                        int[] slw, String ss, int[] winX, boolean[] b) // 对输入字符串进行判断,进行相应动作。
        {
                switch (ss) {
                case "w":
                        Move.upW(lei, guangBiao, xianShi, slw);
                        break;
                case "a":
                        Move.leftA(lei, guangBiao, xianShi, slw);
                        break;
                case "s":
                        Move.downS(lei, guangBiao, xianShi, slw);
                        break;
                case "d":
                        Move.rightD(lei, guangBiao, xianShi, slw);
                        break;
                case "y": // 确定打开非雷区域,如果是雷,游戏失败。
                        y(lei, guangBiao, xianShi, slw, 1, winX, b);
                        break;
                case "l": // 雷的确定并计数,如果非雷,游戏失败。
                        y(lei, guangBiao, xianShi, slw, 0, winX, b);
                        break;
                default:
                        System.out
                                        .println("请输入\"w、a、s、d\"进行移动,输入\"y\"显示非雷区,输入\"l(L小写)\"确定雷点。");
                        break;
                }
                JieMian.Print(lei, guangBiao, xianShi, slw);
                return;
        }

        private static void y(boolean[] lei, int[] guangBiao, int[] xianShi,
                        int[] slw, int canShu, int[] winX, boolean[] b) {
                switch (canShu) {
                case 1: // 输入 y → case 1:
                        if (lei[guangBiao[0]] == true) {
                                System.out.println("哎呀,妈呀,你踩着雷了。\n");
                                b[0] = false;
                                return;
                        } else if (slw[guangBiao[0]] != 0) {
                                xianShi[guangBiao[0]] = -1;
                        } else {
                                int jiDian = guangBiao[0];
                                xianShi[guangBiao[0]] = -1;
                                kongBai(xianShi, jiDian); // 空白扩散。第一步。jiDian → 基点
                                //JieMian.Print(lei, guangBiao, xianShi, slw);
                                for (int i = 0; i < 81; i++) {
                                        // slw[i]==0 → 空白处,lei[i]==false → 非雷区。
                                        if (slw[i] == 0 && lei[i] == false) {
                                                int[] wasd = FanWei.getWASD(i);
                                                for (int ii = 0; ii < 8; ii++) {
                                                        if (xianShi[i + wasd[ii]] == -1 && wasd[ii] != 0
                                                                        && slw[i + wasd[ii]] == 0) {
                                                                // //调试扩散位置
                                                                // System.out.println("xianShi[i+wasd[ii]]"+xianShi[i+wasd[ii]]);
                                                                kongBai(xianShi, i + wasd[ii]);
                                                                // System.out.println("i+wasd[ii]="+(i+wasd[ii]));
                                                        }
                                                }
                                        }
                                }

                                for (int i = 80; i >= 0; i--) // 倒过来再运行一次,使扩散更广。
                                {
                                        if (slw[i] == 0 && lei[i] == false) {
                                                int[] wasd = FanWei.getWASD(i);
                                                for (int ii = 0; ii < 8; ii++) {
                                                        if (xianShi[i + wasd[ii]] == -1 && wasd[ii] != 0
                                                                        && slw[i + wasd[ii]] == 0) {
                                                                // //调试扩散位置
                                                                // System.out.println("xianShi[i+wasd[ii]]"+xianShi[i+wasd[ii]]);
                                                                kongBai(xianShi, i + wasd[ii]);
                                                                // System.out.println("i+wasd[ii]="+(i+wasd[ii]));
                                                        }
                                                }
                                        }
                                }
                        }
                        break;
                case 0: // 输入 l → case 0:
                        if (lei[guangBiao[0]] == true) {
                                if (xianShi[guangBiao[0]] != -1) {
                                        xianShi[guangBiao[0]] = -1;
                                        winX[0]++;
                                        if (winX[0] == 10) // 如果已经胜利。
                                        {
                                                System.out.println("恭喜十个雷都已经找到!国家需要你这样的人才!");
                                                b[0] = false; // 结束循环。
                                                Victory.print();
                                                System.exit(0);
                                                return;
                                        } else
                                                System.out.println("恭喜找到" + winX[0] + "个雷,拆弹部队正在路上......");
                                }
                        } else {
                                System.out.println("抱歉,这里不是雷,游戏失败,请再接再厉。");
                                b[0] = false;
                        }
                        break;
                default:
                        break;
                }
                return;
        }

        private static void kongBai(int[] xianShi, int jiDian) {
                int wasd[] = FanWei.getWASD(jiDian); // 扩散范围。
                for (int ii = 0; ii < 8; ii++) {
                        xianShi[jiDian + wasd[ii]] = -1;
                }
        }
}
回复 使用道具 举报
import java.util.Random;
import java.util.Scanner;

class GameLeiLei {
        static boolean[] lei = new boolean[81];// 如果有雷的点值为 true 。
        static int[] slw = new int[81]; // 游戏区间内的元素,用来分析附近雷数
        static int[] guangBiao = { 40 }; // 光标移动范围0~80
        Scanner sc = new Scanner(System.in);
        String ss;
        static int[] winX = { 0 };
        static boolean[] b = { true };
        static int[] xianShi = new int[81]; // 用来判断光标位置,按y,之后,显示,定义xianShi[jiaoBiao]=-1就显示。
        static boolean[] kk = { true }; // 扩散空白,判断是否停止。

        {
                Random r = new Random();
                for (int i = 0; i < 10; i++) {
                        int leiDian = r.nextInt(81);
                        if (lei[leiDian] == true)
                                i--;
                        else {
                                lei[leiDian] = true; // 随机出十个雷点。
                                FuJin.leiShu(slw, leiDian);//同时在附近标记有雷,用 slw [] 记录。
                        }
                }
        }

        public void run() {
                JieMian.Print(lei, guangBiao, xianShi, slw);

                while (b[0]) // 当 b[0] 为false 循环结束,游戏结束,否则一直在游戏中。
                {
                        win();
                        ss = sc.nextLine(); // 输入
                        Select.caseSS(lei, guangBiao, xianShi, slw, ss, winX, b);
                }
                System.out.println("游戏结束,谢谢体验slw.扫雷1.0版本");
        }

        private void win() // 对胜利条件分析,如果十个雷都找出来就返回false,终止下面 while的循环。
        {
                if (winX[0] == 10)
                        b[0] = false;
                else
                        b[0] = true;
        }
}

  1. class SaoLei {

  2.         public static void main(String[] args) {

  3.                 GameLeiLei gg = new GameLeiLei();
  4.                 gg.run();

  5.         }
  6. }
复制代码
回复 使用道具 举报
本帖最后由 samove 于 2015-7-2 21:33 编辑

一共八个class类,main方法在 class SaoLei 类里面,即上面最后一个。代码比较多,发的有点乱,请见谅。
再补充,第一行代码上面,有系统加的乱码【<div class="blockcode"><blockquote><div class="blockcode"><blockquote><div class="blockcode"><blockquote><div class="blockcode"><blockquote>class JieMian {  】
只有最后
class JieMian {
为有效代码。

如果有想要交流学习的同学,可以私信我直接发源码文件。
谢谢关注,谢谢支持,求加分,呵呵。^_^
再补两张游戏界面图。




回复 使用道具 举报
{:3_51:}楼主的很有才能 非常的棒 向其学习
回复 使用道具 举报
谢谢,分享,学习一下。
回复 使用道具 举报
求关注。。。求关注。。。求加分,谢谢
回复 使用道具 举报
厉害 大神啊   = = 看到这么长就晕了
回复 使用道具 举报
真棒!!!!!!

点评

求加分呀 ^_^  发表于 2015-7-6 21:24
回复 使用道具 举报
虽然看不懂 还是得赞一个
回复 使用道具 举报
厉害,必须点个赞
回复 使用道具 举报
很棒,怎么没上传个图片呢?赞一个。
回复 使用道具 举报
芬芬老师 发表于 2015-7-2 21:05
真棒!!!!!!

芬芬老师,给加点分呗 :victory:
回复 使用道具 举报
孙培广 发表于 2015-7-2 21:28
很棒,怎么没上传个图片呢?赞一个。

在楼上补了两张游戏界面图,不出意外的话,可以直接复制代码,运行的,分8个class类。
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
看不懂。。。。。。。
回复 使用道具 举报
真牛!崇拜你!
回复 使用道具 举报
很赞啊,用了多少时间写的?
回复 使用道具 举报
楼主碉堡了。。。
回复 使用道具 举报
哈哈  留名
回复 使用道具 举报
12345下一页
您需要登录后才可以回帖 登录 | 加入黑马