android小游戏 扫雷

原创 2016年12月23日 15:14:39

MainActivity 类

public class MainActivity extends Activity implements OnClickListener,
        OnLongClickListener {
    // 最外层布局
    LinearLayout textviews;
    LinearLayout buttons;

    int[][] map = new int[10][10];

    // 用来隐藏所有Button
    List<Button> buttonList = new ArrayList<Button>();

    // -1

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textviews = (LinearLayout) findViewById(R.id.textviews);
        buttons = (LinearLayout) findViewById(R.id.buttons);
        initData();
        initView();
    }

    Set<Integer> random地雷;

    private void initData() {
        // 10个地雷 显示* 数组中是-1
        // 90个 雷的边上是数字,其他是空白 0 1-8
        // 100个数字 从里面随机取走10个
        // 初始化
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                map[i][j] = 0;
            }
        }
        // 抽取100个数 99
        random地雷 = getRandom();
        // 丢入map
        for (Integer integer : random地雷) {
            int hang = integer / 10;// 98
            int lie = integer % 10;
            // 所有的地雷用-1代替
            map[hang][lie] = -1;
        }
        // 为所有的空白地点去设置数值
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                if (map[i][j] == -1)
                    continue; // 继续下次循环
                int sum = 0;
                // 左上角
                if (i != 0 && j != 0) {// 防止下标越界
                    if (map[i - 1][j - 1] == -1)
                        sum++;
                }
                // 上面
                if (j != 0) {
                    if (map[i][j - 1] == -1)
                        sum++;
                }
                // 右上角
                if (j != 0 && i != 9) {
                    if (map[i + 1][j - 1] == -1)
                        sum++;
                }
                // 左边
                if (i != 0) {
                    if (map[i - 1][j] == -1)
                        sum++;
                }
                // 右边
                if (i != 9) {
                    if (map[i + 1][j] == -1)
                        sum++;
                }
                // 左下角
                if (j != 9 && i != 0) {
                    if (map[i - 1][j + 1] == -1)
                        sum++;
                }
                if (j != 9) {
                    if (map[i][j + 1] == -1)
                        sum++;
                }
                if (j != 9 && i != 9) {
                    if (map[i + 1][j + 1] == -1)
                        sum++;
                }
                map[i][j] = sum;
            }
        }

        // 打印看看
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }
    }

    private Set<Integer> getRandom() {
        // 没有重复的
        Set<Integer> set = new HashSet<Integer>();
        while (set.size() != 10) {
            int random = (int) (Math.random() * 100);
            set.add(random);
        }
        return set;
    }

    // 创建视图
    private void initView() {
        int width = getResources().getDisplayMetrics().widthPixels / 10;
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(width,
                width);
        for (int i = 0; i < 10; i++) {
            // 每一条的布局
            LinearLayout tvs = new LinearLayout(this);
            tvs.setOrientation(LinearLayout.HORIZONTAL);
            LinearLayout btns = new LinearLayout(this);
            btns.setOrientation(LinearLayout.HORIZONTAL);
            // 添加内层的100个按钮和文本
            for (int j = 0; j < 10; j++) {
                // 底层的TextView
                TextView tv = new TextView(this);
                tv.setBackgroundResource(R.drawable.textview_bg);
                tv.setLayoutParams(params);
                tv.setGravity(Gravity.CENTER);
                if (map[i][j] == -1)
                    tv.setText("*");
                else if (map[i][j] != 0)
                    tv.setText(map[i][j] + "");
                tvs.addView(tv);
                // 底层的Button
                Button btn = new Button(this);
                btn.setBackgroundResource(R.drawable.button);
                btn.setLayoutParams(params);
                btn.setTag(i * 10 + j);
                btn.setOnClickListener(this);
                btn.setOnLongClickListener(this);
                buttonList.add(btn);
                btns.addView(btn);
            }
            textviews.addView(tvs);
            buttons.addView(btns);
        }
    }

    @Override
    public void onClick(View v) {
        int id = (Integer) v.getTag();
        int hang = id / 10;
        int lie = id % 10;
        // 隐藏按钮,显示底下的数据
        v.setVisibility(View.INVISIBLE);
        isOver(hang, lie);
        // 判断点击的是否是一个数字
        if (map[hang][lie] == 0) {
            // 开始递归
            显示周围所有的空白(hang, lie);
        }
        if (isWin()) {
            Toast.makeText(this, "游戏胜利", Toast.LENGTH_SHORT).show();
        }
    }

    // 显示周围所有的button
    public void 显示周围所有的空白(int i, int j) {
        // 检测周围的元素,如果为0 继续调用自身,并且显示
        // 不是,就显示button
        // 从左上角开始
        // 左上角
        // 先显示自己
        buttonList.get(i * 10 + j).setVisibility(View.INVISIBLE);
        if (i != 0 && j != 0) {// 防止下标越界
            if (map[i - 1][j - 1] == 0) {
                if (判断是否需要递归(i - 1, j - 1))
                    显示周围所有的空白(i - 1, j - 1);
            } else {
                隐藏button(i - 1, j - 1);
            }
        }
        // 上面
        if (j != 0) {
            if (map[i][j - 1] == 0) {
                if (判断是否需要递归(i, j - 1))
                    显示周围所有的空白(i, j - 1);
            } else {
                隐藏button(i, j - 1);
            }
        }
        // 右上角
        if (j != 0 && i != 9) {
            if (map[i + 1][j - 1] == 0) {
                if (判断是否需要递归(i + 1, j - 1))
                    显示周围所有的空白(i + 1, j - 1);
            } else {
                隐藏button(i + 1, j - 1);
            }
        }
        // 左边
        if (i != 0) {
            if (map[i - 1][j] == 0) {
                if (判断是否需要递归(i - 1, j))
                    显示周围所有的空白(i - 1, j);
            } else {
                隐藏button(i - 1, j);
            }
        }
        // 右边
        if (i != 9) {
            if (map[i + 1][j] == 0) {
                if (判断是否需要递归(i + 1, j))
                    显示周围所有的空白(i + 1, j);
            } else {
                隐藏button(i + 1, j);
            }
        }
        // 左下角
        if (j != 9 && i != 0) {
            if (map[i - 1][j + 1] == 0) {
                if (判断是否需要递归(i - 1, j + 1))
                    显示周围所有的空白(i - 1, j + 1);
            } else {
                隐藏button(i - 1, j + 1);
            }
        }
        if (j != 9) {
            if (map[i][j + 1] == 0) {
                if (判断是否需要递归(i, j + 1))
                    显示周围所有的空白(i, j + 1);
            } else {
                隐藏button(i, j + 1);
            }
        }
        if (j != 9 && i != 9) {
            if (map[i + 1][j + 1] == 0) {
                if (判断是否需要递归(i + 1, j + 1))
                    显示周围所有的空白(i + 1, j + 1);
            } else {
                隐藏button(i + 1, j + 1);
            }
        }

    }

    private void 隐藏button(int i, int j) {
        int 位置 = i * 10 + j;
        buttonList.get(位置).setVisibility(View.INVISIBLE);
    }

    boolean 判断是否需要递归(int hang, int lie) {
        // 判断是否是现实的
        int 位置 = hang * 10 + lie;
        if (buttonList.get(位置).getVisibility() == View.INVISIBLE)
            return false;
        else
            return true;
    }

    private boolean isOver(int hang, int lie) {
        // OVER
        if (map[hang][lie] == -1) {
            Toast.makeText(this, "GameOver", Toast.LENGTH_SHORT).show();
            for (int i = 0; i < buttonList.size(); i++) {
                buttonList.get(i).setVisibility(View.INVISIBLE);
            }
            return true;
        }
        return false;
    }

    // 最多10个旗子
    List<Integer> 旗子 = new ArrayList<Integer>();

    @Override
    public boolean onLongClick(View v) {
        // 插旗子
        // 1. 有了旗子 就取消
        // 2. 没有就插旗
        Button btn = (Button) v;
        int tag = (Integer) v.getTag();
        if (旗子.contains(tag)) {
            // 如果使用drawableTop 对应的java代码的方法
            // setCompoundDrawablesWithIntrinsicBounds
            btn.setText("");
            // int ArrayList.remove(int);//下标
            旗子.remove((Integer) tag);
        } else {
            // 没有插旗就需要插旗,判断数量是否超过了上限
            if (旗子.size() != 10) {
                旗子.add(tag);
                btn.setText("∉ " + 旗子.size());
                btn.setTextColor(Color.RED);
            } else {
                Toast.makeText(this, "没有旗子了", Toast.LENGTH_SHORT).show();
            }

        }
        // 消耗事件,
        return true;
    }

    // 是否胜利
    public boolean isWin() {
        int sum = 0;
        for (int i = 0; i < buttonList.size(); i++) {
            if (buttonList.get(i).getVisibility() == View.INVISIBLE)
                sum++;
        }
        if (sum == 90)
            return true;
        return false;
    }
}

xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:orientation="vertical" >
    <FrameLayout
        android:id="@+id/framelayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <LinearLayout
            android:id="@+id/textviews"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" />

        <LinearLayout
            android:id="@+id/buttons"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
        </LinearLayout>
    </FrameLayout>

</LinearLayout>
版权声明:本文为博主原创文章,未经博主允许不得转载。

【Android】自己动手做个扫雷游戏

本文链接:http://blog.csdn.net/e_one/article/details/52088983 1.  游戏规则 扫雷是玩法极其简单的小游戏,点击玩家认为不存在雷的区域,标记出全...
  • e_one
  • e_one
  • 2016年08月01日 20:59
  • 6045

android写的扫雷,适合初学者

  • 2012年12月09日 17:07
  • 1.47MB
  • 下载

Android扫雷游戏(基于Android Studio)

  • 2016年01月04日 18:12
  • 6.16MB
  • 下载

android studio 扫雷小游戏

  • 2017年03月02日 21:12
  • 2.95MB
  • 下载

Android 扫雷游戏

 基于Android平台的扫雷游戏Download MinesweeperForAndroid_Source – 1.16 MB扫雷-开始的截图扫雷-新游戏的截图扫雷-胜利的截图扫雷-失败的截图简介扫...
  • umengcom
  • umengcom
  • 2010年11月30日 18:39
  • 4276

android小游戏 扫雷

MainActivity 类public class MainActivity extends Activity implements OnClickListener, OnLongC...
  • Dr_abandon
  • Dr_abandon
  • 2016年12月23日 15:14
  • 975

Android扫雷游戏源代码

  • 2011年04月29日 14:47
  • 483KB
  • 下载

如何开发一个扫雷小游戏?

本文介绍如何用C#开发一个扫雷小游戏
  • u011583927
  • u011583927
  • 2016年11月28日 17:03
  • 982

C++小游戏之扫雷

用了两天时间做了一个扫雷终于完成了,先看看效果吧。 和之前做的东西一样,用的也是easy x图形库+vs2015. 点击  扫雷源文件  就可以获得源文件。 开始界面: 完整代码: #inc...
  • zl908760230
  • zl908760230
  • 2017年03月23日 13:41
  • 248

安卓扫雷游戏源代码

  • 2012年05月13日 11:08
  • 2.8MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android小游戏 扫雷
举报原因:
原因补充:

(最多只允许输入30个字)