当前位置: 移动技术网 > IT编程>移动开发>Android > Android 实现扫雷小游戏实例代码

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

71sou,北京养生堂讲座,qq游戏实名制

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>

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网