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

  • 2015年06月10日 12:05
  • 1.49MB
  • 下载

android studio 扫雷小游戏

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

C语言简单实现扫雷小游戏~~~

C语言实现扫雷 C语言编写小游戏扫雷,因为目前个人技术问题,外观界面不能做出来,最终呈现的效果还是在命令里进行,但是总体来说还是完成了扫雷的基本功能。 不过,标记的函数,没有写的完美,每次都要进行...

android扫雷小游戏

  • 2014年06月24日 17:24
  • 7.83MB
  • 下载

android小游戏(扫雷)

  • 2013年03月26日 11:11
  • 1.15MB
  • 下载

C语言实现小游戏--扫雷

game.h 游戏头文件  #define _CRT_SECURE_NO_WARNINGS 1 #ifndef __GAME_H__ #define __GAME_H__ #include #in...

如何利用C#开发“扫雷”小游戏

本文详细说明了利用C#语言开发“扫雷”小游戏的开发过程。

JS_小游戏_扫雷

JS_小游戏_扫雷

JS写怀旧小游戏系列(五)扫雷

经典的window小游戏扫雷,支持IE9,chrome,firefox,safari,opera等现代浏览器!~IE8以下没测试~ JS扫雷 script type="text/java...

【小游戏】C++扫雷

用C++复现经典扫雷。 主要是dfs实现打开一片的操作,数字带有颜色,很真实。 windows扫雷中鼠标左右键同时按也实现了,即试探。先上图,详见下面代码: 代码中有详细注释,编译无任何错误警告...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android小游戏 扫雷
举报原因:
原因补充:

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