全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android 实现扫雷小游戏实例代码

Android 实现扫雷小游戏实例

               最近学习Android 应用编程,抽空做个小应用,大家熟悉的扫雷应用,练手用,

以下是实现代码:

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  # 扫雷  # 小游戏  # 实现扫雷小游戏  # Android小游戏扫雷  # Android高仿2048小游戏实现代码  # 最常见的猜拳小游戏Android代码实现  # Android实现2048小游戏  # Android 实现抖音小游戏潜艇大挑战的思路详解  # 递归  # 判断是否  # 是一个  # 他是  # 最多  # 希望能  # 做个  # 谢谢大家  # 边上  # 取走  # 组中  # 下次  # 最外层  # 超过了  # id  # initData  # Integer  # findViewById  # private  # random 


相关文章: linux top下的 minerd 木马清除方法  如何在阿里云域名上完成建站全流程?  网站网页制作专业公司,怎样制作自己的网页?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  香港服务器网站卡顿?如何解决网络延迟与负载问题?  如何高效配置香港服务器实现快速建站?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  如何快速搭建高效服务器建站系统?  家庭服务器如何搭建个人网站?  如何在万网自助建站中设置域名及备案?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  西安专业网站制作公司有哪些,陕西省建行官方网站?  手机网站制作与建设方案,手机网站如何建设?  用v-html解决Vue.js渲染中html标签不被解析的问题  山东云建站价格为何差异显著?  建站主机SSH密钥生成步骤及常见问题解答?  专业公司网站制作公司,用什么语言做企业网站比较好?  广东企业建站网站优化与SEO营销核心策略指南  如何快速搭建高效香港服务器网站?  建站之星收费标准详解:套餐费用及年费价格表一览  建站主机选购指南与交易推荐:核心配置解析  如何在Tomcat中配置并部署网站项目?  C#如何在一个XML文件中查找并替换文本内容  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  建站之星免费模板:自助建站系统与智能响应式一键生成  网站微信制作软件,如何制作微信链接?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  如何快速生成凡客建站的专业级图册?  购物网站制作公司有哪些,哪个购物网站比较好?  实例解析angularjs的filter过滤器  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何通过西部数码建站助手快速创建专业网站?  b2c电商网站制作流程,b2c水平综合的电商平台?  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  如何用美橙互联一键搭建多站合一网站?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  ui设计制作网站有哪些,手机UI设计网址吗?  制作门户网站的参考文献在哪,小说网站怎么建立?  建站之星价格显示格式升级,你的预算足够吗?  大连网站设计制作招聘信息,大连投诉网站有哪些?  如何获取PHP WAP自助建站系统源码?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  建站之星如何修改网站生成路径?  如何通过IIS搭建网站并配置访问权限?  建站之星备案流程有哪些注意事项?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  建站OpenVZ教程与优化策略:配置指南与性能提升 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。